Relé con la función millis y botones

Quería realizar un control de electrovlavulas por medio de botones, entonces yo necesito activar 2 relays (2 electrovalvulas) y despues de medio segundo activar otro relé (bomba) y despues de unos 5 minutos se desactiven primero los 2 relays(electroválvulas) y despues de medio segundo se desactive la el otro relé (bomba); entonces todo eso cuando yo presione un botón.
En total son 5 electrovalvulas y el motor, entonces necesito tres 4 botones, y cada boton activa ciertas electrovalvulas por un vierto tiempo, yo ya lo realizé pero lo hice unicamente con DELAYS pero estos días me informo, de que el delay está mal debido a que pausa todo el sketch y eso no debe de hacer ya que necesita ejecutar otras tareas,
Y quería saber como le haría utilizando la función millis.
con todo dejo mi código de los delays.:

int MOTOR =3;
int T1 = 4;
int T2 = 5;
int T3 = 6;
int PULSADOR =2;// ACTIVA EL EL MOTOR, TANQUE 2 Y TANQUE 3
int PULSADOR2 =7;//ACTIVA EL MOTOR Y TANQUE 1
int PULSADOR3 =8;//ACTIVA EL MOTOR 


void setup(){
  pinMode(MOTOR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(T3, OUTPUT);
  pinMode(PULSADOR, INPUT);
  pinMode(PULSADOR2, INPUT);
  pinMode(PULSADOR3, INPUT);
}
void loop(){
//********************************COMIDA*************************************************************
 if(digitalRead(PULSADOR) == HIGH && digitalRead(PULSADOR2) == LOW && digitalRead(PULSADOR3)==LOW)
 {
  delay(20);
  digitalWrite(T2, LOW);
  digitalWrite(T3, LOW);
  delay(1000);
  digitalWrite(MOTOR, LOW); 
  delay(5000);
  digitalWrite(MOTOR, HIGH);
  delay(1000);
  digitalWrite(T2, HIGH);
  digitalWrite(T3, HIGH);
  
 }
 //----------------------------------------------------------------------------------------------
 //*****************************FUMIGACION*******************************************************
 if(digitalRead(PULSADOR) == LOW && digitalRead(PULSADOR2) == HIGH && digitalRead(PULSADOR3)==LOW)
 {
  delay(20);
  digitalWrite(T1, LOW);
   delay(1000);
  digitalWrite(MOTOR, LOW); 
   delay(5000);
  digitalWrite(MOTOR, HIGH);
    delay(1000);
  digitalWrite(T1, HIGH);
 }
//----------------------------------------------------------------------------------------------
 //*****************************REGADIO*******************************************************
  if(digitalRead(PULSADOR) == LOW && digitalRead(PULSADOR2) == LOW && digitalRead(PULSADOR3)==HIGH)
 {
  delay(20);
  digitalWrite(MOTOR, LOW); 
   delay(5000);
  digitalWrite(MOTOR, HIGH);
 }
//----------------------------------------------------------------------------------------------
 
 else
 {
  digitalWrite(MOTOR,HIGH);
  digitalWrite(T1,HIGH);
  digitalWrite(T2,HIGH);
  digitalWrite(T3,HIGH);
 }

 
}

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Hay dos hilos en esta Sección uno dice que temas pueden postearse aqui, el tuyo no califica como proyecto. Movido a Software

ya disculpa, soy nuevo en el foro y nosé muy bien sobre que puedo y no puedo.

Ve a Documentacion (la Sección) y lee sobre millis().
Cuando lo hagas seguimos conversando.

Para contestar a tu pregunta, (veo que algo has leido sobre millis y delays y algo ya entiendes), yo me preguntaria primero cual es el nucleo, el cozazon, el motor logico de tu programa, es decir la prioridad.
¿Es el que has posteado o el otras tareas?. Si la prioridad son las otras tareas lo que tienes no te vale para nada has de replantearlo para darle prioridad a las otras tareas y con millis manejar esos reles.
En cambio si lo principal es lo que has posteado y lo secundario las otras tareas bastaria cambiar cada delay por lo siguiente

//delay (???); el delay a sustituir
unsigned long tiempo = millis ();
while (millis() - tiempo < ??? ) {
  otras_tareas();
}

// y fuera del loop como funcion independiente
void otras_tareas() {
  //hacemos las otras tareas
}

Saludos

@gonpezzi No te das cuenta que lo que escribiste es basicamente un delay() ?el ciclo while() es bloqueante, el codigo se detendra haciendo "otras tareas" y no ejecutara las demas "tareas" que esten fuera de la funcion. Por lo que no ayuda mucho al problema.
La solucion es usar maquina de estados.

@israkun8 Te dejo mi sugerencia de como lo puedes hacer, modifique tu codigo, solo la parte que dice "COMIDA" , basandote en ese ejemplo puedes modificar el codigo para que ejecute las demas intrucciones que necesitas

const byte MOTOR =3;
const byte T1 = 4;
const byte T2 = 5;
const byte T3 = 6;
const byte PULSADOR =2;// ACTIVA EL EL MOTOR, TANQUE 2 Y TANQUE 3
const byte PULSADOR2 =7;//ACTIVA EL MOTOR Y TANQUE 1
const byte PULSADOR3 =8;//ACTIVA EL MOTOR 

unsigned long tiempoOn=300000,   //5 minutos
              pausaBomba=500,    //espera de medio segundo entre encendido de valvulas y encendido de bomba
              t_millisOn;        //Para guardar millis y medir el tiempo de encendido
                  

enum ESTADOS{en_espera, encendidoValvulas, encendidoBomba, apagado};
ESTADOS estado; 


void setup(){
  pinMode(MOTOR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(T3, OUTPUT);
  pinMode(PULSADOR, INPUT);
  pinMode(PULSADOR2, INPUT);
  pinMode(PULSADOR3, INPUT);
}



void loop(){

///    COMIDA   ////

  if(digitalRead(PULSADOR)){
       estado=encendidoValvulas;
       }

  switch (estado) {
      case encendidoValvulas:
           digitalWrite(T2, LOW);
           digitalWrite(T3, LOW);
           t_millisOn=millis();
           estado=encendidoBomba;
        break;

      case encendidoBomba: 
           if(millis()- t_millisOn>=pausaBomba){
                 digitalWrite(MOTOR, LOW); 
                 estado=apagado;
               }
           break;

      case apagado:
           if(millis() - t_millisOn >= tiempoOn){
               digitalWrite(T2, HIGH);
               digitalWrite(T3, HIGH);
              }

           if(millis() - t_millisOn >= tiempoOn+pausaBomba){
               digitalWrite(MOTOR, HIGH);
               estado=en_espera;   
              }   
           break;

       }
     

    ///HASTA AQUI COMIDA/////

  
}  //Fin del loop
  

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.