1、准备开发板
这里我选用了一块网红开发板:”小熊派“,这款板子的人气比较高,还是全国大学生物联网设计竞赛(华为杯)的华为竞赛开发板,我个人也比较喜欢用这款板子,这款板子在放在纸箱吃灰半年之后,被我重新拿了起来,并想借此写博客的机会,整理一下自己的代码。
开发板功能区分布图
开发板俯视图
我们前面实现了一个厨房烟雾监测系统,还有一点点的欠缺,就是不能通过按键进行烟雾浓度阈值的修改,现在我们把这部分功能进行完善。到了这里我们该怎么做呢,方法就是用标志位 。难点主要是在:只有两个按键,但是要实现画面切换,并且修改阈值的操作。解决方法:按键按下的时候,进入阈值设置模式,当再按下上次按键的时候,进行阈值的加或者减,当按下另一个按键的时候,就会回到主菜单,这样就可以巧秒的利用两个按键了。
2、在MDK中编写代码
在main.c中编写以下代码
float smoke_value;
float Smoke_UT = 5;
char LCD_Str[30];
unsigned char F1btn_back_flag;
unsigned char F2btn_back_flag;
unsigned char display_mode;
typedef enum
{
NORMAL,
SETUP
}ENUM_DISPLAY_MODE;
void setDisplayMode(ENUM_DISPLAY_MODE mode)
{
display_mode = mode;
}
ENUM_DISPLAY_MODE getDisplayMode(void)
{
return display_mode;
}
void Info_Alter(char *info)
{
char *uwRet;
uwRet = strstr(info, "UT");
if (uwRet != NULL)
{
uwRet = strchr(uwRet, ':');
if (uwRet != NULL)
{
uwRet++;
printf("设定烟雾浓度阈值为:%s\r\n",uwRet);
Smoke_UT = atof(uwRet);
}
}
}
void LCD_Display(void)
{
if(getDisplayMode() == NORMAL)
{
sprintf(LCD_Str,"smoke:%0.2f",smoke_value);
LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str);
}
else
{
sprintf(LCD_Str,"upthv:%0.2f",Smoke_UT);
LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str);
}
}
int main(void)
{
unsigned char key;
HAL_Init();
uint32_t smoke_time = 0;
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
MX_SPI2_Init();
MX_TIM2_Init();
MX_TIM16_Init();
USART_Interupt_Enable();
TIM_Interupt_Enable();
LCD_Init();
LCD_Clear(BLUE);
LCD_ShowString(65, 50+24+32, 240, 32, 32, "Welcome");
LCD_Draw_Circle(120, 120, 60);
LCD_Draw_Circle(120, 120, 80);
LCD_Draw_Circle(120, 120, 100);
LCD_Draw_Circle(120, 120, 120);
HAL_Delay(500);
LCD_Clear(BLACK);
LCD_ShowString(10, 10, 240, 24, 24, "Monitoring system");
LCD_Draw_Circle(120, 120, 85);
while (1)
{
if(time2Count - smoke_time >= 1000)
{
smoke_time = time2Count;
smoke_value = (float)ADC_GetValue()/4096*3.3;
printf("smoke_value:%f\r\n",smoke_value);
if(smoke_value > Smoke_UT)
{
printf("报警中...");
BEEP_ON;
}
else
{
BEEP_OFF;
}
}
key = KEY_Scan(0);
if(key == 1)
{
LED_Set(LED_ON)
F2btn_back_flag = 1;
Smoke_UT += 0.1;
if(F1btn_back_flag == 1)
{
F1btn_back_flag = 0;
setDisplayMode(NORMAL);
continue;
}
setDisplayMode(SETUP);
}
else if(key == 2)
{
LED_Set(LED_OFF)
F1btn_back_flag = 1;
Smoke_UT -= 0.1;
if(Smoke_UT<=0)
Smoke_UT = 0;
if(F2btn_back_flag == 1)
{
F2btn_back_flag = 0;
setDisplayMode(NORMAL);
continue;
}
setDisplayMode(SETUP);
}
LCD_Display();
if(usart1Info.InfBit.finishFlag == REC_OK)
{
usart1Info.rxBuf[usart1Info.InfBit.dataLen++] = '\0';
printf("usart1Info.rxBuf:%s\r\n",usart1Info.rxBuf);
Info_Alter((char*)usart1Info.rxBuf);
usart1Info.InfBit.finishFlag = REC_WAIT;
usart1Info.InfBit.dataLen = 0;
}
}
}
3、实验现象
实现的功能 |
---|
1、给单片机上电会显示欢迎界面然后进入烟雾浓度显示界面 | 2、按下按键1控制LED点亮,按下按键2控制LED熄灭 | 3、ADC采集烟雾传感器浓度,并显示到LCD屏幕上 | 4、通过串口助手向单片机发送阈值设置指令,设置阈值成功后会给串口助手返回修改成功信息 | 5、烟雾浓度超过所设置的阈值时,触发蜂鸣器报警 | 6、按下按键1时,就会进入阈值设置画面,再按下按键1,烟雾浓度阈值就会加0.1,当按下按键2的时候就会回到主页面 按下按键2时,就会进入阈值设置画面,再按下按键2,烟雾浓度阈值就会减0.1,当按下按键1的时候就会回到主页面 |
[外链图片转存中…(img-seB2Y1W2-1626783255189)]
|