2021高职物联网国赛 Lora点对点

1|02021高职物联网国赛 Lora点对点

1|1题目

​ 使用两个 LoRa 模块,一个作为主控端,另一个作为节点端,在主控端装上 温湿度和光照二合一模块,节点端装上单联继电器并外接一个照明灯,该任务要 求实现主控端通过无线方式手动或自动控制节点端上的照明灯,并在 LED 屏幕 上实时显示要求的温度、湿度、光照值。

image-20221016082504459

**任务要求: **

  • 如上图所示,主控端有 4 个界面,节点端也有四个界面与主控端的界面 一一对应,节点端的界面根据主控端的选择自动切换到对应的界面。

  • 主控端通电后 LED1,LED2 灭,默认显示 Menu 界面,光标停留在选项 1 上,并实时向节点端发送当前的状态;

  • 主控端切换到 Menu 界面,节点端显示 Select Menu 界面,在主控端使 用 Key2(上移),Key3(下移)按键能对 < 光标进行上下的移动,当 在 < 符号所处的选项,按下 KEY4 时,进入相应的界面。

  • 主控端切换到 Auto Lamp 界面,节点端显示 Auto Lamp 界面,此时为 自动模式,主控端实时读取传感器光照、温度、湿度的数值,并在显示 屏上实时显示,同时向节点端发送当前光照、温度、湿度的数值,节点 端在 Auto Lamp 界面实时显示当前接收到的光照、温度、湿度的数值。 当光照值低于某一阀值时(用手遮住),节点端板上外接的照明灯亮, 同时主控端和节点端上的 LED1,LED2 亮,反之全灭。在主控端按下 KEY4 后,返回到 Menu 界面。(注:光照值需使用公式换算成正确的数值。)

  • 主控端切换到 Mula Lamp 界面,节点端显示 Mula Lamp 界面,此时为 手动模式,在主控端按下 Key2 时节点端板上外接的照明灯亮,同时主 控端和节点端上的 LED1,LED2 亮,且显示屏上显示为 Lamp:Open,在主 控端按下 Key3 时节点端板上外接的照明灯灭,同时主控端和节点端上 的 LED1,LED2 灭,且显示屏上显示 Lamp:Close。在主控端按下 KEY4 后, 返回到 Menu 界面。

  • 主控端切换到 View Freq 界面,节点端显示 View Freq 界面,主控端 显示带有 WIFI 图标,主控端和节点端能正确显示当前的 LoRa 频率。在 主控端按下 KEY4 后,返回到 Menu 界面。

1|2分析

  • 题目很难

  • 点对点头疼

    • 上午点对点可能信号不太好
    • 收到数据进行转换

    发送特定数据

1|3代码A发送

