Пишем программный код без использования задержек на микроконтроллере ESP8266 в среде программирования Arduino IDE. 

В данном уроке мы рассмотрим алгоритм который позволяет выполнять программный код в котором необходимо использовать задержки без задержек,  которые в пустую используют ресурсы микроконтроллера.

В нашем случаи будут мигать три светодиода  которые будут эмитировать некий программный код который должен запускаться с пузами в  0,5  2 и 4 секунды. Так же у нас будет кнопка, при нажатии которой у нас будет включаться/выключаться четвертый светодиод.

Светодиоды подключим к ножкам D1, D2, D3, кнопка к ножке D7, светодиод который будет включаться/выключаться по нажатию кнопки к D4:

Для реализации данной возможности будем использовать функцию millis(), которая возвращает количество миллисекунд с момента включения. Максимальное число до которого может досчитать данная функция 4294967295 мс, что примерно ровняется 50 суткам, после чего значение функции сбрасывается и счет начинается заново.

Суть данного алгоритма в том, что на момент когда нам нужно организовать выполнения определенного кода с задержкой, мы запоминаем текущее значение функции millis(), и это значение отнимаем от текущего значения функции millis(), и как только разница достигнет заданного  значения паузы в миллисекундах —  мы выполняем нужный нам код.

Программный код:

#define HL1 D1 //GPIO5
#define HL2 D2//GPIO4
#define HL3 D3//GPIO0
#define HL4 D4//GPIO2
#define button D7//GPIO13 int b=0;
unsigned long previousMillis_1 = 0;
unsigned long previousMillis_2 = 0;
unsigned long previousMillis_3 = 0;

const long
interval_1 = 500;
const long interval_2 = 2000;
const long interval_3 = 4000;

int ledState_1=LOW;
int ledState_2=LOW;
int ledState_3=LOW;

void setup() {
pinMode(HL1, OUTPUT);
pinMode(HL2, OUTPUT);
pinMode(HL3, OUTPUT);
//настраиваем ножки на вход pinMode(button, INPUT_PULLUP);
}

void loop() {
unsigned long currentMillis = millis();
if(digitalRead(button)==0) { if(b==1)b=0; else b=1; digitalWrite(HL4, b); }
if (currentMillis-previousMillis_1>= interval_1) {
previousMillis_1 = currentMillis;
if (ledState_1 == LOW) {
ledState_1 = HIGH;
} else {
ledState_1 = LOW;
}
digitalWrite(HL1, ledState_1);
}

if (currentMillis-previousMillis_2 >= interval_2) {
previousMillis_2 = currentMillis;
if (ledState_2 == LOW) {
ledState_2 = HIGH;
} else {
ledState_2 = LOW;
}
digitalWrite(HL2, ledState_2);
}
if ((currentMillis-previousMillis_3) >= interval_3) {
previousMillis_3 = currentMillis;
if (ledState_3 == LOW) {
ledState_3 = HIGH;
} else {
ledState_3 = LOW;
}
digitalWrite(HL3, ledState_3);
}
}