【STM32项目开源】基于STM32的智能家居环境监测系统

【STM32项目开源】基于STM32的智能家居环境监测系统

目录

一、设计背景和意义

1.1设计背景

1.2设计意义

二、实物效果展示

2.1实物图片

2.2实物演示视频

三、硬件功能简介

3.1项目功能详解

3.2元器件清单

四、主框图与软件流程图

五、硬件PCB展示

六、软件程序设计

七、项目资料包内容

         资料获取:查看主页介绍“充哥单片机设计”


一、设计背景和意义

1.1设计背景

        随着物联网(IoT)、嵌入式系统和云计算等技术的飞速发展,智能家居系统正在逐渐改变人们的生活方式。智能家居不仅仅是简单的远程开关控制,而是向着环境感知、自主判断、智能决策的方向不断演进。特别是在城市化进程加快、生活节奏加快的背景下,用户对生活便捷性、家庭安全性和环境舒适度的要求不断提高,这对智能家居系统的综合感知、智能响应能力提出了更高的要求。

        当前市面上的智能家居产品多以分立模块存在,系统功能较为单一,往往只能实现某一方面的控制,比如智能照明、温湿度调节、安防监控等,缺乏整体化的环境监测与多条件联动控制能力。同时,许多系统依赖厂商封闭协议,用户扩展性差,缺乏灵活性与个性化调整能力。另外,一些传统系统虽然具备远程控制功能,但仍停留在手动控制层面,无法基于环境数据自主做出决策,自动响应潜在的安全风险。

1.2设计意义

        系统不仅支持用户远程手动控制,如开关窗户(由步进电机模拟)、控制声光报警和照明设备,还具备自动模式,可依据传感器数据智能决策。例如,一旦检测到烟雾或一氧化碳超标,系统会立即启动报警器并自动开窗通风,有效降低安全隐患;在夜晚或光照不足时,系统可自动点亮灯光,提升家庭舒适度。这种以数据驱动控制逻辑的智能响应机制,真正实现了从“被动控制”向“主动管理”的转变。

        本课题融合了嵌入式系统、物联网通信、自动控制与人机交互等多个知识点,能够全面锻炼学生在软硬件开发、系统集成与工程实践方面的能力。通过对STM32开发平台、传感器数据采集处理、WiFi模块通信协议、云平台接入与APP交互控制等技术的综合应用,提升了理论知识向实际工程转化的能力。

二、实物效果展示

2.1实物图片

2.2实物演示视频

【开源】基于STM32的智能家居环境监测系统

三、硬件功能简介

3.1项目功能详解

1)传感器检测:烟雾浓度、空气质量、一氧化碳、温湿度、光照
2)数据显示:0.96OLED屏幕
3)执行机构:步进电机(窗户、风扇
4)云平台:通过ESP8266 WIFI联网后,接入机智云平台
5)App监控:App远程监控数据,控制执行机构
6)数据设定:按键或APP设定阈值,切换模式
7)手动模式:通过手机App实现控制窗户、风扇开关
8)自动模式:根据设定的烟雾、一氧化碳、空气质量阈值等超过阈值自动开启声光报警、打开窗户通风

3.2元器件清单

  1. 主控ST,M32F103C8T6
  2. 0.96OLED显示屏幕
  3. ESP8266联网WiFi
  4. DHT11温湿度传感器
  5. MQ-2烟雾传感器
  6. MQ-7一氧化碳传感器
  7. MQ-135空气质量传感器
  8. 光敏电阻
  9. 风扇
  10. 步进电机
  11. 蜂鸣器声光报警

四、主框图与软件流程图

主框图

流程图

五、硬件PCB展示

六、软件程序设计

