Switch leds DRL - conditions ...

Good night,
I'm having trouble making the following program:

                    unsigned long interval=1500;  // the time we need to wait
                    unsigned long interval2=2800;  // the time we need to wait
                    unsigned long waitUntil=interval; // millis() returns an unsigned long.
                    unsigned long waitUntil2=interval2; // millis() returns an unsigned long.

void playDRL(){
  
  val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  
  //A lógica é quando ligo a luz de presença ele conta 1,5 segundos para executar as linhas seguintes
  if (val_1 == HIGH || val_2 == HIGH && val_3 == HIGH && (unsigned long)(millis() - waitUntil) >= interval){
      waitUntil =+ interval; // Incrementa mais 1,5 segundos e depois passa à ordem...
      digitalWrite(FAROLD,LOW);
      digitalWrite(FAROLE,LOW);
  }else{
  if (val_1 == LOW && val_2 == HIGH && val_3 == LOW && (unsigned long)(millis() - waitUntil) >= interval){
      waitUntil =+ interval; // Incrementa mais 1,5 segundos e depois passa à ordem...
      digitalWrite(FAROLD,LOW);
      digitalWrite(FAROLE,HIGH);
  }else{
  if (val_1 == LOW && val_2 == LOW && val_3 == HIGH && (unsigned long)(millis() - waitUntil) >= interval){
      waitUntil =+ interval; // Incrementa mais 1,5 segundos e depois passa à ordem...
      digitalWrite(FAROLD,HIGH);
      digitalWrite(FAROLE,LOW);
  }else{
    
  //Como nenhum é verdadeiro quando ligo o carro, ele espera 2,8 segundos para ativar as luzes DRL fortes
  if (val_1 == LOW && val_2 == LOW && val_3 == LOW && (unsigned long)(millis() - waitUntil2) >= interval2){
      waitUntil2 =+ interval2; // Increase our wait for another 2800ms.
      digitalWrite(FAROLD,HIGH);
      digitalWrite(FAROLE,HIGH);

}}}}}

Function:
When I have the headlights on, or the TURN SIGNALS on, DRL are off.
When I TURN SIGNALS driver's side on, DRL TURN SIGNALS driver's side off.
When I TURN SIGNALS passenger side on, DRL TURN SIGNALS passenger side off.

I need to wait 500ms before activating, and 1500ms when disables the functions

Sorry for bad english ...

I have also tested this way:

