Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В функции 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, выполнить код прерывания, а затем вернуться к прерванной задаче. Далее мы узнаем, как осуществить прерывания по времени и при изменении состояния контактов. На основе этих знаний мы построим систему аппаратных прерываний и напишем программу, использующую прерывания таймера.
ПРИМЕЧАНИЕ
Видеоурок по прерываниям и аппаратному устранению дребезга можно посмотреть на странице
http://www.jeremyblum.com/2011103/07/arduino-tutorial-10-interrupts-and1hardware-debouncing [15] На русском: http://wiki.amperka.ru/видеоуроки:10-прерывания-и-аппаратная-стабилизация.
. Найти данный видеофайл можно и на странице издательства Wiley.
12.1. Использование аппаратных прерываний
Аппаратные прерывания происходят при наступлении (или изменении) заданного состояния на входах-выходах. Аппаратное прерывание полезно, например, когда нужно изменить значение переменной, не проверяя непрерывно состояние кнопки.
Ранее мы устраняли дребезг путем опроса состояния кнопки в цикле. Этот прием отлично работает, если время выполнения остальной части программы невелико.
Но предположим, вы устраняете дребезг в цикле, выполнение которого занимает значительное время. Например, в основном цикле программы изменяется яркость

Рис. 12.1. Влияние внешнего прерывания на ход выполнения программы
- 255 -
светодиода или скорость двигателя с помощью оператора for() с некоторой задержкой delay(). Возникает опасность пропустить нажатие кнопки, которое происходит в момент выполнения главной программы. Вот здесь и приходят на помощь прерывания. Определенные контакты на плате Arduino могут вызывать внешние аппаратные прерывания. Вы выполняете главную программу, и при возникновении внешнего прерывания запускается специальная процедура его обработки (рис. 12.1), причем прерывание может наступить в любом месте программы.
Читать дальшеИнтервал:
Закладка: