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.
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.
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.
Modulo nRF24L01 utilizzato per il collegamento radio.
Materiale necessario
🧰 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 consigliatoLink 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 ArduinoLink 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.
Nodo trasmettitore TX con DHT11.
Collegamenti nRF24L01 su Arduino Uno
| nRF24L01 | Arduino Uno |
|---|---|
| VCC | 3,3 V |
| GND | GND |
| CE | D9 |
| CSN / CS | D10 |
| MOSI | D11 |
| MISO | D12 |
| SCK | D13 |
Codice del trasmettitore TX
/*
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.
Nodo ricevitore RX con display LCD I2C.
Codice del ricevitore RX
/*
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:
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
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.

