1. 项目概述
这个语音环境监测系统是我去年为一个农业大棚项目设计的解决方案。当时农户反映传统环境监测设备操作复杂,很多上了年纪的种植者根本看不懂那些数字显示。于是我就琢磨着用最便宜的单片机,做个会"说话"的环境监测装置。
系统核心功能很简单:实时监测温湿度、光照和空气质量,当数值超出设定范围时,直接用语音播报告警。比如温度超过30度就会说"当前温度过高,请及时通风"。整套硬件成本控制在50元以内,比市面上的商业设备便宜了至少80%。
2. 硬件选型与设计
2.1 核心器件选型
主控芯片我选了STC89C52RC,这个老牌51单片机虽然性能一般,但胜在价格便宜(不到5块钱)且开发简单。环境传感器方面:
- 温湿度:DHT11(8元)
- 光照强度:BH1750(6元)
- 空气质量:MQ-135(12元)
- 语音模块:SYN6288(15元)
注意:DHT11的湿度测量误差在±5%左右,对精度要求高的场合建议换用DHT22,不过价格要贵3倍
2.2 电路设计要点
电源部分用了AMS1117-3.3V给传感器供电,主控还是5V工作。特别要注意的是MQ-135需要预热20分钟才能稳定工作,我在电路里专门加了预热指示灯。
传感器布局也有讲究:
- DHT11要远离其他发热元件
- BH1750不能有遮挡
- MQ-135要保证空气流通
3. 软件实现细节
3.1 传感器数据采集
DHT11的时序要求特别严格,我调试时发现很多现成库都有问题。最后自己写了驱动,关键代码如下:
c复制void DHT11_Read() {
// 主机拉低18ms
DHT11_IO=0;
Delay18ms();
DHT11_IO=1;
Delay20us();
// 等待从机响应
while(DHT11_IO);
while(!DHT11_IO);
while(DHT11_IO);
// 读取40位数据
for(i=0;i<5;i++){
for(j=0;j<8;j++){
while(!DHT11_IO);
Delay40us();
if(DHT11_IO) dat[i]|=0x80>>j;
while(DHT11_IO);
}
}
}
3.2 语音合成处理
SYN6288模块通过UART通信,需要发送特定格式的指令。我封装了几个常用语音:
c复制void SpeakWarning(float temp) {
uchar str[50];
sprintf(str, "[t0]当前温度%.1f度,超过安全阈值", temp);
UART_SendString(str);
}
实测发现:每次播报间隔至少要500ms,否则会出现语音截断现象
4. 系统优化经验
4.1 低功耗设计
虽然系统接的是市电,但我还是做了低功耗优化:
- 传感器采样间隔从1秒改为5秒
- 空闲时关闭LED显示
- 语音模块不用时断电
这样整套系统工作电流从85mA降到了30mA左右。
4.2 抗干扰措施
在大棚里实测时遇到两个坑:
- 电动卷帘机启动导致传感器数据异常
- 喷雾加湿造成DHT11短路
解决方案:
- 所有信号线加磁珠滤波
- 传感器接口做防水处理
- 数据做滑动平均滤波
5. 常见问题排查
5.1 语音模块不工作
先检查硬件:
- 测量模块供电是否正常(5V±0.5V)
- 用示波器看TX信号是否发出
- 复位引脚是否被意外拉低
软件方面:
- 波特率是否设置为9600
- 文本是否用GB2312编码
- 指令格式是否正确(必须有[t0]前缀)
5.2 传感器数据异常
典型表现和解决方法:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| DHT11一直返回255 | 接线松动 | 检查DATA线接触 |
| BH1750读数不变 | 光照饱和 | 降低采样频率 |
| MQ-135数值波动大 | 未预热 | 等待20分钟 |
6. 项目改进方向
现在这个系统已经稳定运行了8个多月,根据用户反馈下一步准备:
- 增加蓝牙连接手机功能
- 加入历史数据存储
- 改用太阳能供电
最让我意外的是,很多城市家庭也想要这个装置,用来监测卧室环境。所以最近在考虑做个家用版本,把外壳做得更美观些。