Изучаем Arduino: инструметы и методы технического волшебства - [62]

Шрифт
Интервал

Начнем с передатчика. Вам нужно подключить кнопку с резистором к цифровому входу платы 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() непрерывно читаем значение статуса клавиши из последовательного порта и управляем светом и звуком.