u32 STM32_xx0=0X4E4C4A; u32 STM32_xx1=0X364B1322; u32 STM32_xx2=0X132D13 ; #define FLASH_SAVE_ADDR 0x08010000 u8 buff[30];//参数显示缓存数组 u8 count; dataPoint_t currentDataPoint;//云端数据点 u8 wifi_sta;//wifi连接状态标志 u8 mode=0;//模式控制自动和手动 u8 NTP_sta=0;//网诺时间获取状态 u8 display_contrl=0; u8 curtain_flag=0; u8 last_curtain_flag=0; extern u8 DHT11_Temp,DHT11_Hum; //温湿度 u16 Pre; //气压检测值 u16 gz_value; //光照检测值 u16 m2_value; //烟雾检测值 u16 m7_value; //一氧化碳检测值 u16 m135_value; //空气质量检测值 u16 A_DHT11_Temp=35; //温度阈值 高于阈值时报警 u16 A_DHT11_Hum=20; //湿度阈值 低于阈值时报警 u16 A_pre=1500; //气压阈值 低于阈值时报警 u16 A_gz_value=1000; //光照强度阈值 低于阈值时打开窗帘和照明灯 u16 A_m2_value=4000; //烟雾阈值 高于阈值时报警 u16 A_m7_value=4000; //一氧化碳阈值 高于阈值时报警 u16 A_m135_value=1500; //空气质量阈值 低于阈值时报警 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.valueLED=!LED0; currentDataPoint.valueCurtain=curtain_flag; currentDataPoint.valueTemp=DHT11_Temp; currentDataPoint.valueHum=DHT11_Hum; currentDataPoint.valuePre=Pre; currentDataPoint.valueGZ_Value=gz_value; currentDataPoint.valueMQ2_Value=m2_value; currentDataPoint.valueMQ7_Value=m7_value; currentDataPoint.valueMQ135_Value=m135_value; } void Get_Data(u16 count);//获取传感器数据 void WIFI_Contection(u8 key);//WiFi连接控制 void Canshu_Change(u8 key);//系统参数调节 void Mode_Change(u8 key);//模式切换 void BUJING_Cotrol(u8 mode,u16 time,u16 count); 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(); //按键引脚初始化 bmp280Init(); while(DHT11_Init()); LED_Init(); //初始化与LED连接的硬件接口 OLED_Init(); //OLED初始化 OLED_Clear(); //OLED清屏 Gizwits_Init(); BEEP = 0; while(1) { Get_Data(0); if(gz_value<=A_gz_value&&mode==0) { LED0=0;curtain_flag=0; }else if(gz_value>A_gz_value&&mode==0){ LED0=1;curtain_flag=1; } if(last_curtain_flag!=curtain_flag&&mode==0) { BUJING_Cotrol(curtain_flag,3,270); last_curtain_flag = curtain_flag; } if(last_curtain_flag!=currentDataPoint.valueCurtain&&mode==1) { BUJING_Cotrol(currentDataPoint.valueCurtain,3,270); curtain_flag = currentDataPoint.valueCurtain; last_curtain_flag = currentDataPoint.valueCurtain; } if(mode==1) { LED0=!currentDataPoint.valueLED; } if(DHT11_Temp>=A_DHT11_Temp||DHT11_Hum<=A_DHT11_Hum||Pre>=A_pre||m135_value<=A_m135_value||m2_value>=A_m2_value||m7_value>=A_m7_value){ //BEEP=!BEEP; }else BEEP = 0; key_value = KEY_Scan(0); if(key_value==4) { display_contrl++; } if(display_contrl%2==0&&t>=10) { OLED_ShowCHinese(0,0,0); OLED_ShowCHinese(16,0,2); sprintf((char*)buff,":%2dC",DHT11_Temp); OLED_ShowString(32,0,buff,16); //显示温度 OLED_ShowCHinese(64,0,1); OLED_ShowCHinese(82,0,2); sprintf((char*)buff,":%2d%%",DHT11_Hum); OLED_ShowString(96,0,buff,16);//显示湿度 OLED_ShowCHinese(0,2,3); OLED_ShowCHinese(16,2,4); sprintf((char*)buff,":%2dhpa ",Pre); OLED_ShowString(32,2,buff,16);//显示气压 OLED_ShowCHinese(0,4,5); OLED_ShowCHinese(16,4,6); OLED_ShowCHinese(32,4,7); OLED_ShowCHinese(48,4,8); sprintf((char*)buff,":%4dppm",gz_value); OLED_ShowString(64,4,buff,16);//显示光照强度 OLED_ShowCHinese(0,6,21); OLED_ShowCHinese(16,6,22); OLED_ShowCHinese(32,6,23); OLED_ShowCHinese(48,6,24); //sprintf((char*)buff,":%4dppm",m135_value); //OLED_ShowString(64,6,buff,16);//显示空气质量 OLED_ShowString(64,6,":",16); }else if(display_contrl%2==1&&t>=10) { OLED_ShowCHinese(0,0,13); OLED_ShowCHinese(16,0,14); OLED_ShowCHinese(32,0,15); OLED_ShowCHinese(48,0,16); sprintf((char*)buff,":%4dppm",m2_value); OLED_ShowString(64,0,buff,16);//显示M2数据 OLED_ShowCHinese(0,2,17); OLED_ShowCHinese(16,2,18); OLED_ShowCHinese(32,2,19); OLED_ShowCHinese(48,2,20); sprintf((char*)buff,":%4dppm",m7_value); OLED_ShowString(64,2,buff,16);//显示M7数据 OLED_ShowCHinese(0,4,5); OLED_ShowCHinese(16,4,6); OLED_ShowCHinese(32,4,7); OLED_ShowCHinese(48,4,8); sprintf((char*)buff,":%4dppm",gz_value); OLED_ShowString(64,4,buff,16);//显示光照强度 OLED_ShowCHinese(0,6,21); OLED_ShowCHinese(16,6,22); OLED_ShowCHinese(32,6,23); OLED_ShowCHinese(48,6,24); } if(t>10){ if(m135_value>100){ OLED_ShowCHinese(80,6,23);//有人 OLED_ShowCHinese(96,6,24); BEEP=!BEEP; //报警 }else{ OLED_ShowCHinese(80,6,25);//无人 OLED_ShowCHinese(96,6,24); BEEP = 0; } } userHandle(); //用户数据采集 WIFI_Contection(key_value);//WiFi连接控制 gizwitsHandle((dataPoint_t *)&currentDataPoint);//机智云协议处理 Canshu_Change(key_value); t++; delay_ms(100); } } void WIFI_Contection(u8 key)//WiFi连接控制 { if(key==2) { printf("WIFI进入AirLink连接模式\r\n"); gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入 } if(key==3) { printf("WIFI复位,请重新配置连接\r\n"); gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位 } } void Canshu_Change(u8 key) { u8 obj=7; if(key==1) { BEEP=0;OLED_Clear(); while(1){ key = KEY_Scan(0); if(key==1){ obj++; if(obj>=8)obj=0; } sprintf((char *)buff,"Working md:%4d",mode); OLED_ShowString(8,0,buff,12); sprintf((char *)buff,"A_Temp :%4d",A_DHT11_Temp); OLED_ShowString(8,1,buff,12); sprintf((char *)buff,"A_Hum :%4d",A_DHT11_Hum); OLED_ShowString(8,2,buff,12); sprintf((char *)buff,"A_pre :%4d",A_pre); OLED_ShowString(8,3,buff,12); sprintf((char *)buff,"A_gz_val :%4d",A_gz_value); OLED_ShowString(8,4,buff,12); sprintf((char *)buff,"A_m2_val :%4d",A_m2_value); OLED_ShowString(8,5,buff,12); sprintf((char *)buff,"A_m7_val :%4d",A_m7_value); OLED_ShowString(8,6,buff,12); sprintf((char *)buff,"A_m135_val:%4d",A_m135_value); OLED_ShowString(8,7,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==5){ 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==6){ 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==7){ 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==2)A_DHT11_Temp-=1; } if(obj==1){ if(key==3)A_DHT11_Hum+=1; if(key==2)A_DHT11_Hum-=1; } if(obj==2){ if(key==3)A_pre+=20; if(key==2)A_pre-=20; } if(obj==3){ if(key==3)A_gz_value+=50; if(key==2)A_gz_value-=50; } if(obj==4){ if(key==3)A_m2_value+=50; if(key==2)A_m2_value-=50; } if(obj==5){ if(key==3)A_m7_value+=50; if(key==2)A_m7_value-=50; } if(obj==6){ if(key==3)A_m135_value+=50; if(key==2)A_m135_value-=50; } if(obj==7){ if(key==3)mode+=1; if(key==2)mode-=1; if(mode >= 2) mode = 0; } if(key==4){ OLED_Clear(); break; } } } } void Get_Data(u16 count)//获取传感器数据 { static float bmp280_press,bmp280; //气压 DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum); bmp280GetData(&bmp280_press,&bmp280,&bmp280); Pre = bmp280_press; gz_value = 4096 - get_Adc_Value(0x04); m2_value = get_Adc_Value(0x07); m7_value = get_Adc_Value(0x05); m135_value = 4096 - get_Adc_Value(0x06); } void BUJING_Cotrol(u8 mode,u16 time,u16 count) { if(mode==0) { while(count--) { BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0; delay_ms(time); BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0; delay_ms(time); BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0; delay_ms(time); BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1; delay_ms(time); } } if(mode==1) { while(count--) { BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1; delay_ms(time); BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0; delay_ms(time); BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0; delay_ms(time); BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0; delay_ms(time); } } } 

