Manejo de bucles en Arduino UNO

Muy buenas con todos

Soy nuevo en Arduino y necesito por favor ayuda para poder completar un programa que bajé del Internet.

Las siguientes instrucciones abren y cierran 6 electroválvulas en un relevador de 8 válvulas que van a controlar un proceso de alternancia en un concentrador de Oxígeno que estoy armando como prototipo. Al momento, tal como están, las electroválvulas 1, 2, 3, 6, 7 y 8 funcionan según lo esperado.

void setup() {
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);  
}
void loop() {
digitalWrite (1,HIGH);
digitalWrite (3,HIGH);
digitalWrite (7,HIGH);
digitalWrite (2,LOW);
digitalWrite (6,LOW);
digitalWrite (8,LOW);
delay(3250);
digitalWrite (1,HIGH);
digitalWrite (3,HIGH);
digitalWrite (7,HIGH);
digitalWrite (2,HIGH);
digitalWrite (6,HIGH);
digitalWrite (8,HIGH);
delay(750);
digitalWrite (1,LOW);
digitalWrite (3,LOW);
digitalWrite (7,LOW);
digitalWrite (2,HIGH);
digitalWrite (6,HIGH);
digitalWrite (8,HIGH);
delay(3250);
digitalWrite (1,HIGH);
digitalWrite (3,HIGH);
digitalWrite (7,HIGH);
digitalWrite (2,HIGH);
digitalWrite (6,HIGH);
digitalWrite (8,HIGH);
delay(750);
}  


Ahora necesito indicar a mi arduino UNO que controle los números 4 y 5 para prender y apagar alternativamente dos compresores cada 22 minutos (1'320.000 ms) con un delay de 2 s mientras se apaga uno y enciende el otro siempre y cuando el circuito principal que controla las electroválvulas está corriendo en bucle cuando el arduino está energizado.

Los compresores tienen un consumo de 3,5 A cada uno y en la placa de los reles dice que soportan hasta 10 A por lo que entiendo se puede arrancar los compresores con esos relés.

Por lo que he leido hasta ahora, entiendo eso lo debo hacer con un bucle anidado... tal vez alguna otra función?

Mucho les agradezco si me pueden incluir los códigos en el programa principal mostrado arriba para que eso se cumpla.

Un cordial saludo

Patricio Troya

Hola Patricio, tu principal problema es el medir el tiempo. En arduino puedes crear un reloj, pero cada vez que se reinicia (por un fallo de alimentación por ejemplo), se pierde la referencia del tiempo. En mi opinión lo mejor es usar un RTC, un reloj externo con una pila conectado al arduino.
Los relés sirven, pero los motores son muy exigentes con los relés, de modo que invierte en relés de buena calidad y muy sobredimensionados (esos baratos de 10A son de juguete). Hay gente que prefiere usar relés de estado sólido (SSR).
Necesitas una fuente de poder muy decente para operar tus relés, mínimo 5 A. También vas a necesitar transistores mosfet (nivel lógico) para conectar los relés al arduino, y un par de resistencias por mosfet. Posiblemente necesitarás filtros inductivos (choke modo común) por los pulsos electromagnéticos que se generarán cada vez que partan los compresores y también condensadores de desacoplado.
Agregaría además un display de tu preferencia.
Saludos,

Olvidé también diodos de protección por cada relé.

Moderador:
Por favor, lee las Normas del foro y edita los siguientes erroes que has cometido:

1) Los códigos se postean usando etiquetas.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>



2) Los títulos no pueden ser como lo que has puesto. Esto no es un chat o grupo de facebook. Lee el punto 5 de las normas sobre como debe ser un título y edita indicando algo que defina tu consulta.

Si falla la alimentación, que pierda la referencia de tiempo sería el menor de los problemas porque de todos modos todo el sistema dejaría de funcionar.
Por lo demás coincido.

En tu código, tal como está (usando delay()) no es tan sencillo agregarle funcionalidad alguna.
Lee en la sección Documentación el tutorial sobre uso de millis() para controlar los tiempos.

Saludos

Gracias Surbyte
He tratado de corregir los dos puntos indicados según lo que entendí de las normas.
Respecto al título, al ser un novato completo en Arduino, no se me ocurre uno mejor
Lamento si aún queda algo pendiente... es lo que entendí.
Saludos

