He estado trabajando en un proyecto propio utilizando un sensor de flujo de agua, un lcd y un keypad y la idea es:
Insertar una medida de agua en litros.
Medir y mostrar en pantalla cuando esa cantidad halla cruzado.
Pedir una nueva medida.
Pero después del primer ciclo, el programa deja de reconocer el keypad.
He buscado mucho y encontré que podría ser o la memoria o el uso de la función delay, respecto a estas sugerencias:
La memoria que resta son 1623, lo cual creo que es suficiente y para el segundo... remplacé delay por la función millis, y funciona exactamente igual que con delay, el primer ciclo sí y luego no. Agracería que me apoyaran.
// Bibliotecas. *************************************************************************
#include <LiquidCrystal.h>
#include <Keypad.h>
// Variables. ***************************************************************************
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
byte rowPins[4] = {13,12,11,10}; //connect to the row pinouts of the keypad
byte colPins[3] = {9,8,7}; //connect to the column pinouts of the keypad
volatile int rpmcont;
int ante = 0;
int Calc;
int cont;
int meta;
byte porcentaje;
byte STEP = 0;
char key;
float Vol;
char keys[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, 4, 3);
// Funciones. ***************************************************************************
void rpm ()
{
rpmcont++;
}
void ImprimirPantallaBase (){
lcd.clear();
cont = 3;
meta = 0;
porcentaje = 0;
rpmcont = 0;
Vol = 0;
lcd.setCursor(2,1);
lcd.print("0 rpm");
lcd.setCursor(2,0);
lcd.print("0 L/min");
lcd.setCursor(14,0);
lcd.print("0%");
lcd.setCursor(14,1);
lcd.print("ml");
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
STEP = 1;
}
void Tempo(int t){
int a,b;
a = millis();
while(millis() - a <= t){}
}
void LeerVolumen (){
key = keypad.getKey();
if (cont >= 0){
if(key == '0'){
Vol = Vol + 0*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('0');
}
if(key == '1'){
Vol = Vol + 1*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('1');
}
if(key == '2'){
Vol = Vol + 2*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('2');
}
if(key == '3'){
Vol = Vol + 3*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('3');
}
if(key == '4'){
Vol = Vol + 4*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('4');
}
if(key == '5'){
Vol = Vol + 5*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('5');
}
if(key == '6'){
Vol = Vol + 6*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('6');
}
if(key == '7'){
Vol = Vol + 7*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('7');
}
if(key == '8'){
Vol = Vol + 8*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('8');
}
if(key == '9'){
Vol = Vol + 9*pow(10,cont);
cont = cont-1;
lcd.setCursor(11-cont,1);
lcd.print('9');
}
}
else{
STEP = 2;
}
}
void FijarMeta(){
meta = ceil(Vol);
ante = meta;
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(9,1);
if(meta >= 0 && meta < 10){lcd.print(' '); lcd.print(' '); lcd.print(' ');}
if(meta >= 10 && meta < 100){lcd.print(' '); lcd.print(' ');}
if(meta >= 100 && meta < 1000){lcd.print(' ');}
lcd.print(meta);
lcd.setCursor(14,1);
lcd.print("ml");
STEP = 3;
}
void Llenar(){
rpmcont = 0;
sei();
Tempo(200);
cli();
Calc = rpmcont*5/7.5;
lcd.setCursor(1,0);
if (Calc < 10){lcd.print(" ");}
lcd.print(Calc);
lcd.setCursor(4,0);
lcd.print("L/min");
lcd.setCursor(0,1);
if (rpmcont < 10){lcd.print(" ");}
else if (rpmcont >= 10 && rpmcont < 100){lcd.print(" ");}
lcd.print(rpmcont);
lcd.setCursor(4,1);
lcd.print("rpm");
attachInterrupt(1,rpm,RISING);
Vol = Vol - 1000*Calc/60/5;
porcentaje = (meta - Vol)/meta*100;
if (Vol >= 250){
digitalWrite(6,HIGH);
digitalWrite(5,LOW);
digitalWrite(4,HIGH);
}
else{
digitalWrite(6,LOW);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
}
lcd.setCursor(12,0);
if (porcentaje < 10){lcd.print(" ");}
else if (porcentaje >= 10 && porcentaje < 100){lcd.print(" ");}
lcd.print(porcentaje);
lcd.print("%");
lcd.setCursor(9,1);
if (Vol > -100 && Vol <= -10){lcd.print(" ");}
else if (Vol > -10 && Vol < 0){lcd.print(" ");}
else if (Vol >= 0 && Vol < 10){lcd.print(" ");}
else if (Vol >= 10 && Vol < 100){lcd.print(" ");}
else if (Vol >= 100 && Vol < 1000){lcd.print(" ");}
lcd.print(int(Vol));
if(Vol <= 0){STEP = 5;}
}
// Setup. *******************************************************************************
void setup(){
Serial.begin(9600);
lcd.clear();
lcd.begin(16,2);
attachInterrupt(1,rpm,RISING);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(4,OUTPUT);
rpmcont = 0;
}
// Loop. ********************************************************************************
void loop(){
if (STEP == 0){
ImprimirPantallaBase();
}
else if (STEP == 1){
LeerVolumen();
}
else if (STEP == 2){
FijarMeta();
}
else if (STEP == 3) {
digitalWrite(6,LOW);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
STEP = 4;
}
else if (STEP == 4){
Llenar();
}
else if (STEP == 5){
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
STEP = 6;
}
else{
STEP = STEP - 6;
}
}