单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

2023-11-08

想要更多项目私wo!!!

一、电路设计

室内环境智能监测系统
主要功能:
        1.检测空气温湿度
        2.检测光照强度
        3.检测烟雾浓度
        4.数据显示在手机端和设备OLED屏幕上
        5.当空气温度高于设定的阈值时,风扇开启
        6.当空气湿度低于设定的阈值时,加湿器开启
        7.当光照强度低于设定的阈值时,灯开启
        8.当烟雾浓度高于设定的阈值时,风扇开启蜂鸣器开启
        9.以上5~8条的阈值可以在手机端控制更改或者设备的按键进行更改
        10.设备具有手动和自动两种模式,可以通过手机或设备端更改
        11.可以用手机远程控制设备
        手动模式下可以控制风扇,加湿器,灯,蜂鸣器的开关
        自动模式下就是以上5~8条的阈值自动控制

二、运行结果

 

 

三、部分代码

#include "sys.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "ADC.h"
#include "usart3.h"
#include "key.h"
#include "oled.h"
#include "math.h"
#include "dht11.h"
#include "gizwits_product.h" 
#include "gizwits_protocol.h" 
#include "bh1750.h"
#include "math.h"
int wifi_linking;          //wifi连接状态,如果连上,值为1  如果未连接,值为0
int maxmode=0;             //手动/自动模式标识符
void key_scanf(void);      //WiFi连接控制,按下即可配网
//显示的时间
int display_hour;
int display_minute;
int display_second;
int display_day;
u32 STM32_xx0=0X4E4C4A;
u32 STM32_xx1=0X364B1322;
u32 STM32_xx2=0X132D13  ;

#define FLASH_SAVE_ADDR 0x08010000
u8 buff[30];//OLED显示缓存数组
u8 count;
dataPoint_t currentDataPoint;//云端数据点
u8 display_contrl=0;
//以下几个EXTERN的是定义在机智云产品.c文件里面的传来的参数
extern u16 TEMPYUZHI;
extern u16 HUMYUZHI;
extern u16 M2YUZHI;
extern u16 GZYUZHI;
//从光照的配置文件传来
extern int lux;
//从温湿度的配置文件传来
extern u8 DHT11_Temp,DHT11_Hum;		//温湿度
//外设采集来的数值
u16 gz_value;					  	//光照检测值			
u16 m2_value;						  //烟雾检测值
//初始阈值
u16 A_DHT11_Temp=35;			    	//温度阈值
u16 A_DHT11_Hum=10;				    	//湿度阈值
u16 A_gz_value=60;				      //光照强度阈值
u16 A_m2_value=1000;			    	//烟雾阈值
//此处表示上一次从手机发送来的数值,如果和上一次发来的不同,代表手机端又下发了新的阈值,新的阈值会生效,lastXXXXXX会变成新的
u16 lastTEMPYUZHI;
u16 lastHUMYUZHI;
u16 lastM2YUZHI;
u16 lastGZYUZHI;
//当前数值超标值为1,不超标值为0   
int flag_temp;
int flag_mq2;
//风扇,蜂鸣器的工作标志位
int flag;
int flag_2;
int times;
//协议初始化
void Gizwits_Init(void)
{	
	TIM3_Int_Init(9,7199);//1MS系统定时
  usart3_init(9600);//WIFI初始化
	memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
	gizwitsInit();//缓冲区初始化
}

//数据上传
void userHandle(void)
{
    currentDataPoint.valuetemp   = DHT11_Temp ;
    currentDataPoint.valuehumi   = DHT11_Hum;
    currentDataPoint.valueLight  = gz_value;
    currentDataPoint.valueMQ2    = m2_value; 
}

void Get_Data(u16 count);    //获取传感器数据
void WIFI_Contection(u8 key);//WiFi连接控制
void Canshu_Change(u8 key);  //系统参数调节
void Mode_Change(u8 key);    //模式切换

int main(void)
{	
	
	u8 t=0;
	int key_value;		//按键值
	uart_init(115200);	 		//串口初始化为115200
	delay_init();	          //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	Adc1_Channe_Init();			//ADC通道初始化
	KEY_Init();					    //按键引脚初始化
	Gizwits_Init();		      //机智云初始化
	while(DHT11_Init())     //DHT11模块初始化
	{
	 	delay_ms(600);
	};	  //等待DHT11的初始化
	LED_Init();		  		  	//LED初始化
	bh1750_iic_init();      //光照传感器初始化 
	RELAY_Init();           //继电器初始化
	BEEP=0;
	delay_ms(300);
	BEEP=1;//全部都初始化完成,蜂鸣器响一下
	OLED_Init();						//OLED初始化
	OLED_Clear();						//OLED清屏
		gizwitsSetMode(WIFI_AIRLINK_MODE);  //Air-link模式接入
while(1)
	{
	if(wifi_linking)
	{
    times++;
		if(times>=2)
		{
			times=0;
		gizwitsGetNTP();//获取网络时间
		delay_ms(100);
		}
	}
		Get_Data(0);
		if(TEMPYUZHI!=lastTEMPYUZHI)  //阈值的获取,如果和上次一样,就代表没变化,如果变化了,新收到的阈值会直接生效
	{
			A_DHT11_Temp=TEMPYUZHI;
		lastTEMPYUZHI=TEMPYUZHI;
	}
		if(HUMYUZHI!=lastHUMYUZHI)
	{
			A_DHT11_Hum=HUMYUZHI;
		lastHUMYUZHI=HUMYUZHI;
	}
		if(M2YUZHI!=lastM2YUZHI)
	{
			A_m2_value=M2YUZHI;
		lastM2YUZHI=M2YUZHI;
	}
		if(GZYUZHI!=lastGZYUZHI)
	{
			A_gz_value=GZYUZHI;
		lastGZYUZHI=GZYUZHI;
	}

		if(maxmode==0)//如果优先级标志位为0 那么就是自动模式
		{		
			//跑马灯
			LED1=~LED1;
		  delay_ms(100);
			
			//如果当前环境太黑 开灯 
										if(gz_value<=A_gz_value)
										{
											LED0=1;
										}else 
										if(gz_value>A_gz_value)
										{
											LED0=0;
										}
			
										
									
		//如果当前环境温度太高或者MQ2 MQ135 MQ7数值高于阈值 开风扇   因为是同一个风扇,所以设计了这种方法

										if(m2_value<A_m2_value)
										{
										flag_mq2=0;
										}
										if(m2_value>=A_m2_value)
										{
										flag_mq2=1;
										}
										if(DHT11_Temp<A_DHT11_Temp)
										{
										flag_temp=0;	
										}
										if(DHT11_Temp>=A_DHT11_Temp)
										{
										flag_temp=1;
										}	
										flag=flag_temp+flag_mq2;
													if(flag>=1)
														{
															FAN=FAN_ON;
														}
													if(flag==0)
														{
															FAN=FAN_OFF; 
														}
			//如果当前环境三个监测的传感器检测到的数值过高 蜂鸣器会不停的警报至其含量低于设定的阈值													
										flag_2=flag_mq2;
											    if(flag_2>=1)
														{
															BEEP=BEEP_ON;
														}
													if(flag_2==0)
														{
															BEEP=BEEP_OFF;
														}
			//如果当前环境空气湿度低于设置的阈值,开启加湿器
                 if(DHT11_Hum<A_DHT11_Hum)
										{
										HUMIPLUS=HUMIPLUS_ON;	
										}
										if(DHT11_Hum>=A_DHT11_Hum)
										{
										HUMIPLUS=HUMIPLUS_OFF;
										}												
				}

											
		key_value = KEY_Scan(0);
		if(key_value==2)
		{
			display_contrl++;
			OLED_Clear();						//OLED清屏
		}
		if(display_contrl%2==0&&t>=10)
		{
			OLED_ShowCHinese(0,0,0);
			OLED_ShowCHinese(16,0,2);
			sprintf((char*)buff,":%2d",DHT11_Temp);
			OLED_ShowString(32,0,buff,16);	//显示温度
			OLED_ShowCHinese(64,0,21);
			
			OLED_ShowCHinese(0,2,1);
			OLED_ShowCHinese(16,2,2);
			sprintf((char*)buff,":%2d ",DHT11_Hum);
			OLED_ShowString(32,2,buff,16);//显示湿度
			OLED_ShowCHinese(64,2,22);
			
			OLED_ShowCHinese(0,4,5);
			OLED_ShowCHinese(16,4,6);
			OLED_ShowCHinese(32,4,7);
			OLED_ShowCHinese(48,4,8);
			sprintf((char*)buff,":%4dLx",gz_value);
			OLED_ShowString(64,4,buff,16);//显示光照强度
			
			OLED_ShowCHinese(0,6,13);
			OLED_ShowCHinese(16,6,14);
			OLED_ShowCHinese(32,6,15);
			OLED_ShowCHinese(48,6,16);
			sprintf((char*)buff,":%4dppm",m2_value);
			OLED_ShowString(64,6,buff,16);//显示空气质量			
		 }
		else if(display_contrl%2==1&&t>=10)
		{
			OLED_ShowCHinese(0,0,0);
			OLED_ShowCHinese(16,0,2);
			sprintf((char*)buff,":%2d",DHT11_Temp);
			OLED_ShowString(32,0,buff,16);	//显示温度
			OLED_ShowCHinese(64,0,21);
			
			OLED_ShowCHinese(0,2,1);
			OLED_ShowCHinese(16,2,2);
			sprintf((char*)buff,":%2d ",DHT11_Hum);
			OLED_ShowString(32,2,buff,16);//显示湿度
			OLED_ShowCHinese(64,2,22);
			
			OLED_ShowCHinese(0,4,5);
			OLED_ShowCHinese(16,4,6);
			OLED_ShowCHinese(32,4,7);
			OLED_ShowCHinese(48,4,8);
			sprintf((char*)buff,":%4dLx",gz_value);
			OLED_ShowString(64,4,buff,16);//显示光照强度
			
			OLED_ShowCHinese(0,6,13);
			OLED_ShowCHinese(16,6,14);
			OLED_ShowCHinese(32,6,15);
			OLED_ShowCHinese(48,6,16);
			sprintf((char*)buff,":%4dppm",m2_value);
			OLED_ShowString(64,6,buff,16);//显示空气质量			
		}

		userHandle();		//用户数据采集
		key_scanf();
		gizwitsHandle((dataPoint_t *)&currentDataPoint);//机智云协议处理
		Canshu_Change(key_value);
		t++;			 
		delay_ms(100);
	}
}
 
