Прийом сигналу від кількох передавачів 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] != ' ') після того, як ми визначили, з якого датчика прийшла інформація.

Фото приймача:

По суті приймач має три задіяні виходи плюс, земля і дані, але чомусь зробили два пини, що виводять дані.

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

Top