1. 项目背景与硬件准备
最近在做一个智能家居的小项目,需要把DHT-11温湿度传感器的数据实时显示在Android手机上。这个需求听起来简单,但实际动手时才发现蓝牙通信有不少坑要踩。先说说我用的硬件配置:
- Arduino nano:性价比超高的开发板,体积小功能全
- HC-05蓝牙模块:经典蓝牙2.0模块,价格便宜又好用
- DHT-11传感器:能同时检测温度和湿度,精度够日常使用
刚开始我以为接线很简单,直接把HC-05的TX/RX和nano的串口引脚相连就行。结果发现这样接会导致一个严重问题——烧录程序时需要拔掉蓝牙模块,否则会冲突。后来改用SoftwareSerial软串口才解决这个问题。这里特别提醒:nano的D5/D6引脚可以用来做软串口,既不影响烧录又能保持蓝牙通信。
关于供电,实测HC-05用3.3V或5V都能工作,但建议统一用5V供电更稳定。DHT-11虽然标称5V供电,但在3.3V下也能运行,只是响应速度会稍慢。
2. 蓝牙通信协议解析
很多人以为串口数据直接等于蓝牙传输数据,其实这是个常见误区。HC-05本质上是个串口转蓝牙的桥接器,但它有自己的通信协议:
- 波特率匹配:HC-05默认38400bps,这个参数必须和代码设置一致
- 数据格式:建议使用ASCII字符传输,避免直接发送二进制数据
- 流控制:简单的温湿度传输不需要硬件流控制
我在代码里加了分隔符"a"来区分温度和湿度值,这是解决数据粘包问题的土办法。更规范的做法是用JSON格式,但对Arduino nano这种资源有限的设备来说,简单有效更重要。
蓝牙通信最常遇到的就是乱码问题。根据我的踩坑经验,乱码通常由三个原因导致:
- 波特率不匹配
- 供电不稳定
- 未正确处理数据编码
3. Arduino代码详解
先来看完整的代码实现,我会逐段解释关键点:
#include <SoftwareSerial.h> #include <dht11.h> dht11 DHT11; #define DHT11PIN 2 SoftwareSerial BT(6, 5); // RX,TX void setup() { BT.begin(38400); // 必须与HC-05匹配 } void loop() { int chk = DHT11.read(DHT11PIN); // 温度+分隔符+湿度+结束符 BT.print(DHT11.temperature); BT.print("a"); BT.print(DHT11.humidity); BT.println("a"); delay(1000); // 1秒间隔 }这段代码有几个关键技巧:
- SoftwareSerial:让D5/D6模拟串口,解放硬件串口用于调试
- 数据格式化:用字母"a"作为分隔符,方便手机端解析
- 传输间隔:1秒的延迟既能保证数据更新,又不会给蓝牙太大压力
DHT-11的读数原理很有意思:它采用单总线协议,每次读取会发送40bit数据,前16bit是湿度,中间16bit是温度,最后8bit是校验和。在dht11库的源码中可以看到具体的时序控制逻辑。
4. Android端开发实战
在手机端我用的是App Inventor,对不熟悉Android开发的人来说特别友好。核心逻辑其实就三步:
- 蓝牙连接:扫描并配对HC-05模块
- 数据接收:设置UTF-8编码,按分隔符解析
- 数据显示:用计时器实现定时刷新
重点说下数据解析的部分。因为Arduino端发送的数据格式是"温度a湿度a",所以在App Inventor中要这样处理:
- 设置分隔符为字母"a"对应的ASCII码97
- 收到数据后按分隔符拆分字符串
- 第一个值是温度,第二个值是湿度
实际测试发现,如果不用计时器控制接收频率,数据很容易错乱。这是因为蓝牙传输有延迟,而DHT-11的读取需要一定时间。
5. 常见问题解决方案
在开发过程中我遇到了不少坑,这里总结几个典型问题的解决方法:
问题1:烧录失败
- 现象:上传代码时提示编程器未响应
- 原因:蓝牙模块占用了硬件串口
- 解决:改用SoftwareSerial或烧录时暂时断开蓝牙
问题2:数据乱码
- 现象:手机端显示问号或奇怪符号
- 检查步骤:
- 确认两端波特率一致
- 检查供电是否稳定
- 尝试降低传输频率
问题3:连接不稳定
- 现象:蓝牙频繁断开
- 优化方案:
- 给HC-05的EN引脚接10k上拉电阻
- 避免手机和模块距离过远
- 在代码中加入重连机制
电源问题也值得注意。当使用电池供电时,建议加个1000μF的电容稳压,能有效避免因电压波动导致的数据异常。
6. 性能优化技巧
经过多次测试,我总结出几个提升系统稳定性的方法:
- 数据校验:在Arduino端增加简单的校验和,比如温度+湿度后发送校验字节
- 双缓冲机制:手机端开辟两个数据缓冲区交替使用,避免显示卡顿
- 自适应频率:根据信号强度动态调整采样频率,信号弱时降低频率
如果想进阶改造,可以考虑这些优化方向:
- 改用BLE蓝牙模块降低功耗
- 加入历史数据存储功能
- 开发多设备同时监控的能力
电源管理也很关键。实测发现,用两节18650电池供电时,加入低压检测电路可以防止电池过放。当电压低于6V时让Arduino进入休眠模式,能显著延长使用时间。
7. 项目扩展思路
这个基础框架其实能玩出很多花样:
智能农业监控:
- 增加土壤湿度传感器
- 设置阈值自动报警
- 结合GPS记录位置信息
家居自动化:
- 联动空调/加湿器
- 数据上传云端
- 微信推送提醒
我曾经用类似方案给朋友做了个宠物窝环境监测系统,除了温湿度还加入了光照传感器,数据通过蓝牙实时推送到手机,当环境异常时自动发送提醒。
硬件方面也可以升级,比如换用DHT-22提高精度,或者改用ESP32同时支持蓝牙和WiFi。这些改造都需要根据具体需求来权衡成本与性能。