本设计的硬件构成:
stm32单片机最小系统板(晶振+复位电路),MQ-3酒精传感器模块、OLED显示屏、按键、语音播报模块、继电器电路、蓝牙模块;
功能介绍:
1、采用酒精传感器检测酒精浓度,并且在oled显示屏上显示当前浓度值,并显示设置的报警阈值;
2、可通过按键调整报警阈值;若超过阈值,语音播报报警信息,继电器开启。按键1:设置键;按键2:加一键;按键3:减一键;
3、可通过按键调整报警阈值;若超过阈值,语音播报报警信息,继电器开启。按键1:设置键;按键2:加一键;按键3:减一键;
主要物料清单及型号:
部分程序源码:
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
uart_init(9600);
usart2_Init(9600);
TIM2_Int_Init(999,7199);//10Khz的计数频率,计数到5000为500ms
Adc_Init();
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,2);
if(TEXT_Buffer[0]!=0xffff)
{
WARNING = TEXT_Buffer[0];
}
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_ShowChinese(16,0,0,16);//烟雾报警系统
OLED_ShowChinese(32,0,1,16);
OLED_ShowChinese(48,0,2,16);
OLED_ShowChinese(64,0,3,16);
OLED_ShowChinese(80,0,4,16);
OLED_ShowChinese(96,0,5,16);
OLED_ShowChinese(0,16,6,16); //浓度
OLED_ShowChinese(16,16,7,16);
OLED_ShowChar(32,16,':',16);
OLED_ShowChar(40,16,' ',16);
OLED_ShowChar(48,16,ALValue%1000/100+0x30,16);
OLED_ShowChar(56,16,ALValue%100/10+0x30,16);
OLED_ShowChar(64,16,ALValue%10+0x30,16);
OLED_ShowString(72,16,"mg/L ",16);
OLED_ShowChinese(0,32,14,16); //阈值
OLED_ShowChinese(16,32,15,16);
OLED_ShowChar(32,32,':',16);
OLED_ShowChar(40,32,' ',16);
OLED_ShowChar(48,32,WARNING%1000/100+0x30,16);
OLED_ShowChar(56,32,WARNING%100/10+0x30,16);
OLED_ShowChar(64,32,WARNING%10+0x30,16);
OLED_ShowString(72,32,"mg/L ",16);
OLED_ShowChinese(0,48,8,16); //状态
OLED_ShowChinese(16,48,9,16);
OLED_ShowChar(32,48,':',16);
OLED_ShowChar(40,48,' ',16);
if(smoke_flag==0)
{
OLED_ShowChinese(48,48,10,16); //状态正常
OLED_ShowChinese(64,48,11,16);
}
else
{
OLED_ShowChinese(48,48,12,16); //状态正常
OLED_ShowChinese(64,48,13 ,16);
}
OLED_Refresh();
LEDB=1;
LEDR=1;
BEEP=1;
while(1)
{
key=KEY_Scan(1); //得到键值
// if(key==0)
// key = APP_Handle(revData);
KEY_Handle(key);
if(W_100ms>=40)
{
W_100ms=0;
if(smoke_flag>=1)
{
play_voice(1);
}
}
if(T_100ms>=10)
{
T_100ms = 0;
//采集烟雾浓度值
ALValue = (u16)(Get_Adc(9)/3);
if(ALValue>999)
ALValue = 999;
if (ALValue > K_ZERO)
ALValue = ALValue - K_ZERO; //首先减去零点漂移
else
ALValue = 0;
APP_Update();
if(ALValue>WARNING)
{
smoke_flag =1;
relay=0;
}
else
{
smoke_flag =0;
relay=1;
}
}
if(set==0) //set为0,说明现在不是设置状态
display_refresh(); //显示AD数值和报警值
delay_ms(10);
}
}
资料链接:https://pan.baidu.com/s/1GiwS3vgvv-UXr6QacnFDlw
提取码:hnqr