Mi programa se congela en un proceso

Buenos dias desde Argentina, quisiera realizar una consulta, estoy armando una maquina para hacer hamburguesas, consta de un sensor que detecta que la bandeja esta cargando carne, si el sensor == LOW empieza el ciclo, tengo una entrada (sensor) y Dos salidas (dos relay que comandan las electrovalvulas de los pistones neumaticos, les dejo el codigo a continuacion

                                         //Hamburguesera// 
//Manejo de dos Electro_Valvulas mediante un Sensor Hall 3144
const int electroValvulaEmpuje = 2;  //Constante de rele_1
const int electroValvulaPlato = 11;  //Constante de rele_2
const int sensor = 9; //Constante de Sensor Hall 3144
int estado = 0; //Variable que toma valor de sensor para determinar tareas

    void setup()
      {
          //Inicia el puerto serie para llevar control de tareas. 
                         //Puede ser remplazado por Liquicrystal.h para reproducior monitoreo en una pantalla LCD
          
          
          
          pinMode(electroValvulaPlato, OUTPUT); //Definimos la constante de rele_1 como salida
          pinMode(electroValvulaEmpuje, OUTPUT); //Definimos la constante de rele_2 como salida
          pinMode(sensor, INPUT); //Definimos la constante del Sensor Hall 3144 como entrada


          digitalWrite(electroValvulaPlato, HIGH);
          digitalWrite(electroValvulaEmpuje, LOW); //Iniciamos el rele_2 en estado "0"
      } 
    void loop()
      {
              
          int estado = digitalRead(sensor); //Lee el estado del sensor
              
            if (estado == LOW) //Si el sensor esta en estado 0 inicia el ciclo, (Detallado en el Serial o LCD)
        
              {
                

                    delay(250);
       //Consigna uno 
                  unsigned long timpoInicioPlatoAfuera = millis();
                    while(millis() - timpoInicioPlatoAfuera < 2250){ //Tiempo de carga de carne
                        }
                      digitalWrite(electroValvulaPlato, LOW); //Salida de plato
                      
                                                                                                            
                    delay(250);
                    
       //Consigna dos
                  unsigned long timpoInicioBajaEmpuje = millis();
                    while(millis() - timpoInicioBajaEmpuje < 1750){ //Tiempo que tarda en bajar empuje
                        }
                      digitalWrite(electroValvulaEmpuje, HIGH); //Baja empuje (piston chico)
                      

                    delay(250);

                  unsigned long timpoInicioSubeEmpuje = millis();
                    while(millis() - timpoInicioSubeEmpuje < 1250){ //Tiempo que tarda en subir piston de empuje
                        }
                      digitalWrite(electroValvulaEmpuje, LOW); //Sube empuje (piston chico)
                      

                    delay(250);

                  unsigned long tiempoInicioPlatoAdentro = millis();
                    while(millis() - tiempoInicioPlatoAdentro < 1750){ //Tiempo que tarda en guardar plato
                        }
                        digitalWrite(electroValvulaPlato, HIGH); //Entrada de plato 
                      

                    delay(250);        
            
              }
                  
            
    
                  delay(250);
        }

mi problema es que queda en la salida del plato, indicado por un comentario como //consigna uno, y no inicia nunca la //consigna dos, cuando inicio el arduino, funcion a perfectamente durante 10-15 min hasta que queda congelado entre esos dos puntos, a veces lo inicio y se congela antes de los 30seg. y asi, no es en una cantidad determinada de ciclos o en un tiempo especifico, siempre lo hace en diferentes momentos.

La placa es un arduino nano. Desde ya muchisimas gracias, espero puedan ayudarme.

Así como estás usando millis()

unsigned long timpoInicioPlatoAfuera = millis();
while(millis() - timpoInicioPlatoAfuera < 2250){ //Tiempo de carga de carne
}

es exactamente lo mismo que usar delay() porque el micro no va a hacer nada hasta que no se cumpla el tiempo.

Te conviene usar una máquina de estados (no es mucho más complicado que lo que ya hiciste), en la sección Documentación hay muy buenos tutoriales.

Agrega un diagrama de conexiones, indicando claramente cómo energizas cada uno de los componentes del sistema. Puedes dibujar uno a mano y tomarle una foto…

Gracias lo probare, no lo habia pensado de esa manera, no eh practicado mucho, estoy empezando en esto y se me complican algunos temas

asdasdasd
Espero que se entienda, remplace las electro valvulas por led ya que fritzing no tiene electro valvulas, esta alimentado mediante 12v de un cargador, y con el 7805 reduzco el voltaje a 5v para poder entrar por el usb del arduino ya que tengo roto el pin [Vin],

Alimentás todo con la misma fuente?
Cuánta corriente entrega?

Le pusiste diodos en antiparalelo a las electroválvulas?

Tenés las características de las electroválvulas o un link donde podamos verlas?

Si alimenta todo la misma fuente 12V 2A entrega,
No no le puse diodos en antiparalelo a las electro valvulas
Las electro valvulas son estas 4V210-06 Electroválvula neumática 5 vías 2 posiciones Puertos 1/8

5V es muy poco para Vin, ya que alimenta un regulador 78M05. Puedes comprobarlo si tienes forma de medir el voltaje en el pin 5V.

Puedes conectar los 5V que salen de tu 7805 al pin 5V, o puedes alimentar los 12V al pin Vin.

Consulta https://docs.arduino.cc/learn/electronics/power-pins/ y https://www.arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf

Estoy energizando el arduino con 5v a un pin usb y entro por el usb del arduino con 5v

Podés conectar los 5V al pin 5V, es más sencillo. :wink:

En teoría las válvulas consumen unos 200 mA, no deberían causar problemas...

Probá poniendo los diodos a las válvulas (en la descripción no aclara si los trae) y capacitores al regulador (si no los pusiste ya), fijate en la hoja de datos del 7805 los valores recomendados.

Ahora probare con los diodos y tambien revisare la hoja de datos del regulador para ponerle los capacitores, muchisimas gracias.

Le puse los capacitores al regulador y los diodos a las valvulas, parecia que todo iba perfecto, hasta que de nuevo fallo, lo que si noto es que siempre falla en el mismo ciclo.

Queda en esta orden sin avanzar hacia la siguiente la cual seria

unsigned long timpoInicioBajaEmpuje = millis();
                    while(millis() - timpoInicioBajaEmpuje < 1750){ //Tiempo que tarda en bajar empuje
                        }
                      digitalWrite(electroValvulaEmpuje, HIGH); //Baja empuje (piston chico)
                      

                    delay(250);

En el post#2 @MaximoEsfuerzo te explico que esto

while(millis() - timpoInicioBajaEmpuje < 1750){ //Tiempo que tarda en bajar empuje
                        }

Es igual a esto

delay(1750);

Entonces tu código ahí dice

delay(2500);
digitalWrite(electroValvulaPlato, LOW); //Salida de plato
 delay(250);
delay(1750);
digitalWrite(electroValvulaEmpuje, HIGH); //Baja empuje (pistón chico)
delay(250);

para que usar millis(), no te compliques, usa delay() en todos los caso, eso si.. no te quejes si hay cambios en el sensor == LOW porque no los verás.

Entonces asi como esta hecho tu código a pesar de usar millis() es equivalente a haberlo hecho como yo te escribí usando delay().
Este código no ve cambios en el sensor por el tiempo que le lleva accionar las dos válvulas, o 4.5 seg 4500 mseg

Exactamente cómo es que te das cuenta de eso?

Tienes forma de usar Serial.print para monitorear el avance del programa? O con un zumbador o un LED?

El programa se congela, o se reinicia?

tenia Serial.println para monitoriarlo en el serial y el arduino ya esta colocado en la maquina hamburguesera y siempre queda en el mismo ciclo y en el monitor serial queda escrito "Plat" y cuando el programa funciona correctamente escribe "Plato fuera", seguido de "baja empuje", y respondiendo tu ultima pregunta, se congela, porque se queda quieto en esa orden

Verifica que la fuente de 12V tenga la capacidad suficiente para manejar las electroválvulas. Si no la tiene eso puede hacer que el Arduino falle.

Si tienes forma de energizar el Arduino con una segunda fuente independiente de la fuente de 12V haz la prueba.

¿Y en qué parte del código que has compartido está lo de "Plato fuera" y demás mensajes?

Está bien que apenas tengo unos 3 o 4 años con arduino pero recién me entero que los comentarios del código se pueden ver en la terminal y sin siquiera iniciar el puerto. :stuck_out_tongue_winking_eye:

Porque el PO dijo

Ahhh si es por eso, te aseguro que vamos muertos, ya sabemos que publican un código y hacen comentarios y referencias a otro.

Esto esta en el código de la Dimensión desconocida!!

igualmente dice tenia Serial.println para monitoriarlo