11.4. Беспроводной дверной звонок

Беспроводная связь между двумя платами Arduino имеет много практических применений. На основе нескольких плат Arduino можно построить сеть датчиков, передавать команды для радиоуправляемого автомобиля или осуществлять удалеый мониторинг. В этом примере с помощью двух плат Arduino, снабженных модулями ХВее, создадим беспроводной звонок для дома, квартиры или офиса. Плата Arduino, встроенная в дверь, будет реагировать на нажатие наружной кнопки звонка. Когда кто-нибудь позвонит в дверь, другая плата Arduino включит световой или звуковой сигнал, чтобы сообщить, что к вам пришел посетитель.

ПРИМЕЧАНИЕ

Возможно, прежде чем создавать проект, вы захотите посмотреть видеоклип, демонстрирующий действие системы, доступный на странице

http://www.exploringarduino.com/content/ch11.

11.4.1. Разработка системы

Система будет состоять из двух плат Arduino. На каждой плате дополнительно установлен переходник с модулем ХВее. Одну плату Arduino можно разместить за пределами дома или квартиры, рядом с кнопкой. Другая плата может находиться в любом месте внутри помещения, чтобы уведомить вас, что кто-то звонит в дверь.

Дальность действия зависит от типа ХВее-модулей, от количества стен между модулями и других факторов окружающей среды.

Просто подать звук - это скучно, наша плата Arduino будет мигать разноцветными огнями и издавать разнообразные звуки, чтобы привлечь внимание. Вы можете придумать собственные звуковые эффекты. Описанная в данном примере система будет кнопочной, но можно заменить кнопку инфракрасным датчиком, фотодатчиком или датчиком присутствия, которые автоматически определят, что к двери ктото приближается.

Общая структура системы показана на рис. 11.19. Сверяясь с этим рисунком, будет проще разработать каждый из блоков.

- 244 -

Рис. 11.19. Структура системы беспроводного звонка

11.4.2. Оборудование для передатчика

Начнем с передатчика. Вам нужно подключить кнопку с резистором к цифровому входу платы Arduino с установленным на ней переходником с модулем ХВее (рис. 11.20).

Тип платы Arduino не имеет принципиального значения, но важно отметить, что последовательное соединение на плате Leonardo будет работать по-другому, нежели на Uno. На платах Uno и Micro один и тот же процессор управляет последовательным обменом и выполняет программу, а на Leonardo и Mega для этих целей

Рис. 11.20. Схема подключения передатчика беспроводного дверного замка

- 245 -

предусмотрены отдельные процессоры. Чтобы продемонстрировать эти различия, я выбрал для передатчика плату Leonardo. Схема для любой платы одна и та же.

Программные различия рассмотрим далее.

Поскольку передатчик будет удален от компьютера, выберите один из описанных ранее вариантов автономного питания платы. В демонстрационном видеоуроке я питал плату Arduino от 9-вольтовой батареи. Возможно, вы захотите использовать сетевой адаптер.

Совет

Чтобы посетителям было удобно, рекомендую взять большую кнопку звонка, протянув провода через стену к плате Arduino.

11.4.3. Оборудование для приемника

Далее соберем приемник, который будет оповещать нас о нажатии кнопки на передатчике. Он тоже состоит из платы Arduino с переходником и модулем ХВее, RGB-светодиода, резисторов и небольшого пьезоизлучателя. Соберите схему по рис. 11.21. Обратите внимание, что в программе будет задействован только красный и зеленый цвет, поэтому подключение резистора к выводу В (синий) RGB-светодиода не требуется. Последовательно с пьезоэлементом можно установить потенциометр для управления громкостью звукового сигнала.

Рис. 11.21. Схема подключения приемника беспроводного дверного замка

- 246 -

Теперь необходимо выбрать тип платы Arduino и способ питания приемника. Я использовал плату Uno, подключенную к сетевому USB-адаптеру. Подойдет также батарея или USB-кабель, соединенный с компьютером. Функциональность приемника можно расширить, добавив светодиоды или компьютерное Processing-приложение.

11.4.4. Программа для передатчика

Оборудование настроено, теперь необходимо написать программы для приемника и передатчика. Для реализации этой схемы связи есть много вариантов, далее будет описан только один из них.

Передатчик отправляет данные каждые 50 мс. Передается значение о, если кнопка отпущена, и 1, если нажата. Проверку на дребезг не проводим. Пьезоизлучатель будет издавать сигнал все время, пока кнопка нажата.

