Hola,
Esta es mi primera publicacion en el foro y tambien son mis primeros pasos con ARDUINO.
Estoy tratando de programar un sistema para un acuario con las siguientes funciones:
*Medir caudal
*Medir temperatura del agua
*Mostrar todo en un display
*Mostrar la fecha en el display
Materiales:
1 Arduino UNO
1 LCD 2004
1 RTA DS1307
1 Caudalimetro yf-s201
1 sensor de temp. Ds18b20
Intension de utilizar un Buzzer Activo
Hasta el momento logre todo esto paseando por muchos foros, pero me gustaria agregarle un detalle mas, quisiera aprovechar un Buzzer activo que tengo y ponerle una alarma para temperaturas por debajo o por arriba de un rango que yo programe. No parece dificil pero ya me estoy haciendo un lio terrible.
les dejo mi codigo aca abajo:
// Importar librerías
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // Librería comunicación I2C
#include <LiquidCrystal_I2C.h> // Librería LCD I2C
#include "RTClib.h" // Para la hora
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = 0;
RTC_DS1307 rtc; //Para la hora
// Declaración del objeto para el LCD
// Poner la dirección del LCD a 0x20 para display 20x4 (A0=0, A1=0, A2=0)
// Terminales de conexión del LCD
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
const int sensor = 2; // Pin digital para el sensor de flujo YF-S201
int litros_Hora; // Variable que almacena el caudal (L/hora)
volatile int pulsos = 0; // Variable que almacena el número de pulsos
unsigned long tiempoAnterior = 0; // Variable para calcular el tiempo transcurrido
unsigned long pulsos_Acumulados = 0; // Variable que almacena el número de pulsos acumulados
float litros; // // Variable que almacena el número de litros acumulados
// Rutina de servicio de la interrupción (ISR)
void flujo()
{
pulsos++; // Incrementa en una unidad el número de pulsos
}
void setup()
{
pinMode(sensor, INPUT_PULLUP); // Pin digital como entrada con conexión PULL-UP interna
lcd.begin(20,4); // Inicializo el LCD 2004
interrupts(); // Habilito las interrupciones
// Interrupción INT0, llama a la ISR llamada "flujo" en cada flanco de subida en el pin digital 2
attachInterrupt(digitalPinToInterrupt(sensor), flujo, RISING);
tiempoAnterior = millis(); // Guardo el tiempo que tarda el ejecutarse el setup
}
void loop ()
{
// 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_Acumulados += pulsos; // Número de pulsos acumulados
litros_Hora = (pulsos * 60 / 7.11); // Q = frecuencia * 60/ 7.5 (L/Hora)
litros = pulsos_Acumulados*1.0/450; // Cada 450 pulsos son un litro
pulsos = 0; // Pongo nuevamente el número de pulsos a cero
// Llamada a la función que muestra los resultados en el LCD 2004
LCD_2004();
}
sensors.requestTemperatures();
tempC = sensors.getTempCByIndex(0);
delay(1000);
}
// Función que muestra los resultados en el LCD 2004
void LCD_2004()
{
DateTime now = rtc.now(); //para la hora
// Imprimo la cabecera del sistema
lcd.clear();
lcd.setCursor(0,0);
//mostramos fecha y hora
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
//fin fecha y hora
lcd.setCursor(0,1);
//Temperatura
lcd.print("-> Temp: ");
lcd.print(tempC);
lcd.print(" *C");
// Presento los valores a través del LCD 2004
lcd.setCursor(0,2);
// Imprimo el caudal en L/hora
lcd.print("-> ");
lcd.print(litros_Hora, DEC);
lcd.print(" L/Hora");
lcd.setCursor(0,3);
// Imprimo el número de litros acumulados
lcd.print("-> ");
lcd.print(litros);
lcd.print(" Litros");
}