CAP8 - Controlando el nivel del agua. Boya de nivel

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
Buenas a todos y feliz año!

En este capítulo vamos a hacer algo realmente sencillo y por otro lado muy importante.
En nuestros acuarios es necesario mantener el nivel de agua constante para mantener os parámetros estables.
Por este motivo vamos a incluir una boya (flotador) que nos indique el estado del nivel del agua.

El funcionamiento es muy simple, una boya es como un interruptor, es decir , es como si cuando el corcho de la boya ya no flota porque ha bajado el nivel de agua apretaramos un boton.

Por lo tanto el esquema de conexión es como si fuera un botón:
Boya.jpg

Y aqui se muestra donde va conectada en la placa atreef Shield.
shield.jpg

Y en cuanto a programación igual tambien que con un botón:
Código:
//CAP8 Nivel del agua

//LIBRERIAS
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>// Debemos instalar la libreria LiquidCrystal_I2C en la carpeta "libraries" del arduino IDE
LiquidCrystal_I2C lcd(0x27,16,2);  // direccion i2c(puede variar segun la placa) del LCD y columnas,lineas

#include <Wire.h>//RELOJ
#define DS1307_I2C_ADDRESS 0x68//RELOJ Direccion

/*PINES CONECTADO EN ARDUINO MEGA
ANALOGICOS:


DIGITALES:
D18 - Boya

D20 - SDA I2C  / LCD+reloj
D21 - SCL I2C  / LCD+reloj

*/

//VARIABLES
byte boya=18; //declaramos que la variable de los pines donde esta conectado boton y potenciometro

//RELOJ

//RELOJ
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year,ajustereloj=0;
int hora=hour;
long offset;
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    // 0 to bit 7 starts the clock
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                   // bit 6 (also need to change readDateDs1307)
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}


void setup()
{
  pinMode(boya, INPUT);//Inidicamos que es  una entrada 
  
  
  Wire.begin();//Inicializamos el reloj   
  setDateDs1307(0, 0, 8,1,1,1,2014);//Esto solo hay que ponerlo una vez, es para grabar la primera vez la hora luego se puede borrar esta linea
  lcd.init();//Inicializamos el LCD
  lcd.backlight();//Encendemos la luz
  lcd.print("CAP8. Nivel Agua");
  
  delay(2000);//Hacemos una pausa de 2 segundos
  lcd.init();//Al inicializar el LCD tambien borramos la pantalla
}

void loop()
{
leehora();//funcion para leer la hora
verhora();//Mostramos informacion en pantalla
nivel();//Revisa estado de la boya
}

void nivel()
{
  if ( digitalRead(boya)==1) //Leemos el estado del pin de la Boya
     {
       lcd.clear();
       lcd.print("Boya activada");
       delay(2000);
       //AQui podríamos activar un rele para encender una bomba de relleno durante x segundos
       lcd.clear();
       }  
}
  
  
void leehora()
{
     getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//Almacenamos los valores actualizados en las variables
}


void verhora()
{
  lcd.setCursor(0,0);
  lcd.print ("CAP8. Nivel Agua");
  lcd.setCursor(0,1);
  if (dayOfMonth <10) {lcd.print("0");}
  lcd.print(dayOfMonth, DEC);
  lcd.print("/");  
  if (month < 10){lcd.print("0");}
  lcd.print(month, DEC);
  lcd.print("  ");
  if (hour < 10){lcd.print("0");}
  lcd.print(hour, DEC);
  lcd.print(":");  
  if (minute < 10){lcd.print("0");}
  lcd.print(minute, DEC);
  lcd.print(":");  
  if (second < 10){lcd.print("0");}
  lcd.print(second, DEC);
}

Saludos!!
Jorge
 
Arriba