2021山东省省赛高职组Lora点对点
2021山东省省赛高职组Lora点对点
题目
请选手选择两块 LoRa 模块实现无线通讯功能,并根据任务要求完成相关功 能的开发,并发布程序到两块 LoRa 模块中,通上电源等待裁判评判。
-
本题提供了工程项目供选手使用。两个 LoRa 模块我们暂时命名为 LoRa(A) 和 LoRa(B)。
-
“竞赛参数信息”中提供了本题所需使用的频率信息。
-
设备上电,默认情况下两个 LoRa 模块上的 LED1 和 LED2 灯都是熄灭的。 LoRa(A)和 LoRa(B)两个模块液晶屏显示界面如下图所示
-

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

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

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

源代码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();//收到字节改变状态
}
}

浙公网安备 33010602011771号