Радиомодуль 433 MHz и Arduino: передатчик, приёмник, антенна
Радиомодуль 433 MHz и Arduino: подключение передатчика FS1000A и приёмника XY-MK-5V, антенна 17,3 см, сообщения через RadioHead и копирование кодов пультов с RCSwitch.
Радиомодуль 433 MHz — самый дешёвый способ добавить беспроводную связь в проект на Arduino: комплект из передатчика (FS1000A) и приёмника (XY-MK-5V) стоит совсем недорого, подключается одним проводом данных и с проволочной антенной длиной 17 см передаёт сигнал на десятки метров. На той же частоте обычно работают и радиоуправляемые розетки, беспроводные дверные звонки, пульты рольставней, датчики открытия дверей и окон, а также уличные датчики метеостанций. Поэтому с этими модулями можно и пересылать данные между двумя Arduino, и считывать коды готовых пультов у тебя дома, чтобы потом отправлять их с Arduino.
В этом руководстве разберёмся, как модули работают с модуляцией ASK (OOK), почему антенна должна быть длиной 17,3 см и как подключить их к Arduino Uno, ESP32 и Raspberry Pi Pico. Затем перешлём текст и данные датчика между двумя Arduino с библиотекой RadioHead, считаем и скопируем код пульта розетки с библиотекой RCSwitch, посмотрим, как увеличить дальность, и сравним модуль с nRF24L01.
Что такое радиомодуль 433 MHz и как он работает?
Комплект состоит из двух отдельных плат. Маленький квадратный передатчик FS1000A (продаётся и под названием XY-FST) включает и выключает несущую частоту 433,92 MHz в такт сигналу на пине DATA. Более длинный приёмник XY-MK-5V ловит этот сигнал из эфира и снова выдаёт его на пин DATA в виде 0 и 1. Иначе говоря, у самих модулей нет ни протокола, ни адреса, ни проверки ошибок: их единственная задача — передать цифровой сигнал по воздуху на другую сторону. Упаковка, проверка и декодирование данных — работа библиотеки на Arduino. Связь односторонняя: передатчик только отправляет, а приёмник только слушает.
| Параметр | FS1000A (передатчик) | XY-MK-5V (приёмник) |
|---|---|---|
| Частота | 433,92 MHz (есть и версия на 315 MHz) | 433,92 MHz |
| Напряжение питания | 3–12 V | 5 V |
| Ток | Примерно 9–40 mA при передаче (зависит от напряжения) | Примерно 4 mA |
| Модуляция | ASK / OOK | ASK / OOK, сверхрегенеративный приёмник |
| Скорость передачи данных | До ~10 кбит/с (на практике 1–4 кбит/с) | Тот же предел, что у передатчика |
| Выходная мощность / чувствительность | Около 10 mW, растёт с напряжением | Около −105 dBm |
| Пины | DATA, VCC, GND + площадка ANT для пайки | VCC, DATA, DATA, GND + площадка ANT для пайки |
| Размер | Примерно 19 × 19 мм | Примерно 30 × 14 мм |
Два пина DATA у приёмника соединены между собой на плате, так что неважно, какой из них использовать. XY-MK-5V — дешёвый, но не слишком избирательный сверхрегенеративный приёмник: его частота задаётся подстроечной катушкой на плате, и он легко ловит помехи от соседних устройств. Не крути винт в этой катушке: если заводская настройка собьётся, приёмник перестанет слышать передатчик. Для более стабильного результата подойдут супергетеродинные приёмники вроде RXB6: они чувствительнее и работают в том числе от 3,3 V. Комплект продаётся и в версии на 315 MHz; передатчик и приёмник должны быть на одной частоте, а на металлическом резонаторе платы передатчика частота обычно напечатана.
Модуляция ASK (OOK): зачем нужна библиотека?
В OOK (On-Off Keying), простейшей разновидности ASK (Amplitude Shift Keying, амплитудная манипуляция), несущая включается для бита 1 и выключается для бита 0. Звучит просто, но у приёмника есть особенность: его автоматическая регулировка усиления (AGC) при отсутствии сигнала выкручивает усиление до максимума, принимает шум эфира за данные и постоянно выдаёт на пин DATA случайные импульсы. Поэтому если подключить передатчик прямо к пину TX Arduino, а приёмник к пину RX и попытаться общаться через Serial.print, обычно получаются мусорные символы.
Драйвер RH_ASK из библиотеки RadioHead решает эту проблему так: перед каждым пакетом он отправляет 36-битную преамбулу и 12-битный стартовый символ, чтобы усиление приёмника успело установиться. Затем каждый байт превращается в два DC-сбалансированных 6-битных символа (кодирование 4 в 6), а в конец пакета добавляется 16-битная CRC. Пакеты с неверной CRC приёмник молча отбрасывает, поэтому до программы доходят только целые данные. RCSwitch же декодирует широтно-импульсное кодирование, которое используют микросхемы пультов: каждый бит представлен импульсами, которые держатся в HIGH и LOW заданное время.
Длина антенны 433 MHz: почему 17,3 см?
Антенны на модулях нет, есть только площадка для пайки с надписью ANT. Без антенны комплект работает лишь на 1–3 метра. Самая эффективная простая антенна — прямой провод длиной в четверть волны: λ = c / f = 300 000 000 / 433 920 000 ≈ 0,69 м, а четверть от этого — около 17,3 см. Для модулей на 315 MHz тот же расчёт даёт 23,8 см. Припаяй один конец одножильного провода к площадке ANT и держи провод прямым и вертикальным; к приёмнику тоже припаяй провод такой же длины и направь обе антенны в одну сторону.
| Антенна | Длина | Примерная дальность (открытое пространство) | Примечание |
|---|---|---|---|
| Без антенны | — | 1–3 м | Только для проверки на столе |
| Прямой провод (λ/4), передатчик от 5 V | 17,3 см | 20–50 м | Самый простой и самый эффективный вариант |
| Прямой провод (λ/4), передатчик от 9–12 V | 17,3 см | 50–100 м и больше | Прямая видимость и высота сильно влияют |
| Готовая спиральная (пружинная) антенна | Длина 2–4 см | Меньше, чем с прямым проводом | Помещается внутри корпуса |
Подключение радиомодуля 433 MHz: Arduino Uno, ESP32 и Pico
| Пин модуля | Arduino Uno (RadioHead) | Arduino Uno (RCSwitch) | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| FS1000A VCC | 5V или внешний источник 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 (пин прерывания) | GPIO 27 (через делитель напряжения) | GP14 (через делитель напряжения) |
| XY-MK-5V GND | GND | GND | GND | GND |
Передатчик нормально работает и с сигналом 3,3 V на пине DATA, поэтому на ESP32 и Pico его можно питать от 5 V, а DATA подключить прямо к GPIO. Сильнее всего на дальность влияет напряжение питания передатчика: при 3,3 V дальность заметно падает, а при 9–12 V вырастает в несколько раз. Керамический конденсатор на 100 nF и электролитический на 10 µF прямо у пинов VCC и GND приёмника снижают помехи по питанию и заметно улучшают приём.
Пересылка сообщений между двумя Arduino с RadioHead
- Открой в Arduino IDE «Менеджер библиотек» (Library Manager), найди RadioHead и установи библиотеку Mike McCauley. Подробнее — в статье Как добавить библиотеку в Arduino.
- Подключи передатчик к первой Arduino: DATA → D12, VCC → 5V, GND → GND.
- Подключи приёмник ко второй Arduino: DATA → D11, VCC → 5V, GND → GND.
- Припаяй к площадке ANT каждого модуля провод длиной 17,3 см.
- Загрузи код передатчика в первую плату, а код приёмника во вторую, затем на стороне приёмника открой монитор порта на скорости 9600 бод.
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}| Команда | Что делает |
|---|---|
| RH_ASK rf(2000, 11, 12) | Скорость 2000 бит/с, приёмник на D11, передатчик на D12; скорость на обеих сторонах должна совпадать |
| rf.init() | Настраивает таймер и пины; если что-то не так, возвращает false |
| rf.send(данные, длина) | Начинает отправку пакета размером до 60 байт |
| rf.waitPacketSent() | Ждёт, пока пакет не будет полностью передан |
| rf.recv(buf, &len) (приём пакета) | Если пришёл новый пакет с верной CRC, копирует его в buf, обновляет len и возвращает true |
| RH_ASK_MAX_MESSAGE_LEN | Наибольший объём данных в одном пакете: 60 байт |
В коде приёмника важно заново задавать переменную len на каждом проходе: recv() записывает в неё размер пришедшего пакета, а при следующем вызове это значение принимается за размер буфера; если его не сбросить, более длинные сообщения будут обрезаться. Если всё в порядке, в мониторе порта раз в секунду появляются строки «Merhaba 0», «Merhaba 1» (по-турецки «привет»). Если номера идут с пропусками, часть пакетов потерялась по дороге; в таком случае проверь антенну и питание.
Отправка данных датчика: пакет со структурой
В реальных проектах отправлять числа выгоднее, чем текст. Показания можно собрать в struct и передать её байты как есть. Передатчик ниже пять раз в секунду отправляет значение фоторезистора (LDR) или потенциометра на A0 и состояние кнопки на D2. Приёмник зажигает светодиод на D13, когда нажата кнопка на другой стороне, и замечает потерянные пакеты.
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}Атрибут __attribute__((packed)) не даёт компилятору добавлять выравнивающие байты между полями. Это важно: одна и та же структура может занимать 5 байт на Arduino Uno и 6 байт на ESP32, и при обмене между разными платами данные съезжают. Благодаря номеру пакета приёмник может посчитать, сколько пакетов потерялось. У модулей 433 MHz нет подтверждения приёма, поэтому важные команды полезно повторять несколько раз. Если поставить и передатчик, и приёмник на каждую сторону, с классом RHReliableDatagram из RadioHead можно настроить связь с подтверждением и повторной отправкой.
Считывание кодов готовых пультов с RCSwitch
Многие радиоуправляемые розетки, беспроводные звонки, пульты рольставней и садовых ворот, а также датчики открытия дверей и окон и PIR-датчики сигнализации используют кодовые микросхемы вроде EV1527 или PT2262. При каждом нажатии кнопки такая микросхема раз за разом отправляет один и тот же 12–24-битный код с паузами синхронизации между повторами. Библиотека RCSwitch (в «Менеджере библиотек» она называется rc-switch) декодирует эти коды. На Uno подключи пин DATA приёмника к пину прерывания, то есть к D2 или D3, и загрузи код ниже:
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}Открой монитор порта и нажми кнопку на пульте: появится строка вроде «Kod / code: 5393 Bit: 24 Protokol / protocol: 1 Darbe / pulse: 350 us». Запиши для каждой кнопки код, число бит, протокол и длительность импульса: при копировании понадобятся все четыре значения. В пультах на EV1527 первые 20 из 24 бит — это идентификатор пульта, а последние 4 — нажатая кнопка, поэтому коды кнопок одного пульта очень близки друг к другу. В протоколе 1 одна единица времени длится около 350 µs: бит 0 — это 1 единица HIGH и 3 единицы LOW, бит 1 — 3 единицы HIGH и 1 единица LOW, а синхроимпульс — 1 единица HIGH и 31 единица LOW.
| Микросхема пульта | Структура кода | Копируется с RCSwitch? |
|---|---|---|
| EV1527 (обучаемый код) | 20 бит ID + 4 бита кнопки, всего 24 бита | Да |
| PT2262 / SC2262 | 12 трёхуровневых (0, 1, F) бит; адрес задаётся DIP-переключателями | Да |
| HT6P20B | Фиксированный код, протокол 6 в RCSwitch | Да |
| Микросхемы с плавающим кодом, например HCS301 (KeeLoq) | Зашифрованный код, который меняется при каждом нажатии | Нет |
Отправка кода пульта с Arduino
Чтобы отправить считанный код, подключи пин DATA передатчика к D10, а две кнопки — между D4 и D5 и GND. При каждом нажатии кнопки Arduino повторяет код 10 раз, как это делает пульт; теперь кнопки включения и выключения розетки находятся на твоей 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}Функция setProtocol() сбрасывает длительность импульса на значение по умолчанию для этого протокола, поэтому setPulseLength() всегда вызывается после неё. Если розетка не реагирует, сначала укажи точно ту длительность импульса, которая была считана (например, 320 или 420 µs), а затем увеличь число повторов до 15. У розеток с обучаемым кодом есть ещё один короткий путь: если перевести розетку в режим обучения и отправить с Arduino любой 24-битный код, розетка запомнит его. То есть можно придумать собственные коды, вообще не копируя ни один пульт.
Приёмник 433 MHz на ESP32: управление реле с пульта
ESP32 — отличный мост между пультами 433 MHz и миром Wi-Fi. RCSwitch работает и на ESP32, а поскольку любой GPIO у ESP32 поддерживает прерывания, приёмник можно подключить к любому безопасному пину. Код ниже считывает коды с приёмника на GPIO 27 (через делитель напряжения); когда приходит код твоего пульта, он переключает светодиод на GPIO 2 или модуль реле. Пульт при одном нажатии отправляет код много раз, поэтому программа не переключит выход повторно, пока код не пропадёт на 600 мс:
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}На этой основе можно построить многое: пересылать полученные коды в Home Assistant по MQTT и добавить в умный дом дешёвые датчики двери на 433 MHz или управлять розетками с телефона через передатчик на GPIO 26. RadioHead тоже поддерживает ESP32; разница лишь в том, что пины явно указываются в конструкторе: RH_ASK rf(2000, 27, 26, 25); (приёмник 27, передатчик 26 и 25 как свободный пин для PTT). Если ESP32 пока в новинку, загляни в статью Что такое ESP32?.
Передатчик 433 MHz на Raspberry Pi Pico с MicroPython
Готового аналога RCSwitch в MicroPython нет, но тайминги протокола 1 настолько просты, что их можно написать вручную в несколько строк. Подключи VCC модуля FS1000A к пину VBUS (5 V) на Pico, DATA к GP15, а кнопку — между GP16 и GND. При нажатии кнопки Pico, как и RCSwitch, отправляет 24 бита начиная со старшего, добавляет в конце синхроимпульс и повторяет весь пакет 10 раз. Если MicroPython на Pico ещё не установлен, начни со статьи Что такое 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)Для процессора Pico на 125 MHz импульсы по 350 µs — вполне комфортная скорость: небольшие задержки Python остаются намного ниже допуска по времени в 60%, который есть у приёмников RCSwitch. Проверить код можно сразу, положив рядом Arduino с загруженным кодом чтения RCSwitch: в мониторе порта должно появиться отправленное число. На стороне приёма пришлось бы измерять длительности импульсов по меткам времени и декодировать их; для этой задачи практичнее Arduino или ESP32 с RCSwitch.
Дальность и помехи: как передать сигнал дальше
- Не забудь про антенну: припаяй прямой провод длиной 17,3 см с обеих сторон; это сильнее всего влияет на дальность.
- Подними напряжение передатчика: питание FS1000A от 9–12 V заметно увеличивает выходную мощность и дальность. Не забудь про общую землю.
- Снизь скорость: 1000 бит/с вместо 2000 в RadioHead делает каждый бит длиннее, и приёмник может декодировать более слабые сигналы. На обеих сторонах укажи одинаковую скорость.
- Прямая видимость и высота: железобетонные стены, металлические корпуса и монтаж у самого пола могут вдвое сократить дальность; вынеси антенны из металлических корпусов и подними как можно выше.
- Очисти питание: моторы, реле и импульсные блоки питания «глушат» приёмник. Дай приёмнику отфильтрованное питание и делай провода короткими.
- Возьми приёмник получше: супергетеродинный приёмник вроде RXB6 вместо XY-MK-5V с тем же передатчиком часто бьёт заметно дальше.
- Отправляй повторно: подтверждения приёма нет, поэтому важные команды отправляй 3–5 раз, а на приёмнике отсеивай повторы по номеру пакета.
Помни, что 433 MHz — общий диапазон: на той же частоте работают метеостанция соседа, автомобильные ключи и дверные звонки. В Европе диапазон 433,05–434,79 MHz открыт для безлицензионного использования устройствами малого радиуса действия, но мощность передачи ограничена 10 mW (ERP), а канал нельзя занимать постоянно; правила зависят от страны (в России действуют похожие ограничения), а в США пульты чаще работают на 315 MHz. Если отправлять данные не непрерывно, а через интервалы или только при изменении, это и укладывается в правила, и продлевает работу от батареи; для передатчика с батарейным питанием пригодится калькулятор времени работы от батареи.
Радиомодуль 433 MHz или nRF24L01?

