基于STM32物联网WiFi云平台温湿度烟雾报警器设计
本设计包含proteus仿真+程序代码+设计报告+讲解视频
一、开发环境
仿真图:proteus 8.17
程序编译器:keil 5
编程语言:C语言
设计编号:C0134
二、主要功能
STM32物联网WiFi云平台温湿度烟雾报警器仿真设计
- 烟雾采集传感器选用MQ-2,由于该传感器输出的是模拟信号,STM32内部ADC将模拟信号转为数字信号。
proteus仿真使用电位器模拟;
-
温湿度采集使用DHT11数字传感器;
-
显示设备使用OLED,可以在屏幕上显示实时烟雾浓度值、温湿度值等信息;
-
报警模块则采用蜂鸣器和LED灯组成,烟雾浓度超过阈值蜂鸣器会鸣叫报警,灯光闪烁;
-
系统带有通风风扇,烟雾浓度高的时候开启;
-
设计采用1个按键作为操作输入设备,可以用来关闭报警;
6.通过WIFI模块ESP01S将数据实时上传至物联网云平台,仿真中使用串口通信模拟。


资料下载链接:
KEY_C0134 STM32远程WIFI温湿度烟雾监测报警OLED显示
链接: https://pan.baidu.com/s/1a5ZDB_Z1Ac4AYOm4tLU0rg?pwd=yzis
提取码: yzis
以下为本设计资料展示:
三、仿真设计
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。


四、程序代码
程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序有注释可以结合讲解视频理解。

