2021山东省省赛高职组Lora点对点

2021山东省省赛高职组Lora点对点

题目

请选手选择两块 LoRa 模块实现无线通讯功能,并根据任务要求完成相关功 能的开发,并发布程序到两块 LoRa 模块中,通上电源等待裁判评判。

  • 本题提供了工程项目供选手使用。两个 LoRa 模块我们暂时命名为 LoRa(A) 和 LoRa(B)。

  • “竞赛参数信息”中提供了本题所需使用的频率信息。

  • 设备上电,默认情况下两个 LoRa 模块上的 LED1 和 LED2 灯都是熄灭的。 LoRa(A)和 LoRa(B)两个模块液晶屏显示界面如下图所示

  • image-20221016143449269

每按一次 Key2 键可以控制 LoRa(A)屏幕中小箭头以 LED1 开 → LED2 关 → LED2 开 → LED1 关 → LED1 开这样的顺序循环切换小箭头指示。每 按一次 Key3 键可以控制 LoRa(A)屏幕中小箭头以 LED1 开 → LED1 关 → LED2 开 → LED2 关 → LED1 开这样的顺序循环切换小箭头指示。效 果如下图所示

image-20221016143511507

  • 当 LoRa(A)中选中某个灯开或者关时,点击 Key4 键,可以控制 LoRa(B) 中对应 LED1 或者 LED2 的常亮或者熄灭。
  • LoRa(B)要根据自己模块中LED1灯或LED2灯的亮起或熄灭使用不同的图 片或动画来表示。灯常亮使用“信号灯-0.bmp”、“信号灯-1.bmp”、 “信号灯-2.bmp”三张连续动画表示,灯熄灭使用“信号灯-0.bmp”来 表示。效果如下图所示
  • image-20221016143543308

分析

  • 使用Lora模块进行点对点通讯
  • Lora 通讯频率为433000000附近的频率
  • 库里面没有#include "sx1276.h"头文件,需要手动导入该头文件
  • 批注 2022-10-17 094117

批注 2022-10-17 094249

源代码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 "sx1276.h"
#include "NS_Radio.h"

uint8_t arr[10];
uint8_t Z = 0,S = 0;//指针位置
uint8_t state = 0x00;//发送LED的状态

uint8_t SE[] = {//三角标志
/*--  ???????:C:\Users\Newland\Desktop\??????.bmp  --*/
/*--  ??x??=16x16  --*/
0x00,0x00,0x80,0xE0,0xE0,0xFC,0xFE,0xFE,0xFE,0xFC,0xF0,0xE0,0x80,0x00,0x00,0x00,
0x30,0x7C,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x78,0x00,
};
uint8_t KG[][32]= {//开关
/*--  ??:  ?  --*/
/*--  ??12;  ??????????:?x?=16x16   --*/
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

/*--  ??:  ?  --*/
/*--  ??12;  ??????????:?x?=16x16   --*/
0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,

};








/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
    // 开发板平台初始化
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
	 
}

/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {
	if(isKey2Pressed()){// LED1 开 → LED2 关 → LED2 开 → LED1 关 → LED1开
		Z+=3;
		resetKey2();
		OLED_Clear();
			if(Z == 6)Z = 2;
        if(Z == 5)Z = 1;
        if(Z == 4)Z = 0;
		
	}
	if(isKey3Pressed()){//LED1 开 → LED1 关 → LED2 开 → LED2 关 → LED1开
		Z++;
		resetKey3();
		OLED_Clear();
		if(Z == 4)Z = 0;
	}
	if(isKey4Pressed()){//设置state[发送亮灯模式]
	
		resetKey4();
		OLED_Clear();
		
		if(Z == 0){
				state |= 0x0F;
		}
		if(Z == 1){
				state &=~0x0F;
		}
		
		if(Z == 2){
				state |= 0xF0;
		}
		if(Z == 3){
				state &=~0xF0;
		}
		
	}	
	
	
	
	
	
}

/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
    for (int delay = 0; delay < 30; delay++) {
        HAL_Delay(10);
        
    }
}