| Параметр | Радиомодуль 433 MHz (FS1000A + XY-MK-5V) | nRF24L01 |
|---|---|---|
| Частота | 433,92 MHz | 2,4 GHz |
| Модуляция | ASK / OOK | GFSK |
| Направление | Одностороннее (отдельные платы передатчика и приёмника) | Двустороннее (один модуль-трансивер) |
| Скорость передачи данных | На практике 1–4 кбит/с (в RadioHead по умолчанию 2 кбит/с) | 250 кбит/с – 2 Мбит/с |
| Подключение | Один пин данных | SPI (7 проводов) |
| Питание | Передатчик 3–12 V, приёмник 5 V | 1,9–3,6 V |
| Проверка ошибок | Программная (CRC в RadioHead) | Аппаратная CRC, автоподтверждение и повторная отправка |
| Дальность | 20–100 м с антенной 17,3 см | 50–100 м, ~1 км с версией PA+LNA |
| Прохождение через стены | Лучше (ниже частота) | Хуже |
| Работа с готовыми устройствами | Пульты розеток, звонков и датчиков | Нет |
| Цена | Очень дёшево | Дёшево |
Коротко: если нужно отправлять в одну сторону редкие небольшие данные (нажатие кнопки, значение температуры, факт открытия двери) или работать с готовыми розетками и датчиками, модуль 433 MHz — самое дешёвое и простое решение. Для радиоуправляемой машинки, джойстика или сенсорных сетей из многих узлов, где нужна быстрая двусторонняя связь с подтверждением, лучше подойдёт nRF24L01. Если нужна дальность в километры, посмотри на модули LoRa, а чтобы увидеть все варианты рядом, прочитай статью Модули беспроводной связи для Arduino.
Идеи проектов с радиомодулем 433 MHz
- Беспроводной дверной звонок: по сигналу от кнопки у садовой калитки в доме играет мелодия; для звука достаточно зуммера.
- Управление розетками с Arduino: скопируй коды радиоуправляемых розеток и включай и выключай лампы по времени или по уровню освещённости.
- Беспроводной датчик двери: поставь на дверь геркон и маленькую Arduino с передатчиком; когда дверь открывается, приёмная сторона поднимает тревогу.
- Домашняя сигнализация: собери сигнализацию на Arduino, которая объединяет готовые PIR-датчики и датчики двери на 433 MHz в одном центральном блоке.
- Садовая метеостанция: отправляй влажность почвы или температуру в дом каждые несколько минут с помощью передатчика на батарейках.
- Мост 433 MHz – Wi-Fi: управляй всеми устройствами 433 MHz в доме с телефона и из системы умного дома с помощью ESP32.
Частые ошибки и как их исправить
| Симптом | Вероятная причина | Решение |
|---|---|---|
| До приёмника не доходит ни один пакет (RadioHead) | На двух сторонах разные скорость или пины, нет антенны | Используй на обеих сторонах одинаковый конструктор (2000, 11, 12) и припаяй к обоим модулям провод 17,3 см |
| Работает только на расстоянии в несколько сантиметров | Нет антенны или низкое напряжение на передатчике | Добавь антенну и питай передатчик от 5–12 V |
| Ошибка multiple definition of `__vector_11' | RadioHead и библиотека Servo не могут делить Timer1 | Используй RH_ASK_ARDUINO_USE_TIMER2 или ServoTimer2 |
| Не работает ШИМ на D9 и D10, устройство на D10 ведёт себя странно | RH_ASK занимает Timer1 и D10 (PTT) | Оставь эти пины свободными или выбери в конструкторе другой пин для PTT |
| RCSwitch не показывает вообще никаких кодов | DATA приёмника подключён к пину без прерывания | На Uno и Nano используй D2 или D3 |
| На экране появляются незнакомые коды | Соседские метеостанции, датчики или шум | Реагируй только на известные коды, длину в битах и протоколы |
| Скопированный код не включает розетку | Отличается длительность импульса или протокол, либо у пульта плавающий код | Передай значение getReceivedDelay() в setPulseLength() и увеличь число повторов |
| ESP32 не принимает коды или работает нестабильно | Выход приёмника на 5 V подключён прямо к GPIO | Используй делитель напряжения или приёмник на 3,3 V |
| Данные пропадают, когда работает мотор | Помехи по питанию и просадки напряжения | Дай приёмнику отдельное питание и добавь конденсаторы 100 nF + 10 µF |
Радиомодули 433 MHz за совсем небольшие деньги дают проектам беспроводную «руку» и входят в число немногих модулей, способных общаться с готовыми радиоуправляемыми устройствами у тебя дома. Когда логика беспроводного управления понятна, легко освоить и другие способы — ИК-пульты и Bluetooth. В приложении BlueGrays есть проекты со схемами и пошаговым кодом: связь между двумя Arduino, включение лампы 220 V с пульта, датчик двери на герконе и сигнализация движения на ESP32.
Частые вопросы
Какая дальность у радиомодуля 433 MHz?
Без антенны комплект работает лишь на 1–3 метра. С проволочной антенной 17,3 см на обеих сторонах и питанием передатчика от 5 V на открытом пространстве реально получить 20–50 метров, а при питании передатчика от 9–12 V — больше 100 метров. В помещении стены и помехи заметно снижают эти цифры.
Какой длины должна быть антенна 433 MHz?
Самая эффективная простая антенна — прямой провод длиной в четверть волны: около 17,3 см для 433 MHz и 23,8 см для 315 MHz. Припаяй провод к площадке ANT модуля и держи его прямым и вертикальным; антенны приёмника и передатчика должны быть направлены в одну сторону.
Можно ли с передатчиком и приёмником 433 MHz наладить двустороннюю связь?
С одной парой связь идёт только от передатчика к приёмнику. Если поставить и передатчик, и приёмник на каждую сторону, можно работать в обе стороны, а класс RHReliableDatagram из RadioHead в такой схеме даже добавляет подтверждения и повторы. И всё же для этого практичнее модули, изначально рассчитанные на двустороннюю связь, например nRF24L01 или HC-12.
Можно ли скопировать автомобильный пульт или пульт гаража модулем 433 MHz?
Автомобильные ключи и современные пульты гаражных ворот используют плавающий код (rolling code): код меняется при каждом нажатии, а записанный код отклоняется, поэтому RCSwitch не может их скопировать. А вот пульты розеток, звонков и датчиков с фиксированным кодом копируются. Используй этот способ только для своих устройств: попытки получить доступ к чужим системам грозят проблемами с законом.
Работает ли радиомодуль 433 MHz с ESP32?
Да. Передатчик FS1000A можно питать от 5 V, а его пин DATA подключить прямо к GPIO: сигнала 3,3 V достаточно. Выход приёмника XY-MK-5V — 5 V, поэтому нужно поставить делитель напряжения или выбрать приёмник с питанием 3,3 V, например RXB6. Библиотеки RCSwitch и RadioHead обе поддерживают ESP32.
Чем отличаются модули на 433 MHz и 315 MHz?
Обе версии устроены одинаково, отличается только рабочая частота. В Европе и России пульты в основном работают на 433,92 MHz, а в США и некоторых странах Азии распространена частота 315 MHz. Передатчик и приёмник, а также пульт, который нужно скопировать, должны быть строго на одной частоте.
Что собрать после прочтения
Все проекты
Односторонняя связь между двумя Arduino
Ты заставляешь две Arduino разговаривать по одному проводу: нажми кнопку на одной, и на другой загорится светодиод, нажми снова — погаснет. Плата-передатчик сообщает о нажатии кнопки коротким сообщени

Двусторонняя связь между двумя Arduino
Две Arduino соединены проводами и разговаривают друг с другом: нажми кнопку на одной, и на другой загорится свет, нажми снова — погаснет. На обеих платах одна и та же программа, поэтому каждая и отпра

Включение лампы 220V пультом
Включай и выключай настоящую лампу у себя дома пультом от телевизора, не вставая с дивана. Arduino читает невидимый световой сигнал пульта; кнопка питания щёлкает реле и включает лампу, а кнопка отклю

Датчик двери на герконе
Узнай, открыта дверь или закрыта, просто взглянув на огонёк. Маленький магнит крепится на дверь, а чувствительный к магниту контакт — на раму; когда дверь закрыта, они рядом, и горит зелёный светодиод

Включение светодиода ИК-приёмником и пультом
Как будто управляешь тремя отдельными лампами, не вставая с кресла: клавиши 1, 2 и 3 на пульте включают синий, красный и зелёный светодиоды, а клавиши 4, 5 и 6 выключают их в том же порядке. Клавиша п

Универсальный ИК-пульт на ESP32 (ИК-приёмник + пульт + 3 светодиода + зуммер + OLED)
С ESP32 можно читать обычный ИК-пульт и управлять с него своим устройством! В этом проекте инфракрасный приёмник (протокол NEC, 38 kHz) ловит сигналы 20-кнопочного ИК-пульта. Каждой кнопке задано своё действие: кнопки 1, 2 и 3 переключают три отдельных светодиода, кнопка PWR выключает все, а цифры 4–9 показывают на OLED особые символы. OLED-дисплей SSD1306 крупно показывает последнюю нажатую кнопку и описание действия.

Управление светодиодом с телефона по Bluetooth
Небольшая репетиция того, как включать и выключать свет в комнате с телефона. Bluetooth-модуль передаёт в Arduino буквы, отправленные с телефона; одна буква включает красный светодиод, другая — зелёны
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