c
//单片机头文件
#include "stm32f10x.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "beep.h"
#include "led.h"
#include "fan.h"
#include "key.h"
#include "dht11.h"
#include "oled.h"
#include "mq2.h"
#include "fan_pwm.h"
//C库
#include <string.h>
#include <stdio.h>
#define ESP8266_ONENET_INFO "AT+CIPSTART=\"TCP\",\"mqtts.heclouds.com\",1883\r\n"
void Hardware_Init(void);
void Display_Init(void);
void Refresh_Data(void);
u8 temp,humi,fan_adj;
float mq2_vol,smog_th=200.0;
uint8_t Fan_Status=0;
uint8_t Beep_Status;
uint8_t Status_Change;
/*
************************************************************
* 函数名称: main
*
* 函数功能:
*
* 入口参数: 无
*
* 返回参数: 0
*
* 说明:
************************************************************
*/
int main(void)
{
DHT11_Data_TypeDef DHT11_Data;
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
uint8_t smog_lock=0;
Hardware_Init(); //初始化外围硬件
ESP8266_Init(); //初始化ESP8266
//// UsartPrintf(USART_DEBUG, "Connect MQTTs Server...\r\n");
// OLED_Clear(); OLED_ShowString(0,0,"Connect MQTTs Server...",16);
// while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
// DelayXms(500);
//// UsartPrintf(USART_DEBUG, "Connect MQTT Server Success\r\n");
// OLED_ShowString(0,4,"Connect MQTT Server Success",16); DelayXms(500);
// OLED_Clear(); OLED_ShowString(0,0,"Device login ...",16);
// while(OneNet_DevLink()) //接入OneNET
// {
// ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT");
// DelayXms(500);
// }
// OneNET_Subscribe();
Display_Init();
// Led_Set(LED_ON);
mq2_vol=65;
temp=25;
humi=45;
while(1)
{
if(++timeCount >= 100) //发送间隔5s
{
// DHT11_Read_Data(&temp,&humi);
if(DHT11_Read_TempAndHumidity(&DHT11_Data) == SUCCESS) {
humi = DHT11_Data.humi_int;
temp = DHT11_Data.temp_int;
}
// UsartPrintf(USART_DEBUG, "OneNet_SendData\r\n");
OneNet_SendData(); //发送数据
timeCount = 0;
ESP8266_Clear();
mq2_vol=MQ2_GetData_PPM();
UsartPrintf(USART_DEBUG, "mq2_data----%.2f\r\n",mq2_vol);
if(Status_Change){
Status_Change=0;
Display_Init();
}
}
dataPtr = ESP8266_GetIPD(0);
if(dataPtr != NULL)
OneNet_RevPro(dataPtr);
Refresh_Data();
/***利用smog_lock进行自锁操作,避免重复无效控制,超阈值后,只执行一次,实现蜂鸣器可以被手动按停,
直到降到阈值以下,才解锁,进入下轮阈值检测***/
if(mq2_vol>smog_th && smog_lock==0)
{
smog_lock = 1;
Fan_Set(FAN_ON);
Beep_Set(BEEP_ON);
}
if(mq2_vol<smog_th && smog_lock==1)
{
smog_lock = 0;
}
if(smog_lock && (timeCount>50)){
Led_Set(LED_ON);
}else{
Led_Set(LED_OFF);
}
DelayMs(10);
}
}
/*
************************************************************
* 函数名称: Hardware_Init
*
* 函数功能: 硬件初始化
*
* 入口参数: 无
*
* 返回参数: 无
*
* 说明: 初始化单片机功能以及外接设备
************************************************************
*/
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Delay_Init(); //systick初始化
Usart1_Init(115200); //串口1,打印信息用
Usart2_Init(115200); //串口2,驱动ESP8266用
Key_Init();
Led_Init();
Beep_Init();
DHT11_Init();
OLED_Init(); //初始化OLED
// while(DHT11_Init())
// {
//// UsartPrintf(USART_DEBUG, "DHT11 Error \r\n");
// OLED_ShowString(0,0,"DHT11 Error",16);
// DelayMs(1000);
// }
Fan_Init();
UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
OLED_Clear(); OLED_ShowString(0,0,"Hardware init OK",16); DelayMs(1000);
}
void Display_Init(void)
{
OLED_Clear();
OLED_ShowCHinese(0,0,1);//温
OLED_ShowCHinese(18,0,2);//度
OLED_ShowCHinese(36,0,0);//:
OLED_ShowCHinese(72,0,3);//℃
OLED_ShowCHinese(0,3,4);//湿
OLED_ShowCHinese(18,3,5);//度
OLED_ShowCHinese(36,3,0);//:
OLED_ShowString(72,3,"%",16);//%
OLED_ShowCHinese(0,6,10);//烟
OLED_ShowCHinese(18,6,11);//雾
OLED_ShowCHinese(36,6,0);//:
}
void Refresh_Data(void)
{
static u8 changeflag = 0;
static u8 last_status = 0; // 记录上一次的Status_Change状态
char buf[5];
if(Status_Change) {
// 如果状态从非Status_Change变为Status_Change,才执行OLED_Clear()
if(last_status == 0) {
OLED_Clear();
}
OLED_ShowCHinese(0,4,10); //烟
OLED_ShowCHinese(18*1,4,11);//雾
OLED_ShowCHinese(18*2,4,12);//阈
OLED_ShowCHinese(18*3,4,13);//值
OLED_ShowCHinese(18*4,4,0); //:
memset(buf, 0, sizeof(buf));
sprintf(buf, "%4.0fppm", smog_th);
OLED_ShowString(18*2,6,(u8*)buf,16); //烟雾阈值
}
else {
// 原有的其他代码...
sprintf(buf, "%2d", temp);
OLED_ShowString(54,0,(u8*)buf,16); //温度值
sprintf(buf, "%2d", humi);
OLED_ShowString(54,3,(u8*)buf,16); //湿度值
sprintf(buf, "%4.0f PPM", mq2_vol);
OLED_ShowString(54,6,(u8*)buf,16); //烟雾测量值
}
last_status = Status_Change; // 更新状态记录
}
程序流程图:

五、设计说明书
10761字,内容包括硬件设计、软件设计、结论等。

六、资料清单&下载链接

资料下载链接:
链接: https://pan.baidu.com/s/1a5ZDB_Z1Ac4AYOm4tLU0rg?pwd=yzis
提取码: yzis