Мигаем светодиодом без delay()

Arduino
Автор темы, Сержант
Сержант
Аватара
Arduino
Автор темы, Сержант
Сержант
Сообщения: 64
Зарегистрирован: 19 апреля 2017
С нами: 6 лет 11 месяцев

#1 Arduino » 2 декабря 2017, 18:40

Мы уже рассматривали пример того, как можно мигать светодиодом, в том примере мы использовали функцию delay(). Главный недостаток такого подхода заключается в том, что во время выполнения delay() программа "замораживается" и не может выполнять других действий. В реальных задачах нам обычно требуется, чтобы программа не только мигала светодиодом, но и выполняла другие полезные действия и не пропустила нажатие кнопки, например. В этом примере мы обойдемся без delay, программа будет запоминать время когда был включен или выключен светодиод и в каждом цикле loop() будет проверять не прошло ли достаточно времени для переключения светодиода.
Необходимые компоненты

Arduino контроллер
Светодиод
резистор 220 Ом

Подключение

Подключение, точно такое же как и в примере мигания с помощью delay()
Мигаем светодиодом без delay().jpg
Мигаем светодиодом без delay()
Мигаем светодиодом без delay().jpg (52.8 КБ) 1279 просмотров

Во многих контроллерах Arduino есть встроенный светодиод, подключенный к порту 13.
светодиод, подключенный к порту 13.jpg
светодиод, подключенный к порту 13
светодиод, подключенный к порту 13.jpg (26.95 КБ) 1279 просмотров

В коде ниже используется функция 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);
  }
}


Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 3 гостя