Arduino радиопередатчик и приемник (433МГц). Беспроводное управление реле.

В данной статье мы подключим к Arduino радиопередатчик и приемник (рисунок 1). В частности реализуем беспроводное управление электромагнитным реле с помощью тактовой кнопки.

rf_433
Рисунок 1 – Радиоприемник и передатчик

Беспроводные модули передатчики позволяют Arduino беспроводно общаться с другими Arduino, или с радио управляемыми устройствами, работающими на той же частоте (433 МГц в данном случае).

Они работают в паре, то есть для работы нам нужны как приемник, так и передатчик.

Технические характеристики радиомодулей

TX (Transmitter) Передатчик

Рабочее напряжение: 3В ~ 12В
Рабочий ток: max?40mA (12В), min?9mA (3В)
Режим резонанса: звуковая волна резонанса (SAW)
Режим модуляции: ASK/ООК
Робочая частота: 315MHz-433.92 доступна настройка частоты.
Передающая мощность: 25mW (315MHz при 12В)
Ошибка частоты: + 150 кГц (макс)
Скорость: ?10Kbps

RX (Receiver) Приемник

Рабочее напряжение: 5.0VDC + 0.5V
Рабочий ток: ?5.5mA (5.0VDC)
Принцип работы: однокристальный супер регенерационный прием
Метод работы: OOK/ASK
Робочая частота: 315MHz-433.92 доступна настройка частоты.
Пропускная способность: 2 МГц (315 МГц, имея результат в тестировании на 3dBm чувствительности)
Чувствительность: Excel -100dBm (50?)
Скорость передачи: <9.6 Kbps (в 315 МГц и -95dBm)

Одно из основных требований к радиомодулям – это дальность и качество их действия. Однако их можно значительно повысить, дополнительно присоединив антенну – ее рекомендуемая длина для передатчиков с частотой 433 МГц составляет около 17 см.
Теперь перейдем к подключению самих элементов. Каждый из них имеет выводы “питание” и “земля”, а также цифровой выход для данных. Все они подписаны на самой плате, поэтому подключение не доставит никаких проблем. Дополнительное подключение антенны повысит качество работы модулей, однако дальность связи можно улучшить и за счет подачи на модуль питания – если оно составит 12 В, то дальность и надежность связи значительно возрастут.

Подключение передатчика

transmitter_arduino

Подключение приемника

receiver_arduino

Реле подключим к цифровому выводу 7 на Arduino с приемником.
Кнопку подключим к цифровому выводу 8 на Arduino с передатчиком.

Схема с передатчиком и кнопкой

transmitter

Схема с приемником и реле

receiver

Код программы для передатчика

/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12


*/

#include <VirtualWire.h> 

int switchPin = 8;
boolean lastButton = LOW;
boolean currentButton = LOW;
int check = 0;

void setup()
{
  pinMode(switchPin, INPUT);
 
// Initialize the IO and ISR
vw_setup(2000); // Bits per sec
}

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}

void loop()
{
     currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH && check == 0)
  {
    send("on");
    delay(500);
check = 1;  
}
else  

if (lastButton == LOW && currentButton == HIGH && check == 1)
  {
    send("off");
    delay(500);
check = 0;
  }
}

void send (char *message)
{
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); // Wait until the whole message is gone
}

Код программы для приемника

/*
SimpleReceive
This sketch displays text strings received using VirtualWire
Connect the Receiver data pin to Arduino pin 11
*/
#include <VirtualWire.h>
byte message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages
byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message
int relayPin = 7;

void setup()
{
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH);
  
Serial.begin(9600);
Serial.println("Device is ready");
// Initialize the IO and ISR
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver
}

void loop()
{
if (vw_get_message(message, &messageLength)) // Non-blocking
{
Serial.print("Received: ");
for (int i = 0; i < messageLength; i++)
{
char c = message[i];
Serial.print(c);
char on = 'on';
if(c == on) 
{
 digitalWrite(relayPin, LOW);
}
char off = 'of';
if(c == off) 
{
 digitalWrite(relayPin, HIGH);
}
 }
Serial.println();
 }
}

