基于STM32物联网WiFi云平台温湿度烟雾报警器设计
本设计包含proteus仿真+程序代码+设计报告+讲解视频
一、开发环境
仿真图:proteus 8.17
程序编译器:keil 5
编程语言:C语言
设计编号:C0134
二、主要功能
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的版本。程序有注释可以结合讲解视频理解。
//单片机头文件#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\",1883rn"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...rn");// 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 Successrn");// 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_SendDatarn"); OneNet_SendData(); //发送数据 timeCount = 0; ESP8266_Clear(); mq2_vol=MQ2_GetData_PPM(); UsartPrintf(USART_DEBUG, "mq2_data----%.2frn",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 rn");// OLED_ShowString(0,0,"DHT11 Error",16);// DelayMs(1000);// } Fan_Init(); UsartPrintf(USART_DEBUG, " Hardware init OKrn"); 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
阅读全文
117