Главная » Arduino
Призовой фонд
на июль 2017 г.
1. Осциллограф DSO138
Паяльник
2. Регулируемый паяльник 60 Вт
Паяльник
3. 200 руб.
От пользователей

Прием сигнала от нескольких передатчиков 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

Raspberry Pi 2
Raspberry Pi 2
Металлоискатель MD3010II Конструктор УНЧ 60 Вт на LM3886
вверх