void key_scanf(void) //控制为自动 
{
	
	if(KEY4==RESET)
	{
		delay_ms(10);
		if(KEY4==RESET)
		{	
      maxmode=5;
			LED0=LED0_OFF;
			LED1=LED1_OFF;
			BEEP=BEEP_OFF;
			FAN=FAN_OFF;
			HUMIPLUS=HUMIPLUS_OFF;
			
	  }			
		while(!KEY4);//松手检测
  }
}


void Canshu_Change(u8 key)
{
	u8 obj=0;
	if(key==1)
	{
		OLED_Clear();
		while(1)
		{
			key = KEY_Scan(0);
			if(key==1)
			{
				obj++;
				if(obj>=5)
				{
					obj=0;
				}
			}
			sprintf((char *)buff," M_CHANGE");
			OLED_ShowString(30,0,buff,12);
			sprintf((char *)buff,"M_Temp    :%4d",A_DHT11_Temp);
			OLED_ShowString(8,1,buff,12);
			sprintf((char *)buff,"M_Humi    :%4d",A_DHT11_Hum);
			OLED_ShowString(8,2,buff,12);
			sprintf((char *)buff,"M_Light   :%4d",A_gz_value);
			OLED_ShowString(8,3,buff,12);
			sprintf((char *)buff,"M_MQ2     :%4d",A_m2_value);
			OLED_ShowString(8,4,buff,12);
			sprintf((char *)buff,"M_mode    :%4d",maxmode);
			OLED_ShowString(8,5,buff,12);
			if(obj==0)
			{
				OLED_ShowString(0,0," ",12);
				OLED_ShowString(0,1,"*",12);
				OLED_ShowString(0,2," ",12);
				OLED_ShowString(0,3," ",12);
				OLED_ShowString(0,4," ",12);
				OLED_ShowString(0,5," ",12);
				OLED_ShowString(0,6," ",12);
				OLED_ShowString(0,7," ",12);
			}
			if(obj==1)
			{
				OLED_ShowString(0,0," ",12);
				OLED_ShowString(0,1," ",12);
				OLED_ShowString(0,2,"*",12);
				OLED_ShowString(0,3," ",12);
				OLED_ShowString(0,4," ",12);
				OLED_ShowString(0,5," ",12);
				OLED_ShowString(0,6," ",12);
				OLED_ShowString(0,7," ",12);
			}
			if(obj==2)
			{
				OLED_ShowString(0,0," ",12);
				OLED_ShowString(0,1," ",12);
				OLED_ShowString(0,2," ",12);
				OLED_ShowString(0,3,"*",12);
				OLED_ShowString(0,4," ",12);
				OLED_ShowString(0,5," ",12);
				OLED_ShowString(0,6," ",12);
				OLED_ShowString(0,7," ",12);
			}
			if(obj==3)
			{
				OLED_ShowString(0,0," ",12);
				OLED_ShowString(0,1," ",12);
				OLED_ShowString(0,2," ",12);
				OLED_ShowString(0,3," ",12);
				OLED_ShowString(0,4,"*",12);
				OLED_ShowString(0,5," ",12);
				OLED_ShowString(0,6," ",12);
				OLED_ShowString(0,7," ",12);
			}
			if(obj==4)
			{
				OLED_ShowString(0,0," ",12);
				OLED_ShowString(0,1," ",12);
				OLED_ShowString(0,2," ",12);
				OLED_ShowString(0,3," ",12);
				OLED_ShowString(0,4," ",12);
				OLED_ShowString(0,5,"*",12);
				OLED_ShowString(0,6," ",12);
				OLED_ShowString(0,7," ",12);
			}
			
			if(obj==0)
			{
				if(key==3)
				{
					A_DHT11_Temp+=1;
				}
				if(key==4)
				{
					A_DHT11_Temp-=1;
				}
			}
			if(obj==1)
			{
				if(key==3)
				{
					A_DHT11_Hum+=1;
				}
				if(key==4)
				{
					A_DHT11_Hum-=1;
				}
			}
			if(obj==2)
			{
				if(key==3)
				{
					A_gz_value+=2;
				}
				if(key==4)
				{
					A_gz_value-=2;
				}
			}
			if(obj==3)
			{
				if(key==3)
				{
					A_m2_value+=5;
				}
				if(key==4)
				{
					A_m2_value-=5;
				}
			}
			if(obj==4)
			{
				if(key==3)
				{
					maxmode=5;
				}
				if(key==4)
				{
					maxmode=0;
				}
			}
			if(key==2)
			{
				OLED_Clear();
				break;
			}
		
		}
	}
}
void Get_Data(u16 count)//获取传感器数据
{
	DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);
	Conversion();/// bh1750 光照模块数据采集
	gz_value   = lux/10;  //灯光;
	m2_value   = get_Adc_Value(0x06)/10;  
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器) 的相关文章

  • 【实验室学习】时钟分频器,2、3、4、8分频 verilog实现

    0引言 记录时钟分频器的Verilog代码编写 主要掌握分频器设计思路 1设计 2 3 4 8分频 2 4 8分频设计较为容易 2分频 设计一个1位的寄存器 当原时钟上升沿时取反即可 代码展示 timescale 1ns 1ps modul
  • 详解HTTP协议

    HTTP 协议 几乎是每个人上网用的第一个协议 同时也是很容易被人忽略的协议 根据TCP IP模型 网络分层分为四层 应用层 传输层 网络层 网络接口层 数据链路层 物理层 HTTP协议属于应用层的一种协议 http www baidu c
  • 深度学习中30个关于数据的问题

    1 下面的数据是线性可分的嘛 否 2 下面哪个是通用的模型逼近器 A Kernel SVM B Neural Networks C Boosted Decision Trees D All of the above D 以上所有都可以得到一

