В данном уроке мы рассмотрим алгоритм который позволяет выполнять программный код в котором необходимо использовать задержки без задержек, которые в пустую используют ресурсы микроконтроллера.
В нашем случаи будут мигать три светодиода которые будут эмитировать некий программный код который должен запускаться с пузами в 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);
}
}