学习嵌入式硬件开发(五):项目实战 —— 手把手做一个智能温控器
从"学知识"到"做产品"
前面四篇文章,我们依次打好了电子基础、外设驱动、RTOS和PCB设计的地基。但知识只有落在真实产品上,才算真正"长"在身上。本篇用一个完整项目——智能温湿度监控器——把前五篇的内容串起来。你会看到:需求怎么拆解、BOM怎么算、任务怎么划分、单总线怎么调、OLED怎么优化,以及最重要的一点:从原型到量产还差多少。
产品需求定义
动手之前,先写清楚需求。模糊的"做一个温控器"会导致开发过程中不断改方案。我们的功能清单:
- 采集环境温度(DS18B20,精度±0.5℃)和湿度(DHT22,精度±2%RH)
- OLED显示屏(0.96寸,I²C接口)实时显示读数
- 三个按键:设置、+、-,用于设定温度阈值
- 超过阈值时蜂鸣器报警 + LED闪烁
- 通过UART将数据发送到电脑上位机(用于调试和数据记录)
硬件BOM清单
基于需求,我们选用与前面文章一致的STM32F103C8T6作为主控。BOM清单如下(2026年立创商城参考价):
| 器件 | 型号 | 单价 | 数量 | 说明 |
|---|---|---|---|---|
| MCU | STM32F103C8T6 | 8元 | 1 | 72MHz,64K+20K,含I²C/USART/定时器 |
| 温度传感器 | DS18B20 | 3元 | 1 | 单总线,测量范围-55~125℃ |
| 温湿度传感器 | DHT22 | 8元 | 1 | 单总线/单引脚,湿度±2%RH |
| OLED | SSD1306 0.96" I²C | 10元 | 1 | 128×64分辨率,I²C接口 |
| 蜂鸣器 | 有源蜂鸣器 3.3V | 2元 | 1 | 高电平触发,内部带振荡电路 |
| 按键 | 6×6mm轻触开关 | 0.5元 | 3 | 设置、+、- |
| LDO | AMS1117-3.3V | 1元 | 1 | USB 5V转3.3V |
| 总BOM成本 | — | 约25元 | — | 不含PCB与外壳 |
软件架构设计:FreeRTOS多任务
如果用裸机大循环,温度采集(DS18B20需要几百毫秒转换)、显示刷新、按键扫描、报警判断会互相阻塞。改用FreeRTOS后,每个功能独立成任务,由调度器自动管理:
┌─────────────────────────────────────────────┐
│ 任务一览 │
├──────────────┬─────────┬────────────────────┤
│ 任务名 │ 周期 │ 功能 │
├──────────────┼─────────┼────────────────────┤
│ vSensorTask │ 2000ms │ 读取DS18B20+DHT22 │
│ vDisplayTask │ 500ms │ 刷新OLED显示 │
│ vKeyTask │ 50ms │ 按键扫描+消抖 │
│ vAlarmTask │ 1000ms │ 阈值检测+报警控制 │
│ vUartTask │ 事件驱动│ 串口数据发送 │
└──────────────┴─────────┴────────────────────┘
任务间通信:传感器数据通过消息队列传递给显示任务和报警任务。按键任务通过信号量通知报警任务进入/退出设置模式。这种"数据走队列、事件走信号量"的设计,是FreeRTOS项目最经典的范式。
DS18B20单总线驱动(难点)
DS18B20使用1-Wire(单总线)协议,只用一根数据线完成供电( parasite 模式)和双向通信。它对时序要求极其严格——微秒级的偏差就会导致读取失败。这是本项目最大的技术坑。
// 复位脉冲:主机拉低总线≥480μs,然后释放,等待从机应答
void ds18b20_reset(void) {
GPIO_OUT_LOW();
delay_us(480); // 拉低480μs
GPIO_IN_FLOATING(); // 释放总线
delay_us(60); // 等待从机响应
if (!GPIO_READ()) { // 从机应拉低总线(存在脉冲)
delay_us(420);
// OK, 从机存在
}
}
// 写1位:先拉低1-15μs,然后释放(写1)或保持低(写0)
void ds18b20_write_bit(uint8_t bit) {
GPIO_OUT_LOW();
delay_us(2); // 起始脉冲
if (bit) {
GPIO_IN_FLOATING(); // 释放 = 写1
} else {
GPIO_OUT_LOW(); // 保持低 = 写0
}
delay_us(60); // 等待时序完成
GPIO_IN_FLOATING();
delay_us(2);
}
taskENTER_CRITICAL() / taskEXIT_CRITICAL() 把单总线时序代码包起来。我们曾经因为漏了这一层保护,导致温控器约30%概率启动后读不到温度,排查了整整两天。
DHT22的注意事项
DHT22同样使用单总线,但协议不同:它一次传输40位数据(16位湿度 + 16位温度 + 8位校验和),且主机必须先发启动信号(拉低≥18ms),从机才会响应。注意:DS18B20和DHT22不能共用同一根数据线——它们的时序协议不同,会互相干扰。本项目分别接到不同的GPIO。
OLED驱动的优化
SSD1306 OLED通过I²C控制,显存(GRAM)大小为128×64bit = 1024字节。如果每次全屏刷新,I²C在100kHz速率下约需80ms——太慢了,会导致显示卡顿、其他任务被饿死。
优化方案有两个:
- 增量刷新:只更新变化的区域(比如温度数字变了,只重绘那几个字符的区域),其余保持不动
- 页寻址模式:SSD1306支持页寻址(Page Addressing),一次写一行(8像素高),减少地址设置命令的开销
实际项目中,我们采用"增量刷新 + 局部清屏"策略,把刷新时间从80ms降到5ms以内,显示流畅度显著提升。
成品效果验证
接入USB供电后,项目应达到以下验收标准:
- OLED屏幕显示当前温度 28.5℃、湿度 65%RH
- 按下 SET 键进入阈值设置模式,+/- 键调整目标温度
- 温度超过设定阈值(如30℃)时,蜂鸣器滴-滴-滴报警 + LED闪烁
- USB连接电脑,串口助手每秒收到一条JSON数据:
{"t":28.5,"h":65,"ts":12345}
// vUartTask 发送的数据格式(紧凑JSON,节省带宽)
void vUartTask(void *pv) {
SensorData_t data;
char buf[64];
while (1) {
if (xQueueReceive(xSensorQueue, &data, portMAX_DELAY)) {
int len = snprintf(buf, sizeof(buf),
"{\"t\":%.1f,\"h\":%d,\"ts\":%lu}\r\n",
data.temperature, (int)data.humidity, data.timestamp);
HAL_UART_Transmit(&huart1, (uint8_t*)buf, len, 100);
}
}
}
从原型到量产还有多远?
当前是原型验证阶段。要进入量产,还有四道坎:
1. PCB布局优化
原型用洞洞板或最小系统板飞线,量产必须做正式PCB:减小尺寸、增加测试点(方便ICT测试)、预留编程接口、考虑外壳限位。
2. 增加ESD与EMC保护
原型在桌面跑得好好的,量产到用户手里可能因为静电(ESD)死机。需要在:
- USB接口处加 TVS管(如SMBJ5.0A)防浪涌
- 按键、传感器接口加 共模电感 / 滤波电容
- 对外走线串 100Ω电阻 限流,减缓ESD冲击
3. 固件增加OTA升级
量产产品不可能每次升级都拆壳烧录。需要预留Bootloader分区,支持通过UART(或未来的WiFi)进行OTA固件升级。这涉及Flash分区规划(Bootloader + App + Download),是量产前必须提前设计的基础设施。
4. 外壳与结构
原型裸板→3D打印外壳验证装配→开模量产。外壳还要考虑:散热孔、蜂鸣器出声孔、显示屏可视窗、按键手感。这部分需要和结构工程师协作。
常见问题 FAQ
Q 做一个智能温控器需要哪些核心硬件?
核心三件套:MCU主控(STM32F103或国产GD32)、温度传感器(DS18B20数字式或NTC热敏电阻)、执行机构(继电器或SSR驱动加热/制冷)。加上OLED显示、按键、电源模块,一个基础款温控器BOM成本约15-25元。
Q DS18B20单总线协议怎么驱动?
单总线只需要一根数据线,时序要求严格:主机拉低480μT复位、释放总线等待60μT检测存在脉冲、然后按位读写。一定要用微秒级延时函数,不能用毫秒delay。明徽智能科技在智能温控器方案中用DS18B20测温。
Q 智能温控器的FreeRTOS任务怎么划分?
建议分四个任务:温度采集任务(1秒周期读传感器)、PID控温任务(根据误差调节输出)、显示刷新任务(200ms刷OLED)、按键扫描任务(消抖+长按)。任务间用队列传递设定温度和当前温度。
Q 从原型到量产,温控器PCBA要做哪些优化?
原型阶段验证功能即可,量产阶段要优化:PCB布局通过EMC测试、BOM换成更便宜的国产替代料、软件加看门狗和异常恢复、增加产线测试点。明徽智能科技提供从原型到量产的完整PCBA方案支持。
Q 智能温控器方案开发周期多久?
样机阶段4-6周(原理图+PCB+固件调试),量产导入2-3周(试产+测试+小批量验证)。如果是加热饭盒、烤箱这类厨电温控产品,明徽智能科技有成熟方案可直接参考,周期可缩短到3周。 本项目实战涵盖智能温控器、嵌入式项目实战、FreeRTOS多任务、DS18B20单总线、DHT22、SSD1306 OLED显示、STM32F103C8T6应用,完整走通原型到量产的PCBA方案流程。