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

**任务要求: **
-
如上图所示,主控端有 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 界面。
#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() {
BoardInitMcu();
BoardInitPeriph();
keys_init();
setTimer2Callback(Time2Handler);
Tim2McuInit(1);
}
void LED_State();
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) {
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);
}
}
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){
}
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();
}
}
#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() {
BoardInitMcu();
BoardInitPeriph();
keys_init();
setTimer2Callback(Time2Handler);
Tim2McuInit(1);
}
void KeyDownHandler(void) {
}
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");
}
}
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();
}
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律