1. 项目概述
这个基于STM32的WiFi远程温控风扇系统,是我去年指导本科生毕业设计时开发的一个典型物联网应用案例。它完美结合了嵌入式开发、传感器技术和无线通信三大核心模块,实现了通过手机APP远程监控环境温度并控制风扇转速的功能。
整套系统硬件成本控制在200元以内,但实现了完整的物联网闭环控制:温度传感器采集数据→STM32处理→WiFi模块上传云端→手机APP显示和控制→指令回传→PWM调节风扇转速。这种"感知-传输-控制"的架构模式,在智能家居、农业大棚、机房监控等场景都有广泛应用价值。
提示:选择STM32F103C8T6作为主控,不仅因为其性价比高(零售价约15元),更因其丰富的外设资源(12位ADC、4个定时器)完全满足本项目需求,且开发资料齐全,特别适合学生项目。
2. 硬件系统设计
2.1 核心器件选型
主控芯片:STM32F103C8T6(Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM)
- 选用原因:内置硬件PWM生成器,可直接驱动风扇;12位ADC精度满足温度采集需求;USART接口与WiFi模块通信
温度传感器:DS18B20(数字输出,±0.5℃精度)
- 对比DHT11的优势:单总线协议节省IO口;测量范围更广(-55~+125℃);无需额外ADC
WiFi模块:ESP8266-01S(支持STA/AP模式,AT指令控制)
- 实测发现:V1.7固件版本最稳定,需注意供电必须≥3.3V且电流≥500mA
风扇驱动:5V直流风扇+MOS管IRLZ34N
- PWM频率选择25kHz(超出人耳听觉范围,避免噪音)
- 占空比调节范围30%~100%(低于30%可能无法启动)
2.2 电路设计要点
电源部分采用两级稳压:
- 输入USB 5V→AMS1117-3.3给MCU和传感器供电
- 单独7805给风扇供电(避免电机干扰MCU)
PCB布局三个关键:
- WiFi天线区域净空(至少10mm无走线)
- PWM驱动线路远离模拟信号线
- 所有数字地模拟地在MCU下方单点连接
常见问题:初期设计未隔离风扇电源,导致MCU频繁复位。解决方案是在7805输出端加100μF电解电容+0.1μF陶瓷电容组合。
3. 软件架构实现
3.1 嵌入式端开发
使用Keil MDK开发环境,程序分层结构:
c复制/* 硬件抽象层 */
void HAL_Init(void) {
DS18B20_Init(); // 温度传感器
PWM_Init(25000); // 25kHz PWM
USART2_Init(115200); // WiFi通信
}
/* 业务逻辑层 */
void Main_Loop() {
float temp = Read_Temperature();
Send_To_Cloud(temp);
if(Receive_Command()) {
Set_PWM_Duty(recv_value);
}
}
温度采集关键代码:
c复制float DS18B20_ReadTemp(void) {
uint8_t tempL, tempH;
DS18B20_Start();
DS18B20_Read(&tempL, &tempH);
return ((tempH<<8)|tempL) * 0.0625; // 12位精度转换
}
3.2 通信协议设计
自定义轻量级JSON协议:
json复制{
"dev":"FAN_001",
"temp":26.5,
"pwm":70,
"cmd":0
}
字段说明:
cmd=0:上行数据(传感器→云端)cmd=1:下行指令(手机→设备)pwm:下行时表示设定值,上行时反馈当前值
经验:每个数据包添加\n结尾,解决ESP8266的TCP粘包问题。测试显示300ms间隔发送最佳,兼顾实时性和网络负载。
4. 云端与APP对接
4.1 腾讯云IoT平台配置
创建产品时关键参数:
- 通信协议:MQTT over WiFi
- 数据模板:添加temperature和fan_speed两个属性
- 设备密钥:采用一机一密方式
设备端连接流程:
- 发送AT+CWJAP连接路由器
- AT+MQTTUSERCFG配置客户端信息
- AT+MQTTCONN连接云平台
- 定时AT+MQTTPUB发布温度数据
4.2 安卓APP开发要点
使用Android Studio开发,核心功能类:
java复制public class MqttService {
private void handleMessage(String topic, MqttMessage message) {
JSONObject obj = new JSONObject(message.toString());
runOnUiThread(()->{
tempText.setText(obj.getDouble("temp")+"℃");
seekBar.setProgress(obj.getInt("pwm"));
});
}
}
界面设计建议:
- 采用Material Design风格
- 实时温度曲线使用MPAndroidChart绘制
- 滑动条事件需做防抖处理(300ms间隔)
5. 系统调试与优化
5.1 温控算法实现
采用增量式PID算法:
c复制typedef struct {
float Kp, Ki, Kd;
float err, lastErr;
} PID;
float PID_Calc(PID* pid, float set, float now) {
pid->err = set - now;
float increment = pid->Kp*(pid->err-pid->lastErr)
+ pid->Ki*pid->err
+ pid->Kd*(pid->err-2*pid->lastErr);
pid->lastErr = pid->err;
return increment;
}
参数整定经验:
- 先设Ki=Kd=0,增大Kp至系统震荡
- 取震荡时Kp的50%作为基准值
- 加入Ki(基准值的10%),消除静差
- 最后加Kd(基准值的30%),抑制超调
5.2 低功耗优化
实测电流数据:
- 全速运行:120mA
- 优化后待机:15mA
具体措施:
- 温度采样间隔从1s改为5s(人体舒适度变化缓慢)
- WiFi模块空闲时进入Light-sleep模式
- STM32主频降至36MHz(通过HSI分频实现)
- 关闭所有未用外设时钟
6. 项目扩展方向
6.1 功能增强建议
- 异常报警:温度超过阈值时APP推送通知
- 实现方法:腾讯云IoT平台配置触发器规则
- 历史数据存储:使用云数据库COS存储
- 存储策略:每小时存一条完整记录
- 多设备组网:通过ESP-NOW协议实现
- 优势:不依赖路由器,直接设备间通信
6.2 工程化改进
量产注意事项:
- PCB改用4层板设计(改善EMI性能)
- 选用工业级ESP32-WROOM模组(-40℃~85℃)
- 增加TVS二极管防护(尤其RS485接口)
我在实际部署中发现,在金属机箱内安装时,WiFi信号衰减可达20dB。解决方案是在外壳开槽并外接棒状天线,或改用4G Cat.1模组(如EC200T)。