3. 无线温湿度监测
任务说明
本案例实现一个无线温湿度监测系统:发送端使用DHT11传感器采集环境温湿度数据,通过nRF24L01无线模块将数据打包发送;接收端接收数据包并解析,将温湿度值显示在1602 LCD屏幕上。系统采用一对一的固定通道通信,发送端每2秒采集并发送一次数据。
硬件连接
发送端代码
// 发送端: DHT11采集 + nRF24L01发送
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "4NRL1";
struct SensorData {
float temperature;
float humidity;
};
void setup() {
Serial.begin(9600);
dht.begin();
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_LOW);
radio.stopListening();
}
void loop() {
SensorData data;
data.humidity = dht.readHumidity();
data.temperature = dht.readTemperature();
if (isnan(data.humidity) || isnan(data.temperature)) {
Serial.println("DHT11读取失败");
delay(2000);
return;
}
radio.write(&data, sizeof(data));
Serial.print("已发送: ");
Serial.print(data.temperature);
Serial.print("°C, ");
Serial.print(data.humidity);
Serial.println("%");
delay(2000);
}
接收端代码
// 接收端: nRF24L01接收 + LCD显示
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "4NRL1";
LiquidCrystal_I2C lcd(0x27, 16, 2);
struct SensorData {
float temperature;
float humidity;
};
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Waiting...");
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_LOW);
radio.startListening();
}
void loop() {
if (radio.available()) {
SensorData data;
radio.read(&data, sizeof(data));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(data.temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(data.humidity);
lcd.print(" %");
Serial.print("收到: ");
Serial.print(data.temperature);
Serial.print("°C, ");
Serial.print(data.humidity);
Serial.println("%");
}
}
依赖库安装
发送端需要 DHT sensor library 和 RF24 库;接收端需要 RF24 和 LiquidCrystal_I2C 库。在Arduino IDE的库管理器中搜索并安装上述库。DHT11传感器接线:VCC→5V,GND→GND,DATA→D2(需接10kΩ上拉电阻到VCC)。
验证方法
编译烧录:分别选择正确的板卡和端口,将发送端代码烧录到发送端Arduino,接收端代码烧录到接收端Arduino。
判定标准:
- 发送端串口监视器每2秒输出一次温湿度数据,格式如
已发送: 25.30°C, 60.00%;若输出“DHT11读取失败”,检查传感器接线和上拉电阻。 - 接收端LCD第一行显示
Temp: 25.30 C,第二行显示Humi: 60.00 %,数值与发送端串口输出一致。 - 用手捏住DHT11传感器,约2秒后LCD数值应随之变化,说明无线链路实时有效。
- 若LCD无显示,旋转I2C模块上的电位器调节对比度;若显示“Waiting...”不更新,检查两个nRF24L01的通道地址是否一致(代码中均为
"4NRL1"),并确认供电电压(nRF24L01需3.3V供电,VCC接3.3V)。
预期输出示例(发送端串口):
已发送: 25.30°C, 60.00%
已发送: 25.40°C, 59.80%
已发送: 25.50°C, 59.60%
接收端LCD对应显示上述温湿度值。此示例为代码逻辑直接推出的确定性结果,实际数值取决于环境温湿度。