Задержка одного таймера на старте, светофор без "Delay"
- Войдите на сайт для отправки комментариев
Вс, 29/03/2020 - 22:30
Доброго времени суток. Пытаюсь сделать светофор без Delay, никак не могу понять как выставить задержку на самом сатарте, все уже перепробовал, ничего не помогает((
Мигают огоньки как задумано, но на старте нужно один из свеодиодов задержвать чуть на дольше. Не подскажете как это сделать?
Вот мой код.
// Эти переменные хранят временной шаблон для интервалов мигания // и текущее состояние светодиодов int ledPin1 = 11; // номер пина со светодиодом int ledState1 = HIGH; // состояние светодиода // последний момент времени, когда состояние светодиода изменялось unsigned long previousMillis1 = 0; long OnTime1 = 1000; // длительность свечения светодиода (в миллисекундах) long OffTime1 = 2000; // светодиод не горит (в миллисекундах) int ledPin2 = 12; // номер пина со светодиодом int ledState2 = HIGH; // состояние светодиода // последний момент времени, когда состояние светодиода изменялось unsigned long previousMillis2 = 0; long OnTime2 = 2000; // длительность свечения светодиода (в миллисекундах) long OffTime2 = 4000; int ledPin3 = 10; // номер пина со светодиодом int ledState3 = LOW; // светодиод не горит (в миллисекундах) unsigned long previousMillis3 = 0; long OnTime3 = 2000; // длительность свечения светодиода (в миллисекундах) long OffTime3 = 4000; // светодиод не горит (в миллисекундах) void setup() { // устанавливаем цифровой пин со светодиодом как ВЫХОД pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); } void loop() { // выясняем не настал ли момент сменить состояние светодиода unsigned long currentMillis = millis(); // текущее время в миллисекундах //ТРЕТИЙ СВЕТОДИОД if((ledState3 == HIGH) && (currentMillis - previousMillis3 >= OnTime3)) { ledState3 = LOW; // выключаем previousMillis3 = currentMillis; // запоминаем момент времени digitalWrite(ledPin3, ledState3); // реализуем новое состояние } else if ((ledState3 == LOW) && (currentMillis - previousMillis3 >= OffTime3)) { ledState3 = HIGH; // выключаем previousMillis3 = currentMillis ; // запоминаем момент времени digitalWrite(ledPin3, ledState3); // реализуем новое состояние } // конечный автомат для 1-го светодиода if((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1)) { ledState1 = LOW; // выключаем previousMillis1 = currentMillis; // запоминаем момент времени digitalWrite(ledPin1, ledState1); // реализуем новое состояние } else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1)) { ledState1 = HIGH; // выключаем previousMillis1 = currentMillis ; // запоминаем момент времени digitalWrite(ledPin1, ledState1); // реализуем новое состояние } // конечный автомат для 2-го светодиода if((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2)) { ledState2 = LOW; // выключаем previousMillis2 = currentMillis; // запоминаем момент времени digitalWrite(ledPin2, ledState2); // реализуем новое состояние } else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2)) { ledState2 = HIGH; // выключаем previousMillis2 = currentMillis ; // запоминаем момент времени digitalWrite(ledPin2, ledState2); // реализуем новое состояние } }
Ну и что такого? Сначала поставили в сетапе одну задержку потом в очередном элсифе другую, хить из массива их берите, хоть рассчитывайте по месту... применения
кстати! В зависимости от аппратного решение состоянию включено устройства может соответствовать и хай и лоу. Я предпочитаю в начале программы дефайнами определить их и в теле применять ON и OFF
так я пробовал в сетапе вписать что то вроде
Для того что бы таймер переолнился раньше, происходит какая то ерунда, изменения есть какие то не очень старнное, разницы нет что написать 500, 1000, 2000, эффект один и тот же((
Целый день уже понять не могу.