Нам необходимо попеременно переключать красный и зеленый цвета 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().
Часть IV. Дополнительные темы и проекты
В этой части
Глава 12. Аппаратные прерывания и прерывания по таймеру
Глава 13. Обмен данными с картами памяти SD
Глава 14. Подключение Arduino к Интернету
Глава 12. Аппаратные прерывания и прерывания по таймеру
Список деталей
Для повторения примеров главы вам понадобятся следующие детали:
• плата Arduino (рекомендуется Uno );
• USB-кабель для программирования платы Arduino;
• кнопка;
• пьезозуммер;
• RGB-светодиод с общим катодом;
• 1 резистор номиналом 10 кОм;
• 1 резистор номиналом 100 Ом;
• 1 резистор номиналом 150 Ом;
• 3 резистора номиналом 220 Ом;
Читать дальше