Результат проделанной нами работы:

11 комментариев к “Arduino радиопередатчик и приемник (433МГц). Беспроводное управление реле.”

  1. Константин

    Все бы хорошо, но скеч не грузится….

    Arduino: 1.6.0 (Windows 7), Плата”Arduino Uno”

    sketch_mar05c.ino:6:10: error: #include expects “FILENAME” or
    sketch_mar05c.ino:7:14: error: ‘VW_MAX_MESSAGE_LEN’ was not declared in this scope
    sketch_mar05c.ino:8:22: error: ‘VW_MAX_MESSAGE_LEN’ was not declared in this scope
    sketch_mar05c.ino: In function ‘void setup()’:
    sketch_mar05c.ino:19:14: error: ‘vw_setup’ was not declared in this scope
    sketch_mar05c.ino:20:13: error: ‘vw_rx_start’ was not declared in this scope
    sketch_mar05c.ino: In function ‘void loop()’:
    sketch_mar05c.ino:24:20: error: ‘message’ was not declared in this scope
    sketch_mar05c.ino:24:43: error: ‘vw_get_message’ was not declared in this scope
    Ошибка компиляции.

    This report would have more information with
    “Отображать вывод во время компиляции”
    enabled in File > Preferences.

    1. Здравствуйте. Проверьте указано ли после директивы #include название библиотеки virtualwire.h и установлена ли сама библиотека.

      1. Константин

        Arduino: 1.6.0 (Windows 7), Плата”Arduino Uno”

        sketch_mar05f.ino:7:86: fatal error: VirtualWire: No such file or directory
        compilation terminated.
        Ошибка компиляции.

        This report would have more information with
        “Отображать вывод во время компиляции”
        enabled in File > Preferences.

      2. Константин

        Да, дело было в библиотеке, она коряво встала (((
        А можно сделать так?
        Чтобы при замыкании копки передатчик передавал сигнал, на приемнике замыкается светодиод. ( тоже самое что с реле ) , но что бы после повторного нажатия ( то есть отключение передачи ) загорелся другой светодиод . Заранее спасибо за информацию )))

        1. Можно создать переменную-счетчик для подсчета нажатий на кнопку. Нужно будет прописать условие для каждого такого номера нажатия. Тогда arduino будет знать номер нажатия и что при нем соответственно делать. Как то так, если я Вас правильно понял.. 🙂

  2. Хотел взять к своему Bluno этот комплект, но не уверен справится ли он с основной задачей, а именно – управление радиоуправляемых розетками (также 433Мгц, куплены в Эпицентре)). Таковых хватает по всей квартире, но управляется они с пульта, п задача стоит сделать управление более универсальным…..
    Буду благодарен за подсказку.

    1. dmitriytmiofeyev

      справится на ура, у меня gsm сигнализация и датчики с новой линии 433 как считывание так и клонирование и пульта и датчиков работает. да цена 50 грн

  3. Спасибо за интересную публикацию!
    Тоже купил такие модули на 433.92Mhz на AliExpress, а как подключать не знаю.

    Вопрос – получается, что любой передающий модуль может управлять модулем приемника, если передаст в пространство рядом строку “on” или “off”?

    То есть, для персонализации пары приемник-передатчик нужно задавать что-то уникальное, вроде: “if (message == “on1234567″)”, “if (message = “off_SJKFbiuj378″)”, правильно?

    Спасибо!

  4. ммммvdvalвалмм

    Будьте любезны .код приемника допишите..обрывается void loop()
    {
    if (vw_get_message(message, &messageLength)) // Non-blocking

    {
    Serial.print(“Received: “);
    for (int i = 0; i < messageLength; i++) { char c = message[i]; Serial.print

Оставьте комментарий

Your email address will not be published. Required fields are marked *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.