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

news2024/11/28 20:52:39

想要更多项目私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;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux从入门到精通】上下文概念详解

上篇文章&#xff08;进程的基本概念&#xff09;我们讲解了进程后&#xff0c;还留下了一个上下文数据概念还没有解释。本篇文章会对上下文概念进行详解。在理解上下文概念时&#xff0c;同时会引出很多新的概念。我们都会对此进行详细解释&#xff0c;希望本篇文章会对你有所…

7款产品经理必备的交互软件

作为UI/UX设计师&#xff0c;我相信你或多或少接触过很多交互设计软件。 为您整理总结了几款流行的交互软件。如果您在上述交互设计软件中确实存在选择困难&#xff0c;希望通过阅读本文帮助您快速做出正确的选择。 即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不…

redis从零开始(1)----基本类型:string/hash/list

认识redis NoSQL Nosql not only sql&#xff0c;泛指非关系型数据库&#xff0c;与之相对的是RDBMS(Relational Database Management System)&#xff0c;即关系型数据库 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff…

企业有必要对三方应用进行安全管控吗?

什么是三方应用&#xff1f; 三方应用是指由第三方开发者创建的软件应用程序&#xff0c;与操作系统或其他主要平台的开发公司无关。这些应用程序通常被设计为在特定平台上运行&#xff0c;并且具有特定的功能或服务&#xff0c;例如社交媒体应用程序、游戏和生产力工具等。 简…

IntersectionObserver“替代”滚动条监听

概要 IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的方法。其祖先元素或视口被称为根&#xff08;root&#xff09;。 当一个 IntersectionObserver 对象被创建时&#xff0c;其被配置为监听根中…

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Aho-Corasick automaton,ac自动机实现

文章目录 写在前面算法概述trie树的构建trie树的节点结构插入P串到trie树中fail指针的创建 搜索过程测试程序 写在前面 原作者的视频讲解链接&#xff1a;[算法]轻松掌握ac自动机_哔哩哔哩_bilibili 原作者的代码实现&#xff1a;data-structure-and-algorithm/aho_corasick.c…

机器视觉表面划痕检测流程

表面缺陷检测常见的检测主要有物体表面的划痕、污渍、缺口、平面度、破损、边框对齐度、物体表面的亮度、皱纹、斑点、孔等。 表面缺陷检测设备凝聚了机器视觉领域的许多技术成果&#xff0c;吸取了许多创新的检测理念&#xff0c;可以与现有生产线无缝对接检测&#xff0c;也…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目&#xff0c;与各项目干系人没有建立有效的联系&#xff0c;他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识&#xff0c;而只管自己那一部分&#xff0c;整个开发过程完全是一种黑盒模式&#xff0c;项目组…

电视盒子哪个好?内行盘点2023最具性价比电视盒子推荐

电视盒子跟有线机顶盒相比不用每年缴费&#xff0c;资源也更丰富&#xff0c;可下载各种APP。作为电视盒子从业人员&#xff0c;身边亲友在选购电视盒子之前会咨询我的意见&#xff0c;不懂电视盒子哪个好&#xff0c;可以看看我总结的2023最具性价比电视盒子推荐&#xff0c;非…

手慢无,阿里巴巴最新出品的高并发终极笔记到底有多强?

前几天收到一位粉丝私信&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式&#xff0c;高并发&#xff0c;多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初…

MySQL-图形化界面工具 (下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

springboot+mybatis+redis实现二级缓存

Mybatis提供了对缓存的支持&#xff0c;分为一级缓存和二级缓存&#xff0c;其查询顺序为&#xff1a;二级缓存>一级缓存->数据库&#xff0c;最原始是直接查询数据库&#xff0c;为了提高效率和节省资源&#xff0c;引入了一级缓存&#xff0c;为了进一步提高效率&#…

计算机网络(四下)——网络层

接上篇&#xff0c;这篇文章主要来写路由选择 五、路由协议 1>动态路由 1.距离向量算法&#xff08;RIP协议&#xff09;&#xff1b;适用于小型网络 1》规定&#xff1a; 1>记录跳数(Hop count)最少的路径。 2>RIP允许一条路由最多15个路由器&#xff0c;距离为…

LitCTF2023 wp re最后一道 cry misc

本来不打算放了&#xff0c;但是比赛打都打了留个纪念社工有佬&#xff0c;与我无关&#xff0c;misc只会隐写虽然我是逆向手&#xff0c;但因为队友tql&#xff0c;所以只留给我最后一道~~我的wp向来以简述思路为主&#xff0c;习惯就好 Crypto Hex&#xff1f;Hex&#xff…

【项目设计】 负载均衡在线OJ系统

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录 一、项目介绍项目技术栈和开发环境 二、项目的宏观结构三、compile_server模块①日志模块开发&#xff0c;Util工具类&#xff0c;供所以模…

NVIDIA再现谜之刀法,RTX 4060Ti新增16G版

随着上一代库存逐渐清理到位&#xff0c;苏妈与老黄终于要把新一代主流级显卡掏出来了。 根据外网消息&#xff0c;AMD 这边主要是 RX 7600XT 与 7600 等型号&#xff0c;发布日期定为 5 月 25 日。 AMD 保密措施做得挺到位的&#xff0c;目前除了部分厂商爆出的包装与产品图…

[MYAQL / Mariadb] 数据库学习-数据导入导出

数据库学习-数据导入导出 数据导入导出&#xff08;批量处理数据&#xff09;查看默认检索目录模糊查询&#xff1a;show variables like %XXXX%;修改检索目录路径&#xff08;&#xff01;&#xff01;文件一定要有MySQL用户的 7的RWX 权限&#xff01;&#xff09;默认的检索…

前端-02 CSS基础

1 简介 1.1 CSS语法 语法 选择器&#xff1a;HTML元素 生命块&#xff1a;用;隔开的各种声明 {a;b} 每条声明有CSS属性名称和值&#xff0c;用冒号分割{属性:值;属性:值} 案例 整块代码 <!DOCTYPE html> <html><head><style>body {background…

同一个IP可以安装配置多个SSL证书吗?

如何在同一IP地址上运行多个SSL证书? 服务器名称指示SNI&#xff0c;可以帮助您实现同一IP运行多个SSL证书&#xff0c;这样虚拟主机网站也能用上SSL证书了。 什么是SNI 服务器名称指示SNI是SSL的一个重要组成部分&#xff0c;SNI允许多个网站存在于同一个IP地址上&#xff…