Прийом сигналу від кількох передавачів 433МГц на Arduino
Нещодавно купив кілька передавачів на 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] != ' ') після того, як ми визначили, з якого датчика прийшла інформація.
Фото приймача:
По суті приймач має три задіяні виходи плюс, земля і дані, але чомусь зробили два пини, що виводять дані.
Прикреплені файли:
- priem.ino (2 Кб)
- send_delay1.ino (1 Кб)
- send_delay2.ino (1 Кб)