Buen día.
Espero me puedan orientar con un proyecto que tengo en preparacion.
Con un sensor de flujo el FS300A y un display 16x2 y su debido codigo me muestra informacion relativamente correcta hemos llenado una cubeta de 20 litros y ha sido muy cercana la cantidad.
Pero al hacer el codigo agregando un teclado matricial y un relee, cambiando el codigo para que despues de cierta cantidad de litros desactive el relee no me regresa al menu principal. Anexo el codigo esperando me puedan orientar por favor gracias.
Solo se ejecuta una vez el codigo si selecciono del menu el 1 si mide abre y cierra el relee pero cuando termina la condicion no me regresa al menu principal.
Tengo arduino uno, teclado matricial 4x4, display 16x2, relevador de 2 canales y sensor de flujo FS300A.
Saludos.
#include <Key.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
const byte filas = 4; //Numero de filas del teclado
const byte columnas = 4; //Numero de columnas del teclado
const int sensorPin = 2;
const int measureInterval = 2500;
volatile int pulseConter;
int relay = 11;
// FS300A
const float factorK = 5.5;
float volume = 0;
long t0 = 0;
//Defino una matriz 4x4 con la posicion de las filas y columnas
char matriz[filas][columnas] =
{
{ '1', '2', '3', 'A'},
{ '4', '5', '6', 'B'},
{ '7', '8', '9', 'C'},
{ '*', '0', '#', 'D'},
};
byte pinesFilas[filas] = {10, 9, 8, 7}; //Pines donde van conectadas las filas del teclado
byte pinesColumnas[columnas] = {6, 5, 4, 3}; //Pines donde van conectadas las columnas del teclado
//Inicializo el teclado con el numero de filas, columnas, los pines del Arduino utilizados y la matriz
Keypad teclado = Keypad( makeKeymap(matriz), pinesFilas, pinesColumnas, filas, columnas);
//Variables para el control de la posicion del cursor
int posX = 0;
int posY = 0;
//Variales para el control de las teclas
char presionando;
int veces_presionada = 0;
//Variables para el control del contador, ya que no se usa ningun delay() en este codigo
unsigned long tiempo_anterior = 0;
int periodo = 500; //500 milisegundos
void ISRCountPulse()
{
pulseConter++;
}
float GetFrequency()
{
pulseConter = 0;
interrupts();
delay(measureInterval);
noInterrupts();
return (float)pulseConter * 1000 / measureInterval;
}
void SumVolume(float dV)
{
volume += dV / 60 * (millis() - t0) / 1000.0;
t0 = millis();
}
// iniciamos la libreria con el nimero de pines de la interfas
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
//Pines donde va conectada la pantalla (RS, E, D4, D5, D6, D7))
void setup() {
pinMode(relay, OUTPUT);
//indicamos a la LCD el número de columnas y filas
lcd.begin(16, 2);
// imprime un mensaje en la LCD
lcd.print("Medidor de Flujo");
lcd.setCursor(0,1);
lcd.print("Sistemas Andalucia");
delay (1000);
lcd.clear();
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(sensorPin), ISRCountPulse, RISING);
t0 = millis();
}
void loop() {
lcd.setCursor(0,0);
lcd.print("1.- 400l");
lcd.setCursor(8,0);
lcd.print("2.- 600l");
char tecla_presionada = teclado.getKey(); //Almacena la tecla presionada
switch (tecla_presionada) //Switch-case de acuerdo a la tecla presionada
{
case '1': //La tecla 1 es para 400 l
do {
digitalWrite(relay, LOW);
// obtener frecuencia en Hz
float frequency = GetFrequency();
// calcular caudal L/min
float flow_Lmin = frequency / factorK;
SumVolume(flow_Lmin);
lcd.setCursor(0,0);
lcd.print("Sistemas Andalucia");
lcd.setCursor(0,1);
lcd.print(flow_Lmin, 1);
lcd.print(" L/m");
lcd.setCursor(8,1);
lcd.print("C ");
lcd.print(volume, 1);
lcd.print(" L");
}
while (volume<3);
digitalWrite(relay, HIGH);
break;
case '2': //La tecla 1 es para 400 l
do {
digitalWrite(relay, LOW);
// obtener frecuencia en Hz
float frequency = GetFrequency();
// calcular caudal L/min
float flow_Lmin = frequency / factorK;
SumVolume(flow_Lmin);
lcd.setCursor(0,0);
lcd.print("Sistemas Andalucia");
lcd.setCursor(0,1);
lcd.print(flow_Lmin, 1);
lcd.print(" L/m");
lcd.setCursor(8,1);
lcd.print("C ");
lcd.print(volume, 1);
lcd.print(" L");
}
while (volume<4);
digitalWrite(relay, HIGH);
break;
}
}