随机推荐

  • java生成三位随机数_java工具类(三)之生成若干位随机数

    java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题 就是需要生成一个4位数的随机数 如果是一个不到4位大的数字 前面可以加0来显示 因为要求最后是一个4位的整数 不带小数点 当时就想到了几个办法 一 用Math rand
  • ADC0832的AD模数转换原理及编程

    作者简介 嵌入式领域优质创作者 博客专家 个人主页 咸鱼弟 系列专栏 单片机设计专栏 目录 一 描述 二 模数转换原理 三 模数转换的过程 四 八位串行A D转换器ADC0832简介 五 ADC0832特点 六 芯片接口说明 七 ADC08
  • TongWeb及应用系统安全加固

    前言 本文档主要面向运维人员说明常见的TongWeb6 TongWeb7安全加固的配置方法 TongWeb配置 一 首先建议TongWeb升级到最新版本 早期版本存在一些代码级安全漏洞 无法通过配置解决 截止2021年4月15日TongWe
  • codeblocks安装后出现问题的可能解决办法

    昨天在写cf的时候遇到了一个问题 因为办公室这台电脑我是刚用 没有装过codeblocks之前 在用到花括号构造的时候报错 如图 不能直接用花括号了 这我能忍 按照以往的经验来说 是compiler出现了问题 于是设置了一下 看起来好像对了
  • msvcr120.dll丢失的解决方法,win10系统dll报错解决方法

    今天 我将和大家分享一个在win10系统中经常遇到的问题 msvcr120 dll丢失 相信很多朋友在使用电脑的过程中都会遇到这个问题 那么如何解决呢 接下来 就让我为大家详细讲解一下解决方法 首先 我们来了解一下msvcr120 dll文
  • Kazantzis-Kravaris-Luenberger ( KKL )非线性观测器

    The formulation of the observer design problem is realized via a system of singular first order linear PDEs and a rather
  • 【Python搞搞轻量Blog】第二发 Flask入门(2)

    上一篇文章 Flask入门 中创建了一个非常简单的Web应用 但从最简单中又稍微深入的说了一下Flask 基于Werkzeug 使用模板 利用HTML 如何快速利用写好的HTML呢 第一步 在和主应用的同级目录下 创建一个名为 templa
  • [算法]PRML学习笔记1.2.6贝叶斯曲线拟合(Bayesian curve fitting)

    参考文献 Pattern Recognition and Machine Learning Published by Springer January 2006 https www microsoft com en us research
  • 【Vue 学习】修改页面默认的标题

    修改页面默认的标题 一般是在 public index html 里面进行设置网页标题 如下 Vue 的脚手架使用了读取配置文件的方式来设置网页标题 如下 配置文件的内容如下 总结 直接修改 public index html 文件 修改配
  • FPN(特征金字塔)图解

    FPN 看了mask RCNN的源代码 其中用到fpn 根据源代码画了个图 当然FPN重要的是它的思想 有一些超参数可以根据自己的框架进行调整
  • [HFSS]Floquet port激励及主从边界设置(实例)

    Floquet port激励及主从边界设置 1 Floquet port简介 2 基本模型建立 3 主从边界设置 4 wave port 设置 5 floquet port 设置 6 Analysis setup 7 验证 仿真 8 结果演
  • Python标准库、模块、包的区别

    文章目录 模块 包 标准库 第三方库 自定义模块 模块 模块可定义为一个包含python定义和语句的 py文件 模块中包含python代码以及python函数 类或python变量 一个模块可以被其他 py文件导入使用 也可以单独作为脚本文
  • 3.3 Git 分支 - 分支管理

    3 3 Git 分支 分支管理 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 23 初稿 目录 文章目录 3 3 Git 分支 分支管理 版本说明 目录 分支管理 分支管理 现在已经创建 合并 删除了一些分支 让我们看看
  • 51单片机的几种中断的用法

    1 外部中断0 外部中断0实验 实现现象 下载程序后按下K3按键可以对D1小灯状态取反 注意事项 无 include reg52 h 此文件中定义了单片机的一些特殊功能寄存器 typed
  • gitlab可以访问,但git clone连接超时不能下载

    因此 我们可以把 http wozhendetainanle map 地址后面加上 git后缀 更改为 http wozhendetainanle map git 此时使用就可以下载了
  • 关于C#监视剪贴板信息

    1 常规方法 在C 中 有一个常规检测剪贴板的方法 用的是 System Windows Forms Clipboard 使用起来很简单 代码如下
  • 微信小程序中的App、Page、Component的生命周期函数

    有点混乱的官方文档 一 什么是生命周期和生命周期函数 字面意义上说 生命周期就是指一个对象自身的生老病死 在程序运行上也可以这么理解 程序也是对象 也有 生老病死 程序自身从创建到销毁的过程中 运行到特定的阶段 会触发特定的函数 这些函数
  • Distributed Database System —— 什么是嵌入式数据库?

    文章目录 什么是嵌入式数据库 Embedded Database 数据库服务器的架构 嵌入式数据库架构 区别 像Oracle Sybase MySQL和SQL Server这些大家熟知的数据库都属于数据库服务器 当然不排除某些也提供嵌入式版
  • “新”科学家Stephen Wolfram

    2011年10月的iPhone 4S发布会上 苹果副总裁Scott Forstall长按Home键 对着那个泛着紫色光晕的话筒问道 Stephen Wolfram 离圣诞节还有几天 让我查查 稍等 Scott得到了他想要的答案 82 天 也
  • 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

    想要更多项目私wo 一 电路设计 室内环境智能监测系统 主要功能 1 检测空气温湿度 2 检测光照强度 3 检测烟雾浓度 4 数据显示在手机端和设备OLED屏幕上 5 当空气温度高于设定的阈值时 风扇开启 6 当空气湿度低于设定的阈值时 加