1. 项目概述与设计思路
这个智能降温水杯项目是我最近完成的一个嵌入式系统实践,核心功能是通过STM32单片机实现水温的智能调节。作为一个经常需要喝温水但又总是忘记及时补充的人,这个项目完美解决了我的痛点。整个系统由温度采集、控制逻辑、执行机构和用户交互四个部分组成,下面我会详细拆解每个环节的实现过程。
系统工作原理其实很直观:DS18B20温度传感器实时监测水温,STM32根据当前温度与设定值的比较结果,通过PWM控制风扇转速和制冷片的工作状态。用户可以通过按键、语音或手机APP三种方式与系统交互,这种多模态交互设计在实际使用中非常方便。
提示:在设计类似项目时,建议优先考虑多种交互方式,单一的控制方式在实际使用中往往不够灵活。
2. 硬件选型与电路设计
2.1 核心控制器选择
我选择了STM32F103C8T6作为主控芯片,这款芯片在性能和成本之间取得了很好的平衡。它基于ARM Cortex-M3内核,主频72MHz,64KB Flash和20KB RAM,对于这个项目来说绰绰有余。更重要的是,它有丰富的GPIO和多个定时器,可以轻松实现PWM输出控制风扇转速。
为什么没有选择更便宜的51单片机?主要考虑三点:
- 需要同时处理蓝牙通信、语音识别和温度控制,对实时性要求较高
- 未来可能需要扩展更多功能(比如增加加热功能)
- 开发环境更友好,调试工具更完善
2.2 温度采集方案
DS18B20是一款非常经典的数字温度传感器,选择它主要基于以下考虑:
- 单总线接口,节省IO资源
- ±0.5℃的精度完全满足水温测量需求
- 防水封装可以直接接触液体
- 成熟的Arduino/STM32驱动库
实际使用中需要注意:
- 上拉电阻建议使用4.7kΩ
- 读取间隔不宜过短(我设置为500ms)
- 需要进行简单的软件滤波处理跳动值
2.3 蓝牙通信模块
HC-05蓝牙模块是这个项目实现手机控制的关键。选择标准版带按键的主要考虑:
- 支持主从模式切换
- 内置3.3V稳压,可直接连接STM32
- 带状态指示灯,调试方便
- 按键可快速进入AT指令模式
连接时需要注意:
- TXD接STM32的RX,RXD接TX
- 最好通过电平转换芯片或电阻分压连接5V模块
- 波特率建议设置为9600或115200
2.4 执行机构设计
制冷系统由半导体制冷片、风扇和MOS管驱动电路组成:
- 制冷片型号TEC1-12706,最大电压12V,电流6A
- 风扇选用5V静音风扇,通过PWM控制转速
- MOS管使用IRF540N,驱动电流足够
- 继电器控制制冷片通断,避免长期工作
重要提示:制冷片工作时会产生大量热量,必须配合散热器使用,否则会很快烧毁!
3. 软件架构与关键代码
3.1 系统主流程设计
整个系统的软件架构采用前后台模式:
c复制void main() {
hardware_init(); // 硬件初始化
while(1) {
read_temperature(); // 温度采集
update_display(); // OLED显示
check_buttons(); // 按键处理
ble_process(); // 蓝牙通信
voice_process(); // 语音识别
control_logic(); // 控制逻辑
}
}
3.2 温度采集与处理
DS18B20的读取需要严格按照时序:
c复制float read_ds18b20() {
reset_ds18b20();
write_byte(0xCC); // 跳过ROM
write_byte(0x44); // 开始转换
delay_ms(750); // 等待转换完成
reset_ds18b20();
write_byte(0xCC); // 跳过ROM
write_byte(0xBE); // 读取暂存器
uint8_t lsb = read_byte();
uint8_t msb = read_byte();
int16_t temp = (msb << 8) | lsb;
return temp * 0.0625; // 转换为摄氏度
}
为了提高稳定性,我增加了滑动平均滤波:
c复制#define FILTER_SIZE 5
float temp_history[FILTER_SIZE];
float filtered_temp = 0;
void update_temperature() {
// 移出最旧数据
for(int i=0; i<FILTER_SIZE-1; i++) {
temp_history[i] = temp_history[i+1];
}
// 添加新数据
temp_history[FILTER_SIZE-1] = read_ds18b20();
// 计算平均值
float sum = 0;
for(int i=0; i<FILTER_SIZE; i++) {
sum += temp_history[i];
}
filtered_temp = sum / FILTER_SIZE;
}
3.3 蓝牙通信协议设计
HC-05与手机APP之间的通信采用简单的文本协议:
- 手机→模块:"TEMP=25.5" 设置目标温度
- 手机→模块:"MODE=AUTO" 设置自动模式
- 手机→模块:"FAN=50" 设置风扇转速(0-100%)
- 模块→手机:"CURTEMP=26.3" 当前温度
- 模块→手机:"STATE=FAN_ON" 当前状态
接收处理代码示例:
c复制void ble_process() {
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) {
char ch = USART_ReceiveData(USART1);
if(ch == '\n') {
parse_command(rx_buffer);
rx_index = 0;
} else {
rx_buffer[rx_index++] = ch;
}
}
}
void parse_command(char* cmd) {
if(strncmp(cmd, "TEMP=", 5) == 0) {
target_temp = atof(cmd+5);
}
else if(strncmp(cmd, "FAN=", 4) == 0) {
fan_speed = atoi(cmd+4);
set_pwm(fan_speed);
}
// 其他命令处理...
}
4. 控制逻辑实现
4.1 自动模式算法
自动控制逻辑是项目的核心,我采用了分级控制策略:
c复制void auto_control() {
float diff = filtered_temp - target_temp;
if(diff > 5.0) { // 温差大于5℃
set_fan_speed(100); // 全速风扇
enable_peltier(); // 开启制冷片
}
else if(diff > 2.0) { // 温差2-5℃
set_fan_speed(70); // 70%转速
enable_peltier(); // 开启制冷片
}
else if(diff > 0.5) { // 温差0.5-2℃
set_fan_speed(50); // 50%转速
disable_peltier(); // 关闭制冷片
}
else if(diff < -0.5) { // 温度低于设定值
set_fan_speed(0); // 关闭风扇
disable_peltier(); // 关闭制冷片
}
}
4.2 PWM风扇控制
风扇转速通过TIM2的PWM输出控制:
c复制void set_fan_speed(uint8_t percent) {
if(percent > 100) percent = 100;
// 计算占空比
uint16_t pulse = (TIM2->ARR * percent) / 100;
TIM_SetCompare2(TIM2, pulse);
// 更新显示
char buf[16];
sprintf(buf, "FAN:%3d%%", percent);
oled_show_string(0, 3, buf);
}
4.3 制冷片控制
制冷片通过继电器控制,避免频繁开关:
c复制void enable_peltier() {
if(!peltier_status) {
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 打开继电器
peltier_status = 1;
last_peltier_on = HAL_GetTick();
}
}
void disable_peltier() {
if(peltier_status) {
// 最小工作时间保护(30秒)
if(HAL_GetTick() - last_peltier_on > 30000) {
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 关闭继电器
peltier_status = 0;
}
}
}
5. 用户交互实现
5.1 OLED显示界面
0.96寸OLED显示核心信息:
c复制void update_display() {
oled_clear();
// 显示当前温度
char temp_str[16];
sprintf(temp_str, "Temp:%.1fC", filtered_temp);
oled_show_string(0, 0, temp_str);
// 显示目标温度
sprintf(temp_str, "Target:%.1fC", target_temp);
oled_show_string(0, 1, temp_str);
// 显示模式
char* mode_str = (current_mode == AUTO) ? "Mode:AUTO" : "Mode:MANUAL";
oled_show_string(0, 2, mode_str);
// 显示风扇状态
char fan_str[16];
sprintf(fan_str, "FAN:%3d%%", fan_speed);
oled_show_string(0, 3, fan_str);
// 显示制冷片状态
char* peltier_str = peltier_status ? "Peltier:ON " : "Peltier:OFF";
oled_show_string(0, 4, peltier_str);
}
5.2 按键功能实现
三个按键分别实现:
- KEY1:模式切换(自动/手动)
- KEY2:目标温度+
- KEY3:目标温度-
按键消抖处理:
c复制#define DEBOUNCE_TIME 20
void check_buttons() {
static uint32_t last_check = 0;
if(HAL_GetTick() - last_check < 50) return;
last_check = HAL_GetTick();
// KEY1处理
if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)) {
HAL_Delay(DEBOUNCE_TIME);
if(!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)) {
current_mode = (current_mode == AUTO) ? MANUAL : AUTO;
while(!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin));
}
}
// KEY2和KEY3处理类似...
}
5.3 语音控制实现
SU-03T语音模块通过串口与STM32通信:
c复制void voice_process() {
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)) {
char ch = USART_ReceiveData(USART2);
if(ch == '\n') {
parse_voice_command(voice_buffer);
voice_index = 0;
} else {
voice_buffer[voice_index++] = ch;
}
}
}
void parse_voice_command(char* cmd) {
if(strstr(cmd, "打开风扇")) {
set_fan_speed(80);
voice_response("风扇已打开");
}
else if(strstr(cmd, "当前温度")) {
char response[32];
sprintf(response, "当前温度%.1f度", filtered_temp);
voice_response(response);
}
// 其他语音命令...
}
6. 电源管理与低功耗设计
6.1 电源系统架构
整个系统采用锂电池供电,通过两个稳压电路:
- 3.3V LDO:为STM32、蓝牙模块、传感器供电
- 5V DCDC:为风扇、语音模块、OLED供电
- 12V DCDC:专为制冷片供电
重要提示:制冷片工作电流较大(可达6A),必须单独供电并加粗走线!
6.2 低功耗考虑
虽然这个项目对功耗要求不高,但良好的电源设计可以延长电池寿命:
- 制冷片工作时关闭OLED背光
- 无操作5分钟后降低OLED刷新率
- 蓝牙模块在没有连接时进入低功耗模式
- 温度采集间隔在稳定后可延长至2秒
7. 制作与调试经验
7.1 PCB设计要点
在嘉立创设计PCB时需要注意:
- 大电流路径(制冷片、风扇)线宽至少2mm
- 数字和模拟地分开布局,单点连接
- 温度传感器远离发热元件(制冷片、稳压芯片)
- 为调试预留足够的测试点
7.2 常见问题排查
-
蓝牙无法连接:
- 检查模块是否进入AT模式(指示灯快闪)
- 确认波特率设置一致
- 检查TX/RX是否交叉连接
-
温度读数不稳定:
- 检查DS18B20的上拉电阻
- 增加软件滤波
- 确保传感器防水处理完好
-
制冷效果不佳:
- 检查散热器是否安装正确
- 测量制冷片两端电压是否达到12V
- 确认导热硅脂涂抹均匀
7.3 性能优化建议
经过实际测试,以下几个优化可以提升使用体验:
- 增加温度校准功能,补偿传感器误差
- 实现PID控制算法,更精确的温度调节
- 添加水温预测功能,提前启动制冷
- 开发iOS/Android双平台APP
8. 项目扩展方向
这个基础框架可以扩展更多实用功能:
- 增加加热功能,实现双向温控
- 集成水质检测传感器
- 添加饮水记录和提醒功能
- 实现多杯组网,同步温度设置
- 开发微信小程序控制界面
我在实际使用中发现,语音控制在某些场景下特别方便,比如当双手不方便操作手机时。而蓝牙APP控制则更适合精确的温度设置。这种多模态交互设计确实大大提升了产品的易用性。
