一、功能簡(jiǎn)介
本項(xiàng)目使用Proteus8仿真STM32單片機(jī)控制器,使用LCD1602顯示模塊、按鍵模塊、LED和蜂鳴器、繼電器直流電機(jī)模塊、DS18B20溫度傳感器、MQ2煙霧傳感器等。
主要功能:
系統(tǒng)運(yùn)行后,LCD1602顯示溫度和MQ2煙霧傳感器檢測(cè)的溫度及煙霧濃度;當(dāng)檢測(cè)溫度或煙霧濃度高于設(shè)置的溫度或煙霧閾值,則聲光報(bào)警且澆水 滅火裝置開(kāi)啟??赏ㄟ^(guò)按鍵K3進(jìn)入閾值設(shè)置模式,K1和K2進(jìn)行加減調(diào)節(jié), K4確定。
主要功能如下:
(1)溫度/煙霧濃度檢測(cè);
(2)LCD1602顯示;
(3)溫度/煙霧閾值設(shè)置;
(4)超限聲光報(bào)警;
(5)自動(dòng)滅火。
二、軟件設(shè)計(jì)
//參數(shù)初始化
void sys_parm_init(void)
{
sys_ctrl.mode=0;
sys_ctrl.temph=50;
sys_ctrl.smokeh=55;
}
//系統(tǒng)初始界面顯示
void sys_open_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0,"Tp: C");
lcd1602_show_string(9,0,"TpH: C");
lcd1602_show_string(0,1,"Yw: %");
lcd1602_show_string(9,1,"YwH: %");
}
//系統(tǒng)數(shù)據(jù)獲取
void sys_data_get(void)
{
static u8 i=0;
while(1)
{
//溫度獲取
i++;
if(i%10==0)
sys_ctrl.temp=DS18B20_GetTemperture();
//煙霧濃度獲取
sys_ctrl.smoke=pcf8591_read_adcvalue(0);
sys_ctrl.smoke=cal_map(sys_ctrl.smoke,0,255,0,99);
break;
}
}
//系統(tǒng)數(shù)據(jù)顯示
void sys_data_show(void)
{
while(1)
{
//溫度顯示
lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);
//煙霧濃度顯示
lcd1602_show_nums(3,1,sys_ctrl.smoke,2,0);
//溫度閾值顯示
lcd1602_show_nums(13,0,sys_ctrl.temph,2,0);
//煙霧濃度閾值顯示
lcd1602_show_nums(13,1,sys_ctrl.smokeh,2,0);
//閾值設(shè)定,數(shù)據(jù)位置閃爍
switch(sys_ctrl.mode)
{
case 1://溫度
lcd1602_show_string(13,0," ");
delay_ms(100);
lcd1602_show_nums(13,0,sys_ctrl.temph,2,0);
break;
case 2://煙霧濃度
lcd1602_show_string(13,1," ");
delay_ms(100);
lcd1602_show_nums(13,1,sys_ctrl.smokeh,2,0);
break;
}
break;
}
}
//系統(tǒng)數(shù)據(jù)設(shè)置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
//模式設(shè)置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>=3)sys_ctrl.mode=1;
}
//在設(shè)置模式下,加
else if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度閾值
sys_ctrl.temph++;
if(sys_ctrl.temph >99)sys_ctrl.temph=0;
break;
case 2://煙霧濃度閾值
sys_ctrl.smokeh++;
if(sys_ctrl.smokeh >99)sys_ctrl.smokeh=0;
break;
}
}
//在設(shè)置模式下,減
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度閾值
sys_ctrl.temph--;
if(sys_ctrl.temph< 0)sys_ctrl.temph=99;
break;
case 2://煙霧濃度閾值
sys_ctrl.smokeh--;
if(sys_ctrl.smokeh< 0)sys_ctrl.smokeh=99;
break;
}
}
//確定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
}
}
//系統(tǒng)功能控制
void sys_fun_ctrl(void)
{
//正常工作模式下
if(sys_ctrl.mode==0)
{
//若溫度高于閾值,或者,煙霧濃度高于閾值則蜂鳴器聲光報(bào)警,開(kāi)啟滅火裝置
if(sys_ctrl.temp>sys_ctrl.temph || sys_ctrl.smoke>sys_ctrl.smokeh)
{
RELAY=0;//打開(kāi)滅火裝置
beep_alarm(1,1000);//打開(kāi)蜂鳴器報(bào)警
}
//若溫度和煙霧濃度都低于閾值,則關(guān)閉蜂鳴器,關(guān)閉滅火裝置
else
{
RELAY=1;//關(guān)閉滅火裝置
BEEP=1;//關(guān)閉蜂鳴器報(bào)警
}
}
}
//應(yīng)用控制系統(tǒng)
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系統(tǒng)參數(shù)初始化
KEY_Init();
BEEP_Init();
DS18B20_Init();
ctrl_pin_init();
pcf8591_init();
lcd1602_init();//LCD1602初始化
//讀取溫度數(shù)據(jù),等待穩(wěn)定
while(i--)
{
//溫度獲取
sys_ctrl.temp=DS18B20_GetTemperture();
//煙霧濃度獲取
sys_ctrl.smoke=pcf8591_read_adcvalue(0);
sys_ctrl.smoke=cal_map(sys_ctrl.smoke,0,255,0,99);
delay_ms(100);
}
sys_open_show();//系統(tǒng)初始界面顯示
while(1)
{
sys_data_get();//系統(tǒng)數(shù)據(jù)獲取
sys_data_show();//系統(tǒng)數(shù)據(jù)顯示
sys_data_set();//系統(tǒng)數(shù)據(jù)設(shè)置
sys_fun_ctrl();//系統(tǒng)功能控制
}
}
三、實(shí)驗(yàn)現(xiàn)象
評(píng)論
查看更多