Este programa hará bastante de lo que pides.

La primer parte del loop es la conversión de tus delay() en máquina de estado, algo que esta bien explicado en Documentación.
La segunda es usando millis() controlar los dos compresores.
Ya ves que con millis() no hay restricciones y con delay() solo se puede hacer una secuencia.
La misma secuencia se implementa como maquina de estados. Se comienza en el estado 0 que es el primer grupo de digitalWrite que tienes luego en lugar de delay() usamos millis() pero cambiamos de estado cuando se cumplen las condiciones.
de ese modo tenemos el delay pero sin frenar al microcontrolador que tambien puede ver la alternancia de las bombas cada 22 minutos.
Falta agregarle los 2 segundos pero eso te lo dejo a ti.

#define COMPRESOR_1 4
#define COMPRESOR_2 5

byte modo = 0;
bool controlBombas = false;
unsigned long startTime, tiempoCompresores;

void setup() {
  pinMode(1,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);  
}
void loop() {
  switch(modo) {
    case 0: digitalWrite (1,HIGH);
            digitalWrite (3,HIGH);
            digitalWrite (7,HIGH);
            digitalWrite (2,LOW);
            digitalWrite (6,LOW);
            digitalWrite (8,LOW);
            startTime = millis();
            modo = 1;
            break;
    case 1: if (millis() - startTime > 3250UL) {
                digitalWrite (1,HIGH);
                digitalWrite (3,HIGH);
                digitalWrite (7,HIGH);
                digitalWrite (2,HIGH);
                digitalWrite (6,HIGH);
                digitalWrite (8,HIGH);
                startTime = millis();
                modo = 2;
            }
            break;
    case 2: if (millis() - startTime > 750UL) {
                digitalWrite (1,LOW);
                digitalWrite (3,LOW);
                digitalWrite (7,LOW);
                digitalWrite (2,HIGH);
                digitalWrite (6,HIGH);
                digitalWrite (8,HIGH);
                startTime = millis();
                modo = 3;
            }
            break;
    case 3: if (millis() - startTime > 3250UL) {
                digitalWrite (1,HIGH);
                digitalWrite (3,HIGH);
                digitalWrite (7,HIGH);
                digitalWrite (2,HIGH);
                digitalWrite (6,HIGH);
                digitalWrite (8,HIGH);      
                startTime = millis();
                modo = 4;
            }
            break;
    case 4: if (millis() - startTime > 750UL) {
                modo = 0;
            }
            break;                      
    }
/* Ahora necesito indicar a mi arduino UNO que controle los números 4 y 5 para prender y 
    apagar alternativamente dos compresores cada 22 minutos (1'320.000 ms) con un delay de 2 s 
    mientras se apaga uno y enciende el otro siempre y cuando el circuito principal que 
    controla las electroválvulas está corriendo en bucle cuando el arduino está energizado.
    */
  if (millis() - tiempoCompresores > 1320000UL) {
      controlBombas = !controlBombas;
      if (controlBombas) {
          digitalWrite(COMPRESOR_1, LOW);   // Enciendo compresor 1
          digitalWrite(COMPRESOR_2, HIGH);  // Apago compresor 2
      }
      else {
          digitalWrite(COMPRESOR_1, HIGH);  // Apago compresor 1
          digitalWrite(COMPRESOR_2, LOW);   // Enciendo compresor 2
      }
      tiempoCompresores = millis();
  }
}

Hola JBBOP, muchas gracias por tu respuesta, me has puesto a pensar y aprender. Investigaré sobre los componentes que mencionas para poder implementarlos en mi circuito.

Quiero que el equipo funcione sin problemas y sea confiable en el tiempo

Un saludo

Hola Surbyte,

Muchas gracias por tu amable ayuda. Lo voy a subir y probarlo.

Cordial saludo

Hola Gatul,

Entendido, para mi proceso, no es problema si todo comienza de nuevo cuando el sistema de desenergiza y regresa otra vez.... De hecho es lo que necesito que se haga, es un ciclo repetitivo. Claro, supongo lo puedo mejorar a medida que conozca mejor cómo controlar las electroválvulas y los compresores para optimizar mi proceso.

Como dije, es un prototipo el que estoy haciendo y por lo tanto suceptible de implementar mejoras.

Gracias a todos por su estimable ayuda

Un buen fin de semana