Код программы зависит от того, какую плату Arduino вы выбрали. Как уже упоминалось, в случае Arduino Uno контакты Rx/Tx (0/1) выполняют функции как UART, так и USB. При программировании Uno или Mega необходимо удалить переходник ХВее или задать на нем требуемое положение перемычек (переключателей).

При программировании платы Leonardo (или другой платы со встроенным USB-интерфейсом) отсоединять переходник ХВее не нужно.

Код листинга 11.5 написан для Arduino Leonardo, если у вас плата Uno, то замените в коде Seriall на Serial.

Листинг 11.5. Код передатчика для беспроводного дверного замка - doorbell/transmitting_arduino

// Код передатчика 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 мс происходит опрос цифрового

- 247 -

входа и значение отправляется по беспроводному каналу. Команду digitalRead о можно разместить непосредственно внутри функции println(), поскольку выходное значение в другом месте в программе не используется.

11.4.5. Программа для приемника

Программа для приемника сложнее, чем для передатчика. Текст программы приемника, приведенный в листинге 11.6, написан для платы Arduino Uno U. В случае платы Arduino Leonardo замените в коде serial на Seriall.

В приемнике программа должна опрашивать последовательный порт для получения приходящих с передатчика данных о статусе кнопки, определять, нажата или отжата кнопка, выдавать световой и звуковой сигналы, при этом одновременно ожидая данные, приходящие в последовательный порт. Это усложняет программу, т. к. мы не можем использовать функцию delay(). При вызове функции delay() программа останавливается, пока не закончится задержка, что может привести к следующей проблеме: реакция приемника на сигнал передатчика не будет мгновенной и буфер может переполниться, т. к. передатчик будет посылать данные быстрее, чем их сможет обработать приемник.

Нам необходимо попеременно переключать красный и зеленый цвета RGB-светодиода и изменять частоту сигнала для пьезоэлемента. Реализовать задержку с помощью функции delay() мы не можем по причинам, указанным ранее. Вместо delay() применим функцию millis(), возвращающую количество миллисекунд с начала выполнения программы. Состояние светодиодов и частоту звука будем менять каждые 100 мс. Сохраняем текущее время и постоянно считываем значение millis(), пока оно не превысит предыдущее значение на 100 мс. Когда это произойдет, меняем цвет светодиода и частоту звука. Кроме того, в цикле loop() непрерывно читаем значение статуса клавиши из последовательного порта и управляем светом и звуком.

В функции setup() инициализируем подключение по последовательному порту.

Чтобы упростить работу программы, сохраняется текущее значение цвета светодиода, частоты звука и предыдущее значение, выдаваемое функцией millis().

Полный текст программы для приемника приведен в листинге 11.6. Загрузите программу на плату Arduino, не забыв перед этим переключить перемычки на переходнике ХВее (или отсоединить его).

Листинг 11.6. Программа для приемника беспроводного дверного замка - doorbell/receiving_arduino

// Код приемника беспроводного дверного замка

const int RED=11;

// Выход 11 - красный контакт RGB-светодиода

const int GREEN =10; // Выход 10 - зеленый контакт RGB-светодиода

const int SPEAKER =8; // Выход 8 подключения пьезоизлучателя

char data;

int onLED = GREEN;

- 248 -

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();

- 249 -

// Кнопка нажата - включаем звук и свет

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.

ПРИМЕЧАНИЕ

Посмотреть видеоурок, демонстрирующий работу беспроводного звонка, можно на странице http://www.exploringarduino.com/content/ch11. Этот видеофайл доступен также на сайте издательства Wiley.

Резюме

В этой главе вы узнали следующее:

• Что выпускается множество разновидностей модулей ХВее.

• Что для использования радиомодулей ХВее с большинством плат Arduino необходимо конвертировать логические уровни с 5 до 3,3 В.

• Как настроить модули ХВее из программы X-CTU (для ОС Windows) или с помощью терминала (для операционных систем Linux и Mac).

• Как организовать автономное питание платы Arduino.

• Как установить беспроводную связь между компьютером и платой Arduino с помощью модулей ХВее.

• Как с помощью модулей ХВее организовать беспроводную связь между двумя платами Arduino.

• Как реализовать временную задержку с помощью функции millis().

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК