Lora 点对点控制灯带
题目要求
3、LoRa 通信系统
使用两个 LoRa 模块,分别命名为监测端和控制端,控制端上安装单联继电
器并外接一个风扇,通过 485 口连接 RGB 灯带。在监测端上安装温湿度和光照
二合一模块,通过 485 口连接物联网应用开发终端与后续的任务进行数据通信。
利用竞赛资料提供的引用库与文档说明、等资源,界面参考效果图,实现程序
的开发,模拟信息的采集、传输。
*注:LoRa 频率需根据给定的参数设定,如需使用 ST-LINK 的仿真器调试需
自行安装相应的 ST-LINK 驱动。
任务要求:
监测端实时采集温度、湿度、光照数据并在液晶屏上显示,同时将数据
实时发送给物联网应用开发终端。
当光照值底于 200Lux 时,监测端和控制端板上的 Led1、Led2 灯亮,否
则两块板上的 Led1、Led2 灯灭。
点击监测端上的 K2 键发送红色 RGB 值(255,0,0)控制端,控制端收到
数据后显示相应的值,使得外接的 RGB 灯带亮成对应的红色。
点击监测端上的 K3 键发送绿色 RGB 值(0,255,0)给控制端,控制端收
到数据后显示相应的值,使得外接的 RGB 灯带亮成对应的绿色。
第 8 页 共 10 页
点击监测端上的 K4 键发送蓝色 RGB 值(0,0,255)给控制端,控制端收
到数据后显示相应的值,使得外接的 RGB 灯带亮成对应的蓝色。
点击控制端 K2 键打开外接的风扇,在液晶屏上显示 On。
点击控制端 K3 键关闭外接的风扇,在液晶屏上显示 Off。
光照值需使用换算公式进行转换。
设备的通讯协议格式由选手自主定义,需考虑后续的物联网网关开发的
数据通信。

代码
检测端
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*/
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "adc_reader.h"
#include "sht3x.h"
#include "NS_Radio.h"
#include "sx1276.h"
#include "usart1-board.h"
/************************* va *********************************************/
float temp,hump,light;
unsigned char State = 0;
unsigned char Send[4];
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
if(isKey2Pressed()){
resetKey2();
Send[0] = 0xff;
Send[1] = 0x00;
Send[2] = 0x00;
SX1276Send(Send,4);
}
if(isKey3Pressed()){
resetKey3();
Send[0] = 0x00;
Send[1] = 0xff;
Send[2] = 0x00;
SX1276Send(Send,4);
}
if(isKey4Pressed()){
resetKey4();
Send[0] = 0x00;
Send[1] = 0x00;
Send[2] = 0xff;
SX1276Send(Send,4);
}
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
void OLED_State (){
if(State == 0){
unsigned char arr[30];
sprintf(arr,"%.2f *%.2f *%.2f *",temp,hump,light);
unsigned char Zhi[3][10];
unsigned char i = 0,j = 0,i0 = 0;
while(j<3){
if(arr[i] != '*'){
Zhi[j][i0] = arr[i];
i0++;
}else {
j++;
i0 = 0;
}
i++;
}
if(light < 200){
GpioWrite(&Led1,0);
GpioWrite(&Led2,0);
Send[3] = 1;
SX1276Send(Send,4);
}else {
GpioWrite(&Led1,1);
GpioWrite(&Led2,1);
Send[3] = 0;
SX1276Send(Send,4);
}
HAL_Delay(20);
OLED_ShowString(0,0," Temp:");OLED_ShowString(48,0,Zhi[0]);
OLED_ShowString(0,2," Hump:");OLED_ShowString(48,2,Zhi[1]);
OLED_ShowString(0,4,"Light:");OLED_ShowString(48,4,Zhi[2]);
USART1_SendStr(arr,30);//发送到安卓客户端
}
}
/**
* Main application entry point.
*/
int main( void )
{
Init();
ADCS_Init();
hal_temHumInit();
OLED_Init();
USART1_Init(9600);
NS_RadioInit(433000520,18,1000,1000);
while( 1 )
{
AdcScanChannel();
light = AdcReadCh0()*5/2.0*100;
call_sht11(&temp,&hump);
OLED_State ();
KeyDownHandler();
}
}
控制端
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*/
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "NS_Radio.h"
#include "usart1-board.h"
#define Relay1 PB_2
Gpio_t Relay;
unsigned char Fun_State = 0;
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
if(isKey2Pressed()){
resetKey2();
Fun_State = 1;
}
if(isKey3Pressed()){
resetKey3();
Fun_State = 0;
}
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
unsigned char LED_R[] = {0xA5,0x06,0x00,0xA0,0xFF,0x00,0x00,0xEE,0x5A};
unsigned char LED_G[] = {0xA5,0x06,0x00,0xA0,0x00,0xFF,0x00,0xEE,0x5A};
unsigned char LED_B[] = {0xA5,0x06,0x00,0xA0,0x00,0x00,0xFF,0xEE,0x5A};
unsigned char LED_C[] = {0xA5,0x06,0x00,0xA0,0x00,0x00,0x00,0xEE,0x5A};
void OLED_State(unsigned char Read[4]){
unsigned char arr[20];
HAL_Delay(100);
OLED_ShowString(0,0,"R:");sprintf(arr,"%d ",Read[0]);OLED_ShowString(16,0,arr);
OLED_ShowString(0,2,"G:");sprintf(arr,"%d ",Read[1]);OLED_ShowString(16,2,arr);
OLED_ShowString(0,4,"B:");sprintf(arr,"%d ",Read[2]);OLED_ShowString(16,4,arr);
if(Read[0] == 0xff){
USART1_SendStr(LED_R,9);
}
else if(Read[1] == 0xff){
USART1_SendStr(LED_G,9);
}
else if(Read[2] == 0xff){
USART1_SendStr(LED_B,9);
}else
{
USART1_SendStr(LED_C,9);
}
}
/**
* Main application entry point.
*/
int main( void )
{
Init();
OLED_Init();
USART1_Init(9600);
GpioInit(&Relay,Relay1,PIN_OUTPUT,PIN_PUSH_PULL,PIN_NO_PULL,0);
GpioWrite(&Relay,0);
NS_RadioInit(433000520,18,1000,1000);
while( 1 )
{
KeyDownHandler();
unsigned char Read[4];
ReadRadioRxBuffer(Read);
OLED_State(Read);
if(Read[3] == 1){
GpioWrite(&Led1,0);
GpioWrite(&Led2,0);
}else {
GpioWrite(&Led1,1);
GpioWrite(&Led2,1);
}
if(Fun_State == 1){
OLED_ShowString(0,6,"Fun:On ");
GpioWrite(&Relay,1);
}
else {
OLED_ShowString(0,6,"Fun:Off");
GpioWrite(&Relay,0);
}
}
}