Retrasar tarea en condicional If

Buenas tardes soy nuevo en el foro y un principiante con Arduino, estoy desarrollando un proyecto de control de generador sin embargo tengo problema con un proceso especifico, en la partida es necesario accionar los relés de la llave START y ACC y tambien un relé para un solenoide que es el encargado de abrir el paso de aire al motor durante la partida, tengo estos 3 procesos juntos pero necesito retrasar el Relé del solenoide aproximadamente 2 segundos para que pueda partir adjunto el código espero puedan ayudarme ya que actualmente las 3 acciones se ejecuten de manera simultanea.

if (intentos <=3 ){
   //CICLO DE ENCENDIDO
   lcd.clear();
   lcd.setCursor(1,0);
   lcd.print("Encendiendo");
   lcd.setCursor(1,1);
   lcd.print("Generador");
   intentos++;
   digitalWrite(RLACC, LOW);
   digitalWrite(RLStart, LOW);
   digitalWrite(RLSolen, LOW);    [b]ESTE RELÉ DEBO RETRASAR 2 SEGUNDOS EN ESTA TAREA[/b]
   delay(3000); 
    digitalWrite(RLStart, HIGH);
    digitalWrite(RLSolen, HIGH);
    delay(1000);
    }

Buenas tardes @Theros182, me gustaría que publicases el código entero si quieres que te ayudemos con mas facilidad... Ya veo que no usas millis y eso puede ser un problema para lo que tratas de hacer...

Angel

Gracias por responder aquí va el código entero, me gustaría poder cambiar los delays por millis.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  

const int RedStat = 8; 
const int GenStat = 10; 
const int RLACC =  5;
const int RLStart = 4;
const int RLSolen = 7;
const int RLGen = 3;
const int RLRed = 2;
int intentos = 0;
 

// variables will change:
int GenState = 0; 
int RedState = 0; 

       
void setup()
{

  pinMode(RLACC, OUTPUT);
  pinMode(RLStart, OUTPUT);
  pinMode(RLSolen, OUTPUT);
  pinMode(RLGen, OUTPUT);
  pinMode(RLRed, OUTPUT);
  digitalWrite(RLACC, HIGH);
  digitalWrite(RLStart, HIGH);
  digitalWrite(RLSolen, HIGH);
  digitalWrite(RLGen, HIGH);
  digitalWrite(RLRed, HIGH);
  // initialize the pushbutton pin as an input:
  pinMode(RedStat, INPUT);
  pinMode(GenStat, INPUT);
  
  Serial.begin(9600);

  lcd.begin(16,2);  
 // ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(150);
    lcd.noBacklight();
    delay(150);
  }
  lcd.backlight(); // finish with backlight on  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print(" TESIS UMAG");

  delay(1000);

 lcd.clear(); 
 lcd.setCursor(0,1); //Start on line 2
 
  Serial.begin(9600);
  lcd.begin(16, 2);

}




void loop() {
  // read the state of the pushbutton value:
  RedState = digitalRead(RedStat);
  GenState = digitalRead(GenStat);


  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (RedState == LOW) {

   lcd.setCursor(1,0);
   lcd.print("Red ");
   lcd.print("Presente");
   //CONECTO LA RED DESPUES DE 5 SEGUNDOS
   
   
   digitalWrite(RLGen, HIGH);
   digitalWrite(RLACC, HIGH);
   intentos=0;
   
   delay(5000);
  digitalWrite(RLRed, LOW);
  } 
    else {

   lcd.setCursor(1,0);
   lcd.print("Red ");
   lcd.print("Auscente");  

   digitalWrite(RLRed, HIGH);

  
    if (GenState == LOW) {

   lcd.setCursor(1,1);
   lcd.print("Gen ");
   lcd.print("Presente");
delay(1000);
 
   digitalWrite(RLGen, LOW);
   
 
  } 
    else { 
      
    // turn LED on:
   // digitalWrite(ledPin, HIGH);
   lcd.setCursor(1,1);
   lcd.print("Gen ");
   lcd.print("Auscente");
   delay(1000);
   if (intentos <=3 ){
   //CICLO DE ENCENDIDO
   lcd.clear();
   lcd.setCursor(1,0);
   lcd.print("Encendiendo");
   lcd.setCursor(1,1);
   lcd.print("Generador");
   intentos++;
   digitalWrite(RLACC, LOW);
   digitalWrite(RLStart, LOW);
   digitalWrite(RLSolen, LOW);
   delay(3000); 
    digitalWrite(RLStart, HIGH);
    digitalWrite(RLSolen, HIGH);
    delay(1000);
    }
    else
    {
    lcd.clear();
   lcd.setCursor(0,0);
   lcd.print(" Falla del Gen.");
   lcd.setCursor(1,1);
   lcd.print("No enciende");
   digitalWrite(RLACC, HIGH);
   digitalWrite(RLStart, HIGH);
   digitalWrite(RLSolen, HIGH);
   digitalWrite(RLGen, HIGH);
delay(10000);
lcd.clear();

      }

    
  }}}

De acuerdo, necesite que me aclares mas detalladamente la función que necesitas...

¿Quieres que

digitalWrite(RLSolen, HIGH);

actue 2 segundos despues de

digitalWrite(RLStart, HIGH);

?

¿O quieres que

digitalWrite(RLSolen, LOW);

actue 2 segundos despues de digitalWrite(RLStart, LOW);?

Angel,

Necesito que

  digitalWrite(RLSolen, LOW)

Actue 2 segundos despues de

digitalWrite(RLACC, LOW);
   digitalWrite(RLStart, LOW);

y luego se mantenga mientras el generador se encuentre funcionando.

Pues simplemente agregando un delay antes, quedando así:

intentos++;
   digitalWrite(RLACC, LOW);        //Activa Rele ACC
   digitalWrite(RLStart, LOW);      //Activa ReleStart
   delay(2000);                     //Delay de 2 segundos
   digitalWrite(RLSolen, LOW);      //Activa Rele Solenoide
   delay(3000);                     //Delay 3 segundos
    digitalWrite(RLStart, HIGH);    //Desactiva Rele Start
    digitalWrite(RLSolen, HIGH);    //Desactiva Rele Solenoide
    delay(1000);                    //Delay 1 segundo
    }

Lo primero que te diré es que tu código esta mal por varias razones pero para simplificar, por el uso de delay.

Observa esto: al comienzo del loop lees dos estados, el del botón y el del generador, hasta ahi estamos bien.
Luego si presionas el boton de accionamiento, Red entonces entramos en el mundo de la espera.
En ese momento se leyó el estado del generador no es así? y supongamos sería que esta "Ausente".

A partir de ahi el sistema debe esperar segundos para volver a leer esos estados. Puede que no sea importante, y para tu gusto 1 seg sea suficiente para hacer cosas y luego volver a saber los estados pero a cada momento vuelves a tomar decisiones en función de un estado que lleva segundos cambiado y eso no me parece adecuado.

La solución no es simple ya que el código lo veo desordenado, pero usando millis() y una máquina de estados tendrias algo mucho mas rápido y que toma decisiones en función de lo que esta pasando casi al instante.

Claro que si estas contra reloj no es una alternativa útil la que te doy pero viendo que es una TESIS yo lo consideraría.

Surbyte,

Gracias por el comentario, la verdad me gustaría poder llevar este codigo a millis, ademas necesitare leer variables de estado como tension corriente y frecuencia, y con este codigo no llegare muy lejos, por donde me recomiendas comenzar a estudiar para poder ir generando el codigo que necesito, al parecer necesitare una maquina de estados?

Gracias por tu respuesta.

Entonces Ve a Documentación => Indice de temas tutoriales => millis()