1. 项目概述与核心功能
这个基于STM32的风速测量仪项目是我去年指导本科生完成的毕业设计,经过三个月的迭代优化,最终实现了一套成本控制在200元以内的高性价比气象监测方案。系统采用模块化设计思路,核心功能包括:
- 实时风速检测(0-30m/s量程,±0.5m/s精度)
- 16方位风向识别(22.5°分辨率)
- 可编程报警阈值(通过按键设置)
- 双模反馈机制(OLED显示+语音播报)
- 超限声光报警(蜂鸣器+LED闪烁)
在实际测试中,这套系统成功应用于校园气象站和小型风力发电机监控场景。相比市售千元级专业设备,我们的方案在满足基本监测需求的同时,特别强化了人机交互体验,这也是设计过程中花费最多精力的部分。
2. 硬件系统架构解析
2.1 主控选型与最小系统
选择STM32F103C8T6作为主控主要基于三点考量:
- 72MHz主频足够处理传感器数据(风速采样率要求<100Hz)
- 内置12位ADC满足模拟信号采集需求
- 丰富的外设接口(3个USART、2个I2C、1个SPI)
最小系统设计要点:
- 8MHz晶振配合22pF负载电容
- 复位电路采用10kΩ上拉+100nF电容
- BOOT0通过10kΩ电阻接地
- 每个电源引脚配置100nF去耦电容
调试经验:焊接完成后务必先测试3.3V和5V电源轨的纹波,我们曾因去耦电容虚焊导致ADC采样异常。
2.2 传感器模块详解
2.2.1 三杯式风速传感器
采用FS3000A型号,关键参数:
- 输出电压:0.4-2V(对应0-30m/s)
- 响应时间:<1s
- 启动风速:0.5m/s
接口电路设计:
code复制传感器OUT → 100Ω限流电阻 → 10kΩ上拉 → STM32 PA1(ADC1_IN1)
电压-风速转换公式:
code复制风速(m/s) = (ADC值/4095*3.3 - 0.4) * 18.75
2.2.2 风向传感器
使用WDD35D电位器式传感器,特性:
- 电阻范围:0-10kΩ
- 角度分辨率:22.5°
- 机械寿命>100万次
测量电路采用分压原理:
code复制3.3V → 10kΩ固定电阻 → 传感器 → GND
测量点接PA2(ADC1_IN2)
角度计算公式:
code复制角度 = (ADC值/4095) * 360°
方位 = int((角度+11.25)/22.5) % 16
2.3 人机交互模块
2.3.1 OLED显示配置
SSD1306驱动芯片的硬件I2C配置:
- SCL→PB6
- SDA→PB7
- 上拉电阻4.7kΩ
显示优化技巧:
- 使用u8g2库实现双缓冲
- 关键数据采用大字体(16x32)
- 添加风速变化趋势箭头
2.3.2 语音模块集成
SU-03T语音芯片的UART连接:
- TX→PA9(USART1_TX)
- RX→PA10(USART1_RX)
- 波特率9600bps
语音内容烧录步骤:
- 使用SU-03T IDE编写语音脚本
- 定义触发指令(如"$windspeed#")
- 通过USB-TTL工具烧录固件
3. 软件设计与关键算法
3.1 主程序流程图
c复制void main() {
hardware_init(); // 硬件初始化
load_threshold(); // 读取EEPROM存储的阈值
while(1) {
read_sensors(); // 采集数据
process_data(); // 数据处理
update_display(); // 刷新显示
check_alarm(); // 阈值判断
handle_buttons(); // 按键扫描
}
}
3.2 风速数据处理算法
采用滑动平均滤波消除抖动:
c复制#define WINDOW_SIZE 5
float wind_speed_buffer[WINDOW_SIZE];
float get_filtered_speed(float new_speed) {
static int index = 0;
wind_speed_buffer[index] = new_speed;
index = (index + 1) % WINDOW_SIZE;
float sum = 0;
for(int i=0; i<WINDOW_SIZE; i++) {
sum += wind_speed_buffer[i];
}
return sum / WINDOW_SIZE;
}
3.3 阈值设置逻辑
按键处理状态机:
c复制typedef enum {
NORMAL_MODE,
SETTING_MODE,
SAVING_MODE
} SystemMode;
void handle_buttons() {
static SystemMode mode = NORMAL_MODE;
if(KEY1_PRESSED) {
mode = (mode == NORMAL_MODE) ? SETTING_MODE : NORMAL_MODE;
}
if(mode == SETTING_MODE) {
if(KEY2_PRESSED) threshold += 0.5;
if(KEY3_PRESSED) threshold -= 0.5;
}
if(KEY4_PRESSED && mode == SETTING_MODE) {
save_to_eeprom(threshold);
mode = NORMAL_MODE;
}
}
4. 系统调试与优化
4.1 传感器校准方法
风速传感器校准步骤:
- 使用标准风速计作为参考
- 在无风环境下记录零点电压(应≈0.4V)
- 用风扇产生5m/s、10m/s、15m/s稳定风速
- 记录ADC读数并修正转换公式系数
风向传感器校准技巧:
- 使用指南针确定正北方向
- 旋转传感器并记录各方位对应的ADC值
- 建立角度-电压对应表(建议16点校准)
4.2 常见问题排查
-
OLED显示花屏:
- 检查I2C上拉电阻
- 降低通信速率(实测100kHz最稳定)
- 确保电源电压>3.0V
-
语音模块无响应:
- 测量TX/RX信号电压(需<3.3V)
- 检查波特率设置(必须与固件一致)
- 确认唤醒指令格式(需包含唤醒词)
-
风速读数跳变:
- 增加软件滤波窗口大小
- 在传感器输出端并联10μF电容
- 检查供电电源稳定性
5. 项目扩展方向
在实际部署后,我们发现了几个有价值的改进点:
- 无线传输功能:添加ESP-01S WiFi模块,通过MQTT协议上传数据到云平台
- 数据记录功能:利用SPI Flash存储历史数据(需设计环形缓冲区)
- 低功耗模式:当检测到长时间无风时,自动进入休眠状态(电流<1mA)
- 机械结构优化:设计防水外壳和可旋转支架,提升户外适用性
这个项目的完整工程文件(包括原理图、PCB、固件源码)已经开源,特别适合作为电子类专业学生的综合实训项目。通过完整实现这个系统,可以全面掌握传感器应用、嵌入式编程和人机交互设计等核心技能。