buenos dias amigos, estoy programando la lectura de 4 sensores de flujo de agua en 3 pantallas lcd 16x2 i2c mediante arduino mega (en base a codigos que encontre en diferentes paginas) y un keypad 4x4. Programe parte por parte cada cosa, es decir primero la lactura del sensor de flujo y funciona perfecto, programe el keypad en cual utilizo el switch case dentro del void loop() para que me made dierentes mensajes en cada lcd segun presione el bton A,B,C,D del keypad y tambien funciono.
ahora junte todo, y por ejemplo si presiona A del keypad deberia leerme valores de 2 sensores de flujo, si presiono B, deberia leerme valores de otros 2 sensores de flujo. no funciono :’(, no me error al compilar ni al enviar al arduino. Al presionar A, las lcd se encienden, se muestran los mensajes pero no lee el sensor a menos que presione continuamente A en el keypad.
switch(customKey)
{
case '0' ... '9': // Alamacena el valor hasta que presionemos "ABCD"
lcd2.clear();
lcd3.clear();
lcd2.setCursor(0,0);
lcd2.print("--> PROGRAMA B");
lcd3.setCursor(0,0);
lcd3.print("VOL. REQUERIDO");
lcd3.setCursor(0,1);
first = first * 10 + (customKey - '0');
lcd3.print(first);
lcd3.print(" Litros");
break;
case 'A':
lcd2.clear();
lcd3.clear();
lcd2.print("--> PROGRAMA A");
lcd3.print("INICIANDO");
lcd3.setCursor(0,1);
lcd3.print("PROGRAMA A");
digitalWrite(22, HIGH); //Abrimos la valvula solenoide
// Cada segundo calculamos e imprimimos el caudal y el número de litros consumidos
if(millis() - tiempoAnterior > 1000)
{
// Realizo los cálculos
tiempoAnterior = millis(); // Actualizo el nuevo tiempo
pulsos_Acumulados1 += pulsos1; // Número de pulsos acumulados
pulsos_Acumulados2 += pulsos2; // Número de pulsos acumulados
litros_Hora1 = (pulsos1 * 60 / 6.67); // Q = frecuencia * 60/ 7.5 (L/Hora)
litros_Hora2 = (pulsos2 * 60 / 6.67); // Q = frecuencia * 60/ 7.5 (L/Hora)
litros = pulsos_Acumulados2*1.0/450; // Cada 450 pulsos son un litro
pulsos1 = 0; // Pongo nuevamente el número de pulsos a cero
pulsos2 = 0; // Pongo nuevamente el número de pulsos a cero
// Llamada a la función que muestra los resultados en el LCD 1602
LCD_1602();
}
break;
case 'B':
lcd2.clear();
lcd3.clear();
if(first<10 || first>4000){
lcd2.print("--> PROGRAMA B");
lcd3.print(first);
lcd3.print(" Litros");
lcd3.setCursor(0,1);
lcd3.print("Fuera de rango");
}
else{
lcd2.print("--> PROGRAMA B");
lcd3.print("INICIANDO");
lcd3.setCursor(0,1);
lcd3.print("PROGRAMA B");
digitalWrite(22, HIGH); //Abrimos la valvula solenoide
}
break;
case 'C':
lcd2.clear();
lcd2.print("--> PROGRAMA C");
lcd3.clear();
lcd3.print("INICIANDO");
lcd3.setCursor(0,1);
lcd3.print("REGENERACION");
break;
case 'D':
lcd1.clear();
lcd2.clear();
lcd3.clear();
lcd3.print("PROCESO TERMINADO");
digitalWrite(22, LOW); //Cerramos la valvula
digitalWrite(24, LOW); //apagamos la bomba
first=0;
delay(1000);
lcd3.clear();
lcd1.print("DESIONIZACION");
lcd1.setCursor(0,1);
lcd1.print("ELIJA UNA OPCION");
lcd2.print("ESPERANDO ORDENES");
lcd2.setCursor(0,1);
lcd2.print("DESDE EL KEYPAD");
lcd3.print("VALVULA CERRADA");
lcd3.setCursor(0,1);
lcd3.print("NO HAY FLUJO");
break;
case '#':
lcd2.clear();
lcd2.print("ESPERANDO ORDENES");
lcd2.setCursor(0,1);
lcd2.print("DESDE EL KEYPAD");
first=0;
break;
}
}
void LCD_1602()
{
lcd1.clear();
lcd1.print("COL CATIONICA");
lcd1.setCursor(0,1);
lcd1.print("Flujo=");
lcd1.print(litros_Hora1, 2);
lcd1.print(" L/h");
lcd2.clear();
lcd2.print("COL ANIONICA");
lcd2.setCursor(0,1);
lcd2.print("Flujo=");
lcd2.print(litros_Hora2, 2);
lcd2.print(" L/h");
lcd3.clear();
lcd3.print("VOL TRATADO");
lcd3.setCursor(0,1);
lcd3.print("Volumen=");
lcd3.print(litros,2);
lcd3.print(" L");
}
solo coloque desde el void pues todo lo demas funciona, deberia presionar A en el keypad una sola vez y el sensor deberia poder leerse continuamente, en cambio tengo que presionar muchas veces y en cada vez me lee una vez el sensor tmb, ayuda por favor, soy novato en esto.