1. 项目概述
这个基于STM32F103C8T6单片机的智能家居系统,是我最近完成的一个嵌入式开发项目。它通过多种传感器实时监测室内环境参数,并通过WiFi模块实现远程监控和控制。整套系统从硬件设计到软件开发都由我独立完成,现在把整个开发过程和经验分享给大家。
这个系统最核心的特点是实现了环境数据的采集、显示、自动控制和远程监控四大功能。相比市面上现成的智能家居产品,自己动手开发可以更灵活地定制功能,而且成本更低。整个项目涉及硬件电路设计、PCB制作、嵌入式编程、通信协议等多个技术点,非常适合想要学习STM32开发的朋友参考。
2. 硬件设计与器件选型
2.1 核心控制器选择
我选择了STM32F103C8T6作为主控芯片,主要基于以下几点考虑:
- 性价比高:这款芯片价格在10-15元左右,性能足够满足智能家居控制需求
- 资源丰富:具有64KB Flash、20KB RAM,支持多种外设接口
- 开发环境成熟:有完善的Keil MDK开发工具链和丰富的库函数支持
提示:对于初学者,建议选择带调试接口的STM32最小系统板,可以省去电源和调试电路的设计工作。
2.2 传感器模块选型
系统使用了四种环境传感器:
-
DHT11温湿度传感器:
- 测量范围:温度0-50℃,湿度20-90%RH
- 精度:温度±2℃,湿度±5%RH
- 数字信号输出,单总线接口
-
MQ-135空气质量传感器:
- 检测NH3、NOx、CO2等气体浓度
- 模拟电压输出,需要ADC采集
- 加热时间约20秒,测量前需要预热
-
光敏电阻传感器:
- 检测环境光照强度
- 模拟电压输出,电阻值随光照变化
- 需要配合分压电路使用
-
蜂鸣器报警模块:
- 有源蜂鸣器,3-5V驱动
- 通过GPIO直接控制
2.3 通信与显示模块
-
ESP8266-01S WiFi模块:
- 支持802.11 b/g/n协议
- 内置TCP/IP协议栈
- 通过AT指令控制
- 工作电流约80mA,需要稳定电源
-
OLED显示屏:
- 0.96寸,128x64分辨率
- I2C接口,节省IO资源
- 低功耗,适合嵌入式应用
2.4 执行机构设计
-
继电器模块:
- 控制风扇和照明灯
- 选用5V驱动,10A负载能力的型号
- 注意添加续流二极管保护电路
-
直流风扇:
- 5V供电,电流约200mA
- 通过MOS管驱动,PWM调速
3. 电路设计详解
3.1 电源电路设计
系统需要多种电压等级:
- 5V:给传感器、继电器、风扇供电
- 3.3V:给STM32、ESP8266、OLED供电
我采用了以下电源方案:
- 输入:USB 5V或锂电池7.4V
- 5V稳压:使用AMS1117-5.0稳压芯片
- 3.3V稳压:使用AMS1117-3.3稳压芯片
- 每个电源支路添加100μF和0.1μF滤波电容
注意:ESP8266工作时电流波动大,建议单独一路LDO供电,并加大滤波电容。
3.2 传感器接口电路
-
DHT11接口:
- 单总线设计,上拉4.7k电阻
- 信号线串联100Ω电阻防干扰
-
MQ-135接口:
- 模拟输出接STM32 ADC引脚
- 添加RC低通滤波(1kΩ+0.1μF)
-
光敏电阻电路:
- 与10kΩ电阻组成分压电路
- 分压点接ADC输入
3.3 PCB布局要点
-
分区布局:
- 数字区:MCU、OLED、按键
- 模拟区:传感器信号处理
- 功率区:继电器、风扇驱动
-
布线技巧:
- 模拟信号走线尽量短
- 数字信号线添加33Ω串联电阻
- 电源线加粗,形成完整地平面
-
抗干扰措施:
- 晶振下方不走线
- 关键信号包地处理
- 添加适当的去耦电容
4. 软件设计与实现
4.1 系统软件架构
采用前后台系统架构:
- 主循环:处理传感器数据、显示更新
- 定时中断:周期性采集传感器数据
- 串口中断:处理WiFi通信
c复制// 主程序框架
int main(void)
{
hardware_init(); // 硬件初始化
wifi_init(); // WiFi模块初始化
sensor_init(); // 传感器初始化
while(1)
{
read_sensors(); // 读取传感器数据
update_display(); // 更新显示
handle_wifi(); // 处理WiFi通信
control_actuators(); // 控制执行机构
}
}
4.2 传感器数据采集
- DHT11温湿度采集:
c复制void DHT11_Read_Data(uint8_t *temp, uint8_t *humi)
{
// 启动信号
DHT11_IO_OUT();
DHT11_DQ_OUT_LOW;
delay_ms(18);
DHT11_DQ_OUT_HIGH;
delay_us(30);
// 等待响应
DHT11_IO_IN();
while(DHT11_DQ_IN);
while(!DHT11_DQ_IN);
// 读取40位数据
for(i=0;i<40;i++)
{
while(DHT11_DQ_IN);
delay_us(40);
if(DHT11_DQ_IN)
data[i/8] |= (1<<(7-i%8));
while(!DHT11_DQ_IN);
}
}
- ADC采集处理:
c复制uint16_t Get_ADC_Value(uint8_t ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
4.3 OLED显示实现
采用分层显示架构:
- 底层驱动:实现基本画点函数
- 中间层:字符、图形绘制函数
- 应用层:数据格式化显示
c复制void Show_Sensor_Data(void)
{
OLED_Clear();
OLED_ShowString(0,0,"Temp: ",16);
OLED_ShowNum(48,0,temp,2,16);
OLED_ShowString(80,0,"C",16);
OLED_ShowString(0,2,"Humi: ",16);
OLED_ShowNum(48,2,humi,2,16);
OLED_ShowString(80,2,"%",16);
// 其他数据显示...
}
4.4 WiFi通信实现
- ESP8266初始化流程:
c复制void ESP8266_Init(void)
{
USART_SendString(USART2,"AT\r\n"); // 测试AT指令
delay_ms(1000);
USART_SendString(USART2,"AT+CWMODE=1\r\n"); // 设置为Station模式
delay_ms(1000);
USART_SendString(USART2,"AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"); // 连接WiFi
delay_ms(5000);
USART_SendString(USART2,"AT+CIPMUX=1\r\n"); // 开启多连接
delay_ms(1000);
USART_SendString(USART2,"AT+CIPSERVER=1,8080\r\n"); // 开启TCP服务器
delay_ms(1000);
}
- 数据上传协议设计:
json复制{
"temp":25.6,
"humi":60.2,
"light":320,
"air":120,
"fan":0,
"light":1
}
5. 系统调试与优化
5.1 常见问题排查
-
DHT11读取失败:
- 检查接线是否正确,DATA引脚需要上拉
- 确保时序严格,特别是起始信号
- 增加重试机制,连续3次失败返回错误
-
ESP8266连接不稳定:
- 检查电源是否足够(建议单独供电)
- 确保WiFi信号强度(RSSI>-70dBm)
- 添加看门狗和自动重连机制
-
ADC采集值跳动:
- 检查参考电压是否稳定
- 添加软件滤波(如滑动平均)
- 远离高频干扰源
5.2 性能优化技巧
-
低功耗优化:
- 空闲时进入STOP模式
- 传感器周期性采样而非连续
- 降低主频到8MHz(不影响功能时)
-
响应速度优化:
- 关键任务放在中断处理
- 使用DMA传输传感器数据
- 优化显示刷新策略
-
稳定性增强:
- 添加软件看门狗
- 关键数据EEPROM备份
- 异常状态自动恢复
6. 项目扩展与改进
6.1 功能扩展方向
-
增加更多传感器:
- PM2.5传感器
- CO2浓度传感器
- 人体红外感应
-
增强控制功能:
- 语音控制集成
- 场景模式设置
- 能耗统计
-
云平台对接:
- 阿里云IoT
- 腾讯云IoT
- Home Assistant
6.2 硬件改进建议
-
改用STM32F4系列:
- 更高性能,支持浮点运算
- 更多外设资源
- 更低功耗
-
采用模块化设计:
- 核心板+功能板结构
- 便于功能扩展
- 简化维修更换
-
优化电源设计:
- 锂电池充放电管理
- 太阳能供电
- 低功耗设计
在实际开发过程中,我发现STM32的硬件I2C有时会出现死锁问题,最终改为软件模拟I2C驱动OLED。另外,ESP8266的固件版本对稳定性影响很大,建议使用最新的AT固件(版本2.2.0以上)。对于需要精确计时的应用,可以考虑使用STM32的硬件定时器产生微妙级延时,比软件延时更准确。
