Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Прием сигнала от нескольких передатчиков 433МГц на Arduino

Недавно купил несколько передатчиков на 433МГц и появилась необходимость принимать информацию от двух передатчиков. 

Передатчик,приемник 433МГц

На приемники/передатчики нужно припаять антенну для более стабильной работы. Я использовал обычный жесткий провод длиной 17 см предварительно сделав его в виде пружины. 

Так как у меня было в наличии всего две ардуины, в качестве третьего передатчика я решил запрограммировать Atmega328. Получился вот такой передатчик:

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

В качестве еще передатчика использовал Arduino Nano:

Эти передатчики, в отличии от первого, передают просто числа 22 и 11.

Схема подключения очень проста:

Vcc к +5, GND к -5В а шина данных  ADATA к D12 пину ардуины.

Код передатчика:

#include 
#include "LowPower.h"
void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
}

void loop(void)
{
  //Прерывание на 8 сек, написано так в мануале а на самом деле на 22сек
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
                
  int number = 22;
  char symbol = 'b';
  
  String strMsg = "f ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";
  
  char msg[255];
  
  strMsg.toCharArray(msg, 255);
  
  Serial.println(msg);
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(300);
}

Здесь используется две библиотеки VirtualWire и LowPower. (внизу статьи ссылки на библиотеки) Первая библиотека отвечает за передачу данных а вторая экономит потребление энергии.

Строка: 

LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);

понижает энергопотребление на 8сек(так сказано в даташите библиотеки), на самом деле мк не работает порядка 23сек. Ниже идет код формирования и передачи пакета информации в эфир, рассмотрим подробнее.

Переменная strMsg содержит в себе строку которую мы будем передавать. Мы передаем вот такую строку: f_b_22_ (нижнее подчеркивание символизирует пробел).

Код другого передатчика:

#include 
#include "LowPower.h"
void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
}

void loop(void)
{
  //Прерывание на 8 сек, написано так в мануале а на самом деле на 22сек
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
                
  int number = 11;
  char symbol = 'a';
  
  String strMsg = "z ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";
  
  char msg[255];
  
  strMsg.toCharArray(msg, 255);
  
  Serial.println(msg);
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(200);
}

Отличие программ в том что в первой код передатчика символ "z" а во втором "f" и еще главная особенность в том что программы работают с разными задержками, сначала одна вещает в эфир информацию а потом другая, что предотвращяет накладывания сигналов друг на друга.

Дальше рассмотрим код приемного устройства:

#include 

void setup()
{
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера
  if (vw_get_message(buf, &buflen))  {
    int i;
    int j;
    if (buf[0] == 'z') {
      i = 4;
      int number = 0;
      while (buf[i] != ' ')  {
        number *= 10;
        number += buf[i] - '0';
        i++;
      }
     Serial.print("1-  ");
     Serial.println(number); 
    }
    else  {
       if (buf[0] == 'f')  {
          j = 4;
      int number2 = 0;
      while (buf[j] != ' ')  {
        number2 *= 10;
        number2 += buf[j] - '0';
        j++;
      }
     Serial.print("2-  ");
     Serial.println(number2);
       }
    }


  }
}

Прием и обработка осуществляется в цикле while (buf[i] != ' ') после того как мы определили от какого датчика пришла информация.

Фото приемника:

По сути приемник имеет три задействованных выхода плюс, земля и данные но почему-то сделали два пина выводящих данные.

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (3) | Я собрал (0) | Подписаться

0
Denis.Mikhailov #
Сылок нету на библы
Ответить
0
UD #
А можно ли использовать пару передатчик-приемник автономно, без Arduino?
Например вкл/выкл лампочку?
Ответить
0
UD #
Из эл.схем пары понял как
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Программатор Pickit3 200 Вт усилитель класса D на IRS2092
вверх