Блог о программировании, электронике и рыбалке

Arduino – передача данных по радиоканалу на частоте 433.920 МГц

arduino 433В этой статье я постараюсь подробно описать процесс организации передачи данных между контролерами Arduino по радиоканалу с использованием передатчика MX-F01 и приемника MX-RM-5V.

Эти модули планирую использовать в своей умной метеостанции, чтобы избавиться от лишних проводов.

Для начала, давайте познакомимся с железом.

Технические характеристики передатчик MX-F01

  • Напряжение питания: 3-12 В
  • Ток потребления в режиме ожидания: 0 мА
  • Ток потребления в режиме передачи: 20-28 мА
  • Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
  • Выходная мощность передатчика: 40 мВт
  • Дальность передачи: до 500 м в зоне прямой видимости с дополнительной антенной длинной 17,5, 35 или 70 см
  • Тип модуляции: амплитудная
  • Температурный диапазон: –10…+70 °C
  • Размеры: 19х19х8 мм

arduino 433

Назначение выводов передатчика MX-F01

arduino 433

  • ATAD - данные
  • VCC - питание "+"
  • GND - питание "-"
  • ANT - антенна

Технические характеристики приемника MX-RM-5V

  • Напряжение питания: 5 В
  • Ток потребления: 4 мА
  • Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
  • Размеры: 30х14х7 мм

arduino 433

Назначение выводов приемника MX-RM-5V

arduino 433

  • GND - питание "-"
  • DATA - данные
  • VCC - питание "+"
  • ANT - антенна

Базовую информацию получили – пора приступать к практической части.

Подключение передатчика MX-F01 к Arduino

Для управления передатчиком MX-F01 я буду использовать Arduino Mega 2560.

Приступим к подключению:

  • ATAD на MX-F01 подключаем к 12 дискретному выводу Arduino Mega 2560
  • VCC на MX-F01 подключаем к +5V Arduino Mega 2560
  • GND на MX-F01 подключаем к GND Arduino Mega 2560
  • ANT на MX-F01 к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)

arduino 433

Подключение приемника MX-RM-5V к Arduino

Для управления приемником я буду использовать Arduino Nano ATmega328.

  • DATA на MX-RM-5V подключаем к 12 дискретному выводу Arduino Nano ATmega328
  • VCC на MX-RM-5Vподключаем к +5V Arduino Nano ATmega328
  • GND на MX-RM-5V подключаем к GND Arduino Nano ATmega328
  • ANT на MX-RM-5V к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)

arduino 433

Библиотека VirtualWire

Чтобы упростить написания кода для работы с радиомодулями, была создана библиотека: VirtualWire.

VirtualWire.rar (17,3 KiB, 3 139 hits)

Распакуйте содержимое архива в папку /libraries/, которая находится в каталоге среды разработки Arduino.

arduino 433

Примеры кода для работы с передатчиком MX-F01 с использованием библиотеки VirtualWire

Пример 1

Данный скетч будет отправлять раз в секунду сообщение "Hello World". Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.

#include <VirtualWire.h>

const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика

void setup()
{
vw_set_tx_pin(transmit_pin);
vw_setup(2000);       // Скорость передачи (Бит в секунду)
pinMode(led_pin, OUTPUT);
}

void loop()
{
const char *msg = "Hello World"; // Передаваемое сообщение
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
vw_wait_tx(); // Ожидаем окончания отправки сообщения
digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
delay(1000); // Пауза 1 секунда
}

Пример 2

Данный скетч будет отправлять раз в секунду сообщение, которое содержит количество миллисекунд, прошедшее с момента начала выполнения текущей программы. Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.

#include <VirtualWire.h>

const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика

void setup()
{
vw_set_tx_pin(transmit_pin);
vw_setup(2000);       // Скорость передачи (Бит в секунду)
pinMode(led_pin, OUTPUT);
}

void loop()
{
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи

String millisresult = String(millis()); // Присваиваем переменной значение, равное количеству миллисекунд с момента начала выполнения текущей программы
char msg[14];
millisresult.toCharArray(msg, 14);

vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
vw_wait_tx(); // Ожидаем окончания отправки сообщения
digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
delay(1000); // Пауза 1 секунда
}

Пример кода для работы с приемником MX-RM-5V с использованием библиотеки VirtualWire

