Программируем Arduino. Профессиональная работа со скетчами. - [61]
{
if (digitalRead(switchPin) == LOW)
{
flashing = ! flashing;
}
if (flashing)
{
digitalWrite(ledPin, HIGH);
delay(period);
digitalWrite(ledPin, LOW);
delay(period);
}
}
Проблема данной реализации в том, что она проверяет нажатие кнопки только после того, как завершится цикл включения/выключения светодиода. Если кнопка будет нажата во время этого цикла, факт нажатия зафиксирован не будет. Это может быть не важно для нормальной работы скетча, но если важно фиксировать каждое нажатие кнопки, следует полностью исключить любые задержки в функции loop. Фактически после перехода в режим мигания Arduino будет тратить основное время на задержки и только малую часть времени — на проверку состояния кнопки.
Пример в следующем разделе решает эту проблему.
Пауза без приостановки
Предыдущий скетч можно переписать без использования функции delay:
// sketch_14_02_flashing_2
const int ledPin = 13;
const int switchPin = 5;
const int period = 1000;
boolean flashing = false;
long lastChangeTime = 0;
int ledState = LOW;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
flashing = ! flashing;
// и выключить светодиод
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
}
long now = millis();
if (flashing && now > lastChangeTime + period)
{
ledState = ! ledState;
digitalWrite(ledPin, ledState);
lastChangeTime = now;
}
}
В этом скетче я добавил две новые переменные, lastChangeTime и ledState. Переменная lastChangeTime хранит время последнего перехода светодиода между состояниями «включено» и «выключено», а переменная ledState хранит текущее состояние светодиода — «включено» или «выключено», чтобы знать, в каком состоянии он пребывает, когда потребуется переключить его.
Теперь функция loop не выполняет задержек. В первой части loop проверяется нажатие кнопки, и, если кнопка нажата, переключается режим мигания. Дополнительная инструкция if, следующая далее, просто выключает светодиод, если нажатие кнопки вызвало выключение режима мигания. В противном случае светодиод мог бы остаться включенным:
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
Во второй части функция loop читает текущее значение счетчика миллисекунд вызовом millis() и сравнивает со значением lastChangeTime, увеличенным на значение period. То есть код внутри этой инструкции if выполняется, только если с момента последнего переключения светодиода прошло более period миллисекунд.
Затем значение переменной ledState изменяется на противоположное, и на цифровом выходе устанавливается соответствующий уровень напряжения. Потом значение now копируется в lastChangeTime, чтобы можно было определить, когда наступит момент следующего переключения.
Библиотека Timer
Решение, представленное в разделе «Пауза без приостановки», было обобщено и реализовано в виде библиотеки, позволяющей планировать выполнение повторяющихся операций с использованием функции millis. Несмотря на свое название, библиотека не использует аппаратные таймеры и потому прекрасно работает в большинстве моделей Arduino.
Получить библиотеку можно по адресу http://playground.arduino.cc//Code/Timer.
Применение библиотеки может существенно упростить код, как показано далее:
// sketch_14_03_flashing_3
#include
const int ledPin = 13;
const int switchPin = 5;
const int period = 1000;
boolean flashing = false;
int ledState = LOW;
Timer t;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
t.every(period, flashIfRequired);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
flashing = ! flashing;
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
}
t.update();
}
void flashIfRequired()
{
if (flashing)
{
ledState = ! ledState;
digitalWrite(ledPin, ledState);
}
}
Чтобы задействовать возможности библиотеки, необходимо определить объект таймера (в данном скетче он получил имя t) и в функции setup указать функцию для вызова через установленные периоды:
t.every(period, flashIfRequired);
Затем нужно добавить в функцию loop следующую строку:
t.update();
В каждом вызове функция update проверит значение millis, определит необходимость выполнения повторяющихся действий и, если пришло время для этого, вызовет указанную функцию (в данном случае flashIfRequired).
Библиотека Timer имеет также множество других вспомогательных функций. Более подробную информацию о ней можно найти, если пройти по ссылке, приведенной в начале раздела.
В заключение
В этой главе вы узнали, как организовать решение сразу нескольких задач без использования механизма потоков выполнения. Для этого достаточно рассмотреть ограничения, накладываемые микроконтроллером, под другим углом.
В заключительной главе вы узнаете, как поделиться своими разработками с сообществом Arduino, создавая и публикуя библиотеки для Arduino.
15. Создание библиотек
Рано или поздно вы создадите нечто замечательное, что, по вашему мнению, могли бы использовать другие. Это будет самый подходящий момент оформить свой код в виде библиотеки и выпустить ее в свет. Эта глава покажет вам, как это сделать.
На первый взгляд процедура удаления Windows 8 ничем не отличается от вполне обычного форматирования винчестера с последующей установкой системы. К сожалению, все гораздо сложней.
Вы приобрели нетбук? И теперь хотите понять, чем он отличается от привычного всем ноутбука? Тогда вы держите в руках действительно необходимую книгу. Прочитав ее, вы не только освоите все тонкости, относящиеся к работе с нетбуками, но и узнаете о том, как работать на компьютере. Вы научитесь выбирать мобильный компьютер и аксессуары к нему, узнаете, как установить и настроить операционную систему, научитесь пользоваться пакетом Microsoft Office, выясните, какие программы следует иметь на жестком диске, как защитить сам ноутбук и данные на нем, можно ли модернизировать нетбук и что делать в случае его поломки.
В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера.
В книге даны детальные рекомендации по выбору и покупке ноутбука. Приведены описания работы, настройки и ремонта компонентов мобильного компьютера – винчестера, карты Wi-Fi, PCMCIA, ЖК-экрана и т. д. Читатель найдет в ней подробные рекомендации по ускорению работы мобильных компьютеров с операционными системами Windows 98, Windows XP и Windows Vista, а также пути решения проблем при поломках, попадании ноутбука в воду, заражении вирусами, сбоях программ. Даны полезные советы по увеличению времени работы от батареи, настройкам, доступу в Интернет.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Жизнь современного человека — это движение. Мобильность для нас становится одним из самых важных моментов для работы, для общения, для жизни. Многие из нас сейчас уже не представляют жизнь без сотовых телефонов, которые из средства роскоши превратились в предмет, без которого жизнь современного человека стала просто немыслима. Многие уже оценили все преимущества Bluetooth, GPRS. Эти устройства превратили наши телефоны из средств связи в незаменимых помощников в работе. К сожалению, один из самых главных недостатков этих беспроводных технологий — малый радиус действия и низкая скорость передачи данных, что сейчас становится очень важным фактором для всех нас.