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

В данной статье мы рассмотрим работу Arduino с 433 МГц радиопередатчиком и приемником (рисунок 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 комментариев

  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. справится на ура, у меня gsm сигнализация и датчики с новой линии 433 как считывание так и клонирование и пульта и датчиков работает. да цена 50 грн

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

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

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

    Спасибо!

  4. Будьте любезны .код приемника допишите..обрывается 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

Оставить ответ

Обязательные поля помечены*

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