作为一名嵌入式开发工程师,最近完成了一个特别有意义的项目——为视障人士设计的智能水杯系统。这个项目源于我的一位视障朋友在使用普通水杯时遇到的诸多不便:无法判断水温、不知道杯中水量、经常找不到水杯位置。基于STM32单片机开发的这套系统,通过多传感器融合和语音交互,完美解决了这些痛点。
系统核心功能包括:
特别说明:水位阈值100/200的单位是克(g),对应约半杯和满杯状态。这个设计考虑了水杯倾倒时的误报问题,实际测试中当倾斜角度超过45度时会自动暂停检测。
经过对比STM32F103C6T6和STC89C52两款单片机,最终选择了前者,主要基于三点考量:
性能需求:
外设资源:
c复制// STM32F103C6T6资源概览
- 32KB Flash / 10KB SRAM
- 2个SPI接口(驱动OLED和HX711)
- 3个USART(语音模块通信)
- 11个定时器(用于PWM温控和倒计时)
开发便利性:
采用DS18B20数字温度传感器,相比模拟传感器有以下优势:
典型读取代码示例:
c复制float Read_DS18B20(void) {
DS18B20_Start();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
temp_l = DS18B20_ReadByte();
temp_h = DS18B20_ReadByte();
return (temp_h<<8 | temp_l) * 0.0625;
}
HX711模块的电路连接需要注意:
code复制HX711 STM32
VCC → 3.3V
GND → GND
DT → PB12
SCK → PB13
校准步骤:
SU-02T语音识别模块的配置要点:
语音指令处理逻辑:
mermaid复制graph TD
A[语音触发] --> B{指令匹配?}
B -->|是| C[执行对应动作]
B -->|否| D[提示"未识别"]
采用时间片轮询架构,确保实时性:
c复制void main() {
Hardware_Init();
while(1) {
if(timer_10ms) {
timer_10ms = 0;
Key_Scan();
Sensor_Update();
Display_Refresh();
}
Voice_Process();
}
}
c复制typedef struct {
float Kp, Ki, Kd;
float err, last_err, integral;
} PID;
float PID_Calc(PID* pid, float set, float now) {
pid->err = set - now;
pid->integral += pid->err;
float output = pid->Kp * pid->err
+ pid->Ki * pid->integral
+ pid->Kd * (pid->err - pid->last_err);
pid->last_err = pid->err;
return output;
}
针对称重传感器的数据波动:
c复制#define FILTER_LEN 10
float weight_filter(float new_val) {
static float buf[FILTER_LEN];
static int index = 0;
buf[index] = new_val;
index = (index + 1) % FILTER_LEN;
float sum = 0;
for(int i=0; i<FILTER_LEN; i++) {
sum += buf[i];
}
return sum / FILTER_LEN;
}
电源模块:
传感器接口:
继电器布局:
c复制void Enter_LowPower() {
if(no_operation_time > 5min) {
HAL_GPIO_WritePin(LCD_PWR_GPIO, LCD_PWR_PIN, GPIO_PIN_RESET);
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2000); // 2秒唤醒一次
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
}
这个项目从硬件选型到软件调试共耗时3个月,期间最大的收获是认识到嵌入式系统设计必须紧密结合用户真实需求。比如最初设计的连续语音播报在实际测试中发现会干扰视障人士的环境感知,最终改为短促提示音加按键查询的复合模式。