void OLED_State(){//设置主界面
	OLED_ShowString(0,0,"LED1:");
	OLED_ShowCHineseArray(48,0,KG[0]);
	OLED_ShowCHineseArray(80,0,KG[1]);
	OLED_ShowString(0,4,"LED2:");
	OLED_ShowCHineseArray(48,4,KG[0]);
	OLED_ShowCHineseArray(80,4,KG[1]);
	OLED_DrawBMP(48+(Z%2 == 0?0:32),2+(Z>=2?4:0),16,16,SE);
	
}









/**
 * Main application entry point.
 */
int main( void )
{
    Init();
	OLED_Init();
	NS_RadioInit(433000001,16,1000,1000);//初始化
	
    while( 1 )
    {
			SX1276Send(&state,1);//发送字节
			KeyDownHandler();//按键检测
			OLED_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"


uint8_t arr[10];
uint8_t Z = 0,S = 0;
uint8_t state;

uint8_t BMP0[] = {
/*--  ???????:D:\?????_?????\2021????????Lora???.assets\0.bmp  --*/
/*--  ??x??=48x45  --*/ //图片灯开 
/*--  ????8???,????:??x??=48x48  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0xE0,0xE0,
0xE0,0xC0,0xE0,0xE0,0xE0,0xC0,0x80,0xC0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xC0,0xE0,
0xE0,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0xF8,0x38,0xE0,0xF8,0xF8,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFD,0xFD,0xFB,0xFB,0xFF,0xFF,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x1F,0x03,0xF3,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x03,0x03,0x03,0x03,0x03,0x03,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0xFF,0x03,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xFF,0xFF,0xFF,0x80,0x81,0x81,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xF7,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x3F,0x3F,0x31,0x3F,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0B,0x0B,0x0B,0x0B,0x0F,0x0F,0x07,0x07,0x07,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x0D,0x0D,0x0F,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

uint8_t BMP1[] = {//灯关
/*--  ???????:D:\?????_?????\2021????????Lora???.assets\1.bmp  --*/
/*--  ??x??=48x48  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,
0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xA0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,
0xE0,0xE0,0xE0,0xE0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFD,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xF9,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,
0xFF,0xFF,0xBD,0xFF,0xFC,0xFC,0x18,0xFC,0xFC,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7F,0x7F,0xFF,0xFF,0x1F,0x1F,0x1F,0xF7,0xFD,
0xFE,0xFE,0xFF,0xEF,0xEF,0xF7,0xF7,0xF7,0xFF,0xEF,0xEF,0xEF,0x3E,0xFD,0xFF,0xFF,
0xFF,0xEF,0xFF,0xFF,0x9B,0x9B,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x07,0xFF,0xFF,0x03,0x03,0x03,0x7F,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xE8,0xB0,0xB0,0xFF,0xFF,0x5F,0x5F,0x5F,0x7F,0xFF,
0x7F,0x7F,0x40,0x7F,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x7F,0x7F,
0x7F,0x3F,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x03,0x03,0x07,0x07,0x07,0x07,0x07,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};







/**********************************************************************************************
*函数: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 OLED_State(){//设置主界面
	
	//判断发过来的值

	OLED_ShowString(0,6,"LED1        LED2");
	if(state == 0x00){
		GpioWrite(&Led1,1);GpioWrite(&Led2,1);
	OLED_DrawBMP(0,0,48,48,BMP0);
	OLED_DrawBMP(48+32,0,48,48,BMP0);
	}
	if(state == 0xFF){
	OLED_DrawBMP(0,0,48,48,BMP1);
		GpioWrite(&Led1,0);GpioWrite(&Led2,0);
	OLED_DrawBMP(48+32,0,48,48,BMP1);
	}
		if(state == 0xF0){
			GpioWrite(&Led2,0);GpioWrite(&Led1,1);
	OLED_DrawBMP(0,0,48,48,BMP0);
	OLED_DrawBMP(48+32,0,48,48,BMP1);
	}
	if(state == 0x0F){
		GpioWrite(&Led1,0);GpioWrite(&Led2,1);
	OLED_DrawBMP(0,0,48,48,BMP1);
	OLED_DrawBMP(48+32,0,48,48,BMP0);
	}
	
	
}



/**
 * Main application entry point.
 */
int main( void )
{
    Init();
	OLED_Init();
		NS_RadioInit(433000001,16,1000,1000);//初始化
    while( 1 )
    {ReadRadioRxBuffer(&state);//接收数据
			OLED_State();//收到字节改变状态
    }
}

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