Hola, el incoveniente que tengo es que cuando agrego las lineas para incluir un reloj en el schetch de flujo se me queda como colgado y en el serial muestra Imagen 01
Creo que el problema esta en las interupciones, he colocado unas lineas como esta
noInterrupts()
...codigo...
Interrupts()
y no he tenido buenos resultados
Codigo del reloj por un lado, funcionó , salida imagen 03
#include <Wire.h> // incluye libreria para interfaz I2C
#include <RTClib.h> // incluye libreria para el manejo del modulo RTC
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
void setup () {
Serial.begin(9600); // inicializa comunicacion serie a 9600 bps
if (! rtc.begin()) { // si falla la inicializacion del modulo
Serial.println("Modulo RTC no encontrado !"); // muestra mensaje de error
while (1); // bucle infinito que detiene ejecucion del programa
}
}
void loop () {
DateTime fecha = rtc.now(); // funcion que devuelve fecha y horario en formato
// DateTime y asigna a variable fecha
Serial.print(fecha.day()); // funcion que obtiene el dia de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.month()); // funcion que obtiene el mes de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.year()); // funcion que obtiene el año de la fecha completa
Serial.print(" "); // caracter espacio en blanco como separador
Serial.print(fecha.hour()); // funcion que obtiene la hora de la fecha completa
Serial.print(":"); // caracter dos puntos como separador
Serial.print(fecha.minute()); // funcion que obtiene los minutos de la fecha completa
Serial.print(":"); // caracter dos puntos como separador
Serial.println(fecha.second()); // funcion que obtiene los segundos de la fecha completa
delay(1000); // demora de 1 segundo
}
El codigo para medición de flujo de liquido (agua), funcionó , salida imagen 02
volatile int NumPulsos; //variable para la cantidad de pulsos recibidos
int PinSensor = 2; //Sensor conectado en el pin 2
float factor_conversion=7.11; //para convertir de frecuencia a caudal
float volumen=0;
long dt=0; //variación de tiempo por cada bucle
long t0=0; //millis() del bucle anterior
//---Función que se ejecuta en interrupción---------------
void ContarPulsos ()
{
NumPulsos++; //incrementamos la variable de pulsos
}
//---Función para obtener frecuencia de los pulsos--------
int ObtenerFrecuecia()
{
int frecuencia;
NumPulsos = 0; //Ponemos a 0 el número de pulsos
interrupts(); //Habilitamos las interrupciones
delay(1000); //muestra de 1 segundo
noInterrupts(); //Deshabilitamos las interrupciones
frecuencia=NumPulsos; //Hz(pulsos por segundo)
return frecuencia;
}
void setup()
{
Serial.begin(9600);
pinMode(PinSensor, INPUT);
attachInterrupt(0,ContarPulsos,RISING); //(Interrupción 0(Pin2),función,Flanco de subida)
Serial.println ("Envie 'r' para restablecer el volumen a 0 Litros");
t0=millis();
}
void loop ()
{
if (Serial.available()) {
if(Serial.read()=='r')volumen=0; //restablecemos el volumen si recibimos 'r'
}
float frecuencia=ObtenerFrecuecia(); //obtenemos la frecuencia de los pulsos en Hz
float caudal_L_m=frecuencia/factor_conversion; //calculamos el caudal en L/m
dt=millis()-t0; //calculamos la variación de tiempo
t0=millis();
volumen=volumen+(caudal_L_m/60)*(dt/1000); // volumen(L)=caudal(L/s)*tiempo(s)
//-----Enviamos por el puerto serie---------------
Serial.print ("Caudal: ");
Serial.print (caudal_L_m,3);
Serial.print ("L/min\tVolumen: ");
Serial.print (volumen,3);
Serial.println (" L");
}
Pero cuando las integro se me cuelga, y obtengo como resultado em serial imagen 01
volatile int NumPulsos; //variable para la cantidad de pulsos recibidos
int PinSensor = 2; //Sensor conectado en el pin 2
float factor_conversion = 7.50; //para convertir de frecuencia a caudal
float volumen = 0;
long dt = 0; //variación de tiempo por cada bucle
long t0 = 0; //millis() del bucle anterior
//---Función que se ejecuta en interrupción---------------
void ContarPulsos ()
{
NumPulsos++; //incrementamos la variable de pulsos
}
//---Función para obtener frecuencia de los pulsos--------
int ObtenerFrecuecia()
{
int frecuencia;
NumPulsos = 0; //Ponemos a 0 el número de pulsos
interrupts(); //Habilitamos las interrupciones
delay(1000); //muestra de 1 segundo
noInterrupts(); //Deshabilitamos las interrupciones
frecuencia = NumPulsos; //Hz(pulsos por segundo)
return frecuencia;
}
//***********************
#include <Wire.h> // incluye libreria para interfaz I2C
#include <RTClib.h> // incluye libreria para el manejo del modulo RTC
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
//***********************
void setup()
{
Serial.begin(9600);
pinMode(PinSensor, INPUT);
attachInterrupt(0, ContarPulsos, RISING); //(Interrupción 0(Pin2),función,Flanco de subida)
Serial.println ("Envie 'r' para restablecer el volumen a 0 Litros");
t0 = millis();
//***********************
if (! rtc.begin()) { // si falla la inicializacion del modulo
Serial.println("Modulo RTC no encontrado !"); // muestra mensaje de error
while (1); // bucle infinito que detiene ejecucion del programa
}
//***********************
}
void loop ()
{
//***********************
DateTime fecha = rtc.now(); // funcion que devuelve fecha y horario en formato
// DateTime y asigna a variable fecha
Serial.print(fecha.day()); // funcion que obtiene el dia de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.month()); // funcion que obtiene el mes de la fecha completa
Serial.print("/"); // caracter barra como separador
Serial.print(fecha.year()); // funcion que obtiene el año de la fecha completa
Serial.print(" "); // caracter espacio en blanco como separador
Serial.print(fecha.hour()); // funcion que obtiene la hora de la fecha completa
Serial.print(":"); // caracter dos puntos como separador
Serial.print(fecha.minute()); // funcion que obtiene los minutos de la fecha completa
Serial.print(":"); // caracter dos puntos como separador// put your main code here, to run repeatedly:
Serial.println(fecha.second());
//***********************
if (Serial.available()) {
if (Serial.read() == 'r')volumen = 0; //restablecemos el volumen si recibimos 'r'
}
float frecuencia = ObtenerFrecuecia(); //obtenemos la frecuencia de los pulsos en Hz
float caudal_L_m = frecuencia / factor_conversion; //calculamos el caudal en L/m
dt = millis() - t0; //calculamos la variación de tiempo
t0 = millis();
volumen = volumen + (caudal_L_m / 60) * (dt / 1000); // volumen(L)=caudal(L/s)*tiempo(s)
//-----Enviamos por el puerto serie---------------
Serial.print ("Caudal: ");
Serial.print (caudal_L_m, 3);
Serial.print ("L/min\tVolumen: ");
Serial.print (volumen, 3);
Serial.println (" L");
}
A la conclución que llegue es que cuando comento la linea
DateTime fecha = rtc.now();
ya no se cuelga, pero me quedo sin reloj. Por lo que lei puede ser conflicto con las interrupciones pero no logro solucionarlo.
Bueno, gracias por detenerse a leer, espero tu ayuda