CAP8 - Controlando el nivel del agua. Boya de nivel

Tema en 'Tutorial Controlador' iniciado por jmcadsl, 14 Ene 2015.

  1. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    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:
    Insertar CODE, HTML o PHP:
    //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