Задержка одного таймера на старте, светофор без "Delay"

Antonzx55
Offline
Зарегистрирован: 29.03.2020

Доброго времени суток. Пытаюсь сделать светофор без 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); // реализуем новое состояние
 }







 
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

кстати! В зависимости от аппратного решение состоянию включено устройства может соответствовать и хай и лоу. Я предпочитаю в начале программы дефайнами определить их и в теле применять ON и OFF

Antonzx55
Offline
Зарегистрирован: 29.03.2020

так я пробовал в сетапе вписать что то вроде

previousMillis3 =  1000;

Для того что бы таймер переолнился раньше, происходит какая то ерунда, изменения есть какие то не очень старнное, разницы нет что написать 500, 1000, 2000, эффект один и тот же((

Целый день уже понять не могу.