七、项目资料包内容

         资料获取:查看主页介绍“充哥单片机设计”

Read more

【保姆级教程】从零部署宇树 Unitree 机器人 ROS 2 环境 (Go2/B2/H1) (Humble + 真实硬件)

摘要 本文为希望在ROS 2 (Humble) 环境下开发宇树 (Unitree) 机器人(支持 Go2, B2, H1)的开发者提供了一篇详尽的、从零开始的部署指南。我们将首先在 Ubuntu 22.04 上安装 ROS 2 Humble,然后重点讲解如何配置 unitree_ros2 功能包,实现 ROS 2 节点与机器人底层 DDS 系统的直接通信。本教程基于官方文档,并针对 Humble 环境进行了优化,可跳过 Foxy 版本复杂的 CycloneDDS 编译步骤。 核心环境: * 操作系统: Ubuntu 22.04 (Jammy) * ROS 2 版本: Humble

MacOS 安装 OpenClaw 并接入飞书机器人(保姆级教程 + 常见问题解决)

MacOS 安装 OpenClaw 并接入飞书机器人(保姆级教程 + 常见问题解决)

MacOS 安装 OpenClaw 并接入飞书机器人(保姆级教程 + 常见问题解决) 在 AI Agent 和自动化工具越来越普及的今天,越来越多开发者希望拥有一个 能够自动处理任务、接入团队协作工具的 AI 助手。 最近OpenClaw火的一塌糊涂,我也跟风研究了一下这个开源项目。它可以理解为一个 可扩展的 AI Agent 框架,支持接入各种工具、自动执行任务,并且可以和企业协作平台(如飞书)打通,实现 AI 自动回复、自动化工作流。 本文将带大家 从 0 开始,在 MacOS 上安装 OpenClaw,并接入飞书机器人。 同时我也整理了自己在安装过程中遇到的 终端报错问题与完整解决方案,让你一次性避坑。 本文包含: * MacOS 安装 OpenClaw * 接入飞书机器人 * 配置开机自启 * 终端报错解决(

【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

文章前瞻:优质数据集与检测系统精选 点击链接:更多数据集与系统目录清单 数据集与检测系统数据集与检测系统基于深度学习的道路积水检测系统基于深度学习的道路垃圾检测系统基于深度学习的道路裂缝检测系统基于深度学习的道路交通事故检测系统基于深度学习的道路病害检测系统基于深度学习的道路积雪结冰检测系统基于深度学习的汽车车牌检测系统基于深度学习的井盖丢失破损检测系统基于深度学习的行人车辆检测系统基于深度学习的航拍行人检测系统基于深度学习的车辆分类检测系统基于深度学习的电动车头盔佩戴检测系统基于深度学习的交通信号灯检测系统基于深度学习的共享单车违停检测系统基于深度学习的摆摊占道经营检测系统基于深度学习的人员游泳溺水检测系统基于深度学习的航拍水面垃圾检测系统基于深度学习的水面垃圾检测系统基于深度学习的水面船舶分类检测系统基于深度学习的海洋垃圾检测系统基于深度学习的救生衣穿戴检测系统基于深度学习的海洋生物检测系统基于深度学习的人员吸烟检测系统基于深度学习的口罩佩戴检测系统基于深度学习的烟雾和火灾检测系统基于深度学习的人员睡岗玩手机检测系统基于深度学习的人员摔倒检测系统基于深度学习的人员姿势检测系

2026低代码发展趋势:从工具到平台

2026低代码发展趋势:从工具到平台

数字化转型进入深水区的2026年,低代码技术正经历一场本质性变革——从单一的效率开发工具,升级为支撑企业全链路数字化的核心平台。据Gartner 2025年Q4报告显示,中国低代码市场规模已突破131亿元,年复合增长率超20%,70%的新应用将通过低代码/无代码技术构建,这一数据背后,是企业对“快速响应需求+深度业务适配”的双重诉求,推动低代码从“能用上”向“用得好、能支撑核心业务”跨越。这种转型并非技术名词的更迭,而是从功能实现到生态构建、从单点效率到全局协同的价值重构。 趋势一:高低代码融合,打破“效率与灵活”的二元对立 早期低代码工具的核心痛点的是“标准化与定制化”的矛盾:零代码工具适配轻量场景但灵活度不足,专业编码开发高效但门槛过高。2026年,“可视化配置+代码拓展”的混合架构已成为行业主流,Gartner预测,85%的企业级低代码平台将采用这一模式,实现“80%标准化场景快速落地+20%复杂场景深度定制”的全覆盖。 这种融合模式的核心价值,在于打通业务人员与技术团队的协作壁垒。