基于STM32的智能家居控制系统设计与实现(带红外遥控控制空调)
音响系统可以与智能家居设备集成,实现智能化控制 #生活常识# #音响#
在现代家庭日常生活管理、居住环境舒适度调节及安全防护等场景中,家居环境参数监测与智能控制是基础且核心的需求。传统家居管理方式多依赖人工操作或功能单一的简易控制工具,这类工具存在明显局限:一方面,专业智能家居设备(如高端全屋智能系统、多场景联动控制中枢)安装复杂、操作繁琐,且成本高昂,难以普及到普通家庭或小户型居住场景,同时设备间兼容性差,需依赖特定品牌生态,导致用户更换设备成本高,无法灵活响应家庭成员多样化的居住需求;另一方面,普通简易控制工具(如单一遥控器、手动开关)虽操作简单,但大多仅能实现单设备控制(如仅控制灯光或仅调节空调),缺乏多设备协同联动、环境数据实时监测及自动响应功能,无法满足现代化智能家居场景下对居住环境全方位、智能化管理的需求。
现有智能家居控制方案还存在功能割裂与集成度低的问题:部分高端智能家居系统虽具备多设备控制与场景联动功能,但依赖复杂的布线与专业调试,且后期维护成本较高,难以覆盖中老年用户或预算有限的家庭群体;而低成本的控制工具又往往在功能完整性与联动性上有所欠缺,无法实现环境数据与移动端 APP、语音控制的联动,导致设备控制效率低、能源浪费严重,无法为居住习惯分析及家居管理优化提供数据支撑。基于此,本设计以 STM32 单片机为核心,融合高精度环境参数采集模块(如温湿度传感器、光照传感器、人体红外传感器、烟雾传感器)、LCD 显示模块、数据存储模块及继电器控制与报警模块,构建低成本、高集成度的 STM32 单片机智能控制系统,以解决传统家居管理中设备分散、智能化程度低、能源利用效率低及普及性差的问题。
从使用体验与管理效率角度,该系统突破了传统家居管理工具的局限:一是实现了多环境指标同步监测与多设备联动(如支持室内温湿度、光照强度、人体活动状态、烟雾浓度等核心指标,联动灯光、空调、窗帘、排气扇等设备),无需人工频繁操作不同设备,减少操作繁琐性;二是配备 LCD 实时显示模块,直观呈现当前各项环境数据、设备运行状态及预设场景模式,同时支持数据自动存储(可通过 SD 卡或 WiFi 传输至手机 APP / 云端平台),方便用户长期追溯环境变化与设备使用规律,为居住习惯分析与家居管理优化提供完整数据支撑;三是新增环境异常预警与自动调控功能,当监测到某项环境指标超出安全范围(如温度过高、烟雾浓度超标、有人活动时灯光未开启)时,系统自动触发声光报警,同时联动继电器开启排气扇、切断危险电源、点亮灯光等,无需人工干预即可及时调整环境,大幅提升了家居管理的便捷性与居住安全性。
从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度环境参数传感器(如 DHT11 温湿度传感器、BH1750 光照传感器、HC-SR501 人体红外传感器、MQ-2 烟雾传感器)与通用外围模块,在保证数据精度(温度测量误差可控制在 ±0.5℃以内,人体感应响应时间可控制在 2 秒以内)的前提下,有效降低了系统整体成本,相比同功能的高端智能家居系统成本降低 40%-60%,更易普及到普通家庭、小户型公寓及老旧小区改造场景。同时,系统支持模块化扩展(如后续可新增语音控制模块、门窗磁控传感器),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。
从应用场景与行业价值角度,该系统可广泛适配多类居住场景:在普通家庭生活中,可作为家居环境的智能管理中枢,实时调控温湿度、灯光及安防状态,提升居住舒适度与安全性;在高校电子信息与自动化相关专业教学中,可作为单片机应用与智能家居控制的实践案例,帮助学生理解嵌入式系统与环境传感器协同工作原理;在小户型公寓或出租房场景中,可为用户提供低成本的智能改造方案,减少设备采购与能源消耗成本,提升生活品质。此外,本设计探索了 STM32 单片机在低成本智能家居领域的应用方案,推动传统家居管理从 “单设备控制、人工操作” 向 “多设备联动、智能监测、自动响应” 升级,为低成本智能化家居设备的开发提供了可参考的集成思路,具有较好的实践应用与行业推广价值。
(1)温度检测
(2)湿度检测
(3)光照强度检测
(4)空气质量检测
(5)烟雾浓度检测
(6)一氧化碳检测
(7)气压检测
(8)按键设置阈值,蜂鸣器报警
(9)OLED 实时显示数值
(10)自动控制 灯光和窗帘当光照强度低于阈值自动开启
(11)WIFI模块连接机智云手机 APP
(12)APP 手动控制灯光、窗帘的开关
#include "stm32f10x.h" // Device header #include "oled.h" #include "adcx.h" #include "bmp280.h" #include "sensormodules.h" #include "dht11.h" #include "key.h" #include "tim2.h" #include "motor.h" #include "led.h" #include "usart.h" SensorModules sensorData;//声明传感器模块的结构体变量 SensorThresholdValue Sensorthreshold;//声明传感器阈值结构体变量 #define KEY_Long111 #define KEY_11 #define KEY_22 #define KEY_33 #define KEY_44 uint8_t motorFlag = 0; uint8_t oledPages = 1;//系统显示页面 uint8_t model;//系统模式 typedef enum {DISPLAY_PAGE1 = 1,DISPLAY_PAGE2,SETTINGS_PAGE } OLED_PAGES; /** * @brief 显示菜单1的固定内容 * @param 无 * @retval 无 */ void OLED_Menu1(void) {//显示“温度: C”OLED_ShowChinese(1,1,48);OLED_ShowChinese(1,2,49);OLED_ShowChar(1,5,':');OLED_ShowChar(1,8,'C');//显示“湿度: %”OLED_ShowChinese(1,5,50);OLED_ShowChinese(1,6,51);OLED_ShowChar(1,13,':');OLED_ShowChar(1,16,'%');//显示”光照强度: Lux“OLED_ShowChinese(2, 1, 8);OLED_ShowChinese(2, 2, 9);OLED_ShowChinese(2, 3, 10);OLED_ShowChinese(2, 4, 11);OLED_ShowChar(2, 9, ':');OLED_ShowString(2, 14, "Lux");//显示“大气压强: ”OLED_ShowChinese(3, 1, 12);OLED_ShowChinese(3, 2, 13);OLED_ShowChinese(3, 3, 14);OLED_ShowChinese(3, 4, 15);OLED_ShowChar(3, 9, ':');OLED_ShowString(3, 14, "hPa");//显示“系统模式:”OLED_ShowChinese(4, 1, 28);OLED_ShowChinese(4, 2, 29);OLED_ShowChinese(4, 3, 30);OLED_ShowChinese(4, 4, 31);OLED_ShowChar(4, 9, ':'); } /** * @brief 显示菜单2的固定内容 * @param 无 * @retval 无 */ void OLED_Menu2(void) {//显示“烟雾浓度: ppm”OLED_ShowChinese(1, 1, 20);OLED_ShowChinese(1, 2, 21);OLED_ShowChinese(1, 3, 22);OLED_ShowChinese(1, 4, 23);OLED_ShowChar(1, 9, ':');OLED_ShowString(1,13,"ppm");//显示“一氧化碳: ppm”OLED_ShowChinese(2, 1, 16);OLED_ShowChinese(2, 2, 17);OLED_ShowChinese(2, 3, 18);OLED_ShowChinese(2, 4, 19);OLED_ShowChar(2, 9, ':');OLED_ShowString(2,13,"ppm");//显示“空气质量: ppm”OLED_ShowChinese(3, 1, 24);OLED_ShowChinese(3, 2, 25);OLED_ShowChinese(3, 3, 26);OLED_ShowChinese(3, 4, 27);OLED_ShowChar(3, 9, ':');OLED_ShowString(3,13,"ppm"); } /** * @brief 显示菜单1的传感器数据 * @param 无 * @retval 无 */ void SensorDataDisplay1(void) {//显示温度数据OLED_ShowNum(1, 6, sensorData.temp, 2);//显示湿度数据OLED_ShowNum(1, 14, sensorData.humi, 2);//显示光照强度数据OLED_ShowNum(2, 10, sensorData.lux, 4);//显示大气压强数据OLED_ShowNum(3, 10, 1020, 4);//显示系统状态数据if (!model){OLED_ShowChinese(4, 6, 36);OLED_ShowChinese(4, 7, 37);}else{OLED_ShowChinese(4, 6, 32);OLED_ShowChinese(4, 7, 33);} } /** * @brief 显示菜单2的传感器数据 * @param 无 * @retval 无 */ void SensorDataDisplay2(void) {//显示烟雾浓度数据OLED_ShowNum(1, 10, sensorData.smoke, 3);//显示一氧化碳数据OLED_ShowNum(2, 10, sensorData.CO, 3);//显示空气质量数据OLED_ShowNum(3, 10, sensorData.AQI, 3); } /** * @brief 显示系统阈值设置界面1 * @param 无 * @retval 无 */ void OLED_SetInterfacevoid(void) {//显示“光照阈值”OLED_ShowChinese(1, 2, 8);OLED_ShowChinese(1, 3, 9);OLED_ShowChinese(1, 4, 42);OLED_ShowChinese(1, 5, 43);OLED_ShowChar(1, 11, ':');//显示“烟雾阈值”OLED_ShowChinese(2, 2, 20);OLED_ShowChinese(2, 3, 21);OLED_ShowChinese(2, 4, 42);OLED_ShowChinese(2, 5, 43);OLED_ShowChar(2, 11, ':');//显示“一氧化碳阈值”OLED_ShowString(3, 3, "CO");OLED_ShowChinese(3, 4, 42);OLED_ShowChinese(3, 5, 43);OLED_ShowChar(3, 11, ':');//显示“空气质量阈值”OLED_ShowString(4, 3, "AQI");OLED_ShowChinese(4, 4, 42);OLED_ShowChinese(4, 5, 43);OLED_ShowChar(4, 11, ':');//显示光照阈值数值OLED_ShowNum(1, 12, Sensorthreshold.luxValue, 4);//显示烟雾阈值数值OLED_ShowNum(2, 12, Sensorthreshold.smokeValue, 3);//显示一氧化碳阈值数值OLED_ShowNum(3, 12, Sensorthreshold.COValue, 3);//显示空气质量阈值数值OLED_ShowNum(4, 12, Sensorthreshold.AQIValue, 3); } /** * @brief 记录阈值界面下按KEY1的次数 * @param 无 * @retval 返回次数 */ uint8_t SetSelection(void) {static uint8_t count = 1;if(KeyNum == KEY_1){KeyNum = 0;count++;if (count > 4){count = 1;}}return count; } /** * @brief 显示阈值界面的选择符号 * @param num 为显示的位置 * @retval 无 */ void OLED_Option(uint8_t num) {switch(num){case 1:OLED_ShowChar(1,1,'>');OLED_ShowChar(2,1,' ');OLED_ShowChar(3,1,' ');OLED_ShowChar(4,1,' ');break;case 2:OLED_ShowChar(1,1,' ');OLED_ShowChar(2,1,'>');OLED_ShowChar(3,1,' ');OLED_ShowChar(4,1,' ');break;case 3:OLED_ShowChar(1,1,' ');OLED_ShowChar(2,1,' ');OLED_ShowChar(3,1,'>');OLED_ShowChar(4,1,' ');break;case 4:OLED_ShowChar(1,1,' ');OLED_ShowChar(2,1,' ');OLED_ShowChar(3,1,' ');OLED_ShowChar(4,1,'>');break;default: break;} } /** * @brief 对阈值界面的传感器阈值进行修改 * @param num 为当前用户需要更改的传感器阈值位置 * @retval 无 */ void ThresholdModification(uint8_t num) {switch (num){case 1:if (KeyNum == KEY_3){KeyNum = 0;Sensorthreshold.luxValue += 10;if (Sensorthreshold.luxValue > 2000){Sensorthreshold.luxValue = 0;}}else if (KeyNum == KEY_4){KeyNum = 0;Sensorthreshold.luxValue -= 10;if (Sensorthreshold.luxValue > 2000){Sensorthreshold.luxValue = 2000;}}break;case 2:if (KeyNum == KEY_3){KeyNum = 0;Sensorthreshold.smokeValue += 10;if (Sensorthreshold.smokeValue > 500){Sensorthreshold.smokeValue = 0;}}else if (KeyNum == KEY_4){KeyNum = 0;Sensorthreshold.smokeValue -= 10;if (Sensorthreshold.smokeValue > 500){Sensorthreshold.smokeValue = 500;}}break;case 3:if (KeyNum == KEY_3){KeyNum = 0;Sensorthreshold.COValue += 10;if (Sensorthreshold.COValue > 500){Sensorthreshold.COValue = 0;}}else if (KeyNum == KEY_4){KeyNum = 0;Sensorthreshold.COValue -= 10;if (Sensorthreshold.COValue > 500){Sensorthreshold.COValue = 500;}}break;case 4:if (KeyNum == KEY_3){KeyNum = 0;Sensorthreshold.AQIValue += 10;if (Sensorthreshold.AQIValue > 500){Sensorthreshold.AQIValue = 0;}}else if (KeyNum == KEY_4){KeyNum = 0;Sensorthreshold.AQIValue -= 10;if (Sensorthreshold.AQIValue > 500){Sensorthreshold.AQIValue = 500;}}break;default: break;} } /** * @brief 根据标志位控制步进电机的运行 * @param 无 * @retval 无 */ void MotorOperation(void) {if (motorFlag == 1){MOTOR_Direction_Angle(1, 0, 90, 1);}else if (motorFlag == 2){MOTOR_Direction_Angle(0, 0, 90, 1);} } /** * @brief 传感器数据扫描 * @param 无 * @retval 无 */ void SensorScan(void) {DHT11_Read_Data(&sensorData.humi, &sensorData.temp);Get_Average_LDR_LUX(&sensorData.lux);Get_Average_MQ2_PPM(&sensorData.smoke);Get_Average_MQ7_PPM(&sensorData.CO);Get_Average_MQ135_PPM(&sensorData.AQI);sensorData.hPa = (uint32_t)BMP280_Get_Pressure(); } int main(void) {ADCX_Init(); Timer2_Init(9,14398);Uart2_Init(9600);Uart1_Init(115200);OLED_Init();Bmp_Init();DHT11_Init();Key_Init();MOTOR_Init();LED_Init();Buzzer_Init();while (1){SensorScan();//获取传感器数据switch (oledPages){case DISPLAY_PAGE1:OLED_Menu1();//显示主页面1固定信息SensorDataDisplay1();//显示传感器1数据MotorOperation();/*按键按下时进入主页面2*/if (KeyNum == KEY_2){KeyNum = 0;oledPages = DISPLAY_PAGE2;OLED_Clear();}/*按键按下时切换模式*/if (KeyNum == KEY_1){KeyNum = 0;model = !model;if (!model){LED_OFF();Buzzer_OFF();}}/*按键按下时进入阈值设计界面*/if (KeyNum == KEY_Long1){KeyNum = 0;oledPages = SETTINGS_PAGE;OLED_Clear();}break;case DISPLAY_PAGE2:OLED_Menu2();SensorDataDisplay2();MotorOperation();/*按键按下时进入主页面2*/if (KeyNum == KEY_2){KeyNum = 0;oledPages = DISPLAY_PAGE1;OLED_Clear();}break;case SETTINGS_PAGE:OLED_SetInterfacevoid();//显示阈值设置界面的固定内容OLED_Option(SetSelection());//实现阈值设置页面的选择功能ThresholdModification(SetSelection());//实现阈值调节功能//判断是否退出阈值设置界面if (KeyNum == KEY_2){KeyNum = 0;oledPages = DISPLAY_PAGE1;//跳转到主界面OLED_Clear();//清屏}break;default: break;}} }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255.256.257.258.259.260.261.262.263.264.265.266.267.268.269.270.271.272.273.274.275.276.277.278.279.280.281.282.283.284.285.286.287.288.289.290.291.292.293.294.295.296.297.298.299.300.301.302.303.304.305.306.307.308.309.310.311.312.313.314.315.316.317.318.319.320.321.322.323.324.325.326.327.328.329.330.331.332.333.334.335.336.337.338.339.340.341.342.343.344.345.346.347.348.349.350.351.352.353.354.355.356.357.358.359.360.361.362.363.364.365.366.367.368.369.370.371.372.373.374.375.376.377.378.379.380.381.382.383.384.385.386.387.388.389.390.391.392.393.394.395.396.397.398.399.400.401.402.403.404.405.406.407.408.409.410.411.412.413.414.415.416.417.418.419.420.421.422.423.424.425.426.427.428.429.430.431.432.433.434.435.436.437.438.439.440.441.442.443.444.445.446.447.448.449.450.451.452.453.454.455.456.457.458.459.460.461.462.463.464.465.466.467.468.469.470.471.472.473.474.475.476.477.478.479.480.
网址:基于STM32的智能家居控制系统设计与实现(带红外遥控控制空调) https://www.yuejiaxmz.com/news/view/1405153
相关内容
基于STM32的智能家居控制系统设计与实现基于STM32的智能家居照明控制系统设计与实现.docx
基于STM32的智能家居照明控制系统设计与实现
基于STM32的智能家居控制器设计与实现
基于STM32的智能家居灯光控制系统设计
基于STM32的智能家用节能控制系统设计
基于STM32智能照明控制系统设计
基于STM32智能家居控制系统软件设计及实现
基于STM32的智能家居控制系统设计与实现(程序+原理图+APP)
基于STM32的智能家居控制系统设计

