ESP32:Примеры/Моргание светодиодом при помощи функции millis()

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Моргание светодиодом при помощи функции millis()

В данном примере демонстрируется возможность мигания светодиодом при помощи функции millis().

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

В других примерах вы могли видеть функцию delay(), которая работала очень просто. Ее единственным параметром служит целочисленное значение (int) – в нем задается количество миллисекунд, которые программа будет ждать до перехода к следующей строчке кода.

delay(время_в_миллисекундах)

Например, если вписать в код delay(1000), программа затормозит на этой строчке на 1 секунду.

То есть функция delay() – это блокирующая функция. Блокирующие функции не дают программе делать что-либо до того, пока не будет выполнена некоторая задача. Если вы хотите, чтобы ваш код одновременно выполнял несколько задач, функцию delay() использовать нельзя.

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

Функция millis() возвращает количество миллисекунд, прошедших с момента запуска программы.

millis()

Что делает эту функцию полезной? Проделав некоторые несложные расчеты, вы можете легко проверить, сколько времени прошло, не блокируя при этом весь код.

Скопируйте код из раздела снизу в IDE Arduino и запустите его.

Теперь давайте поближе взглянем на этот скетч, где вместо delay() используется функция millis(). По сути, этот код вычитает записанное ранее время (previousMillis) из текущего времени (currentMillis). Если получившийся остаток больше интервала (в нашем случае он равен 5000 миллисекунд), программа обновляет переменную «previousMillis» до текущего времени, а затем либо включает, либо выключает светодиод.

Поскольку этот фрагмент не является блокирующим, код, находящийся за пределами оператора if(), должен работать нормально.

То есть, вы можете добавить в блок loop() другие задачи, но это не помешает вашему коду по-прежнему мигать светодиодом раз в секунду.

Необходимое оборудование

Схема

Примечание

На этой схеме показана 30-контактная версия ESP32 DEVKIT V1 DOIT. Если вы используете другую модель, обязательно сверьтесь с ее распиновкой

Код

// константы – это неизменяемые значения;
// здесь мы используем их, чтобы задать номер контакта:
const int ledPin =  23;  // номер контакта светодиода

const long interval = 5000;  // интервал включения 
                             // и выключения светодиода 
                             // (в миллисекундах)

// переменные – это изменяемые значения;
// здесь мы используем переменную «ledState»,
// чтобы задать состояние контакта светодиода:
int ledState = LOW;      // состояние контакта светодиода

// как правило, для переменных, хранящих время, 
// следует использовать тип данных «unsigned long»;
// значение в этой переменной быстро станет очень большим,
// поэтому тип данных «int» для него не подойдет:
unsigned long previousMillis = 0;  // здесь хранится время того,
                                   // когда состояние контакта
                                   // светодиода поменялось 
                                   // в последний раз 
unsigned long currentMillis = 0;   // здесь хранится текущее время выполнения программы

void setup() {
  // делаем цифровой контакт «ledPin» выходным:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // в блоке loop() пишется код, который будет выполняться постоянно 

  // здесь мы проверяем, настало ли время моргать светодиодом;
  // или, если более развернуто, проверяем, какова разница
  // между текущим временем и временем, когда мы моргнули светодиодом
  // в последний раз, и больше ли она интервала моргания светодиодом

  currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохраняем время, когда мы 
    // в последний раз моргнули светодиодом:
    previousMillis = currentMillis;

    // если светодиод, выключен, включаем его, и наоборот:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // задаем состояние светодиода с помощью значения «ledState»:
    digitalWrite(ledPin, ledState);
  }
}

См.также

Внешние ссылки