3. 无线温湿度监测

无线温湿度监测 学习卡片

任务说明

本案例实现一个无线温湿度监测系统:发送端使用DHT11传感器采集环境温湿度数据,通过nRF24L01无线模块将数据打包发送;接收端接收数据包并解析,将温湿度值显示在1602 LCD屏幕上。系统采用一对一的固定通道通信,发送端每2秒采集并发送一次数据。

硬件连接

发送端 (Arduino Uno) DHT11 数据 → D2 nRF24L01 CE → D9 nRF24L01 CSN → D10 nRF24L01 SCK → D13 nRF24L01 MOSI→ D11 nRF24L01 MISO→ D12 DHT11 VCC GND DATA nRF24L01 发送端 2.4GHz 无线 通道: 0x4E4F524C 接收端 (Arduino Uno) nRF24L01 CE → D9 nRF24L01 CSN → D10 nRF24L01 SCK → D13 nRF24L01 MOSI→ D11 nRF24L01 MISO→ D12 LCD I2C SDA → A4, SCL → A5 1602 LCD (I2C) 地址 0x27 nRF24L01 接收端

发送端代码

// 发送端: 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。

判定标准:

  1. 发送端串口监视器每2秒输出一次温湿度数据,格式如 已发送: 25.30°C, 60.00%;若输出“DHT11读取失败”,检查传感器接线和上拉电阻。
  2. 接收端LCD第一行显示 Temp: 25.30 C,第二行显示 Humi: 60.00 %,数值与发送端串口输出一致。
  3. 用手捏住DHT11传感器,约2秒后LCD数值应随之变化,说明无线链路实时有效。
  4. 若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对应显示上述温湿度值。此示例为代码逻辑直接推出的确定性结果,实际数值取决于环境温湿度。