📡 Arduino • nRF24L01 • DHT11

Comunicazione wireless tra due Arduino con nRF24L01, DHT11 e display

Realizziamo una piccola stazione meteo wireless con due Arduino Uno: il primo misura temperatura e umidità con DHT11, il secondo riceve i dati via nRF24L01 e li visualizza su un display LCD 16×2 I2C.

Radio2 × nRF24L01
SensoreDHT11
RicezioneLCD 16×2 I2C
In poche parole: Arduino TX legge temperatura e umidità dal DHT11 e invia due valori via radio a 2,4 GHz. Arduino RX riceve il pacchetto e mostra i dati sul display LCD.

Come è organizzato il sistema

Il progetto è formato da due nodi distinti. Il trasmettitore può essere posizionato, per esempio, all’esterno dell’abitazione insieme al DHT11. Il ricevitore può invece restare all’interno e visualizzare continuamente i valori ricevuti.

Arduino con modulo nRF24L01
Schema generale trasmettitore e ricevitore Arduino nRF24L01

Architettura TX/RX della stazione meteo wireless.

Il modulo nRF24L01

nRF24L01 è un ricetrasmettitore radio nella banda dei 2,4 GHz. Due moduli possono scambiarsi piccoli pacchetti di dati senza utilizzare Wi-Fi, Bluetooth o una connessione cablata.

Alimentazione importante: il modulo nRF24L01 deve essere alimentato a 3,3 V. Non collegare VCC direttamente ai 5 V di Arduino.
Modulo nRF24L01 pinout Arduino

Modulo nRF24L01 utilizzato per il collegamento radio.

Stabilità: i moduli nRF24L01 possono essere sensibili ai disturbi sull’alimentazione. Se la comunicazione è instabile, un condensatore vicino al modulo tra 3,3 V e GND può aiutare a rendere più stabile la tensione.

Materiale necessario

🔌 2 × Arduino Uno
📡 2 × nRF24L01
🌡️ 1 × DHT11
🖥️ Display LCD 16×2 I2C
🔗 Cavetti jumper
🧩 Breadboard

🧰 Kit Arduino consigliato

Un kit completo è utile per avere breadboard, cavetti, resistenze, sensori e molti componenti necessari per sperimentare con Arduino.

👉 Guarda il kit Arduino consigliato

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

📘 Vuoi imparare Arduino passo dopo passo?

Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.

👉 Scopri i miei libri su Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema 1: trasmettitore TX

Il primo Arduino legge il sensore DHT11 e invia temperatura e umidità al secondo nodo.

Schema Arduino trasmettitore nRF24L01 DHT11

Nodo trasmettitore TX con DHT11.

Collegamenti nRF24L01 su Arduino Uno

nRF24L01Arduino Uno
VCC3,3 V
GNDGND
CED9
CSN / CSD10
MOSID11
MISOD12
SCKD13

Codice del trasmettitore TX

