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

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

В функции 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 Ом;

• электролитический конденсатор 10 мкФ;

• микросхема 74НС14 (шесть инверторов с триггерами Шмитта);

• набор перемычек;

• 2 макетные платы.

Электронные ресурсы к главе

На странице http://www.exploringarduino.com/content/ch12 можно загрузить программный код, видеоуроки и другие материалы для данной главы. Кроме того, листинги примеров можно скачать со страницы www.wiley.com/go/exploringarduino в разделе Downloads.

Что вы узнаете в этой главе

Все предыдущие программы работали в синхронном режиме. В связи с этим возникали проблемы, например, выполнение команды delay() останавливает программу на некоторое время и не дает возможности Arduino осуществлять другие действия.

В главе 1 мы создали программный таймер, использующий функцию millis(), что

- 254 -

позволило избежать временного блокирования платы Arduino функцией delay().

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