STM32项目分享:家庭环境监测系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图

2.PCB板打样焊接图

五、程序设计

六、实验效果

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1oi42117dp/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的家庭环境监测系统。功能如下:

  1. 温湿度采集:使用DHT11温湿度传感器采集环境温湿度
  2. 烟雾浓度采集:通过MQ-2烟雾传感器采集环境烟雾浓度
  3. PM2.5浓度采集:通过粉尘传感器采集环境PM2.5浓度
  4. 二氧化碳浓度采集:通过CO2气敏传感器检测二氧化碳浓度
  5. 风扇控制:可自动模式下根据环境温度触发或手动模式下APP开闭
  6. 加湿器控制:可自动模式下根据环境湿度触发或手动模式下APP开闭
  7. 窗户:可自动模式下根据PM2.5浓度触发或手动模式下APP开闭
  8. OLED显示:将检测到的环境数据显示在oled屏幕上。
  9. 蜂鸣器报警:异常情况下本地蜂鸣器触发报警
  10. APP功能:使用机智云APP,包括功能有自动模式和手动模式切换,控制并显示风扇、加湿器和窗户状态,查看蜂鸣器报警状态,显示当前环境温湿度、烟雾浓度和PM2,5浓度信息

2.主要器件

  • STM32F103C8T6最小系统板
  • DHT11温湿度传感器
  • OLED显示屏(4针I2C协议)
  • WiFi模块(ESP8266-01s)
  • MQ-2烟雾浓度传感器
  • PM2.5模块
  • 28BYJ51步进电机
  • 5V风扇模块
  • 加湿器模块及驱动板
  • 继电器
  • 蜂鸣器
  • LED灯

三、原理图设计

四、PCB硬件设计

1.PCB图

2.PCB板打样焊接图

五、程序设计

cpp 复制代码
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	OLED_Init();
	ADCX_Init();
	GP2Y_Init();
	MQ2_Init();
	DHT11_UserConfig();
	MOTOR_UserConfig();
	Key_Init();
	Relay_Init();
	Buzzer_Init();
	Timer2_Init(9,14398);
	uart2_init(9600);
	uart1_init(115200);
	GENERAL_TIM_Init();
	userInit();		//完成机智云初始赋值
	gizwitsInit();	//开辟一个环形缓冲区
	Delay_ms(500);
	gizwitsSetMode(WIFI_AIRLINK_MODE);
	IWDG_Init();	//初始化看门狗
	while (1)
	{
		IWDG_ReloadCounter(); //重新加载计数值 喂狗		
		switch(Menu)
		{
			case 1:	
				Menu1();
				//判断步进电机是否需要进行旋转
				if(Window_Flag_ON == 1)
				{
					MOTOR_Direction_Angle(1,0,90,1);	//顺时针旋转90度
					MOTOR_STOP();
					Window_Flag_ON = 0;
				}
				if(Window_Flag_OFF == 1)
				{
					MOTOR_Direction_Angle(0,0,90,1);	//逆时针旋转90度
					MOTOR_STOP();
					Window_Flag_OFF = 0;
				}
				break;
			case 2: 
					OLED_Clear();
					Menu2();
					Menu = 3;
					//用于判断阈值数据有没有被更改
					old_Temp_value = Temp_value;
					old_Humi_value = Humi_value;
					old_Smog_value = Smog_value;
					old_PM25_value = PM25_value;
					break;
			case 3: 
				//显示传感器阈值
				OLED_ShowNum(1,13,Temp_value,2);
				OLED_ShowNum(2,13,Humi_value,2);
				OLED_ShowNum(3,13,Smog_value,4);
				OLED_ShowNum(4,13,PM25_value,4);
				//进行阈值选择
				if(KeyNum == 1)
				{
					KeyNum = 0;
					value_Option_Num++;
					if(value_Option_Num > 4)
					{
					value_Option_Num = 1;
					}
				}
				//显示选择标识符">"
				OLED_Option(value_Option_Num);
				//检测阈值数值的调节
				switch(value_Option_Num)
				{
					case 1: 
						if(KeyNum == 3)
						{
							KeyNum = 0;
							Temp_value++;
							if(Temp_value >= 100)
							{
								Temp_value = 1;
							}
						}
						if(KeyNum == 4)
						{
							KeyNum = 0;
							Temp_value--;
							if(Temp_value >= 100)
							{
								Temp_value = 99;
							}
						}
						break;
					case 2: 
						if(KeyNum == 3)
						{
							KeyNum = 0;
							Humi_value++;
							if(Humi_value >= 100)
							{
								Humi_value = 1;
							}
						}
						if(KeyNum == 4)
						{
							KeyNum = 0;
							Humi_value--;
							if(Humi_value >= 100)
							{
								Humi_value = 99;
							}
						}
						break;
					case 3: 
						if(KeyNum == 3)
						{
							KeyNum = 0;
							Smog_value++;
							if(Smog_value >= 501)
							{
								Smog_value = 1;
							}
						}
						if(KeyNum == 4)
						{
							KeyNum = 0;
							Smog_value--;
							if(Smog_value >= 5001)
							{
								Smog_value = 500;
							}
						}
						break;
					case 4: 
						if(KeyNum == 3)
						{
							KeyNum = 0;
							PM25_value++;
							if(PM25_value >= 501)
							{
								PM25_value = 1;
							}
						}
						if(KeyNum == 4)
						{
							KeyNum = 0;
							PM25_value--;
							if(PM25_value >= 501)
							{
								PM25_value = 500;
							}									
						}
						break;
				}
				//退出阈值设置界面
				if(KeyNum == 2)
				{
					KeyNum = 0;
					//当阈值数据被更改后,才会写入FLASH中
					if((old_Temp_value != Temp_value) || (old_Humi_value != Humi_value) || (old_Smog_value != Smog_value) || (old_PM25_value != PM25_value))
					{
						//写入传感器阈值数据
                       FLASH_W(FLASH_START_ADDR,Temp_value,Humi_value,Smog_value,PM25_value);				
					}
					Menu = 1;	//回到主菜单
					OLED_Clear();	//清屏
				}
				break;			
		}
		userHandle();	//更新机智云数据点变量存储的值
		gizwitsHandle((dataPoint_t *)&currentDataPoint);	//数据上传至机智云					
	}
}

六、实验效果

七、资料内容

项目分享

相关推荐
学生哥-_-5 小时前
STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider
stm32·lvgl·tftlcd·gui guider·gt911
三三十二5 小时前
STM32实战:数字音频播放器开发指南
stm32·单片机·嵌入式硬件
想搞嵌入式的小白7 小时前
STM32外设问题总结
单片机·嵌入式硬件
让子弹飞027 小时前
35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
stm32·按键
木子单片机8 小时前
基于STM32语音识别柔光台灯
stm32·单片机·嵌入式硬件·proteus·语音识别·keil
广药门徒9 小时前
澄清 STM32 NVIC 中断优先级
单片机·嵌入式硬件
小禾苗_10 小时前
32单片机——窗口看门狗
单片机·嵌入式硬件
小灰灰搞电子10 小时前
单片机0-10V电压输出电路分享
单片机·嵌入式硬件
Moonnnn.11 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
lingzhilab12 小时前
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
stm32·嵌入式硬件·信息可视化