1. 智能家居系统的核心架构设计

智能家居系统听起来高大上,但其实拆解开来就是几个关键部分的组合。我自己做过好几个基于STM32的智能家居项目,发现最核心的就是传感器数据采集主控芯片处理云端数据交互这三个环节。

先说传感器部分吧。智能家居系统需要感知环境状态,比如温度、湿度、光照强度、人体移动等。我常用的DHT11温湿度传感器才几块钱一个,精度足够家用。光照检测可以用光敏电阻,人体感应用HC-SR501模块,这些都是很成熟的方案。关键是这些传感器都要接到STM32的ADC引脚或者GPIO口上,通过程序定时采集数据。

主控芯片我首选STM32F103系列,这款芯片性价比超高,自带多个ADC通道和通信接口,完全能满足智能家居的需求。最重要的是它的功耗控制得很好,即使24小时开机也不会很耗电。我之前测试过,一个完整的智能家居控制系统待机功耗不到3W,比一个灯泡还省电。

云端交互现在主流的是用ESP8266 WiFi模块,这个模块价格便宜而且稳定性不错。通过AT指令让STM32控制ESP8266连接家里的路由器,然后就可以用MQTT协议和云平台通信了。阿里云物联网平台有免费额度,特别适合毕业设计使用。

实际部署时要注意电源设计。我建议用5V/2A的电源适配器供电,然后通过AMS1117稳压芯片转换成3.3V给STM32和传感器供电。记得在电源入口加个470μF的电解电容滤波,能有效避免电压波动导致系统重启。

2. 环境监测功能的实现细节

环境监测是智能家居最基础的功能,但要做好也不容易。我先说温湿度监测的实现吧。DHT11传感器虽然便宜,但读取数据时要特别注意时序。我遇到过最坑的问题就是时序不对导致读数全是0,后来发现是延时不准确。

这是我最常用的读取函数:

void DHT11_Read_Data(uint8_t *temperature, uint8_t *humidity)
{
    uint8_t data[5] = {0};
    DHT11_Start();
    if(DHT11_Check_Response() == SUCCESS) {
        for(int i=0; i<5; i++) {
            data[i] = DHT11_Read_Byte();
        }
        if(data[4] == (data[0]+data[1]+data[2]+data[3])) {
            *humidity = data[0];
            *temperature = data[2];
        }
    }
}

光照监测建议用BH1750数字光照传感器,比光敏电阻准确得多。它是I2C接口的,直接接到STM32的I2C引脚上就行。这个传感器精度能达到1lx,而且自带数字输出,不用自己校准。

空气质量检测可以用GP2Y1010AU0F粉尘传感器检测PM2.5,用MQ-135检测有害气体。这两个传感器都需要模拟电压读取,要注意ADC的采样精度。我一般设置STM32的ADC为12位分辨率,这样能得到比较精确的数值。

数据上传到云端时要注意数据格式设计。我推荐用JSON格式,比如:

{
  "deviceId": "STM32_001",
  "temperature": 26.5,
  "humidity": 45,
  "light": 300,
  "pm25": 12
}

这样的数据结构清晰,云平台也容易解析。上传频率建议设置成5分钟一次,太频繁了浪费流量,太慢了又不够实时。

3. 设备远程控制的多种方案

设备控制是智能家居的核心功能,我实践过三种方案:WiFi直连、Zigbee组网和混合模式。WiFi方案最简单,直接用继电器模块控制电器开关。我常用5V继电器模块,驱动能力达到10A,足够控制台灯、风扇等小家电。

继电器控制代码很简单:

void Control_Relay(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint8_t state)
{
    if(state == ON) {
        HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET);
    } else {
        HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
    }
}

但WiFi方案有个缺点:每个设备都要配WiFi模块,成本较高。这时候Zigbee就显示出优势了。我用CC2530模块组建Zigbee网络,一个协调器带多个终端设备,成本能降低30%左右。

Zigbee组网要配置PAN ID和信道,建议用固定的参数避免干扰:

#define PAN_ID 0x1234
#define CHANNEL 11

混合模式是我最推荐的方案:用STM32作为网关,通过Zigbee连接各个传感器和执行器,再通过WiFi连接云端。这样既节省成本,又保证可靠性。网关程序要处理协议转换,比如把Zigbee的数据转换成MQTT协议上传。

远程控制还要考虑安全性。我建议每个设备设置独立的控制密钥,避免被恶意控制。控制指令最好加密传输,简单的可以用AES加密,虽然增加了一些计算量,但安全得多。

4. 物联网通信协议的选择与实现

物联网通信协议直接关系到系统稳定性,我对比过MQTT、HTTP和CoAP三种协议。MQTT最适合智能家居场景,因为它基于发布/订阅模式,功耗低而且支持离线消息。

我用FreeRTOS在STM32上跑MQTT客户端,这样能保证网络通信不阻塞其他任务。创建一个单独的MQTT任务:

void MQTT_Task(void const *argument)
{
    while(1) {
        if(WiFi_Connected()) {
            MQTT_Client_Connect();
            while(MQTT_Connected()) {
                MQTT_Client_Loop();
                osDelay(100);
            }
        }
        osDelay(1000);
    }
}

MQTT主题设计很重要,我建议用分层结构:home/living_room/temperature这样清晰明了。QoS级别通常设为1,保证消息至少送达一次,又不会像QoS2那样消耗太多资源。

HTTP协议虽然简单,但开销太大,不适合频繁数据传输。CoAP协议适合资源受限设备,但生态不如MQTT成熟。我最终选择MQTT+SSL的组合,既保证效率又确保安全。

数据持久化也很重要。我在STM32上用了SPI Flash存储历史数据,网络中断时先存本地,恢复后再同步到云端。这样即使网络不稳定,数据也不会丢失。

5. 低功耗设计与优化技巧

智能家居设备经常需要7x24小时运行,低功耗设计特别重要。STM32的低功耗模式我基本都用过,总结下来待机模式最省电,功耗可以降到2μA以下。

这是我的功耗优化方案:平时运行在运行模式,无操作时进入睡眠模式,用RTC定时唤醒采集数据。只有需要长时间待机时才进入待机模式。切换代码是这样的:

void Enter_LowPower_Mode(void)
{
    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 3600, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
    HAL_SuspendTick();
    HAL_PWR_EnterSTANDBYMode();
}

传感器供电也要优化。我用MOS管控制传感器电源,采集数据时才上电,平时完全断电。这样DHT11的功耗可以从5mA降到几乎为0。

时钟配置很关键。系统时钟越低越省电,我通常设置主时钟为32MHz,够用又省电。外设时钟不用时一定要关闭,比如ADC转换完成后立即关闭时钟。

电源管理芯片的选择也很重要。我推荐使用TPS63020这类高效降压芯片,转换效率能达到95%,比普通LDO强多了。电池供电的设备记得加电压检测,电量低时进入超级省电模式。

6. 手机APP与云端平台对接

现在做智能家居肯定要配手机APP,我用Android Studio开发控制APP,通过HTTP API与云端通信。阿里云物联网平台提供了完整的SDK,集成起来很方便。

APP设计要考虑用户体验。我通常设计三个主要界面:环境数据展示、设备控制、历史记录。数据刷新用下拉刷新方式,控制按钮要做防误触处理。

这是网络请求的示例代码:

public void controlDevice(String deviceId, String command) {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url("http://api.example.com/control?device="+deviceId+"&cmd="+command)
        .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            // 处理响应
        }
    });
}

云端我用Node-RED做数据流转发,这个工具可视化编程,很容易上手。通过MQTT节点接收设备数据,再用HTTP节点推送到手机APP。

数据存储用InfluxDB时序数据库,特别适合存储传感器数据。查询速度快,还支持各种聚合查询。Grafana做数据可视化,可以生成很漂亮的数据图表。

7. 常见问题与调试技巧

做智能家居系统肯定会遇到各种坑,我总结了一些常见问题和解决方法。最头疼的是WiFi频繁断连,后来发现是电源噪声导致的。在电源引脚加个0.1μF的去耦电容就解决了。

传感器数据异常也是常见问题。DHT11偶尔会读数失败,我的解决办法是连续读取三次取中间值。光照传感器要注意避免直射光,否则读数会偏高。

Zigbee网络干扰问题很麻烦。建议用Zigbee信道扫描工具选择空闲信道,避开WiFi信道。2.4GHz WiFi的信道1、6、11与Zigbee信道重叠最少。

调试时我习惯用SEGGER RTT实时输出日志,不占用串口资源。Hardfault故障要用STM32CubeIDE的故障分析功能,能快速定位内存访问错误。

固件升级要用OTA功能,我实现了通过MQTT推送固件包,自动校验和更新。关键是要设计回滚机制,更新失败时能恢复旧版本。

8. 扩展功能与创新设计

基础功能实现后,可以做一些创新扩展。我最近给系统加了语音控制功能,用LD3320语音识别芯片,本地识别简单指令,不依赖网络。

能源管理也是个有意思的方向。我在电源入口加了ACS712电流传感器,监测各设备耗电量,自动关闭待机设备,能省不少电。

智能场景联动很好用。比如设置"回家模式":开门自动开灯、开空调、播放音乐。我用红外学习模块控制空调电视,成本才十几块钱。

安全防护功能也很重要。我加了门窗磁感应和摄像头联动,检测到异常立即拍照上传云端,并通过APP推送告警信息。

这些扩展功能让智能家居系统更实用更好玩,而且都是基于STM32就能实现的,不需要很高端的硬件。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