void playDRL(){
  
  val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  /*
    //Se a condição for verdadeira ele espera 1,5 segundos para desligar as DRL fortes...
    if (val_1 == HIGH || val_2 == HIGH && val_3 == HIGH){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 50 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,LOW);
    }
    //Se a condição for verdadeira ele espera 1,5 segundos para desligar a DRL DIREITA...
    else if (val_1 == LOW && val_2 == HIGH && val_3 == LOW){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 50 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,HIGH);
    }
    //Se a condição for verdadeira ele espera 1,5 segundos para desligar a DRL ESQUERDA...
    else if (val_1 == LOW && val_2 == LOW && val_3 == HIGH){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 50 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,HIGH);
          digitalWrite(FAROLE,LOW);
    }
    //SE NENHUMA CONDIÇÃO ANTERIOR FOR VERDADEIRA ESPERA 2,8 SEGUNDOS PARA ATIVAR AS DRL FORTES
    else{
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 500 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,HIGH);
          digitalWrite(FAROLE,HIGH);
    }
 }

Thank you.
Marcog
Portugal

Marcog,
Millis(), by default, is an unsigned long. Why are you casting it as unsigned long again?

.. to restart the timing function.

Is wrong?

It's already tried several ways to configure it and I can not make it work properly.

void loop(){

  playDRL();
  playPiscas();

}

void playDRL(){
  
  val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  
  //A lógica é quando ligo a luz de presença ou 4 piscas ele conta 1,5 segundos para executar as linhas seguintes
  if (val_1 == HIGH || val_2 == HIGH && val_3 == HIGH){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 500 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,LOW);       
  }
  else
  {      
    digitalWrite(FAROLD,HIGH);
    digitalWrite(FAROLE,HIGH);
  }
  
}

void playPiscas(){[
  
  //val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  

  //Pisca direito ligado####################################################################################
  if (val_2 == HIGH && val_3 == LOW){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 500 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,HIGH);
  }
  
  //Pisca esquerdo ligado####################################################################################
  else if (val_2 == LOW && val_3 == HIGH){
      unsigned long tempo = millis(); // *    variável tempo, recebe o retorno da função
      while(tempo + 500 > millis()); // **   Laço de repetição while, será abordado em um post na sequência.
          digitalWrite(FAROLD,HIGH);
          digitalWrite(FAROLE,LOW);
  }
  else
  {
    digitalWrite(FAROLD,HIGH);
    digitalWrite(FAROLE,HIGH);
  }
  
}

I tried again this way but what happens is that when TURN SIGNAL on passenger side, fast and back to TURN SIGNAL driver’s side, the two turn off DRL. Should the DRL on passenger side and driver’s side off

Can anyone give a hand?
I can not do, or do otherwise …

thank you,
hug
marcog

Marcog,
Although not wrong:while(tempo + 500 > millis()); is usually written as:while(millis() - tempo < 500);to avoid problems when millis() gets to it’s maximimum and returns to zero (roll-over). I don’t know if that’s what is causing your problem. What is DRL?

DLR are daytime running lights of the car.

I've had programmed the way you placed but does not solve the problem.

Now I'm trying to program this way:

val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  
  if (val_1 == HIGH || val_2 == HIGH && previous == LOW && millis() - time > intervalo_0) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();    
  }

  digitalWrite(FAROLD, state);

  previous = val_1;

I have to test to see if it works...

Post ALL your code, not just part of it.
Also, make sure your comments are accurate. You've got two variables that you've labelled Direito in the comments. I'm sure you mean one of them (PISCAE) is Esquirdo (spelling?). Although my family was Portuguese 150 years ago, I speak no Portuguese and only a little Spanish.

Previously was thus:

#include <Servo.h>
int servoPin = 10;
Servo servo;

// constants won't change. Used here to - set pin numbers:
//ATIVAÇÃO DA CÂMARA TRASEIRA E LED DE MOVIMENTO-################################################################
    const int ledPin = 8;      // the number of the LED pin
    const int PIN_D2 = 2;                           // pushbutton connected to digital pin 7
    const int val    = 0;                              // variable to store the read value

// Variables will change:
    int ledState = LOW;                             // Led de presença quando o motor do simbolo está aberto...
    long previousMillis = 0;                        // will store last time LED was updated
    
    // the follow variables are long's because the time, measured in miliseconds,
    // will quickly become a bigger number than can be stored in an int.
    long time = 0;         // the last time the output pin was toggled
    long time2 = 0;         // the last time the output pin was toggled
    
    long intervalo_0   = 0;                             // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_1 = 200;                         // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_2 = 1000;                        // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_3 = 2500;                        // interval at which to blink (milliseconds)--FECHAR O SÍMBOLO

//LUZES DIURNAS - FRENTE-########################################################################################
    const int PISCAD   = 5;                           //SINAL DE ENTRADA   - CORRENTE DO PISCA TRASEIRO DO LADO DIREITO
    const int PISCAE   = 6;                           //SINAL DE ENTRADA   - CORRENTE DO PISCA TRASEIRO DO LADO ESQUERDO
    const int PRESENCA = 7;                         //SINAL DE ENTRADA   - CORRENTE DA MATRÍCULA TRASEIRA
    const int FAROLD   = 12;                          //SINAL DE SAIDA     - PARA O PIN 7 DO FAROL DIREITO
    const int FAROLE   = 13;                          //SINAL DE SAIDA     - PARA O PIN 7 DO FAROL ESQUERDO

    int val_1 = 0;                                  // variável para armazenar o valor lido - PRESENCA
    int val_2 = 0;                                  // variável para armazenar o valor lido - PISCAD
    int val_3 = 0;                                  // variável para armazenar o valor lido - PISCAE
//###############################################################################################################

void setup() {
  servo.attach(servoPin);
  
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  pinMode(PIN_D2, INPUT_PULLUP);                    // Pushbutton - sinal para ativar servo
  servo.writeMicroseconds(791);                     // Clockwise máximo 2175
  
  pinMode(PISCAD,   INPUT);                           //int PISCAD = 5;
  pinMode(PISCAE,   INPUT);                           //int PISCAD = 6;
  pinMode(PRESENCA, INPUT);                         //int PISCAD = 7;
  pinMode(FAROLD,   OUTPUT);                          //Pin de saida de corrente DRL DO FAROL direito   (Pin12)
  pinMode(FAROLE,   OUTPUT);                          //Pin de saida de corrente DRL DO FAROL esquerdo  (Pin13)
}

void loop(){
  
  if (digitalRead(PIN_D2)) {                  //sinal para ativar o servo - pin 2
    // Se o PIN2 tiver corrente...
    ledState = HIGH;                          // LED on
    servo.writeMicroseconds(2174);            // Counter clockwise 792
    unsigned long currentMillis = millis();
      if(currentMillis > intervalo_2) { 
          ledState = LOW;
      } 
    } else {
      ledState = LOW;
      servo.writeMicroseconds(792);
      unsigned long currentMillis = millis();      // Clockwise máximo 2175
      if(currentMillis > intervalo_3) { 
          ledState = LOW;
      }
      digitalWrite(ledPin, ledState);
  }
  playDRLdireita();

}

void playDRLdireita(){
  
  val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                   //variável para armazenar o valor lido do pisca direito

  
  unsigned long currentMillis = millis();
 
  if(val_1 == HIGH || val_2 == HIGH && currentMillis - previousMillis > intervalo_1) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(FAROLD, ledState);
  } 
}

I’m testing this way. It seems to work better but it is not consistent.

#include <Servo.h>
int servoPin = 10;
Servo servo;

// constants won't change. Used here to - set pin numbers:
//ATIVAÇÃO DA CÂMARA TRASEIRA E LED DE MOVIMENTO-################################################################
    const int ledPin = 8;      // the number of the LED pin
    const int PIN_D2 = 2;                           // pushbutton connected to digital pin 7
    const int val    = 0;                           // variable to store the read value

// Variables will change:
    int ledState = LOW;                             // Led de presença quando o motor do simbolo está aberto...
    long previousMillis = 0;                      // will store last time LED was updated
    
          unsigned long onTime;

// INTERVALO DE TEMPO PARA CONTAGEM DAS CONDIÇÕES
    long intervalo_0   = 0;                         // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_1 = 100;                         // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_2 = 1000;                        // interval at which to blink (milliseconds)--ABRIR O SÍMBOLO
    long intervalo_3 = 2500;                        // interval at which to blink (milliseconds)--FECHAR O SÍMBOLO

//LUZES DIURNAS - FRENTE-########################################################################################
    const int PISCAD   = 5;                         //SINAL DE ENTRADA   - CORRENTE DO PISCA TRASEIRO DO LADO DIREITO
    const int PISCAE   = 6;                         //SINAL DE ENTRADA   - CORRENTE DO PISCA TRASEIRO DO LADO ESQUERDO
    const int PRESENCA = 7;                         //SINAL DE ENTRADA   - CORRENTE DA MATRÍCULA TRASEIRA
    const int FAROLD   = 12;                        //SINAL DE SAIDA     - PARA O PIN 7 DO FAROL DIREITO
    const int FAROLE   = 13;                        //SINAL DE SAIDA     - PARA O PIN 7 DO FAROL ESQUERDO

    
    int val_1 = 0;                                  // variável para armazenar o valor lido - PRESENCA
    int val_2 = 0;                                  // variável para armazenar o valor lido - PISCAD
    int val_3 = 0;                                  // variável para armazenar o valor lido - PISCAE
//###############################################################################################################

void setup() {
  servo.attach(servoPin);
  
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  pinMode(PIN_D2, INPUT_PULLUP);                    // Pushbutton - sinal para ativar servo
  servo.writeMicroseconds(791);                     // Clockwise máximo 2175
  
  pinMode(PISCAD,   INPUT);                         //int PISCAD = 5;
  pinMode(PISCAE,   INPUT);                         //int PISCAD = 6;
  pinMode(PRESENCA, INPUT);                         //int PISCAD = 7;
  pinMode(FAROLD,   OUTPUT);                        //Pin de saida de corrente DRL DO FAROL direito   (Pin12)
  pinMode(FAROLE,   OUTPUT);                        //Pin de saida de corrente DRL DO FAROL esquerdo  (Pin13)
}

void loop(){
  //activate servo motor
  if (digitalRead(PIN_D2)) {                        //sinal para ativar o servo - pin 2
    // Se o PIN2 tiver corrente...
    ledState = HIGH;                                // LED on
    servo.writeMicroseconds(2174);                  // Counter clockwise 792
    unsigned long currentMillis = millis();
    
      if(currentMillis > intervalo_2) { 
          ledState = LOW;
      }
      
  } else {
    
    ledState = LOW;
    servo.writeMicroseconds(792);
    unsigned long currentMillis = millis();       // Clockwise máximo 2175
    
      if(currentMillis > intervalo_3) { 
          ledState = LOW;
      }
      
    digitalWrite(ledPin, ledState);
  }
  //##################
  playDRL();
  //##################
}

void playDRL(){
  //variable to store the value read from the license plate lamp; right blinkers (PISCAD); left blinkers (PISCAE)
  val_1 = digitalRead (PRESENCA);                   //variável para armazenar o valor lido da luz de presença da matrícula
  val_2 = digitalRead (PISCAD);                     //variável para armazenar o valor lido do pisca direito
  val_3 = digitalRead (PISCAE);                     //variável para armazenar o valor lido do pisca direito
  
  //A lógica é quando ligo a luz de presença ou 4 piscas ele conta 0,5 segundos para executar as linhas seguintes
  //The logic is when I turn on the lamp or 4 blinkers he has 0.5 seconds to execute the following lines
  if (val_1 == HIGH || val_2 == HIGH && val_3 == HIGH){
      onTime = millis();
      onTime > 0 && millis() - onTime > 500;
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,LOW);
          
      if (val_1 == HIGH || val_2 == HIGH && val_3 == HIGH){
          onTime = millis();
          onTime > 0 && millis() - onTime > 100;
              digitalWrite(FAROLD,LOW);
              digitalWrite(FAROLE,LOW);      
    }
  }
  
  else{
  //Pisca direito ligado####################################################################################
  if (val_1 == LOW && val_2 == HIGH && val_3 == LOW){
      onTime = millis();
      onTime > 0 && millis() - onTime > 500;
          digitalWrite(FAROLD,LOW);
          digitalWrite(FAROLE,HIGH);
          
      if (val_1 == LOW && val_2 == LOW && val_3 == HIGH){
          onTime = millis();
          onTime > 0 && millis() - onTime > 100;
              digitalWrite(FAROLD,HIGH);
              digitalWrite(FAROLE,LOW);
    }
  }
  
  else{
    //Pisca esquerdo ligado####################################################################################
  if (val_1 == LOW && val_2 == LOW && val_3 == HIGH){
      onTime = millis();
      onTime > 0 && millis() - onTime > 500;
          digitalWrite(FAROLD,HIGH);
          digitalWrite(FAROLE,LOW);
 
      if (val_1 == LOW && val_2 == HIGH && val_3 == LOW){
          onTime = millis();
          onTime > 0 && millis() - onTime > 100;
              digitalWrite(FAROLD,LOW);
              digitalWrite(FAROLE,HIGH);
    }
  }
  
  else{
  //Como nenhum é verdadeiro quando ligo o carro, ele espera 2,8 segundos para ativar as luzes DRL fortes####

    digitalWrite(FAROLD,HIGH);
    digitalWrite(FAROLE,HIGH);
  }
  
}}}

Function for DRL:
When I have the headlights on, or the TURN SIGNALS on, DRL are off.
When I TURN SIGNALS driver’s side on, DRL TURN SIGNALS driver’s side off.
When I TURN SIGNALS passenger side on, DRL TURN SIGNALS passenger side off.

Function for servo (work ok):

Thanks for the help

MarcoG
Portugal

Vieira_mar:
I'm testing this way. It seems to work better but it is not consistent.

 onTime = millis();  //you've set onTime = the time since
                        // the Arduino was switched on or reset.
onTime > 0 && millis() - onTime > 100; // onTime will almost always be > O
                   // and shouldn't this be an if statement?
       digitalWrite(FAROLD,HIGH);
       digitalWrite(FAROLE,LOW);