Беспроводная связь между двумя платами Arduino имеет много практических применений. На основе нескольких плат Arduino можно построить сеть датчиков, передавать команды для радиоуправляемого автомобиля или осуществлять удалеый мониторинг. В этом примере с помощью двух плат Arduino, снабженных модулями ХВее, создадим беспроводной звонок для дома, квартиры или офиса. Плата Arduino, встроенная в дверь, будет реагировать на нажатие наружной кнопки звонка. Когда кто-нибудь позвонит в дверь, другая плата Arduino включит световой или звуковой сигнал, чтобы сообщить, что к вам пришел посетитель.
Система будет состоять из двух плат Arduino. На каждой плате дополнительно установлен переходник с модулем ХВее. Одну плату Arduino можно разместить за пределами дома или квартиры, рядом с кнопкой. Другая плата может находиться в любом месте внутри помещения, чтобы уведомить вас, что кто-то звонит в дверь.
Дальность действия зависит от типа ХВее-модулей, от количества стен между модулями и других факторов окружающей среды.
Просто подать звук - это скучно, наша плата Arduino будет мигать разноцветными огнями и издавать разнообразные звуки, чтобы привлечь внимание. Вы можете придумать собственные звуковые эффекты. Описанная в данном примере система будет кнопочной, но можно заменить кнопку инфракрасным датчиком, фотодатчиком или датчиком присутствия, которые автоматически определят, что к двери ктото приближается.
Общая структура системы показана на рисунке. Сверяясь с этим рисунком, будет проще разработать каждый из блоков.
Начнем с передатчика. Вам нужно подключить кнопку с резистором к цифровому входу платы Arduino с установленным на ней переходником с модулем ХВее.
Тип платы Arduino не имеет принципиального значения, но важно отметить, что последовательное соединение на плате Leonardo будет работать по-другому, нежели на Uno. На платах Uno и Micro один и тот же процессор управляет последовательным обменом и выполняет программу, а на Leonardo и Mega для этих целей предусмотрены отдельные процессоры.
Оборудование для приемника
Далее соберем приемник, который будет оповещать нас о нажатии кнопки на передатчике. Он тоже состоит из платы Arduino с переходником и модулем ХВее, RGB-светодиода, резисторов и небольшого пьезоизлучателя. Соберите схему по рисунку. Обратите внимание, что в программе будет задействован только красный и зеленый цвет, поэтому подключение резистора к выводу В (синий) RGB-светодиода не требуется. Последовательно с пьезоэлементом можно установить потенциометр для управления громкостью звукового сигнала.
Теперь необходимо выбрать тип платы Arduino и способ питания приемника. Подойдет также батарея или USB-кабель, соединенный с компьютером. Функциональность приемника можно расширить, добавив светодиоды или компьютерное Processing-приложение.
Оборудование настроено, теперь необходимо написать программы для приемника и передатчика. Для реализации этой схемы связи есть много вариантов, далее будет описан только один из них.
Передатчик отправляет данные каждые 50 мс. Передается значение о, если кнопка отпущена, и 1, если нажата. Проверку на дребезг не проводим. Пьезоизлучатель будет издавать сигнал все время, пока кнопка нажата.
Код программы зависит от того, какую плату Arduino вы выбрали. Как уже упоминалось, в случае Arduino Uno контакты Rx/Tx (0/1) выполняют функции как UART, так и USB. При программировании Uno или Mega необходимо удалить переходник ХВее или задать на нем требуемое положение перемычек (переключателей).
При программировании платы Leonardo (или другой платы со встроенным USB-интерфейсом) отсоединять переходник ХВее не нужно.
Код листинга написан для Arduino Leonardo, если у вас плата Uno, то замените в коде Seriall на Serial.
Листинг - Код передатчика для беспроводного дверного замка
// Код передатчика Arduino для беспроводного дверного замка
const int BUTTON =12; // Вывод кнопки к контакту 12
void setup()
{
//Для платы Leonardo выводы Rx/Tx
//не мультиплексированы с USB r
//Код для Leonardo (Seriall = RX/TX)
// Для UNO измените Seriall на Serial
Seriall.begin(9600);
}
void loop()
{
Seriall.println(digitalRead(BUTTON)); // Отправка статуса кнопки
// Небольшая задержка
delay(50);
}
В функции setup() последовательный порт подключается к модулю ХВее и начинает работать со скоростью 9600 бод. Каждые 50 мс происходит опрос цифрового входа и значение отправляется по беспроводному каналу. Команду digitalRead о можно разместить непосредственно внутри функции println(), поскольку выходное значение в другом месте в программе не используется.
Программа для приемника сложнее, чем для передатчика. Текст программы приемника, приведенный в листинге 11.6, написан для платы Arduino Uno U. В случае платы Arduino Leonardo замените в коде serial на Seriall.
В приемнике программа должна опрашивать последовательный порт для получения приходящих с передатчика данных о статусе кнопки, определять, нажата или отжата кнопка, выдавать световой и звуковой сигналы, при этом одновременно ожидая данные, приходящие в последовательный порт. Это усложняет программу, т. к. мы не можем использовать функцию delay(). При вызове функции delay() программа останавливается, пока не закончится задержка, что может привести к следующей проблеме: реакция приемника на сигнал передатчика не будет мгновенной и буфер может переполниться, т. к. передатчик будет посылать данные быстрее, чем их сможет обработать приемник.
Нам необходимо попеременно переключать красный и зеленый цвета RGB-светодиода и изменять частоту сигнала для пьезоэлемента. Реализовать задержку с помощью функции delay() мы не можем по причинам, указанным ранее. Вместо delay() применим функцию millis(), возвращающую количество миллисекунд с начала выполнения программы. Состояние светодиодов и частоту звука будем менять каждые 100 мс. Сохраняем текущее время и постоянно считываем значение millis(), пока оно не превысит предыдущее значение на 100 мс. Когда это произойдет, меняем цвет светодиода и частоту звука. Кроме того, в цикле loop() непрерывно читаем значение статуса клавиши из последовательного порта и управляем светом и звуком.
В функции setup() инициализируем подключение по последовательному порту.
Чтобы упростить работу программы, сохраняется текущее значение цвета светодиода, частоты звука и предыдущее значение, выдаваемое функцией millis().
Полный текст программы для приемника приведен в листинге. Загрузите программу на плату Arduino, не забыв перед этим переключить перемычки на переходнике ХВее (или отсоединить его).
Листинг - Программа для приемника беспроводного дверного замка
// Код приемника беспроводного дверного замка
const int RED=11;
// Выход 11 - красный контакт RGB-светодиода
const int GREEN =10; // Выход 10 - зеленый контакт RGB-светодиода
const int SPEAKER =8; // Выход 8 подключения пьезоизлучателя
char data;
int onLED = GREEN;
int offLED = RED;
int freq = 131;
unsigned long prev_time = 0;
// Таймер для переключения цвета светодиода
// и частоты звука
void setup()
{
Serial.begin(9600);
}
void loop()
{
// Для переключения звука и цвета светодиода
// прошло 100 мс?
if (millis() >= prev_time + 100)
// Переключение светодиода
if (onLED == GREEN)
{
onLED = RED;
offLED = GREEN;
}
else
{
onLED = GREEN;
offLED = RED;
}
// Переключение частоты звука
if ( freq == 261)
{
freq =131;
}
else
{
freq=261;
}
// Корректировка времени для переключения
// Текущее время становится предыдущим
prev_time = millis();
// Проверить наличие данных из последовательного порта
if (Serial.available() > 0)
{
// Чтение байта данных
data = Serial.read();
// Кнопка нажата - включаем звук и свет
if (data == '1')
{
digitalWrite(onLED, HIGH);
digitalWrite(offLED, LOW);
tone(SPEAKER, freq);
}
// Кнопка отпущена - выключаем звук и свет
else if (data == '0')
{
digitalWrite(onLED, LOW);
digitalWrite(offLED, LOW);
noTone(SPEAKER);
}
}
}
Первый оператор if() в основном цикле программы loop() проверяет время, прошедшее с последнего момента установки переменной prev_time. Если прошло более 100 мс, то значения переменных текущего состояния цвета светодиода и частоты звука меняются, в результате получается чередование сигналов.
Второй оператор if() в цикле loop() проверяет наличие и значение входящих последовательных данных. Если приходит 0, свет и звук выключаются, если 1 - цвет и частота звука выставляются в соответствии со значениями переменных onLed, offLed, freq.