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

const int motor_up=2; //Pin de salida digital para subir la plataforma
const int motor_down=3; //Pin de salida digital para bajar la plataforma

const int ind_error=27; //Pin del indicador de error
const int ind_pt=26; //Pin del indicador de proceso sin errores

const int boton=28; //Pin de entrada del boton de inicio

LiquidCrystal_I2C lcd(0x27, 20, 4); //Declaracion del LCD, con dimensiones
                                    //y direccion del modulo i2c
void setup() {
  Wire.setSDA(0); //Configuración e inicialización de los pines SDA y SCL
  Wire.setSCL(1); //para modulo i2c de la LCD
  Wire.begin();


  lcd.init(); //Inicialización de LCD
  lcd.backlight();
  lcd.begin(0,2);
  lcd.print("Prueba de"); //Escritura del primer mensaje "prueba de continuidad"
  lcd.setCursor(2, 1);
  lcd.print("continuidad");

  pinMode(boton, INPUT);      //Configuración de entradas y salidas para
  pinMode(motor_down, OUTPUT);//el boton, la plataforma y los indicadores
  pinMode(motor_up, OUTPUT);
  pinMode(ind_error, OUTPUT);
  pinMode(ind_pt, OUTPUT);

  for (int i=4; i<=18;i+=2){

    pinMode(i,OUTPUT); //Configuración de los pines para enviar pulso
  }

  for(int j=5;j<=19;j+=2){

    pinMode(j,INPUT);//Configuración de los pines de lectura de pulso
  }

}


void sendPulse(int a,int e){ //Función de enviar pulso
  if (e!=0){              //La función enciende o apaga el pulso del pin
    digitalWrite(a,HIGH);//indicado con la letra "a"
    delay(100);
  }
  else{
    digitalWrite(a,LOW);
  }
}

void plataforma(int x){//Función plataforma
                            //Esta función baja o sube la plataforma con 
  if (x==1){                //las puntas de prueba, al bajar muestra el 
    lcd.print("Realizando");//mensaje "Realizando prueba"
    lcd.setCursor(2, 1);
    lcd.print("Prueba");
    digitalWrite(motor_down,HIGH);
    delay(1000);
    digitalWrite(motor_down,LOW);
  }
  else{
    digitalWrite(motor_up,HIGH);
    delay(1000);
    digitalWrite(motor_up,LOW);
  }
}

bool test(){ //Función test, se encarga de realizar la prueba
  bool err=false; //Variable de retorno "false" si no hay errores, "true" si hay alguna falla
  plataforma(1); //Se baja la plataforma
  int a=1;
  lcd.clear(); //Se limpia el LCD
  lcd.print("Probando galleta"); //Se imprime "Probando galleta"
  for (int i=4;i<=18;i+=2){ //ciclo for para pasar por todas las galletas
    
    sendPulse(i,1); //Se enivia un pulso a la galleta
    lcd.setCursor(2, 1);
    lcd.print(a); //Se imprime el numero de la galleta que se está probando 
    if (digitalRead((i+1))==LOW){ //Si no se recibe señal 
      sendPulse(i,0);             //Se apaga el pulso
      lcd.clear();                //y se imprime el mensaje de fallo 
      lcd.setCursor(0, 0);        //junto al numero de la galleta
      lcd.print("fallo en galleta");
      lcd.setCursor(2, 1);
      lcd.print(a);
      digitalWrite(ind_error,HIGH); //Se enciende el indicador de error 
      err= true;
      break;                      // y se detiene el proceso de pruebas

    }
    sendPulse(i,0); //se apaga el pulso 
    a++;
  }
  plataforma(0); //Se sube la plataforma
  return err; //Se retorna si hubo o no hubo un error
}

void loop() {

  if (digitalRead(boton)==HIGH){ //Si el boton se presiona se reinician
    digitalWrite(ind_error,LOW); //Los indicadores y la LCD
    digitalWrite(ind_pt,LOW);    
    lcd.clear();
    if (test()==false){         //Se realiza la prueba y se verifica si
      lcd.clear();              //hubo algun error, de lo contrario se
      lcd.print("Sin fallas");  //enciende el indicador verde y se muestra
      digitalWrite(ind_pt, HIGH); //Sin fallas
    }
  }

  delay(1); //Solo sirve para darle fluidez a la simulación
}
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT