Мигаем светодиодом без delay()
Мы уже рассматривали пример того, как можно мигать светодиодом, в том примере мы использовали функцию delay(). Главный недостаток такого подхода заключается в том, что во время выполнения delay() программа "замораживается" и не может выполнять других действий. В реальных задачах нам обычно требуется, чтобы программа не только мигала светодиодом, но и выполняла другие полезные действия и не пропустила нажатие кнопки, например. В этом примере мы обойдемся без delay, программа будет запоминать время когда был включен или выключен светодиод и в каждом цикле loop() будет проверять не прошло ли достаточно времени для переключения светодиода.
Необходимые компоненты
- Arduino контроллер
- Светодиод
- резистор 220 Ом
Подключение
Подключение, точно такое же как и в примере мигания с помощью delay()
Во многих контроллерах Arduino есть встроенный светодиод, подключенный к порту 13.
Схема
Код
В коде ниже используется функция millis(), возвращающая количество милисекунд с момента начала работы текущей программы на Arduino.
/* Blink without Delay 2005 by David A. Mellis modified 8 Feb 2010 by Paul Stoffregen */ const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState == LOW) ledState = HIGH; else ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } }