[SOLUCIONADO] Interrumpir ciclo + problema con LCD

Buenos días, lo primero de todo, pedir disculpas si he incumplido alguna norma del foro, me las he leído y creo que lo he hecho bien, pero en caso de que no, pido perdón.

Soy un novato y tengo el código que veréis aquí abajo, instalado en un Arduino uno.

El caso es que yo necesito, que cuando activo el pulsador, el ciclo de las válvulas, comience, pero que si en medio de este ciclo de las válvulas, le vuelvo a dar, se pare, es decir, que todas se quedaran en LOW (como están en el else.)

He probado con otro tipo de funciones además de con el if, pero no lo consigo.

Como puedo hacer para interrumpir el ciclo de las válvulas volviendo a presionar el pulsador???

P.d: Para que el ciclo pueda comenzar tanto vacuostato como presostato, deben ser menores a 500.

Muchas gracias.
Espero vuestra ayuda.

Un abrazo fuerte para tod@s

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


//Entradas
  int Vacuostato=A0; //Señal analogica de 0 o 5v que nos indica si el tanque de vacio esta cargado o no
  int Presostato=A1; //Señal analogica de 0 o 5v que nos indica si el tanque de presion de aire esta cargado o no
  int Potenciometro=A3; //Potenciometro que fija el tiempo que dura el proceso de vacio
  int Botoninicio=5; //Pulsador con resistencia pull down que inicia o detiene el ciclo

//Salidas
  int Cilindrotapa=4; //Rele que abre y cierra la tapa de la camara de vacio
  int Entradavacio=3; //Rele que hace vacio en la camara
  int Escapevacio=2; //Rele que libera vacio en la camara
  //Pantalla A4 SDA y A5 SCL

//Variables
  long ValorVacuostato; //Variable raw Vacuostato (0 a 1023)
  long ValorPresostato; //Variable raw Presostato (0 a 1023) 
  long ValorPotenciometro; //Guardamos el valor del potenciometro (0 a 1023)
  float TiempoVacio; //Guarda el tiempo configurado por el potenciometro
  int SegundosVacio; //Tiempo en segundos
  int Segundos=1000;
  int ValorBoton;


  LiquidCrystal_I2C lcd(0x27,20,4);
  
void setup() {
  Serial.begin(9600);

  pinMode(Vacuostato, INPUT);
  pinMode(Presostato, INPUT);
  pinMode(Potenciometro, INPUT);
  pinMode(Botoninicio, INPUT);
  pinMode(Cilindrotapa, OUTPUT);
  pinMode(Entradavacio, OUTPUT);
  pinMode(Escapevacio, OUTPUT);
  




  //Iniciar LCD
  lcd.init();
  lcd.init();
  //Imprimir mensaje LCD
  lcd.backlight();
  lcd.setCursor(1,0);
  lcd.print("*****************");
  lcd.setCursor(5,1);
  lcd.print("BLACKONION");
  lcd.setCursor(5,2);
  lcd.print("INDUSTRIES");
  lcd.setCursor(1,3);
  lcd.print("******************");
  delay(3000);
  lcd.clear();


  
}

void loop() {

  
  //Seteo de datos
  ValorBoton=digitalRead(Botoninicio);
  Serial.println(ValorBoton);
  
  ValorVacuostato=analogRead(Vacuostato); //Realizar lectura vacuostato
  ValorPresostato=analogRead(Presostato); //Realizar lectura presostato
  ValorPotenciometro=analogRead(Potenciometro); //Realizar lectura potenciometro
  

 


  //Función tiempo en segundos
  TiempoVacio=map(ValorPotenciometro,0,1023,60000,600000); //Mapeo datos potenciometro
  SegundosVacio=(TiempoVacio/Segundos); //Paso de valores potenciometro a segundos
    Serial.println(SegundosVacio);
    lcd.backlight();
    lcd.setCursor(9,0);
    lcd.print("TIME:");
    lcd.setCursor(14,0);
    lcd.print(SegundosVacio);
    

    
  //Configuración vacuostato
  if(ValorVacuostato<=500){
    Serial.println("Vacio:OK");
    lcd.backlight();
    lcd.setCursor(0,1);
    lcd.print("VAC:OK"); 
  }else{
    Serial.println("Vacio:BAD");
    lcd.backlight();
    lcd.setCursor(0,1);
    lcd.print("VAC:BAD");
  }



  //Configuración presostato
  if(ValorPresostato<=500){
    Serial.println("Presion:OK");
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("PRE:OK");
  }else{
    Serial.println("Presion:BAD");
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("PRE:BAD");
  }

//********************************************************

  //Condición inicio loop
  if((ValorVacuostato<=500&&ValorPresostato<=500&&ValorBoton)==1){

//********************************************************
    
  //Ciclo de las valvulas
    digitalWrite(Cilindrotapa, HIGH);
    delay (2000);

    digitalWrite(Cilindrotapa, HIGH);
    digitalWrite(Entradavacio, HIGH);
    delay (TiempoVacio);   //Tiempo potenciometro

    digitalWrite(Cilindrotapa, HIGH);
    digitalWrite(Entradavacio, LOW);
    digitalWrite(Escapevacio, HIGH);
    delay(10000);

    digitalWrite(Cilindrotapa, LOW);
    digitalWrite(Entradavacio, LOW);
    digitalWrite(Escapevacio, LOW);

//********************************************************
    
    }else{
    digitalWrite(Cilindrotapa, LOW);
    digitalWrite(Entradavacio, LOW);
    digitalWrite(Escapevacio, LOW);    
    }
     
}

Tu problema son los Delays, no puedes usarlos. Cuando los utilizas le dices al microprocesador que no haga nada, y cuando presionas el pulsador, en un delay, lo ignora. Lamentablemente tienes que escribir nuevamente todo el código utilizando la función millis .
Saludos

Muy bien posteado!!

Ve a Documentación y lee sobre millis()

Buenas tardes chic@s!!!
Hace unos días que solucione el problema, entendiendo mills, y el programa y sus funciones he conseguido que funcionen perfectamente como yo quiero.
Dejo por aquí el código, por si a alguien le sirviera de ayuda.

 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>
 
 int boton=5;
 int interruptor=13;
 int lecturaboton_old=1; 

 int tapa=4;
 int entradavacio=3;
 int escapevacio=2;

 int potenciometro=A3;
 long tiempovacio;
 float segundosvacio;
 float tiempopantalla;
 
 
 int presostato=A1;
 int valorpresion;
 
 int vacuostato=A0;
 int valorvacio;
 
 unsigned long t;

 LiquidCrystal_I2C lcd(0x27,20,4);
 
void setup() {
  Serial.begin(9600);

//setup interruptor  
  pinMode(boton,INPUT_PULLUP);
  pinMode(interruptor,OUTPUT);

//setup valvulas
  pinMode(tapa,OUTPUT);
  pinMode(entradavacio,OUTPUT);
  pinMode(escapevacio,OUTPUT);

//setup sensores
  pinMode(potenciometro,INPUT);
  pinMode(presostato,INPUT);
  pinMode(vacuostato,INPUT);

//iniciado de la pantalla
  lcd.init();
  lcd.init();
  //Imprimir mensaje LCD
  lcd.backlight();
  lcd.setCursor(1,0);
  lcd.print("*****************");
  lcd.setCursor(5,1);
  lcd.print("BLACKONION");
  lcd.setCursor(5,2);
  lcd.print("INDUSTRIES");
  lcd.setCursor(1,3);
  lcd.print("******************");
  delay(3000);
  lcd.clear();
}

void loop(){
 
//Interruptor
int lecturaboton=digitalRead(boton);
  if(lecturaboton!=lecturaboton_old){
    if(lecturaboton==0){
    int lecturainterruptor=digitalRead(interruptor);
    digitalWrite(interruptor,!lecturainterruptor);
    }
  }
lecturaboton_old=lecturaboton;

//Presostato
long presion=analogRead(presostato);
  if(presion<=500){
  valorpresion=1;    
  }

//Vacuostato
long vacio=analogRead(vacuostato);
  if(vacio<=500){
  valorvacio=1;    
  }  

//Potenciometro
long valorpotenciometro=analogRead(potenciometro);
  tiempovacio=map(valorpotenciometro,0,1023,1,19);
  segundosvacio=map(tiempovacio,1,19,60000,600000);
  
//Ciclo de las valvulas
int lecturainterruptor=digitalRead(interruptor);
  if(lecturainterruptor&&valorpresion&&valorvacio==1){
    lcd.backlight();
    lcd.setCursor(0,3);
    lcd.print("WORKING");
    digitalWrite(tapa,HIGH);
    if(millis()-t>=2000){
    digitalWrite(tapa,HIGH);
    digitalWrite(entradavacio,HIGH);
      if(millis()-t>=segundosvacio){
      digitalWrite(tapa,HIGH);
      digitalWrite(entradavacio,LOW);
      digitalWrite(escapevacio,HIGH);
        if(millis()-t>=(segundosvacio+10000)){
        digitalWrite(tapa,LOW);
        digitalWrite(entradavacio,LOW);
        digitalWrite(escapevacio,LOW);
        digitalWrite(interruptor,LOW);
        valorpresion=!valorpresion;
        valorvacio=!valorvacio;
        }
      }   
    }
  }
  else{
    t=millis();
    digitalWrite(interruptor,LOW); 
    }
  if(lecturainterruptor==0){
    digitalWrite(tapa,LOW);
    digitalWrite(entradavacio,LOW);
    digitalWrite(escapevacio,LOW);    
    }



    
//Pantalla


  //Vacio
  if(vacio<=500){
    lcd.backlight();
    lcd.setCursor(0,1);
    lcd.print("VAC:OK"); 
    }
  else{
    lcd.backlight();
    lcd.setCursor(0,1);
    lcd.print("VAC:BAD");
    }

    
  //Presion
  if(presion<=500){
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("PRE:OK");
    }
  else{
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("PRE:BAD");
    }


  //LOADING
  if(presion<=500&&vacio<=500){
    lcd.backlight();
    lcd.setCursor(0,3);
    lcd.print("READY");
    }
  else{
    lcd.backlight();
    lcd.setCursor(0,3);
    lcd.print("LOADING...");
    }   

     
  //Tiempo
    tiempopantalla=(segundosvacio/60000);
    Serial.println(lecturaboton);
    Serial.println(tiempopantalla);
    lcd.backlight();
    lcd.setCursor(9,0);
    lcd.print("TIME:");
    lcd.setCursor(14,0);
    lcd.print(tiempopantalla,2);
  
}

Sin embargo, me he topado con otro problema. El LCD.
Si añado un lcd.clear(); al final del sketch a la pantalla le da un tabardillo, como que parpadea,etc.
Pero si no lo pongo, no me escribe bien cuando pasa de una palabra o numero largo, a uno mas corto.
Adjunto unas imágenes para que veáis mi problema, y me digáis como puedo atacarlo.


Muchas gracias a tod@s

P.d:No se si seria necesario abrir un post con el nuevo problema. En dicho caso, pido disculpas, y abro un hilo nuevo.

Para "VAC:OK", "PRE:OK" y "READY" lo solucionas fácilmente agregando espacios.
"VAC:OK_", "PRE:OK_" y "READY_____" (simbolizo los espacios con guion bajo para que se note mejor).
Así lo que imprimes por una u otra opción ocupa la misma cantidad de caracteres.

Si tienes que imprimir números puedes hacer lo mismo (agregar espacios) o usar sprintf() para darle formato (más o menos) a tu gusto.

Saludos

Buenas tardes
Muchas gracias, ya he solucionado mi problema con los espacios, nunca pensé que tendría una solución tan simple.

Para finalizar, pido disculpas, por generar tantos problemas.
El ultimo problema, con el que me topo para ver finalizado mi proyecto es el siguiente, ya que no se si los es, o es normal.
La pantalla, al encender la "maquina" mete un flashazo, se apaga, y luego se enciende.
Esto es culpa del código, o de conexionado.
He intentado subir un video, pero no me lo permite la plataforma.

Al menos el display que tengo yo hace lo mismo.
La verdad nunca me puse a ver si es la librería o el chip I2C el que lo provoca.

Saludos

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