#include <VirtualWire.h>

byte message[VW_MAX_MESSAGE_LEN]; // Буфер для хранения принимаемых данных
byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения

const int led_pin = 13; // Пин светодиода
const int receiver_pin = 12; // Пин подключения приемника

void setup()
{
Serial.begin(9600); // Скорость передачиданных
Serial.println("MX-RM-5V is ready");
vw_set_rx_pin(receiver_pin); // Пин подключения приемника

vw_setup(2000); // Скорость передачи данных (бит в секунду)
vw_rx_start(); // Активация применика
}
void loop()
{
if (vw_get_message(message, &messageLength)) // Если есть данные..
{
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета
for (int i = 0; i < messageLength; i++)
{
Serial.write(message[i]); // выводим их в одной строке
}
Serial.println();
digitalWrite(led_pin, LOW); // Гасим светодиод в конце
}
}

Результат работы

Для “Пример 1” кода передатчика

arduino 433

Для “Пример 2” кода передатчика

arduino 433

Не забудьте припаять антенны, а то без них дальность передачи будет всего несколько сантиметров.

На этом пока все.

P.S.

Частота 433.920 МГц выделена для работы маломощных цифровых передатчиков таких как: радиобрелки автосигнализаций, брелки управления шлагбаумами на стоянках и другие подобные системы.

Свои вопросы оставляйте в комментариях или задавайте их в нашей группе в Телеграм

Geek Electronics
  • keyboard_arrow_downArduino – передача данных по радиоканалу на частоте 433.920 МГц
    • Автор:
    • Миниатюра: Arduino – передача данных по радиоканалу на частоте 433.920 МГц
    • Рубрика: Arduino от А до Я
    • Обновлено: 06.02.2018
    • Комментариев: 5
    • Просмотров: 45 931
      • searchПоисковые боты
        Дата Бот
        2018-09-19 21:51:11 Yandex
        2018-09-19 21:26:26 Yandex
        2018-09-19 15:21:12 Bing
        2018-09-19 07:31:02 Google
        2018-09-17 21:06:36 Google
        2018-09-17 17:47:18 Yandex
        2018-09-16 16:45:36 Yandex
        2018-09-14 19:33:01 Bing
        2018-09-14 17:52:14 Google
        2018-09-14 14:10:01 Google
  • Оцените пожалуйста статью
    1 Star2 Stars3 Stars4 Stars5 Stars
    Loading Загрузка...
  • Поделитесь с друзьями
GeekElectronics

Похожие записи

Комментариев: 5

  • Avatar for source
    nikolay:

    Для “Пример 2” кода передатчика
    у меня происходит странное явление. После увеличения разрядности счетчика (было 99ххх стало 100ххх) число полученных знаков остается старым (в нашем примере 5) и младший разряд не получается.
    После перезагрузки приемника начинаем принимать 6 разрядов но при следующем увеличении разрядности история повторяется.
    Хуже дело обстоит с перезагрузкой передатчика. Приемник принимает только 1 знак (думаю это связано с тем что время после включения =0 и первый раз передается только 1 знак)

    Далее к передаче прибавляю текст и в начало и в конец. Получаю строку "HI 99123 LO". Проблема сохраняется - при увеличении длины переданной строки начинает резать последний символ.....

  • Avatar for source
    nikolay:

    Нашел ошибку
    void loop()
    {
    if (vw_get_message(message, &messageLength)) // Если есть данные..

    messageLength получает длину полученной строки. а в следующем цикле мы ее передаем как размер буфера (размер message) . в начале цикла надо заново инициализировать эту переменную
    messageLength = VW_MAX_MESSAGE_LEN;

  • Avatar for source
    Виктор:

    А можно как то без использования Arduino передать сигнал на приемник что бы при этом на приемнике светился светодиод?

    • Avatar for source
      source™:

      К сожалению, без дополнительного контроллера не получится.

  • Avatar for source
    Александр Д.:

    Большое спасибо за статью. Все получилось. Дополнительно отправил дату и время с DS3231. Работает!!! Хочу сделать контроль температуры и влажности подвала гаража и приделать датчик движения. Нужно передавать не стринг а данные в цифра, чтобы вести лог с записью на SD.

Добавить комментарий

arrow_upward