实现的功能:通过MQ-2监测当前环境的烟雾浓度,软件设置报警上限显示的是电压值并显示在lcd1602的第二行,第一行是实际的检测值,这里引用了ADC单通道采集DMA读取,显示的也是电压值,具体原理查看烟雾报警器的原理,如果当前的数值大于设置的上限则会导致蜂鸣器报警,并会开启风扇,反之则不会。并且这里还设置了手动调报警上限值的两个按钮,可以随时实现调大调小。
main.c文件代码如下:
#include "lcd1602.h"
#include "beep.h"
#include "key.h"
int main(void)
{
float smoke_value =0 ;
float limit_value =1.0;
uint8_t key_num =0 ;
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();
uart1_init(115200);
KEY_init();
adc_dma_init();
fan_init();
lcd1602_init();
beep_init();
printf("hello world!\r\n");
lcd1602_show_line(1,1,"Smoke: 0.0 V");
lcd1602_show_line(2,1,"Limit: - 0.0 + ");
while(1)
{
key_num =KEY_scan();
if(key_num ==1)
limit_value +=0.1;
else if (key_num ==2)
limit_value -=0.1;
lcd1602_display_limit(limit_value);
smoke_value =adc_get_smoke();
lcd1602_display_smoke(smoke_value);
if(smoke_value >limit_value)
{
beep_on();
fan_on();
}
else
{
beep_off();
fan_off();
}
}
}
lcd1602.c文件核心如下:
void lcd1602_display_smoke(float smoke_value)
{
char msg[16]={0};
sprintf(msg,"Smoke: %0.2f V",smoke_value);
lcd1602_show_line(1,1,msg);
}
void lcd1602_display_limit(float limit_value)
{
char msg[16]={0};
sprintf(msg,"limit: - %0.2f +",limit_value);
lcd1602_show_line(2,1,msg);
}
adc.c 文件代码核心如下:
void adc_dma_init(void)
{
adc_config();
adc_channel_config(&adc_handle,ADC_CHANNEL_8,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_239CYCLES_5);
dma_config();
HAL_ADC_Start_DMA(&adc_handle,(uint32_t *)&adc_value,1);
}
float adc_get_smoke(void)
{
return (float)adc_value/ 4096 *3.3;
}