【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

直流无刷电机FOC控制算法

直流无刷电机FOC控制算法

文章目录 * 1、FOC概述 * 1.1 FOC控制算法介绍 * 2、无刷电机 * 2.1 无刷电机介绍 * 2.2 无刷电机和永磁同步电机的区别 * 2.3 无刷电机的控制原理 * 2.3.1 无刷电机工作原理 * 2.3.2 直流无刷电机驱动原理 * 2.3.2.1 有感直流无刷电机六步换相驱动原理 * 2.3.2.2 直流无刷电机FOC控制原理 * 3、无刷电机FOC控制算法 * 3.1 FOC控制算法整体流程 * 3.2 FOC算法Clarke变换 * 3.2.1 Clarke变换公式推导 * 3.2.2

By Ne0inhk
【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

摘要:本文聚焦OpenClaw三大核心交互方式,针对新手“不知如何与AI助理沟通”的痛点,提供Web控制台、TUI终端、聊天软件(以钉钉为核心)的完整实操流程。Web控制台适配电脑端深度配置,TUI终端适合服务器远程维护,聊天软件满足手机端移动办公,三者协同实现“随时随地召唤AI”。文中包含2026实测的命令代码、配置步骤、问题排查方案,所有案例为虚拟构建,代码未上传GitHub,兼顾新手入门与进阶实操,帮助读者快速打通多端交互,最大化OpenClaw使用效率。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:高并发+性能调优终极实战】【Coze搞钱实战:零代码打造吸金AI助手】

By Ne0inhk
【Actix Web】Rust Web开发实战:Actix Web框架全面指南

【Actix Web】Rust Web开发实战:Actix Web框架全面指南

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,ZEEKLOG全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。 所属的专栏:Rust语言通关之路 景天的主页:景天科技苑 文章目录 * Rust Web开发 * 一、Actix Web框架概述 * 1.1 Actix Web的特点 * 1.2 Actix Web与其他Rust框架比较

By Ne0inhk
解决 Android WebView 无法加载 H5 页面常见问题的实用指南

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介         Android WebView 是一种视图组件,使得 Android 应用能够显示网页内容。它基于 Chromium,具备现代浏览器的许多功能,包括支持 HTML5、CSS3 和 JavaScript。这使得 WebView 成为展示在线内容和混合应用开发的理想选择。 2.

By Ne0inhk