1 簡介
Hi,大家好,這里是丹成學(xué)長,今天向大家介紹一個 單片機項目
基于單片機的火災(zāi)報警系統(tǒng)設(shè)計與實現(xiàn)
大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計
?? 項目分享:
https://gitee.com/sinonfin/sharing
2 緒論
2.1 課題背景與目的
火災(zāi)是指在時間或空間上失去控制的燃燒所造成的災(zāi)害。在各種災(zāi)害中,火災(zāi)是最經(jīng)常、最普遍地威脅公眾安全和社會發(fā)展的主要災(zāi)害之一。人類能夠?qū)疬M行利用和控制,是文明進步的一個重要標(biāo)志?;?,給人類帶來文明進步、光明和溫暖。但是,失去控制的火,就會給人類造成巨大的災(zāi)難。本系統(tǒng)是一個由單片機控制的火災(zāi)煙霧濃度、溫度檢測系統(tǒng),它將傳感器輸出地電壓信號進行A/D轉(zhuǎn)換、濾波、線性化,由單片機將電壓值轉(zhuǎn)換為氣體濃度和溫度送LED顯示,并判斷是否超過報警上限,若超過,則發(fā)出聲光報警。同時用戶可以自己設(shè)定報警上限和定時時間,使用戶可以根據(jù)實際情況方便的掌握安全狀況。本系統(tǒng)的設(shè)計能夠及時監(jiān)測到系統(tǒng)故障和環(huán)境中有無火災(zāi),火災(zāi)一旦發(fā)生將實現(xiàn)聲光報警,并采取有效措施控制火情的發(fā)展,將火災(zāi)消滅在萌芽狀態(tài),以確保人身財產(chǎn)安全,最大限度地減少損失。
目標(biāo)
通過設(shè)計一個以 stm32單片機為核心外加 MQ-2 型半導(dǎo)體電阻式霧敏感器件的火災(zāi)報警器可以實現(xiàn)聲光報警、 故障自診斷、 濃度顯示、 報警限設(shè)置、 延時報警及與上位機串口通信等功能。
是一種結(jié)構(gòu)簡單、 性能穩(wěn)定、 使用方便、 價格低廉、智能化的火災(zāi)報警器, 具有一定的實用價值。
3 煙霧傳感器介紹
3.1 類型
煙霧傳感器種類繁多, 從檢測原理上可以分為三大類:
- (a) 利用物理化學(xué)性質(zhì)的煙霧傳感器: 如半導(dǎo)體煙霧傳感器、 接觸燃燒煙霧傳感器等。
- (b) 利用物理性質(zhì)的煙霧傳感器: 如熱導(dǎo)煙霧傳感器、 光干涉煙霧傳感器、 紅外傳感器等。
- ? 利用電化學(xué)性質(zhì)的煙霧傳感器: 如電流型煙霧傳感器、 電勢型氣體傳感器等。
3.2 MQ系列傳感器介紹
MQ系列傳感器使用的敏感材料是活性很高的金屬氧化物半導(dǎo)體,傳感器加熱后,在不同氣體濃度中電導(dǎo)率不同。使用簡單的電路就可以將電導(dǎo)率的變化轉(zhuǎn)換成與該氣體濃度相對應(yīng)的信號輸出了。
3.3 模塊介紹
MQ-2傳感器對可燃氣、煙霧等氣體靈敏度高,基于MQ-2的煙霧傳感器模塊通過電路設(shè)計,提供了兩種輸出方式:
- 數(shù)字量輸出:通過板載電位器設(shè)定濃度閾值,當(dāng)檢測到環(huán)境氣體濃度超過閾值時,通過數(shù)字引腳DO輸出低電平。
- 模擬量輸出:濃度越高,AO引腳輸出的電壓值越高,通過ADC采集的模擬值越高。
4 系統(tǒng)設(shè)計
報警器系統(tǒng)結(jié)構(gòu)框圖如下圖所示,系統(tǒng)以單片機為核心,配合外圍電路共同完成:
- 信號采集
- 濃度顯示
- 時間顯示
- 狀態(tài)顯示
- 聲音及閃爍報警
- 按鍵輸入
- 故障自檢等功能。
報警器采用巡檢的工作方式,進行兩級報警值設(shè)定,并發(fā)出不同的光、聲信號。系統(tǒng)應(yīng)采用高性能的單片機,要求工作穩(wěn)定、測量精度高、通用性強、功耗低,保證報警器的精確性及可靠性,而且最好體積小,成本低有利于減少報警器的體積,降低報警器的成本
4.1 自診斷故障報警功能
當(dāng)傳感器加熱絲或者電纜線發(fā)生斷線或者接觸不良的情況時, 報警器發(fā)出警報, 并且黃色指示燈閃爍, 提醒用戶檢查傳感器或者電路線接觸情況, 及時排除故障, 保證安全。
4.2 煙霧濃度顯示
通過液晶屏顯示可燃煙霧的濃度值, 并且可以切換到設(shè)置狀態(tài), 通過鍵盤設(shè)置或者更改報警限值, 以便于用戶或檢測人員隨時觀測煙霧濃度及更改報警限。
4.3 煙霧報警功能
當(dāng)煙霧濃度連續(xù) 20 秒取值都在報警限值之上, 蜂鳴器開始報警, 且聲音越來越急促,并且伴隨紅燈閃爍。 因為人對變化的信號更為敏感, 所以變化的聲音及燈光更容易引起用戶的注意。
4.4 防止報警器誤報功能
快速重復(fù)檢測及延時報警可以區(qū)別出是管道中可燃煙霧的泄漏, 還是由于打開閥門時的微量煙霧的散失。
4.5 看門狗自檢單片機狀態(tài)功能
調(diào)用單片機中的看門狗程序, 定時檢查單片機工作狀態(tài), 一旦發(fā)現(xiàn)單片機出現(xiàn)死循環(huán)狀態(tài), 立即復(fù)位, 保證報警器工作正常。
4.6 與上位機通訊功能
可以實現(xiàn)與計算機串口通訊, 對報警器采取統(tǒng)一控制, 以及便于采集和處理數(shù)據(jù), 也可以在計算機上更改報警限值等。
4.7 自動控制相關(guān)安全裝置的擴展功能
留有繼電器接口, 可以帶動排風(fēng)扇或大功率蜂鳴器, 也可以控制管道電子閥門, 可在報警的同時自動啟動相關(guān)安全裝置。
5 軟件設(shè)計
主程序流程圖如圖所示。
首先要給傳感器預(yù)熱三分鐘, 因為 MQ-2 型半導(dǎo)體電阻式煙霧傳感器在不通電存放一段時間后, 再次通電時, 傳感器不能立即正常采集煙霧信息,需要一段時間預(yù)熱。 程序初始化結(jié)束后, 系統(tǒng)進入監(jiān)控狀態(tài)。 本論文的主程序設(shè)計先對傳感器預(yù)熱三分鐘, 預(yù)熱同時, 對傳感器加熱絲故障檢測, 采用軟件方式檢測傳感器加熱絲或電纜線是否斷線或者接觸不良。
5.1 初始化流程
5.2 傳感器數(shù)據(jù)濾波
在煙霧傳感器對煙霧濃度采樣時, 可能會遇到尖脈沖干擾的現(xiàn)象。 干擾通常只影響個別采樣點的數(shù)據(jù), 此數(shù)據(jù)與其他采樣點的數(shù)據(jù)相差比較大。
5.3 報警子程序
當(dāng)煙霧濃度超過報警設(shè)定值時, 報警器發(fā)出一種近似警笛的鳴叫聲, 對應(yīng)通道的紅燈閃亮, 以提示操作人員采取安全對策或自動控制相關(guān)安全裝置, 從而保障生產(chǎn)安全, 避免火災(zāi)和爆炸事故的發(fā)生。
6 實現(xiàn)效果
文章來源:http://www.zghlxwxcb.cn/news/detail-763947.html
7 部分相關(guān)代碼
#ifndef __SMOKE_H
#define __SMOKE_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
//正常狀態(tài)高電平,有煙霧低電平,單片機檢測到下降沿觸發(fā)中斷
//引腳定義
#define SMOKE_INT_GPIO_PORT GPIOB
#define SMOKE_INT_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
#define SMOKE_INT_GPIO_PIN GPIO_Pin_4
#define SMOKE_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
#define SMOKE_INT_EXTI_PINSOURCE GPIO_PinSource4
#define SMOKE_INT_EXTI_LINE EXTI_Line4 //中斷標(biāo)志位
#define SMOKE_INT_EXTI_IRQ EXTI4_IRQn
#define SMOKE_IRQHandler EXTI4_IRQHandler
#define SMOKE_BIT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//讀取
void EXTI_SMOKE_Config(void);
#endif
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//功能:煙霧探測器模塊驅(qū)動
//作用:
//編寫:MARK
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include "smoke.h"
#include "stm32f10x_gpio.h"
static void SMOKE_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC為優(yōu)先級組1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中斷源*/
NVIC_InitStructure.NVIC_IRQChannel = SMOKE_INT_EXTI_IRQ;
/* 配置搶占優(yōu)先級 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子優(yōu)先級 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中斷通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 配置 IO為EXTI中斷口,并設(shè)置中斷優(yōu)先級
* @param 無
* @retval 無
*/
void EXTI_SMOKE_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*開啟GPIO口的時鐘*/
RCC_APB2PeriphClockCmd(SMOKE_INT_GPIO_CLK,ENABLE);
/* 配置 NVIC 中斷*/
SMOKE_NVIC_Configuration();
/* 選擇用到的GPIO */
GPIO_InitStructure.GPIO_Pin = SMOKE_INT_GPIO_PIN;
/* 配置為浮空輸入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(SMOKE_INT_GPIO_PORT, &GPIO_InitStructure);
/* 選擇EXTI的信號源 */
GPIO_EXTILineConfig(SMOKE_INT_EXTI_PORTSOURCE, SMOKE_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = SMOKE_INT_EXTI_LINE;
/* EXTI為中斷模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿下降沿中斷觸發(fā) */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
/* 使能中斷 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
#include <stdio.h>
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "./LED/LED.h"
#include "./usart3/usart3.h"
#include "./cJSON/cJSON.h"
#include "./millis/millis.h"
#include "./yun/yun.h"
#include "./systick/bsp_SysTick.h"
#include "./dht11/bsp_dht11.h"
#include "all_init.h"
#include "math_display.h"
#include "bsp_beep.h"
#include "./stepmotor/stepmotor.h"
#include "smoke.h"
volatile u8 aRxBuffer[1024]={0x00};
volatile u8 RxCounter=0;
volatile u8 ReceiveState=0;
unsigned long lastCheckInTime = 0; //記錄上次報到時間
unsigned long lastCheckStatusTime = 0;
unsigned long lastSayTime = 0;
unsigned long lastUpdateTime = 0; //記錄上次上傳數(shù)據(jù)時間
const unsigned long postingInterval = 40000; // 每隔40秒向服務(wù)器報到一次
const unsigned long statusInterval = 100000; // 數(shù)據(jù)上傳間隔時間10秒
const unsigned long updateInterval = 5000;
/*用CJSON處理接收到的信息*/
int processMessage(char *msg) {
cJSON *jsonObj = cJSON_Parse(msg);
cJSON *method;
char *m;
//json字符串解析失敗,直接退出
if(!jsonObj)
{
//uart1.printf("json string wrong!");
return 0;
}
method = cJSON_GetObjectItem(jsonObj, "M");
m = method->valuestring;
if(strncmp(m, "WELCOME", 7) == 0)
{
//防止設(shè)備在線狀態(tài)未消除,先登出
checkout();
//防止連續(xù)發(fā)送指令過快
Delay_ms(50);
checkin();
}
if(strncmp(m, "connected", 9) == 0)
{
checkout();
Delay_ms(50);
checkin();
}
//有設(shè)備或用戶登錄,發(fā)送歡迎信息
if(strncmp(m, "login", 5) == 0)
{
char *from_id = cJSON_GetObjectItem(jsonObj, "ID")->valuestring;
char new_content[] = "Dear friend, welcome to BIGIOT !";
say(from_id, new_content);
}
//收到say指令,執(zhí)行相應(yīng)動作,并進行相應(yīng)回復(fù)
if(strncmp(m, "say", 3) == 0 && millis() - lastSayTime > 10)
{
char *content = cJSON_GetObjectItem(jsonObj, "C")->valuestring;
char *from_id = cJSON_GetObjectItem(jsonObj, "ID")->valuestring;
lastSayTime = millis();
if(strncmp(content, "play", 4) == 0)
{
char new_content[] = "led1 played";
//do something here....
Led_On(LED1);//板載LED1亮
say(from_id, new_content);
}
else if(strncmp(content, "stop", 4) == 0)
{
char new_content[] = "led stoped";
//do something here....
Led_Off(LED1);//板載LED滅
say(from_id, new_content);
}
else if(strncmp(content, "up", 2) == 0)
{
char new_content[] = "led2 played";
//do something here....
Led_On(LED2);//板載LED2亮
say(from_id, new_content);
}
else if(strncmp(content, "plus", 4) == 0)
{
char new_content[] = "led2 stoped";
//do something here....
Led_Off(LED2);//板載LED2滅
say(from_id, new_content);
}
else if(strncmp(content, "pause", 5) == 0)
{
char new_content[] = "beep played";
macBEEP_ON();//打開蜂鳴器
say(from_id, new_content);
}
else if(strncmp(content, "right", 5) == 0)
{
char new_content[] = "beep stoped";
macBEEP_OFF();//關(guān)閉蜂鳴器
say(from_id, new_content);
}
else if(strncmp(content, "down", 4) == 0)
{
char new_content[] = "stepmotor played";
Motor_angle(-720,200); //步進電機順時針
say(from_id, new_content);
}
else if(strncmp(content, "forward", 7) == 0)
{
char new_content[] = "stepmotor stoped";
Motor_angle(720,200); //步進電機逆時針
say(from_id, new_content);
}
}
if(jsonObj)cJSON_Delete(jsonObj);
return 1;
}
int main(void)
{
u8 i = 0;
float wendu;
float shidu;
int yanwu;
int chuanglian;
DHT11_Data_TypeDef DHT11_Data;
all_init(); //打包的全部初始化函數(shù)
while (1)
{
//delay_ms(100);
if (millis() - lastCheckInTime > postingInterval || lastCheckInTime == 0)
{
checkin();
lastCheckInTime = millis();
}
if (millis() - lastCheckStatusTime > statusInterval)
{
check_status();
lastCheckStatusTime = millis();
}
if( DHT11_Read_TempAndHumidity ( & DHT11_Data ) == SUCCESS)//調(diào)用DHT11_Read_TempAndHumidity讀取溫濕度,
//若成功則輸出該信息
{
display_num(DHT11_Data.temp_int,DHT11_Data.temp_deci,DHT11_Data.humi_int,DHT11_Data.humi_deci);
//屏幕顯示溫度和濕度值,封裝后的程序
if (millis() - lastUpdateTime > updateInterval)
{
wendu = (float)DHT11_Data.temp_int + (float)DHT11_Data.temp_deci/10.0;
shidu = (float)DHT11_Data.humi_int + (float)DHT11_Data.humi_deci/10.0;
if(SMOKE_BIT == Bit_RESET) //檢測到該引腳電平變低---有煙霧
{
yanwu = 1;
}
else if(SMOKE_BIT == Bit_SET) //檢測到該引腳電平變高---正常
{
yanwu = 0;
}
/*上傳三個接口的實時數(shù)據(jù)*/
update4(DEVICEID, INPUTID_1, wendu, INPUTID_2, shidu, INPUTID_3, yanwu, INPUTID_4, chuanglian);
lastUpdateTime = millis();
}
}
if(ReceiveState == 1)
{
ReceiveState = 0;
i = 0;
processMessage(aRxBuffer);
RxCounter = 0;
}
}
}
8 最后
?? 項目分享:
https://gitee.com/sinonfin/sharing文章來源地址http://www.zghlxwxcb.cn/news/detail-763947.html
到了這里,關(guān)于stm32畢設(shè)分享 火災(zāi)報警系統(tǒng)設(shè)計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!