Arduino TX – DHT11 + nRF24L01
/*
  TRASMETTITORE TX
  Arduino Uno + nRF24L01 + DHT11

  DHT11 -> A0
  nRF24L01 -> bus SPI di Arduino Uno
  CE  -> D9
  CSN -> D10

  Invia due valori:
  temperature[0] = temperatura
  temperature[1] = umidità
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT11.h>

// Sensore DHT11
const int DHT_PIN = A0;
DHT11 dht11(DHT_PIN);

// Pacchetto con temperatura e umidità
float temperature[2];

// Radio: CE = D9, CSN = D10
RF24 radio(9, 10);

// Indirizzo del canale logico usato dai due moduli
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup() {

  // Avvia nRF24L01
  radio.begin();

  // Imposta il modulo come trasmettitore
  radio.openWritingPipe(pipe);
}

void loop() {

  float temp;
  float humi;

  // Legge temperatura e umidità dal DHT11
  dht11.read(humi, temp);

  // Prepara il pacchetto da inviare
  temperature[0] = temp;
  temperature[1] = humi;

  // Trasmette l'intero array
  radio.write(temperature, sizeof(temperature));

  // DHT11 non richiede letture troppo frequenti
  delay(1000);
}

Come funziona il trasmettitore

Il DHT11 viene letto una volta al secondo. I due valori vengono inseriti nell’array temperature[2]: l’elemento 0 contiene la temperatura e l’elemento 1 l’umidità.

Con radio.write() Arduino trasmette l’intero array attraverso la pipe configurata con l’indirizzo 0xE8E8F0F0E1.

Schema 2: ricevitore RX

Il secondo Arduino riceve il pacchetto e mostra i due valori su un display LCD 16×2 I2C.

Schema Arduino ricevitore nRF24L01 display I2C

Nodo ricevitore RX con display LCD I2C.

Codice del ricevitore RX

Arduino RX – nRF24L01 + LCD I2C
/*
  RICEVITORE RX
  Arduino Uno + nRF24L01 + LCD 16x2 I2C

  nRF24L01:
  CE  -> D9
  CSN -> D10

  Il ricevitore mostra sul display:
  - temperatura
  - umidità
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

// Display I2C usato nel progetto
LiquidCrystal_I2C lcd(
  0x27,
  2, 1, 0,
  4, 5, 6, 7,
  3, POSITIVE
);

// Array ricevuto via radio:
// [0] temperatura
// [1] umidità
float temperature[2];

// Radio: CE = D9, CSN = D10
RF24 radio(9, 10);

// Deve essere uguale a quello del trasmettitore
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup() {

  Serial.begin(9600);

  // Avvia il modulo radio
  radio.begin();

  // Configura la pipe di ricezione
  radio.openReadingPipe(1, pipe);

  // Passa in ascolto
  radio.startListening();

  // Avvia LCD
  lcd.begin(16, 2);
  lcd.backlight();

  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);

  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
}

void loop() {

  // Se è disponibile un nuovo pacchetto...
  if (radio.available()) {

    // Legge temperatura e umidità
    radio.read(temperature, sizeof(temperature));

    // Prima riga: temperatura
    lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print("Temp");

    lcd.setCursor(9, 0);
    lcd.print(temperature[0]);
    lcd.print(" C");

    // Seconda riga: umidità
    lcd.setCursor(0, 1);
    lcd.print("Umid");

    lcd.setCursor(9, 1);
    lcd.print(temperature[1]);
    lcd.print(" %");

    Serial.print("Temperatura: ");
    Serial.print(temperature[0]);
    Serial.print(" C - Umidita: ");
    Serial.print(temperature[1]);
    Serial.println(" %");

    delay(1000);
  }
}

Come funziona il ricevitore

Il modulo viene configurato in ascolto tramite radio.startListening(). Quando radio.available() segnala un pacchetto disponibile, i due valori vengono copiati nell’array temperature.

Il display mostra quindi temperatura sulla prima riga e umidità sulla seconda.

Perché TX e RX devono usare lo stesso indirizzo

I due programmi utilizzano la stessa pipe:

Indirizzo radio
const uint64_t pipe = 0xE8E8F0F0E1LL;

Se l’indirizzo non coincide, il ricevitore non riconosce i pacchetti inviati dal trasmettitore.

Librerie necessarie

Sono disponibili i file utilizzati per nRF24L01, RF24, DHT11, LCD I2C e Wire:

⬇️ nrf24l01.zip ⬇️ rf24.zip ⬇️ dht11.zip ⬇️ liquidcrystal_i2c.zip ⬇️ wire.zip

Nota sulle librerie: gli esempi sono legati alle API delle librerie indicate. Versioni molto più recenti di RF24, DHT o LiquidCrystal_I2C possono richiedere piccole modifiche al codice.

Scarica i due sketch

⬇️ Sketch trasmettitore TX ⬇️ Sketch ricevitore RX

Problemi comuni con nRF24L01

  • alimentazione a 5 V invece di 3,3 V;
  • CE e CSN collegati ai pin sbagliati;
  • collegamenti SPI errati;
  • alimentazione 3,3 V instabile;
  • pipe differente tra trasmettitore e ricevitore;
  • librerie non compatibili con lo sketch;
  • moduli troppo vicini durante le prove o ambiente radio molto disturbato.

Debug rapido

  • prova prima il DHT11 da solo;
  • verifica che il display I2C funzioni indipendentemente;
  • controlla che entrambi i moduli siano alimentati a 3,3 V;
  • verifica D9, D10 e i pin SPI D11-D13;
  • mantieni identico l’indirizzo della pipe sui due Arduino;
  • aggiungi un condensatore vicino al nRF24L01 se la comunicazione è instabile;
  • usa il Monitor Seriale sul ricevitore per verificare i valori arrivati.

Varianti del progetto

  • sostituire DHT11 con un sensore più preciso;
  • aggiungere pressione atmosferica;
  • trasmettere lo stato di più sensori;
  • aggiungere un secondo display o un OLED;
  • salvare i dati su scheda SD;
  • aggiungere più nodi radio;
  • realizzare una stazione meteo alimentata a batteria.

Cosa devi ricordare

  • Servono due Arduino e due nRF24L01.
  • Il nodo TX legge temperatura e umidità dal DHT11.
  • Il nodo RX visualizza i dati su LCD 16×2 I2C.
  • nRF24L01 deve essere alimentato a 3,3 V.
  • CE e CSN sono configurati sui pin D9 e D10.
  • Trasmettitore e ricevitore devono usare la stessa pipe.

Domande frequenti

Posso alimentare nRF24L01 a 5 V?

No. Il pin VCC del modulo deve essere alimentato a 3,3 V.

Perché il ricevitore non mostra alcun dato?

Controlla prima alimentazione, pin CE/CSN, bus SPI e indirizzo della pipe. Anche una libreria RF24 incompatibile con lo sketch può impedire la comunicazione.

Posso mettere il trasmettitore all’esterno?

Sì, purché Arduino, sensore e modulo radio siano protetti da umidità, condensa e agenti atmosferici e siano alimentati correttamente.

Posso trasmettere altri valori oltre a temperatura e umidità?

Sì. Puoi creare una struttura dati o un array più ampio e aggiungere altre misure, rispettando la dimensione massima dei pacchetti gestiti dal modulo.