基于STM32物联网WiFi云平台温湿度烟雾报警器设计

基于STM32物联网WiFi云平台温湿度烟雾报警器设计

本设计包含proteus仿真+程序代码+设计报告+讲解视频

一、开发环境

仿真图:proteus 8.17

程序编译器:keil 5

编程语言:C语言

设计编号:C0134

二、主要功能

STM32物联网WiFi云平台温湿度烟雾报警器仿真设计

  1. 烟雾采集传感器选用MQ-2,由于该传感器输出的是模拟信号,STM32内部ADC将模拟信号转为数字信号。

proteus仿真使用电位器模拟;

  1. 温湿度采集使用DHT11数字传感器;

  2. 显示设备使用OLED,可以在屏幕上显示实时烟雾浓度值、温湿度值等信息;

  3. 报警模块则采用蜂鸣器和LED灯组成,烟雾浓度超过阈值蜂鸣器会鸣叫报警,灯光闪烁;

  4. 系统带有通风风扇,烟雾浓度高的时候开启;

  5. 设计采用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

相关推荐
小慧10241 小时前
STM 32 TIM定时器(1)
单片机·嵌入式硬件
崇山峻岭之间13 小时前
单片机LCD实验
单片机·嵌入式硬件
m0_3771081413 小时前
STM32-adc
stm32·单片机·嵌入式硬件
【云轩】15 小时前
如何设计一台能模拟电机的电子负载:一个硬件工程师的实战笔记
笔记·嵌入式硬件
SmartRadio15 小时前
STM32WLE5 LoRa Smart TDMA 完整协议栈实现(工程级可直接编译)-【1】
javascript·stm32·单片机·嵌入式硬件·lora·自组网·smart tdma
上海合宙LuatOS15 小时前
Air8000多网通信- Netdrv
物联网·luatos·多网融合
TDengine (老段)18 小时前
TDengine WAL 预写日志机制 — 持久性保障与崩溃恢复
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Geometry Fu18 小时前
《物联网安全》第3.1章 RFID安全
物联网·安全·rfid
平安的平安19 小时前
从“数据孤岛“到“数据融合“:DolphinDB 多模引擎如何打通工业物联网的“任督二脉“
物联网