Недавно купил несколько передатчиков на 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 Кб)
Комментарии (3) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Например вкл/выкл лампочку?