/** ****************************************************************************** * 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 "adc_reader.h" #include "sx1276.h" uint8_t S = 0,Z = 1; uint8_t arr[10]; float Zhi[3] = {0}; uint8_t Lamp_s = 0; uint8_t Json[30]; /********************************************************************************************** *函数:void Init( void ) *功能:平台初始化 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ void Init() { // 开发板平台初始化 BoardInitMcu(); BoardInitPeriph(); keys_init();//按键初始化 setTimer2Callback(Time2Handler); Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次 } void LED_State(); /********************************************************************************************** *函数:void KeyDownHandler( void ) *功能:按钮事件监听 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ void KeyDownHandler(void) { if(isKey2Pressed()){ resetKey2(); Z--;if(Z == 0)Z = 1; if(S == 2){Lamp_s =~Lamp_s; GpioToggle(&Led1); GpioToggle(&Led2); } OLED_Clear(); LED_State(); } if(isKey3Pressed()){ resetKey3(); Z++;if(Z == 4)Z = 3; OLED_Clear(); LED_State(); } if(isKey4Pressed()){ resetKey4(); if(S == 0)S = Z; else if(S != 0)S = 0; OLED_Clear(); LED_State(); } } /********************************************************************************************** *函数:void handlerPre10Ms( void ) *功能:10毫秒循环 *输入:无 *输出:无 *特殊说明:循环处理总时长300ms **********************************************************************************************/ void handlerPre10Ms(void) { for (int delay = 0; delay < 30; delay++) { HAL_Delay(10); } } void LED_State(){ if(S == 0){ OLED_ShowString(48,0,"Menu"); OLED_ShowString(0,2,"1.Auto Lamp"); OLED_ShowString(0,4,"2.Mula Lamp"); OLED_ShowString(0,6,"3.View Freq"); OLED_ShowChar(127-16,2*Z,'<'); } if(S == 1){ OLED_ShowString((127-72)/2,0,"Auto Lamp"); OLED_ShowString(0,2,"Light:");sprintf(arr,"%.2f",Zhi[0]); OLED_ShowString(48,2,arr); OLED_ShowString(0,4,"Temp :");sprintf(arr,"%.2f",Zhi[1]); OLED_ShowString(48,4,arr); OLED_ShowString(0,6,"Humi :");sprintf(arr,"%.2f",Zhi[2]); OLED_ShowString(48,6,arr); } if(S == 2){ OLED_ShowString((127-72)/2,0,"Mula Lamp"); OLED_ShowString(0,2,"Lamp:"); if(Lamp_s == 0){ OLED_ShowString(40,2,"Close"); }else OLED_ShowString(40,2,"Open"); } if(S == 3){ OLED_ShowString((127-72)/2,0,"View Freq"); OLED_ShowString(0,2,"Freq:433000521"); OLED_ShowCHinese(0,4,44); } } /** * Main application entry point. */ int main( void ) { Init(); OLED_Init(); LED_State(); hal_temHumInit(); ADCS_Init(); NS_RadioInit(433000521,18,1000,1000); while( 1 ) {KeyDownHandler(); AdcScanChannel(); Zhi[0] = AdcReadCh0()*5/2.0*100; call_sht11(&Zhi[1],&Zhi[2]); if((S == 1&& Zhi[0] <= 100)){ GpioWrite(&Led1,0); GpioWrite(&Led2,0); Lamp_s = 1; } else { if(S == 2){ //GpioWrite(&Led2,0); //GpioWrite(&Led1,0); } else { GpioWrite(&Led2,1); GpioWrite(&Led1,1); Lamp_s = 0; } } sprintf(Json,"%.2f %.2f %.2f ",Zhi[0],Zhi[1],Zhi[2]); Json[30-1] = S; Json[30-2] = Lamp_s; SX1276Send(Json,30); if(S == 1)LED_State(); } }

1|4代码B接收

/** ****************************************************************************** * 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" #define Relay_1 PB_2 Gpio_t Relay1; uint8_t S = 1,Z = 1; uint8_t arr[10]; uint8_t Lamp_s = 0; uint8_t Zhi[3][10]; /********************************************************************************************** *函数:void Init( void ) *功能:平台初始化 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ void Init() { // 开发板平台初始化 BoardInitMcu(); BoardInitPeriph(); keys_init();//按键初始化 setTimer2Callback(Time2Handler); Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次 } /********************************************************************************************** *函数:void KeyDownHandler( void ) *功能:按钮事件监听 *输入:无 *输出:无 *特殊说明:无 **********************************************************************************************/ void KeyDownHandler(void) { } /********************************************************************************************** *函数:void handlerPre10Ms( void ) *功能:10毫秒循环 *输入:无 *输出:无 *特殊说明:循环处理总时长300ms **********************************************************************************************/ void handlerPre10Ms(void) { for (int delay = 0; delay < 30; delay++) { HAL_Delay(10); } } void LED_State(){ if(S == 0){ OLED_ShowString((128-88)/2,0,"Select Menu"); OLED_ShowCHinese((128-16)/2,4,44); } if(S == 1){ OLED_ShowString((127-72)/2,0,"Auto Lamp"); OLED_ShowString(0,2,"Light:");sprintf(arr,"%s",Zhi[0]); OLED_ShowString(48,2,arr); OLED_ShowString(0,4,"Temp :");sprintf(arr,"%s",Zhi[1]); OLED_ShowString(48,4,arr); OLED_ShowString(0,6,"Humi :");sprintf(arr,"%s",Zhi[2]); OLED_ShowString(48,6,arr); } if(S == 2){ OLED_ShowString((127-72)/2,0,"Mula Lamp"); OLED_ShowString(0,2,"Lamp:"); if(Lamp_s == 0){ OLED_ShowString(40,2,"Close"); }else OLED_ShowString(40,2," Open"); } if(S == 3){ OLED_ShowString((127-72)/2,0,"View Freq"); OLED_ShowString(0,2,"Freq:433000521"); } } /** * Main application entry point. */ int main( void ) { Init(); OLED_Init(); GpioInit( &Relay1, Relay_1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 ); NS_RadioInit(433000521,18,1000,1000); uint8_t Json[30]; while( 1 ) { ReadRadioRxBuffer(Json); if(S != Json[30-1])OLED_Clear(); S = Json[30-1]; Lamp_s = Json[30-2]; uint8_t i,j,t = 0; if(S == 1) for(i = 0,j = 0;i < 28;i ++){ if(Json[i] != ' '){ Zhi[j][t] = Json[i]; t++; }else {j++;t = 0;} if(j == 3)break; } if(Lamp_s == 0){ GpioWrite(&Led1,1); GpioWrite(&Led2,1); GpioWrite(&Relay1,1); }else { GpioWrite(&Led1,0); GpioWrite(&Led2,0); GpioWrite(&Relay1,0); } LED_State(); //OLED_ShowString(0,0,Json); } }

__EOF__

本文作者~内个臣呐~
本文链接https://www.cnblogs.com/Xin-chen/p/16800193.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ~内个臣呐~  阅读(462)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示