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

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

题目

​ 使用两个 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 界面。

分析

  • 题目很难

  • 点对点头疼

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

    发送特定数据

代码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();
			
			
    }
}

代码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);
    }
}

posted @ 2022-10-17 18:28  ~内个臣呐~  阅读(628)  评论(0)    收藏  举报