物联网竞赛LoRa模块双击实现某些功能-新大陆
一、任务要求
1、第一次双击key3使得OLED屏幕显示工位号
2、第二次双击key3使得OLED屏幕显示某个图标
3、第三次双击key3使得OLED屏幕环境监测
4、能实现以上三步循环操作
二、代码main.c文件编写
#include <string.h> #include "board.h" #include "hal_key.h" #include "tim-board.h" #include "timer_handles.h" #include "hal_oled.h" #include "adc_reader.h" #include "math.h" //获取pow计算x的y次幂函数 #include "sht3x.h" //温湿度 void Init() { BoardInitMcu(); BoardInitPeriph(); keys_init();//按键初始化 setTimer2Callback(Time2Handler); Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次 OLED_Init(); //OLED初始化 OLED_Clear(); ADCS_Init(); //ADC初始化 } void number() //显示工位号 { OLED_ShowString(56,3,(uint8_t *)"01"); } uint8_t tubiao[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,0xF0,0xF8,0xF8,0x7C,0x7C,0x3E, 0x3E,0x3E,0x1F,0x1F,0x1F,0x1F,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFE,0xBE, 0x3E,0x7C,0xFC,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0xE0,0xF8,0xFC,0xFF,0x7F,0x1F,0x8F,0x87,0xC3,0xC1,0xE0,0xE0,0xE0,0xE0, 0xE0,0xE0,0xC0,0xC0,0xC0,0x80,0xFF,0xFF,0xFF,0xFF,0x01,0x03,0x07,0x0F,0xFF,0xFF, 0xFE,0xFC,0xF0,0x00,0x01,0x03,0x07,0x0F,0x3F,0x7F,0xFE,0xFC,0xF8,0xE0,0x80,0x00, 0xFC,0xFF,0xFF,0xFF,0xFF,0xF9,0xFE,0xFF,0xFF,0xDF,0xCF,0xC7,0xC3,0xC3,0xC3,0xC3, 0xC3,0xE3,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF8,0xFF,0xFF, 0xFF,0xDF,0xC7,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC3,0xBF,0xFF,0xFF,0xFF,0xF8, 0x3F,0xFF,0xFF,0xFF,0xFD,0x83,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xE3,0xFB,0xFF, 0xFF,0xFF,0x1F,0x3F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xC7,0xC3, 0x87,0x87,0xC7,0xC7,0xC7,0xE7,0xFB,0xFF,0xFF,0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0x3F, 0x00,0x01,0x07,0x1F,0x3F,0xFF,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x1F,0x3F,0xFF, 0xFF,0xFF,0xE0,0xC0,0xC0,0x80,0xFF,0xFF,0xFF,0xFF,0x01,0x03,0x03,0x07,0x07,0x07, 0x07,0x07,0x07,0x07,0x87,0xC3,0xE3,0xF1,0xFC,0xFE,0x7F,0x3F,0x1F,0x07,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x1F,0x1F,0x3E,0x3E,0x7C, 0x7D,0x7B,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF8,0xF8,0xF8,0xF8,0x7C,0x7C, 0x7C,0x3E,0x3F,0x1F,0x1F,0x0F,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, }; void picture() //显示图标 { OLED_DrawBMP(40,1,48,48,tubiao); } //float temp; //float humi; //char str_temp[64]; //char str_humi[64]; float value; unsigned char databuffer[64]; void get_sensor() { AdcScanChannel(); value = pow(10, ((1.395 - log10((50 / AdcReadCh0() - 20) / 10)) / 0.465)); HAL_Delay(200); sprintf((char *)databuffer,"value:%2.0f",value); OLED_ShowString(32,3,databuffer); // call_sht11(&temp,&humi); // sprintf(str_temp,"%.0f",temp); //温度 // OLED_ShowString(50,2,(uint8_t*)str_temp); // sprintf(str_humi,"%.0f Rh",humi); //湿度 // OLED_ShowString(50,4,(uint8_t*)str_humi); } int fun,n,clickkey3,key3time; void KeyDownHandler() { scan_keys(); if(isKey3Pressed()) { resetKey3(); //重置key3状态 clickkey3++; //统计双击次数 if(clickkey3>=2&&key3time<50) { fun++; //统计功能 clickkey3=0; key3time=0; // if(fun%3==1){n=1;OLED_Clear();} if(fun%3==2){n=2;OLED_Clear();} if(fun%3==0){n=3;OLED_Clear();} }else if(clickkey3>=2&&key3time>=50) { key3time=0; //两次单击超出时间则归零 } } } int main( void ) { Init(); while( 1 ) { KeyDownHandler(); if(clickkey3) { ++key3time; HAL_Delay(5); }else{ key3time=0; } switch(n) { case 1: number(); break; case 2: picture(); break; case 3: get_sensor(); break; } } }
三、LoRa模块烧写代码
编译无错误,直接用STlink下载,"模组串口连接拨码开关"无要求
四、实验效果