Modulo RF 433 MHz Arduino: trasmettitore, ricevitore e antenna
Modulo RF 433 MHz con Arduino: collegare trasmettitore FS1000A e ricevitore XY-MK-5V, antenna da 17,3 cm, messaggi RadioHead e telecomandi clonati con RCSwitch.
Un modulo RF 433 MHz è il modo più economico per aggiungere un collegamento wireless a un progetto Arduino: un kit composto da un trasmettitore (FS1000A) e un ricevitore (XY-MK-5V) costa pochissimo, si collega con un solo filo di dati e, con un'antenna a filo di 17 cm, porta il segnale a decine di metri. Anche prese radiocomandate, campanelli wireless, telecomandi delle tapparelle, sensori di apertura di porte e finestre e i sensori esterni delle stazioni meteo usano quasi sempre la stessa frequenza. Con questi moduli puoi quindi inviare dati tra due Arduino e anche leggere i codici dei telecomandi che hai in casa per poi ritrasmetterli da Arduino.
In questa guida scoprirai come funzionano i moduli con la modulazione ASK (OOK), perché l'antenna deve essere lunga 17,3 cm e come collegarli ad Arduino Uno, ESP32 e Raspberry Pi Pico. Poi invierai testo e dati dei sensori tra due Arduino con la libreria RadioHead, leggerai e clonerai il codice del telecomando di una presa con la libreria RCSwitch, vedrai come aumentare la portata e confronterai il modulo con l'nRF24L01.
Cos'è un modulo RF 433 MHz e come funziona?
Il kit è formato da due schede separate. Il piccolo trasmettitore quadrato FS1000A (venduto anche come XY-FST) accende e spegne un'onda portante a 433,92 MHz in base al segnale sul suo pin DATA. Il ricevitore XY-MK-5V, più lungo, capta questo segnale dall'aria e lo restituisce come 0 e 1 sul suo pin DATA. In altre parole, i moduli non hanno né protocollo, né indirizzo, né controllo degli errori; il loro unico compito è portare un segnale digitale senza fili dall'altra parte. Impacchettare, verificare e decodificare i dati è compito della libreria su Arduino. La comunicazione è unidirezionale: il trasmettitore invia soltanto e il ricevitore ascolta soltanto.
| Caratteristica | FS1000A (trasmettitore) | XY-MK-5V (ricevitore) |
|---|---|---|
| Frequenza | 433,92 MHz (esiste anche una versione a 315 MHz) | 433,92 MHz |
| Tensione di alimentazione | 3–12 V | 5 V |
| Corrente | Circa 9–40 mA in trasmissione (secondo la tensione) | Circa 4 mA |
| Modulazione | ASK / OOK | ASK / OOK, ricevitore a superreazione |
| Velocità dati | Fino a ~10 kbps (1–4 kbps nella pratica) | Stesso limite del trasmettitore |
| Potenza / sensibilità | Circa 10 mW, cresce con la tensione | Circa −105 dBm |
| Pin | DATA, VCC, GND + piazzola ANT | VCC, DATA, DATA, GND + piazzola ANT |
| Dimensioni | Circa 19 × 19 mm | Circa 30 × 14 mm |
I due pin DATA del ricevitore sono collegati tra loro sulla scheda: non importa quale usi. L'XY-MK-5V è un ricevitore a superreazione economico ma poco selettivo: la sua frequenza è fissata da una bobina regolabile sulla scheda ed è facilmente disturbato dalle interferenze vicine. Non girare la vite di questa bobina; se si perde la taratura di fabbrica, il ricevitore non sente più il trasmettitore. Per risultati più stabili, i ricevitori supereterodina come l'RXB6 sono più sensibili e funzionano anche a 3,3 V. Il kit esiste anche in versione a 315 MHz; trasmettitore e ricevitore devono avere la stessa frequenza, e sul risonatore metallico del trasmettitore di solito è stampata la frequenza.
Modulazione ASK (OOK): perché ti serve una libreria?
Nella OOK (On-Off Keying), la forma più semplice di ASK (Amplitude Shift Keying, modulazione a spostamento d'ampiezza), la portante viene accesa per un bit 1 e spenta per un bit 0. Sembra facile, ma il ricevitore ha un'abitudine: il suo controllo automatico del guadagno (AGC), in assenza di segnale, porta il guadagno al massimo, scambia il rumore nell'aria per dati e manda di continuo impulsi casuali sul pin DATA. Per questo collegare il trasmettitore direttamente al pin TX di Arduino e il ricevitore al pin RX per comunicare con Serial.print di solito produce solo caratteri senza senso.
Il driver RH_ASK della libreria RadioHead risolve il problema così: prima di ogni pacchetto invia un preambolo di 36 bit e un simbolo di inizio di 12 bit per far assestare il guadagno del ricevitore. Poi converte ogni byte in due simboli da 6 bit bilanciati in continua (codifica da 4 a 6) e aggiunge un CRC a 16 bit alla fine del pacchetto. Il ricevitore scarta in silenzio i pacchetti con CRC errato, così ti arrivano solo dati integri. RCSwitch, invece, decodifica la codifica a larghezza d'impulso usata dai chip dei telecomandi: ogni bit è rappresentato da impulsi che restano HIGH e LOW per tempi precisi.
Lunghezza dell'antenna a 433 MHz: perché 17,3 cm?
I moduli non hanno un'antenna montata, ma solo una piazzola di saldatura marcata ANT. Senza antenna, un kit funziona solo a 1–3 metri. L'antenna semplice più efficiente è un filo dritto lungo un quarto della lunghezza d'onda: λ = c / f = 300.000.000 / 433.920.000 ≈ 0,69 m, e un quarto corrisponde a circa 17,3 cm. Per i moduli a 315 MHz lo stesso calcolo dà 23,8 cm. Salda un'estremità di un filo rigido unipolare alla piazzola ANT e tieni il filo dritto e verticale; salda un filo della stessa lunghezza anche al ricevitore e orienta le due antenne nella stessa direzione.
| Antenna | Lunghezza | Portata indicativa (campo aperto) | Nota |
|---|---|---|---|
| Senza antenna | — | 1–3 m | Solo per prove sulla scrivania |
| Filo dritto (λ/4), trasmettitore a 5 V | 17,3 cm | 20–50 m | L'opzione più semplice ed efficiente |
| Filo dritto (λ/4), trasmettitore a 9–12 V | 17,3 cm | 50–100 m e oltre | Linea di vista e altezza contano molto |
| Antenna elicoidale (a molla) già pronta | 2–4 cm di lunghezza | Inferiore al filo dritto | Sta dentro una scatola |
Collegamento del modulo RF 433 MHz: Arduino Uno, ESP32 e Pico
| Pin del modulo | Arduino Uno (RadioHead) | Arduino Uno (RCSwitch) | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| FS1000A VCC | 5V o esterni 9–12 V | 5V | VIN (5 V) | VBUS (5 V) |
| FS1000A DATA | D12 | D10 | GPIO 26 | GP15 |
| FS1000A GND | GND | GND | GND | GND |
| XY-MK-5V VCC | 5V | 5V | VIN (5 V) | VBUS (5 V) |
| XY-MK-5V DATA | D11 | D2 (pin di interrupt) | GPIO 27 (con partitore di tensione) | GP14 (con partitore di tensione) |
| XY-MK-5V GND | GND | GND | GND | GND |
Il trasmettitore funziona senza problemi con un segnale a 3,3 V sul pin DATA: su ESP32 e Pico puoi quindi alimentarlo a 5 V e collegare DATA direttamente a un GPIO. La portata dipende soprattutto dalla tensione del trasmettitore: a 3,3 V si riduce nettamente, a 9–12 V aumenta di parecchie volte. Mettere un condensatore ceramico da 100 nF e uno elettrolitico da 10 µF proprio accanto ai pin VCC e GND del ricevitore riduce il rumore dell'alimentazione e migliora visibilmente la ricezione.
Inviare messaggi tra due Arduino con RadioHead
- Apri il Gestore librerie dell'IDE Arduino, cerca RadioHead e installa la libreria di Mike McCauley. Per i dettagli consulta come aggiungere una libreria ad Arduino.
- Collega il trasmettitore al primo Arduino: DATA → D12, VCC → 5V, GND → GND.
- Collega il ricevitore al secondo Arduino: DATA → D11, VCC → 5V, GND → GND.
- Salda un filo da 17,3 cm alla piazzola ANT di ciascun modulo.
- Carica il codice del trasmettitore sulla prima scheda e quello del ricevitore sulla seconda, poi apri il Monitor seriale sul lato del ricevitore a 9600 baud.
1#include <RH_ASK.h>
2#include <SPI.h> // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12); // hız (bps), RX pini, TX pini / speed (bps), RX pin, TX pin
5unsigned int sayac = 0;
6
7void setup() {
8 Serial.begin(9600);
9 if (!rf.init()) Serial.println("RF init hatasi / failed");
10}
11
12void loop() {
13 char mesaj[24];
14 snprintf(mesaj, sizeof(mesaj), "Merhaba %u", sayac++);
15 rf.send((uint8_t *)mesaj, strlen(mesaj));
16 rf.waitPacketSent(); // paket bitene kadar bekle / wait until the packet is sent
17 Serial.print("Gonderildi / sent: ");
18 Serial.println(mesaj);
19 delay(1000);
20}1#include <RH_ASK.h>
2#include <SPI.h> // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12); // vericiyle aynı hız / same speed as the transmitter
5
6void setup() {
7 Serial.begin(9600);
8 if (!rf.init()) Serial.println("RF init hatasi / failed");
9}
10
11void loop() {
12 uint8_t buf[RH_ASK_MAX_MESSAGE_LEN + 1]; // +1: metin sonu için / +1 for the string terminator
13 uint8_t len = RH_ASK_MAX_MESSAGE_LEN; // her turda yeniden ayarla / reset on every pass
14 if (rf.recv(buf, &len)) { // yalnız CRC doğruysa true / true only if the CRC is valid
15 buf[len] = '\0';
16 Serial.print("Alindi / received: ");
17 Serial.println((char *)buf);
18 }
19}| Comando | Cosa fa |
|---|---|
| RH_ASK rf(2000, 11, 12) | Velocità 2000 bps, ricevitore su D11, trasmettitore su D12; la velocità deve essere uguale su entrambi i lati |
| rf.init() | Prepara il timer e i pin; restituisce false se c'è un problema |
| rf.send(dati, lunghezza) | Avvia l'invio di un pacchetto di massimo 60 byte |
| rf.waitPacketSent() | Attende che il pacchetto sia stato trasmesso del tutto |
| rf.recv(buf, &len) | Se c'è un nuovo pacchetto con CRC corretto, lo copia in buf, aggiorna len e restituisce true |
| RH_ASK_MAX_MESSAGE_LEN | La quantità massima di dati per pacchetto: 60 byte |
Nel codice del ricevitore è importante reimpostare la variabile len a ogni giro: recv() vi scrive la dimensione del pacchetto ricevuto e alla chiamata successiva quel valore viene preso come dimensione del buffer; se non la reimposti, i messaggi più lunghi vengono troncati. Se tutto va bene, nel Monitor seriale vedrai ogni secondo le righe "Merhaba 0", "Merhaba 1". Se mancano dei numeri, alcuni pacchetti sono andati persi per strada; in quel caso controlla l'antenna e l'alimentazione.
Inviare dati dei sensori: un pacchetto con struct
Nei progetti reali inviare numeri è più efficiente che inviare testo. Puoi raccogliere le misure in una struct e inviarne i byte così come sono. Il trasmettitore qui sotto invia cinque volte al secondo il valore di una LDR o di un potenziometro su A0 e lo stato del pulsante su D2. Il ricevitore accende il LED su D13 quando viene premuto il pulsante remoto e si accorge dei pacchetti persi.
1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket { // iki tarafta birebir aynı olmalı / must be identical on both sides
5 uint16_t no; // paket numarası / packet number
6 int16_t deger; // analog değer / analog value
7 uint8_t buton; // 1 = basılı / 1 = pressed
8};
9
10RH_ASK rf; // varsayılan: 2000 bps, RX 11, TX 12 / defaults
11Paket p = {0, 0, 0};
12
13void setup() {
14 pinMode(2, INPUT_PULLUP); // buton D2-GND / button D2-GND
15 rf.init();
16}
17
18void loop() {
19 p.no++;
20 p.deger = analogRead(A0); // örneğin LDR ya da potansiyometre / e.g. LDR or potentiometer
21 p.buton = (digitalRead(2) == LOW);
22 rf.send((uint8_t *)&p, sizeof(p));
23 rf.waitPacketSent();
24 delay(200);
25}1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket {
5 uint16_t no;
6 int16_t deger;
7 uint8_t buton;
8};
9
10RH_ASK rf;
11const int LED = 13;
12uint16_t sonNo = 0;
13
14void setup() {
15 Serial.begin(9600);
16 pinMode(LED, OUTPUT);
17 rf.init();
18}
19
20void loop() {
21 Paket p;
22 uint8_t len = sizeof(p);
23 if (rf.recv((uint8_t *)&p, &len) && len == sizeof(p)) {
24 digitalWrite(LED, p.buton ? HIGH : LOW); // uzaktaki buton LED'i yakar / remote button lights the LED
25 if (sonNo != 0 && p.no != (uint16_t)(sonNo + 1)) {
26 Serial.println("Paket kaybi / packet lost");
27 }
28 sonNo = p.no;
29 Serial.print(p.no);
30 Serial.print(" A0 = ");
31 Serial.println(p.deger);
32 }
33}L'attributo __attribute__((packed)) impedisce al compilatore di inserire byte di riempimento tra i campi. È importante: la stessa struct può occupare 5 byte su Arduino Uno e 6 su ESP32, e quando comunicano due schede diverse i dati si sfasano. Grazie al numero di pacchetto il ricevitore può contare le perdite. Dato che i moduli a 433 MHz non hanno conferma di ricezione, è buona abitudine ripetere più volte i comandi importanti. Se metti trasmettitore e ricevitore su entrambi i lati, puoi anche creare una comunicazione con conferme e ritrasmissioni usando la classe RHReliableDatagram di RadioHead.
Leggere i codici dei telecomandi commerciali con RCSwitch
Molte prese radiocomandate, campanelli wireless, telecomandi di tapparelle e cancelli, oltre ai sensori di apertura e ai sensori PIR degli allarmi, usano chip codificatori come l'EV1527 o il PT2262. A ogni pressione questi chip inviano lo stesso codice da 12 a 24 bit più volte di seguito, separato da pause di sincronizzazione. La libreria RCSwitch (rc-switch nel Gestore librerie) decodifica questi codici. Su Arduino Uno collega il pin DATA del ricevitore a un pin di interrupt, cioè D2 o D3, e carica il codice seguente:
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4
5void setup() {
6 Serial.begin(9600);
7 rf.enableReceive(digitalPinToInterrupt(2)); // alıcı DATA -> D2 (kesme pini) / receiver DATA -> D2 (interrupt pin)
8 Serial.println(F("Kumandanin tusuna bas / press a remote button"));
9}
10
11void loop() {
12 if (rf.available()) {
13 Serial.print(F("Kod / code: "));
14 Serial.print(rf.getReceivedValue());
15 Serial.print(F(" Bit: "));
16 Serial.print(rf.getReceivedBitlength());
17 Serial.print(F(" Protokol / protocol: "));
18 Serial.print(rf.getReceivedProtocol());
19 Serial.print(F(" Darbe / pulse: "));
20 Serial.print(rf.getReceivedDelay());
21 Serial.println(F(" us"));
22 rf.resetAvailable(); // bir sonraki koda hazırlan / get ready for the next code
23 }
24}Apri il Monitor seriale e premi un tasto del telecomando; vedrai una riga come "Kod / code: 5393 Bit: 24 Protokol / protocol: 1 Darbe / pulse: 350 us". Annota per ogni tasto codice, numero di bit, protocollo e durata dell'impulso: per clonarlo ti serviranno tutti e quattro. Nei telecomandi con EV1527, i primi 20 dei 24 bit sono l'identificativo del telecomando e gli ultimi 4 il tasto premuto; per questo i codici dei tasti dello stesso telecomando sono molto vicini. Nel protocollo 1 un'unità dura circa 350 µs: un bit 0 è 1 unità HIGH e 3 LOW, un bit 1 è 3 unità HIGH e 1 LOW, e la sincronizzazione è 1 unità HIGH e 31 LOW.
| Chip del telecomando | Struttura del codice | Clonabile con RCSwitch? |
|---|---|---|
| EV1527 (codice ad autoapprendimento) | 20 bit di identificativo + 4 bit di tasto, 24 bit in totale | Sì |
| PT2262 / SC2262 | 12 bit a tre stati (0, 1, F); indirizzo impostato con dip switch | Sì |
| HT6P20B | Codice fisso, protocollo 6 di RCSwitch | Sì |
| Chip a codice variabile come HCS301 (KeeLoq) | Codice cifrato che cambia a ogni pressione | No |
Inviare il codice del telecomando da Arduino
Per inviare il codice letto, collega il pin DATA del trasmettitore a D10 e due pulsanti tra D4 e D5 e GND. Ogni volta che premi un pulsante, Arduino ripete il codice 10 volte, proprio come il telecomando; i tasti di accensione e spegnimento della presa ora sono sul tuo Arduino:
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int BTN_AC = 4; // "aç" butonu D4-GND / "on" button D4-GND
5const int BTN_KAPAT = 5; // "kapat" butonu D5-GND / "off" button D5-GND
6
7void setup() {
8 pinMode(BTN_AC, INPUT_PULLUP);
9 pinMode(BTN_KAPAT, INPUT_PULLUP);
10 rf.enableTransmit(10); // verici DATA -> D10 / transmitter DATA -> D10
11 rf.setProtocol(1); // önce protokol... / protocol first...
12 rf.setPulseLength(350); // ...sonra okuduğun darbe süresi / ...then the pulse length you read
13 rf.setRepeatTransmit(10); // her gönderim 10 kez tekrarlanır / each send is repeated 10 times
14}
15
16void loop() {
17 if (digitalRead(BTN_AC) == LOW) {
18 rf.send(5393, 24); // okuduğun "aç" kodu ve bit sayısı / the "on" code and bit length you read
19 delay(300);
20 }
21 if (digitalRead(BTN_KAPAT) == LOW) {
22 rf.send(5396, 24); // okuduğun "kapat" kodu / the "off" code you read
23 delay(300);
24 }
25}Poiché setProtocol() riporta la durata dell'impulso al valore predefinito del protocollo, chiama sempre setPulseLength() dopo. Se la presa non risponde, inserisci prima esattamente la durata d'impulso letta (ad es. 320 o 420 µs), poi porta le ripetizioni a 15. Le prese ad autoapprendimento offrono un'altra scorciatoia: se metti la presa in modalità apprendimento e invii da Arduino un qualsiasi codice a 24 bit, la presa lo memorizza. Così puoi creare codici tuoi senza clonare alcun telecomando.
Ricevitore 433 MHz con ESP32: comandare un relè con il telecomando
L'ESP32 è un ponte ideale per portare i telecomandi a 433 MHz nel mondo Wi-Fi. RCSwitch funziona anche su ESP32 e, dato che tutti i suoi GPIO accettano interrupt, puoi collegare il ricevitore al pin sicuro che preferisci. Il codice seguente legge i codici da un ricevitore collegato a GPIO 27 (con partitore di tensione); quando arriva il codice del tuo telecomando, commuta il LED su GPIO 2 o un modulo relè. Poiché il telecomando invia il codice molte volte con una sola pressione, il programma non commuta di nuovo finché il codice non si è interrotto per 600 ms:
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int RX_PIN = 27; // alıcı DATA, gerilim bölücüyle / receiver DATA, through a divider
5const int ROLE_PIN = 2; // dahili LED ya da röle girişi / onboard LED or relay input
6const unsigned long KOD = 5393; // kendi kumandanın kodu / your own remote's code
7bool durum = false;
8unsigned long sonGorulme = 0;
9
10void setup() {
11 Serial.begin(115200);
12 pinMode(ROLE_PIN, OUTPUT);
13 rf.enableReceive(digitalPinToInterrupt(RX_PIN)); // ESP32'de her GPIO kesme alır / every GPIO takes interrupts on the ESP32
14}
15
16void loop() {
17 if (rf.available()) {
18 unsigned long kod = rf.getReceivedValue();
19 Serial.printf("Kod / code: %lu %u bit protokol %u\n", kod, rf.getReceivedBitlength(), rf.getReceivedProtocol());
20 if (kod == KOD) {
21 // kumanda kodu art arda tekrarlar; yalnız yeni basışta değiştir / the remote repeats the code; toggle only on a new press
22 if (millis() - sonGorulme > 600) {
23 durum = !durum;
24 digitalWrite(ROLE_PIN, durum ? HIGH : LOW);
25 }
26 sonGorulme = millis();
27 }
28 rf.resetAvailable();
29 }
30}Su questa base puoi costruire molto: inoltra i codici ricevuti a Home Assistant tramite MQTT per aggiungere economici sensori porta a 433 MHz alla tua domotica, oppure comanda le prese dal telefono con un trasmettitore su GPIO 26. Anche RadioHead supporta l'ESP32; l'unica differenza è che devi scrivere esplicitamente i pin nel costruttore: RH_ASK rf(2000, 27, 26, 25); (ricevitore 27, trasmettitore 26 e 25 come pin libero per il PTT). Se l'ESP32 è una novità per te, dai un'occhiata a Cos'è l'ESP32?.
Trasmettitore 433 MHz con Raspberry Pi Pico e MicroPython
MicroPython non ha un equivalente pronto di RCSwitch, ma la temporizzazione del protocollo 1 è così semplice che puoi scriverla da solo in poche righe. Collega il VCC dell'FS1000A al pin VBUS (5 V) del Pico, DATA a GP15 e un pulsante tra GP16 e GND. Quando premi il pulsante, il Pico invia i 24 bit partendo dal più significativo, come fa RCSwitch, aggiunge l'impulso di sincronizzazione alla fine e ripete l'intero pacchetto 10 volte. Se non sai ancora come installare MicroPython sul Pico, parti da Cos'è il Raspberry Pi Pico?.
1from machine import Pin
2import time
3
4tx = Pin(15, Pin.OUT, value=0) # FS1000A DATA -> GP15
5buton = Pin(16, Pin.IN, Pin.PULL_UP) # buton GP16-GND / button GP16-GND
6T = 350 # darbe süresi µs (RCSwitch protokol 1) / pulse length µs (RCSwitch protocol 1)
7
8def darbe(yuksek, dusuk): # süreler T cinsinden / durations in units of T
9 tx.value(1)
10 time.sleep_us(yuksek * T)
11 tx.value(0)
12 time.sleep_us(dusuk * T)
13
14def gonder(kod, bit=24, tekrar=10):
15 for _ in range(tekrar):
16 for i in range(bit - 1, -1, -1): # en anlamlı bitten başla / start from the most significant bit
17 if (kod >> i) & 1:
18 darbe(3, 1) # "1" biti: 3T HIGH, 1T LOW / bit "1"
19 else:
20 darbe(1, 3) # "0" biti: 1T HIGH, 3T LOW / bit "0"
21 darbe(1, 31) # senkron: 1T HIGH, 31T LOW / sync
22
23while True:
24 if buton.value() == 0: # butona basıldı / button pressed
25 gonder(5393) # okuduğun kodu yaz / put the code you read here
26 time.sleep_ms(300)Per il processore a 125 MHz del Pico, impulsi da 350 µs sono un ritmo comodo; i piccoli ritardi di Python restano ben al di sotto della tolleranza del 60% dei ricevitori RCSwitch. Puoi provare subito il codice mettendogli accanto un Arduino con il codice lettore RCSwitch: nel Monitor seriale dovrebbe comparire il numero inviato. Per la ricezione dovresti misurare e decodificare la durata degli impulsi con dei timestamp; per questo è più pratico un Arduino o un ESP32 con RCSwitch.
Portata e interferenze: portare il segnale più lontano
- Non dimenticare l'antenna: salda un filo dritto da 17,3 cm su entrambi i lati; è ciò che incide di più sulla portata.
- Alza la tensione del trasmettitore: alimentare l'FS1000A a 9–12 V aumenta nettamente potenza e portata. Non dimenticare la massa comune.
- Riduci la velocità: usare 1000 bps invece di 2000 in RadioHead rende ogni bit più lungo e permette al ricevitore di decodificare segnali più deboli. Imposta la stessa velocità su entrambi i lati.
- Linea di vista e altezza: muri in cemento armato, scatole metalliche e montaggio vicino al suolo possono dimezzare la portata; porta le antenne fuori dai contenitori metallici e il più in alto possibile.
- Pulisci l'alimentazione: motori, relè e alimentatori switching rendono sordo il ricevitore. Dagli un'alimentazione filtrata e tieni i fili corti.
- Usa un ricevitore migliore: un ricevitore supereterodina come l'RXB6 al posto dell'XY-MK-5V spesso arriva molto più lontano con lo stesso trasmettitore.
- Invia più volte: dato che non c'è conferma, invia i comandi importanti 3–5 volte e scarta i duplicati sul ricevitore grazie al numero di pacchetto.
Ricorda che i 433 MHz sono una banda condivisa: la stazione meteo del vicino, le chiavi delle auto e i campanelli trasmettono sulla stessa frequenza. In Europa e in Turchia l'intervallo 433,05–434,79 MHz è libero da licenza per i dispositivi a corto raggio, ma la potenza è limitata a 10 mW (ERP) e non devi occupare il canale di continuo. Inviare i dati a intervalli, o solo quando qualcosa cambia, invece che in continuazione, rispetta le regole e allunga la durata della batteria; per un trasmettitore a batteria puoi usare il calcolatore di durata della batteria.
Modulo RF 433 MHz o nRF24L01?

| Caratteristica | RF 433 MHz (FS1000A + XY-MK-5V) | nRF24L01 |
|---|---|---|
| Frequenza | 433,92 MHz | 2,4 GHz |
| Modulazione | ASK / OOK | GFSK |
| Direzione | Unidirezionale (trasmettitore e ricevitore separati) | Bidirezionale (un unico modulo ricetrasmettitore) |
| Velocità dati | 1–4 kbps nella pratica (2 kbps predefiniti in RadioHead) | 250 kbps – 2 Mbps |
| Collegamento | Un solo pin dati | SPI (7 fili) |
| Alimentazione | Trasmettitore 3–12 V, ricevitore 5 V | 1,9–3,6 V |
| Controllo errori | Software (CRC di RadioHead) | CRC hardware, conferma e ritrasmissione automatiche |
| Portata | 20–100 m con antenna da 17,3 cm | 50–100 m, ~1 km con la versione PA+LNA |
| Attraversamento dei muri | Migliore (frequenza più bassa) | Peggiore |
| Compatibile con dispositivi commerciali | Telecomandi di prese, campanelli e sensori | No |
| Prezzo | Molto economico | Economico |
In breve, se devi inviare in una sola direzione dati piccoli e poco frequenti (un pulsante, una temperatura, l'avviso che una porta è stata aperta) o lavorare con prese e sensori commerciali, il modulo a 433 MHz è la soluzione più economica e semplice. Per un'auto radiocomandata, un joystick o reti di sensori con molti nodi che richiedono una comunicazione veloce, bidirezionale e con conferma, l'nRF24L01 è la scelta migliore. Se ti servono chilometri di portata, guarda i moduli LoRa; per vedere tutte le opzioni a confronto, leggi moduli di comunicazione wireless per Arduino.
Idee di progetti con il modulo RF 433 MHz
- Campanello wireless: suona una melodia in casa quando il pulsante al cancello invia un segnale; per il suono basta un buzzer.
- Comandare le prese da Arduino: clona i codici delle prese radiocomandate e accendi o spegni le lampade in base all'ora o alla luce.
- Sensore porta wireless: metti sulla porta un interruttore reed e un piccolo Arduino con trasmettitore; quando la porta si apre, il lato ricevente fa scattare l'allarme.
- Antifurto per la casa: costruisci un sistema d'allarme con Arduino che riunisca in una centrale sensori PIR e di apertura a 433 MHz già pronti.
- Stazione di sensori per il giardino: invia in casa l'umidità del terreno o la temperatura ogni pochi minuti con un trasmettitore a batteria.
- Ponte da 433 MHz a Wi-Fi: comanda con un ESP32 tutti i dispositivi a 433 MHz di casa dal telefono e dal sistema domotico.
Errori comuni e soluzioni
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| Al ricevitore non arriva nessun pacchetto (RadioHead) | Velocità o pin diversi sui due lati, nessuna antenna | Usa lo stesso costruttore su entrambi i lati (2000, 11, 12) e salda 17,3 cm di filo a entrambi i moduli |
| Funziona solo a pochi centimetri | Nessuna antenna o tensione bassa sul trasmettitore | Aggiungi un'antenna e alimenta il trasmettitore a 5–12 V |
| Errore multiple definition of `__vector_11' | RadioHead e la libreria Servo non possono condividere il Timer1 | Usa RH_ASK_ARDUINO_USE_TIMER2 o ServoTimer2 |
| Il PWM su D9 e D10 non funziona, il dispositivo su D10 si comporta in modo strano | RH_ASK usa il Timer1 e D10 (PTT) | Lascia liberi questi pin o scegli un altro pin PTT nel costruttore |
| RCSwitch non mostra alcun codice | Il DATA del ricevitore è su un pin senza interrupt | Su Uno e Nano usa D2 o D3 |
| Compaiono codici che non riconosci | Stazioni meteo o sensori dei vicini, oppure rumore | Reagisci solo a codici, numero di bit e protocolli noti |
| Il codice clonato non attiva la presa | Durata dell'impulso o protocollo diversi, oppure telecomando a codice variabile | Inserisci il valore di getReceivedDelay() in setPulseLength() e aumenta le ripetizioni |
| L'ESP32 non riceve codici o funziona in modo instabile | L'uscita a 5 V del ricevitore è collegata direttamente a un GPIO | Usa un partitore di tensione o un ricevitore a 3,3 V |
| I dati si interrompono quando gira un motore | Rumore e cali di tensione sull'alimentazione | Alimenta il ricevitore a parte e aggiungi condensatori da 100 nF + 10 µF |
I moduli RF a 433 MHz danno ai tuoi progetti un braccio wireless con una spesa minima e sono tra i pochi moduli in grado di dialogare con i dispositivi radiocomandati che hai già in casa. Una volta capita la logica del controllo wireless, imparerai facilmente altri metodi come i telecomandi IR e il Bluetooth. Nell'app BlueGrays trovi progetti come la comunicazione tra due Arduino, l'accensione di una lampadina a 220 V con il telecomando, un sensore porta con interruttore reed e un allarme di movimento con ESP32, con schemi elettrici e codice passo passo.
Domande frequenti
Qual è la portata di un modulo RF 433 MHz?
Senza antenna un kit funziona solo a 1–3 metri. Con un'antenna a filo da 17,3 cm saldata su entrambi i lati e il trasmettitore alimentato a 5 V si ottengono 20–50 metri in campo aperto, e oltre 100 metri con il trasmettitore a 9–12 V. All'interno degli edifici muri e interferenze riducono parecchio questi valori.
Quanto deve essere lunga l'antenna a 433 MHz?
L'antenna semplice più efficiente è un filo dritto a quarto d'onda: circa 17,3 cm per 433 MHz e 23,8 cm per 315 MHz. Salda il filo alla piazzola ANT del modulo e tienilo dritto e verticale; le antenne di trasmettitore e ricevitore devono essere orientate nella stessa direzione.
Trasmettitore e ricevitore a 433 MHz possono comunicare in entrambe le direzioni?
Con una sola coppia la comunicazione va solo dal trasmettitore al ricevitore. Se metti trasmettitore e ricevitore su entrambi i lati puoi lavorare nei due sensi, e la classe RHReliableDatagram di RadioHead aggiunge anche conferme e ritrasmissioni in questa configurazione. Per questo scopo, però, sono più pratici moduli bidirezionali di serie come l'nRF24L01 o l'HC-12.
Si può clonare il telecomando dell'auto o del garage con un modulo a 433 MHz?
Le chiavi delle auto e i telecomandi dei garage moderni usano il codice variabile (rolling code): il codice cambia a ogni pressione e uno registrato viene rifiutato, quindi RCSwitch non può clonarli. I telecomandi a codice fisso di prese, campanelli e sensori invece si possono clonare. Usa questo metodo solo sui tuoi dispositivi; tentare di accedere ai sistemi altrui può causare problemi legali.
Il modulo RF 433 MHz funziona con l'ESP32?
Sì. Puoi alimentare il trasmettitore FS1000A a 5 V e collegare il suo pin DATA direttamente a un GPIO; un segnale a 3,3 V è sufficiente. Poiché l'uscita del ricevitore XY-MK-5V è a 5 V, devi aggiungere un partitore di tensione o scegliere un ricevitore che funzioni a 3,3 V, come l'RXB6. Le librerie RCSwitch e RadioHead supportano entrambe l'ESP32.
Che differenza c'è tra i moduli a 433 MHz e a 315 MHz?
Le due versioni sono costruite allo stesso modo; cambia solo la frequenza di lavoro. In Europa i telecomandi usano soprattutto 433,92 MHz, mentre negli Stati Uniti e in alcuni paesi asiatici è diffuso il 315 MHz. Trasmettitore e ricevitore, o il telecomando che vuoi clonare, devono avere esattamente la stessa frequenza.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
Comunicazione unidirezionale tra 2 Arduino
Fai parlare due Arduino con un solo filo: premi il pulsante sull'uno e il LED dell'altro si accende, premi di nuovo e si spegne. La scheda che invia segnala la pressione con un breve messaggio, e quel

Comunicazione bidirezionale tra 2 Arduino
Due Arduino collegati con dei fili parlano tra loro: premi il pulsante di uno e si accende la luce dell'altro, premilo di nuovo e si spegne. Entrambe le schede hanno lo stesso programma, quindi ognuna

Accendere una lampadina 220V con il telecomando
Accendi e spegni una vera lampadina di casa con un telecomando, senza alzarti dal divano. L'Arduino legge il segnale di luce invisibile del telecomando; il tasto di accensione fa scattare il relè e ac

Sensore porta con contatto reed
Capisci se la tua porta è aperta o chiusa guardando una luce. Metti un piccolo magnete sulla porta e sul telaio un interruttore che sente i magneti; a porta chiusa stanno vicini e si accende il LED ve

Accendere e spegnere LED con ricevitore IR e telecomando
Come comandare tre lampade senza alzarti dalla poltrona: i tasti 1, 2 e 3 del telecomando accendono i LED blu, rosso e verde, e i tasti 4, 5 e 6 li spengono nello stesso ordine. Il tasto di accensione

Telecomando universale ESP32 IR (ricevitore IR + telecomando + 3 LED + cicalino + OLED)
Con l'ESP32 puoi leggere un telecomando IR già pronto e controllare il tuo dispositivo! In questo progetto acquisiamo i segnali di un telecomando IR a 20 tasti tramite un ricevitore a infrarossi (protocollo NEC a 38 kHz). Abbiamo definito un'azione diversa per ogni tasto: i tasti 1/2/3 attivano/disattivano tre LED distinti, il tasto PWR li spegne tutti, mentre i numeri da 4 a 9 visualizzano un messaggio specifico sul display OLED. Sul display OLED SSD1306 vengono visualizzati in tempo reale, in

Controllare un LED dal telefono tramite Bluetooth
Una piccola prova per accendere e spegnere le luci della tua stanza dal telefono. Il modulo Bluetooth passa all'Arduino le lettere che invii dal telefono; una lettera accende il LED rosso, un'altra qu
Altri articoli
App BlueGrays
Costruisci questo circuito passo passo sul telefono
Schema, codice ed elenco componenti in un’unica schermata. Oltre 200 progetti Arduino, ESP32 e Pico da realizzare.
Inquadra con il telefono
Punta la fotocamera sul codice: si apre lo store del tuo telefono.
oppure apri lo store

