Ayuda con el código, por favor

Registrado
6 Feb 2013
Mensajes
275
Ubicación
España
Provincia
Barcelona - Sta. Perpetua de Mogoda
Hola compañeros,

Creo este post porque me parece que el otro post, por tener una fecha de inicio antigua, no tiene la difusión que necesito y que puedan pensar los entendidos que no hay avances en el.

Este es el post original: https://todomarino.com/comunidad/temas/Inicio-proyecto-de-Arduino.107844/

Y ahora continuaré con este y a ver si tengo suerte.

Ahora de lleno en este apasionante mundo que nos acorta las horas de sueño. Increíble despertarte a media noche y pensar "Y si modifico esto en el código", y como no lo hagas ya no duermes en toda la noche.

Ahora necesitaría una ayuda. He hecho todo lo que buenamente he podido aprovechando códigos de compañeros, aprendiendo lo que quieren decir e intentando adaptarlos a mis necesidades.

De momento tengo programado y funcionando pero sin tenerlo montado en su ubicación definitiva:
- Arduino Mega 2560
- Pantalla lcd i2C 2004
- Reloj i2c
- Sensor ultrasonidos HC-SR04 (Depósito de relleno) y en espera de un segundo
- 3 peristálticas con tip-120
- Módulo relé de 5 V y 8 canales
- 2 sensores DS 18b20 (Dallas)
- 2 sondas de nivel para el sump (de momento y en espera de ultrasonidos)

He intentado incorporar pulsadores para ejecutar un menú pero no consigo hacerlo funcionar. Me explico: Pulsadores con pantalla y nada más funcionan, pero cuando tienen que interactuar con todo lo demás, no me hacen ni caso. Me he olvidado de la posibilidad de poder modificar valores de horas de puesta en marcha y otras cosas, pero me gustaría poder parar bombas para dar de comer, limpiar el skimmer, etc.

He adquirido un teclado matricial 4x3 que es muy económico y tiene muchas posibilidades y con solo pulsar una tecla preestablecida efectuaría la parada de bombas y a los 10 minutos las accionaría de nuevo. Pero me pasa lo mismo, solo con los relés funciona bien pero cuando hay más cosas no se por donde tirar.

Así que después de este rollo, solicito la ayuda de algún alma caritativa que me pueda supervisar el código para que funcione el menú.

Muchas gracias.

Mi código:
Código:
  ///////////////////////////////////////////////////////////
  //                                                       // 
  //         PROYECTO ARDUINO ANTONIO RIVEROLA             // 
  //                                                       //  
  ///////////////////////////////////////////////////////////
  
  // Librerías
  
  #include <Wire.h>                               //Libreria de comunicacion I2C 
  #include <LiquidCrystal_I2C.h>          //Libreria para LCD 
  #include <OneWire.h>                         //Temperatura
  #include <DallasTemperature.h>         //Temperatura
  #include <Ultrasonic.h>                      //Sensor distancia ultrasonido 
  #include <Keypad.h>                           //Teclado matricial 4x3
  
  ///////////////////////////////////////////////////////////
  //            Definimos las constantes:                  //
  ///////////////////////////////////////////////////////////
  
  //Definimos los PINS
  
  
  #define TEMP               2
  #define LUZSUMP            3
  #define PIN_D_NIVEL_SUMP   7
  #define PIN_D_NIVEL_MAX    8
  //Ultrasonido pin          9
  //Ultrasonido pin         10
  #define NIVEL_SUMP_MAX    13  
  #define CALENTADOR        22
  #define VENTILADOR         24
  #define RELE_PERISTALTICAS 26
  #define BOMBAS_MOVIM      28 
  #define SKIMMER           30
  #define BOMBA_SUBIDA      32
  #define BOMBA_RELLENO_SUMP 34
  #define BOMBA_RELLENO     36
  
  #define ONE_WIRE_BUS 2      //temperatura, pin de entrada
  #define Reloj 0x68         // Reloj  
  
  int pin_peristaltica1 = 14;//PERISTALTICA 1
  int pin_peristaltica2 = 15;//PERISTALTICA 2
  int pin_peristaltica3 = 16;//PERISTALTICA 3
  
  LiquidCrystal_I2C lcd(0x27,20,4); //Selecciona la dirección 0x27 para el LCD con 4 lineas
                                    //y 20 caracteres
 
  Ultrasonic ultrasonico(9,10); //Declaramos el sensor ultrasonico en los Pines Digitales elegidos 
  
  OneWire oneWire(ONE_WIRE_BUS);          //temperatura
  DallasTemperature sensors(&oneWire);    //temperatura

  ///////////////////////////////////////////////////////////
  //           Variables del programa                      //
  ///////////////////////////////////////////////////////////
  
  char* reef = "   RIVEROLA  REEF";            //Selecciona el nombre/version del programa 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  int Retraso=5000;  

  //Definimos las constantes del teclado matricial
 
  const byte ROWS = 4; //cuatro filas
  const byte COLS = 3;  // tres columnas
  
  // Matriz
  
  char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'#','0','*'}
  };
  
  //Conexiones ROW0, ROW1, ROW2 and ROW3 y COL0, COL1 y COL2 en los pienes 
 
  byte rowPins[ROWS] = {37, 39, 41, 43}; //conexiones de 4 filas del keypad
  byte colPins[COLS] = {45, 47, 49}; //conexiones de 3 columnas del keypad  

  // Creamos el Keypad
  
  Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 

  ///////////////////////////////////////////////////////////
  //Realizamos el setup de todos los componentes           //
  ///////////////////////////////////////////////////////////
  
  void setup() 
  { 
    sensors.begin();
    Wire.begin(); 
    Serial.begin(9600); 
    lcd.init();                               //Inicia el LCD 
    lcd.backlight();                     //Activa iluminacion LCD 
  
  // Pines de entrada digitales
  
    pinMode (PIN_D_NIVEL_SUMP, INPUT); //Sonda nivel relleno sump
    pinMode (PIN_D_NIVEL_MAX, INPUT);  //Sonda nivel relleno sump, nivel maximo
    
  
   //Pines de salida del rele
   
    pinMode(NIVEL_SUMP_MAX , OUTPUT);  //Indica nivel alto en el sump
    pinMode(LUZSUMP , OUTPUT);  //Luz Sump
    pinMode(CALENTADOR, OUTPUT); //Calentador
    pinMode(VENTILADOR, OUTPUT); //Ventilador
    pinMode(RELE_PERISTALTICAS, OUTPUT);//Rele del trasnformador de 12V para Peristalticas
                                         //y luz sump
    pinMode(BOMBAS_MOVIM, OUTPUT); //Bombas movimiento Urna
    pinMode(SKIMMER, OUTPUT); //Bombas del skimmer
    pinMode(BOMBA_SUBIDA, OUTPUT); //Bomba subida
    pinMode(BOMBA_RELLENO_SUMP, OUTPUT); //Bomba de relleno al sump
    pinMode(BOMBA_RELLENO, OUTPUT); //Bomba emergencia por si se queda vacio el deposito
                                         //de relleno (solo vacaciones)
  
   //Pines de salida Peristalticas    
    
    pinMode(pin_peristaltica1, OUTPUT); 
    pinMode(pin_peristaltica2, OUTPUT);  
    pinMode(pin_peristaltica3, OUTPUT);
    
    if (minute < 2)  Retraso=1000;
    else if (hour < 5) Retraso=10000;
    else Retraso=3000;
  
    //No entiendo como funciona este punto
  
    /*   byte n;
    for(n=31; n < 46; n = n + 2)
     {
     digitalWrite( n, HIGH);
     } */    

    //Las bombas y skimmner tienen que estar activados
    
    digitalWrite(BOMBAS_MOVIM ,HIGH); 
    digitalWrite(SKIMMER,HIGH); 
    digitalWrite(BOMBA_SUBIDA,HIGH);  

   /* 
  // la primera vez debemos poner en hora, activa esta parte y luego vuelve a quitarla
  
  second = 50;
  minute = 51;
  hour = 19;
  dayOfWeek = 4;
  dayOfMonth = 11;
  month = 7;
  year = 13;
  
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
  
  */
  } 
   
  ///////////////////////////////////////////////////////
  //                                                   //
  //     Entramos en el bucle del codigo principal     //
  //                                                   //  
  ///////////////////////////////////////////////////////
  
  void loop()
  
    {
    infolcd();                           //Envía la información a la pantalla LCD   
    getDateDs1307
    (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Obtenemos la hora
    sensors.requestTemperatures();        //Activa los sensores de temperatura
    Temperatura();                        //Control de la temperatura
    MirarNiveles(minute, hour);           //Niveles del sump
    Relleno();                            //Nivel del deposito de relleno
    Peristalticas(second, minute, hour);  //Puesta en marcha peristalticas en segundos 
    Menu();                               //Menu
    }    
  
  ///////////////// 
  //  FUNCIONES  // 
  ///////////////// 
  
  // Convierte números normales decimales a BCD (binario decimal codificado) 

  byte decToBcd(byte val) 
  { 
    return ( (val/10*16) + (val%10) ); 
  } 
  
  // Convierte BCD (binario decimal codificado) a números normales decimales  

  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(Reloj);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));      
   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) 
  { 
   
    Wire.beginTransmission(Reloj);
    Wire.write(0); 
    Wire.endTransmission();  
    Wire.requestFrom(Reloj, 7);
  
    *second     = bcdToDec(Wire.read() & 0x7f); 
    *minute     = bcdToDec(Wire.read()); 
    *hour       = bcdToDec(Wire.read() & 0x3f);   
    *dayOfWeek  = bcdToDec(Wire.read()); 
    *dayOfMonth = bcdToDec(Wire.read()); 
    *month      = bcdToDec(Wire.read()); 
    *year       = bcdToDec(Wire.read()); 
  } 
  

  //Dibujamos la pantalla fecha y temperaturas 
  
  void infolcd(){
    lcd.clear(); 
    lcd.setCursor(0,0); 
    lcd.print(reef);
    lcd.setCursor(0,1);
      lcd.print("   ");  
    if (hour<10)
      {
      lcd.print("0");
      lcd.print(hour,DEC);
      }
    else
      {
      lcd.print(hour, DEC);
      }
    lcd.print(":");
    if (minute<10)
      {
      lcd.print("0");
      lcd.print(minute,DEC);
      }
    else
      { 
      lcd.print(minute, DEC);
      }  
      
      // Esto pone nombre del dia
  
        lcd.print(" ");
      switch (dayOfWeek) 
      {
      case 1:
        lcd.print("   Lunes"); 
        break;
      case 2:
        lcd.print("  Martes"); 
        break;
      case 3:
        lcd.print("Miercoles"); 
        break;
      case 4:
        lcd.print("  Jueves"); 
        break;
      case 5:
        lcd.print(" Viernes"); 
        break;
      case 6:
        lcd.print("  Sabado"); 
        break;
      case 7:
        lcd.print(" Domingo"); 
        break;
     }
      
    lcd.print("   ");
      
    lcd.setCursor(0,2);    
    lcd.print(" FECHA:  "); 
    if (dayOfMonth < 10) lcd.print("0"); 
    lcd.print(dayOfMonth, DEC); 
    lcd.print("/");    
    if (month < 10) lcd.print("0"); 
    lcd.print(month, DEC);   
    lcd.print("/");
    lcd.print("20");   
    if (year < 10) lcd.print("0"); 
    lcd.print(year, DEC);
    lcd.print(" ");
    
    
  // TEMPERATURAS
  
      lcd.setCursor(0,3); 
      lcd.print("T1:");
      lcd.print(sensors.getTempCByIndex(0)); //Index 0 , es el primer sensor
      lcd.print("\337");
      lcd.print(" T2:");   
      lcd.print(sensors.getTempCByIndex(1)); //Index 1 , es el segundo sensor
      lcd.print("\337");  
      
       p();  // Pausa 3 segundos
       
  } 
  
    
  // Pausa 3 segundos:
  
  void p ()
  { 
  delay (3000);
  }

  //////////////////////////////////////////////////////////////
  //                      FUNCION MENU                        //
  //////////////////////////////////////////////////////////////

  void Menu ()
  {
    float t0 = 0;
    sensors.requestTemperatures();  
    t0 = sensors.getTempCByIndex(0);    
    lcd.clear(); 
    lcd.setCursor(0,0); 
    lcd.print(reef);
    lcd.setCursor(0,1);
      lcd.print("   ");  
    if (hour<10)
      {
      lcd.print("0");
      lcd.print(hour,DEC);
      }
    else
      {
      lcd.print(hour, DEC);
      }
    lcd.print(":");
    if (minute<10)
      {
      lcd.print("0");
      lcd.print(minute,DEC);
      }
    else
      { 
      lcd.print(minute, DEC);
      }  
      
      // Esto pone nombre del dia
  
        lcd.print(" ");
      switch (dayOfWeek) 
      {
      case 1:
        lcd.print("   Lunes"); 
        break;
      case 2:
        lcd.print("  Martes"); 
        break;
      case 3:
        lcd.print("Miercoles"); 
        break;
      case 4:
        lcd.print("  Jueves"); 
        break;
      case 5:
        lcd.print(" Viernes"); 
        break;
      case 6:
        lcd.print("  Sabado"); 
        break;
      case 7:
        lcd.print(" Domingo"); 
        break;
     }
     
  //Teclado matricial 4x3
 
  char key = kpd.getKey();
    if(key)  // Check for a valid key.
    {
      switch (key)
      {
      case '1':                       // Comida: Paramos bombas de movimiento y de subida
      lcd.setCursor(0,2); 
      lcd.print("PARO PARA DAR COMIDA");      
      digitalWrite(BOMBAS_MOVIM, LOW);
      digitalWrite(BOMBA_SUBIDA, LOW);
      delay (600000);
      digitalWrite(BOMBAS_MOVIM, HIGH);
      digitalWrite(BOMBA_SUBIDA, HIGH);
        break;

      case '2':                        //Limpieza skimmer
      lcd.setCursor(0,2); 
      lcd.print("PARO LIMPIAR SKIMMER");      
      digitalWrite(SKIMMER, LOW);
      delay (600000);
      digitalWrite(SKIMMER, HIGH);
        break;

      case '3':                        //Cambio calcetin sump
      lcd.setCursor(0,2); 
      lcd.print("PARO LIMPIAR BAJANTE");      
      digitalWrite(BOMBA_SUBIDA, LOW);
      delay (600000);
      digitalWrite(BOMBA_SUBIDA, HIGH); 
        break;

      case '4':                         //Limpieza sump
      lcd.setCursor(0,2); 
      lcd.print(" PARO LIMPIEZA SUMP ");
      lcd.setCursor(0,3); 
      lcd.print(" PULSA 5 AL ACABAR  ");          
      digitalWrite(BOMBA_SUBIDA, LOW);
      digitalWrite(SKIMMER, LOW);
      digitalWrite(CALENTADOR, LOW);  
        break;

      case '5':                          //Restaurar sump
      digitalWrite(BOMBA_SUBIDA, HIGH);
      digitalWrite(SKIMMER, HIGH);
         if(t0 < 24.70)
          { 
          digitalWrite (CALENTADOR, HIGH); 
          }
          if(t0 > 25.00)
          { 
          digitalWrite (CALENTADOR, LOW);
          }
        break;

     }
  }
  }
 
//////////////////////////////////////////////////////////////////
//                                                              //
// COMPRUEBA EL NIVEL DE AGUA DEL SUMP Y DEPOSITO DE RELLENO    //
//                                                              //
//////////////////////////////////////////////////////////////////

  void MirarNiveles(int minutos, int horas)

   { 
 
  int InicioNiveles1 = 600;   // 10:00
  int FinalNiveles1 = 602;    // 10:05
  int InicioNiveles2 = 1200;   // 20:00
  int FinalNiveles2 = 1202;    // 20:05
 
  int Tiempo; 
  Tiempo=(horas*60+minutos);   lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print(reef);    
  
  if (digitalRead(PIN_D_NIVEL_MAX)==HIGH)   // La bolla no esta activa, funcionamiento normal 
    {
    digitalWrite(NIVEL_SUMP_MAX,LOW);       
    if (digitalRead(PIN_D_NIVEL_SUMP)==HIGH) 
      {
      lcd.setCursor(0,1); 
      lcd.print("     SUMP  BAJO     "); 
      }   
    else 
      {
      lcd.setCursor(0,1); 
      lcd.print("      SUMP  OK      "); 
      }   
    
    if (Tiempo >= InicioNiveles1 && Tiempo <= FinalNiveles1)    //Damos la orden de encendido
                                                           //y apagado 
      if (digitalRead(PIN_D_NIVEL_SUMP)==HIGH) // La bolla esta activa y cierra las
                                               //electrovalvulas 
        {
        digitalWrite(BOMBA_RELLENO_SUMP,HIGH); 
        lcd.setCursor(0,1); 
        lcd.print("     SUMP  BAJO     "); 
        }   
      else 
        {
        digitalWrite(BOMBA_RELLENO_SUMP,LOW);
        lcd.setCursor(0,1); 
        lcd.print("      SUMP  OK      "); 
        } 
    if (Tiempo == FinalNiveles1)
      digitalWrite(BOMBA_RELLENO_SUMP,LOW);

    if (Tiempo >= InicioNiveles2 && Tiempo <= FinalNiveles2)    //Damos la orden de encendido
                                                               //y apagado
      if (digitalRead(PIN_D_NIVEL_SUMP)==HIGH) // La bolla esta activa y la bomba llena el sump 
        {
        digitalWrite(BOMBA_RELLENO_SUMP,HIGH); 
        lcd.setCursor(0,1); 
        lcd.print("     SUMP  BAJO     "); 
        }   
      else                                   // El sump esta lleno y cierra la bomba
        {
        digitalWrite(BOMBA_RELLENO_SUMP,LOW);
        lcd.setCursor(0,1); 
        lcd.print("      SUMP  OK      "); 
        }
    if (Tiempo == FinalNiveles2)
      digitalWrite(BOMBA_RELLENO_SUMP,LOW);
      }   
  else 
    {
    digitalWrite(BOMBA_RELLENO_SUMP,LOW);  //Sump demasiado lleno hay que programar la alarma
    digitalWrite(NIVEL_SUMP_MAX,HIGH);
    lcd.setCursor(0,1); 
    lcd.print("    ALARMA  SUMP    ");       
    } 
    }

  // DEPOSITO DE RELLENO
  //Medidas = 42*21*42,  0,88 litros/cm. Total = 37 litros

   void Relleno()
  {
  int Nivel1 = 45;  //Hay que ajustar los cm exactos del nivel cuando este puesto en su sitio
  int Nivel2 = 15;
  
  int CmAgua;
  float Litros;
   
  CmAgua=54-ultrasonico.Ranging(CM);
  Litros=CmAgua*0.88; 
      lcd.setCursor(0,2); 
      lcd.print("RELLEN"); 
      lcd.print(" "); 
      lcd.print(Litros);    //Indica los litros que quedan en el deposito de relleno
      lcd.print("L");
      lcd.print(" ");
      lcd.print((Litros/37)*100);  //Indica el porcentaje del deposito de relleno, cuanto queda
      lcd.print("% ");
      //lcd.print(ultrasonico.Ranging(CM)); 
      //lcd.print(" cm");
  
  lcd.setCursor(0, 3);    //Dibuja una barra de nivel con lo que queda del deposito
  lcd.print("MIN ");        //Con un minimo y un maximo
  
  if (Litros > 3)  lcd.print((char)255);
  if (Litros > 6) lcd.print((char)255);
  if (Litros > 9) lcd.print((char)255);
  if (Litros > 12) lcd.print((char)255);
  if (Litros > 15) lcd.print((char)255);
  if (Litros > 18) lcd.print((char)255);
  if (Litros > 21) lcd.print((char)255);
  if (Litros > 24) lcd.print((char)255);
  if (Litros > 27) lcd.print((char)255);
  if (Litros > 30) lcd.print((char)255);
  if (Litros > 33) lcd.print((char)255);
  if (Litros > 36) lcd.print((char)255);
  
  
  lcd.setCursor(17, 3);
  lcd.print("MAX");
     if (Nivel1 <= ultrasonico.Ranging(CM))// && Tiempo <= FinalNiveles1) 
      {
      digitalWrite(BOMBA_RELLENO,HIGH);
      lcd.setCursor(0,2); 
      lcd.print("RELLEN"); 
      lcd.print(" "); 
      lcd.print(Litros);
      lcd.print("L");
      //lcd.print(ultrasonico.Ranging(CM)); 
      //lcd.print(" cm");
      }   
   
    
   if (Nivel2 >= ultrasonico.Ranging(CM))// && Tiempo <= FinalNiveles1) 
      {
      digitalWrite(BOMBA_RELLENO,LOW);
      lcd.setCursor(0,2); 
      lcd.print("RELLEN"); 
      lcd.print(" "); 
      lcd.print(Litros);
      lcd.print("L");
      //lcd.print(ultrasonico.Ranging(CM)); 
      //lcd.print(" cm");
      }

     p();  // Pausa 3 segundos  
}

/////////////////////////////////////////////////////////
//                PERISTALTICAS                        //
/////////////////////////////////////////////////////////

  void Peristalticas(int segundos, int minutos, int horas)

[FONT=Lucida Sans Unicode]//El tiempo se establece en segundos para mayor precisión
  //Aun hay que precisar el tiempo necesario para cada peristaltica[/FONT]

  {  
   
  int InicioPeristaltica1=72000;  //72000 = 20:00  
  int FinPeristaltica1=72060;     //72060 = 20:01
  int InicioPeristaltica2=72300;  //72300 = 20:05
  int FinPeristaltica2=72360;     //72360 = 20:06
  int InicioPeristaltica3=72600;  //72600 = 20:10
  int FinPeristaltica3=72660;     //72660 = 20:11

  int Tiempo; 
  Tiempo=((horas*3600)+(minutos*60)+segundos);

     digitalWrite(RELE_PERISTALTICAS, LOW);  //PERISTALTICA 1

    if (Tiempo >= InicioPeristaltica1 && Tiempo <= FinPeristaltica1)//Damos la orden de encendido
                                                                 //y apagado
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica1, HIGH); 
    } 
    else
    { 
    digitalWrite(pin_peristaltica1, LOW);
    digitalWrite(RELE_PERISTALTICAS, LOW);
    } 
    
  //PERISTALTICA 2

   if (Tiempo >= InicioPeristaltica2 && Tiempo <= FinPeristaltica2)    //Damos la orden de
                                                                 //encendido y apagado 
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica2, HIGH); 
    } 
    else
    { 
    digitalWrite(RELE_PERISTALTICAS, LOW);
    digitalWrite(pin_peristaltica2, LOW); 
    } 
    
  //PERISTALTICA 3

   if (Tiempo >= InicioPeristaltica3 && Tiempo <= FinPeristaltica3)    //Damos la orden de
                                                            //encendido y apagado 
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica3, HIGH); 
    } 
    else
    { 
    digitalWrite(RELE_PERISTALTICAS, LOW);
    digitalWrite(pin_peristaltica3, LOW); 
    }
   }

////////////////////////////////////////////////////////////
//                CONTROL TEMPERATURAS                    //
////////////////////////////////////////////////////////////


  void Temperatura()

  {
    float t0 = 0;
    float t1 = 0;
    sensors.requestTemperatures();  
    t0 = sensors.getTempCByIndex(0);
    t1 = sensors.getTempCByIndex(1);
      
    //Configuracion de la temperatura
    
    if(t0 < 24.70)
    { 
    digitalWrite (CALENTADOR, HIGH); 
    }
    if(t0 > 25.00)
    { 
    digitalWrite (CALENTADOR, LOW);
    }
    if(t0 > 25.40)
    { 
    digitalWrite (VENTILADOR, HIGH);
    }
    if(t0 < 25.10)
    { 
    digitalWrite (VENTILADOR, LOW);
    }
    
  }

 
yo no entiendo mucho y a lo mejor te lio mas pero me da la sensacion de que no le dices al codigo lo que hace cada boton haber que dicen los maestros me esplico
pinMode( PIN_D_KEY_MENU, INPUT );
pinMode( PIN_D_KEY_OK, INPUT );
pinMode( PIN_D_KEY_ARRIBA, INPUT );
pinMode( PIN_D_KEY_ABAJO, INPUT );
pero no me hagas caso ya que el unico teclado que e tocado es el fabricado con botones y juegas con las resistencias que le pones
 
El problema es que cuando he puesto botones como tu dices, tampoco me funciona el menú. En este teclado matricial no hace falta indicar los pines de entrada. Tal como está es correcto. Por ejemplo te pongo este código que funciona y hace todo lo especificado, pero cuando tiene que interactuar con otras cosas, no se por donde salir. Pero me pasa lo mismo con un teclado analógico o teclado en pines digitales indivuduales. Espero que el padre de este foro se apiade de mi y le eche un vistazo.

Un saludo,

Código:
[/FONT]

#include <Keypad.h>
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
  byte rowPins[ROWS] = {37, 39, 41, 43}; //conexiones de 4 filas del keypad
  byte colPins[COLS] = {45, 47, 49}; //conexiones de 3 columnas del keypad
// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
#define ledpin1 11
#define ledpin2 12
#define ledpin3 13

void setup()
{
  pinMode(ledpin1, OUTPUT);
  pinMode(ledpin2, OUTPUT);
  pinMode(ledpin3, OUTPUT);
  
  Serial.begin(9600);
}
void loop()
{
  char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      case '1':
  digitalWrite(ledpin1, HIGH);
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin3, HIGH);
  delay (10000);
  digitalWrite(ledpin1, LOW);
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin3, LOW);  
        break;
      case '2':
  digitalWrite(ledpin1, HIGH);
  delay (1000);
  digitalWrite(ledpin2, HIGH);
  delay (1000);  
  digitalWrite(ledpin3, HIGH); 
  delay (2000);
  digitalWrite(ledpin1, LOW);
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin3, LOW);  
        break;
      case '3':
  digitalWrite(ledpin1, LOW);
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin3, LOW);  
        break;
      case '4':
  digitalWrite(ledpin1, LOW);
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin3, LOW);  
        break;
         
      default:
        Serial.println(key);
    }
  }
}
[FONT=Lucida Sans Unicode]
 
Parece que ya funciona, pero tengo que permanecer mucho rato con el pulsador seleccionado apretado. Y si quiero seleccionar otro pulsador, tengo que esperar un rato hasta que me hace caso (no es el tiempo del delay, es mucho más). Lógicamente en las pruebas no pongo un delay de 10 minutos, lo pongo de 1 minuto. ¿Alguien sabría a qué es debido esta demora? Tanto en el tiempo de pulsado como entre orden y orden
 
de verdad me gustaria saber mas para ayudarte pero por mas que me lo miro sigo sin ver una orden donde le diga que entra en un menu solo veo todo lo que tiene que hacer pero me da la sensacion que no sabe como y quizas por eso tarda en responder asta que ve lo que quieres hacer
 
Estos teclados tienen muy buena pinta, porque utilizas menos pines que los pulsadores individuales y se puede simplificar el menú al dar una orden para cada botón.

Son de membrana y no necesita resistencias ni otras conexiones como las tomas al polo positivo y negativo. Y lo mejor es que solo vale 1,50€.

Te dejo una foto del producto.



Un saludo,
 
ok perdona pero esque yo tembien me estoy comiendo la cabeza porque no se inplementar los reles en mi codigo bueno ese teclado esta muy guapo pero a lo que me refiero es que en el codigo no veo ninguna orden para que salte a un menu me explico lo que veo es que es directo y eso no le da tiempo al arduino a decidir que hacer si tu usaras el numero 1 para entrar en modo menu a lo mejor ganarias velocidad
 
Antes de probar este teclado, hice pruebas con pulsadores normales, e incluso instalé un pulsador para acceder al menú (no descarto volver a intentarlo), pero no me funcionaba. He hecho pruebas con preferencia del menú y retraso en el resto de comandos del programa (millis) y no lo he conseguido.

Si no avanzo con esto, me resignaré y haré poca cosa más, el perro guardián (watchdog) y no se si vale la pena guardar en la epromm por que como no consigo manejar el menú, no puedo modificar tiempos ni temperatura ni nada.

El dimeado de la pantalla no lo puedo hacer porque tengo otro sistema de fuentes. Cuando tenga que hacer alguna modificación o se funda alguna fuente entonces si que me meteré de lleno.

Ahora empezaré a soldar y montar y haré fotos para que puedas ver lo que tengo en mente.

Gracias por el interés isoriano.
 
no se si te servira pero puedes chafardear este codigo a lo mejor te ayuda a solucionar el problema

creo que tengo otro por hay lo busco y te lo pongo
pero as pensado usar mando IR es lo que yo uso

////////////////////////////////
///////// Variables/////////////
////////////////////////////////
////// constantes Mado distancia
#define mando_1 16748655
#define mando_2 16758855
#define mando_3 16775175
#define mando_4 16750695
#define mando_5 16767015
#define mando_6 16746615
#define mando_7 16771095
#define mando_8 16730295
#define mando_9 16751205
#define mando_0 16714485
#define mando_ok 16769055
#define mando_Ro 16714485 // title
#define mando_Ve 16763445 // display
#define mando_Am 16747125 // mute
#define mando_Az 16746615 // repeat
#define mando_AB 16754775
#define mando_Search 16716015
#define mando_Slow 16732845
#define mando_Baja 16720605
#define mando_Sube 16736415
#define mando_Izq 16769565
#define mando_Dch 16712445
#define mando_Power 16722135
#define mando_Exit 16743045 //setup
#define mando_Clear 16716525
#define mando_Menu 16753245 //escribe los dos puntos : doble fecha izquierda
#define mando_EPG 16763445 // escribe slat / abance rapido dch
 
Última edición:
El código lo voy a dejar aparcado de momento. Marcho de vacaciones el 1 de agosto y quisiera tenerlo montado todo. Así que ahora estoy en la fase de diseño de la caja donde pondré el arduino y las soldaduras.

De momento he desmontado todo de la placa protoboard y he empezado con las soldaduras de la placa donde irán los TIP 120 y cableado de las peristálticas. Quiero poner unos interruptores para poder cebar las bombas sin tener que entrar a traves de arduino. Iré colgando fotos.

El cableado lo pensaba hacer con cables de red, que tienen muchos colores.
 
He preparado un posible panel frontal para las peristálticas. Lo he hecho en negro porque el mueble es negro y quiero ver que tal quedaría. Como simplemente lo tengo que imprimir con la impresora, y si me gusta lo plastificaría con aironfix.

Dejo una foto del panel frontal y me decís que os parece o si se puede añadir o quitar algo.



Los círculos grandes son para insertar las peristálticas. Los cuadrados encima de las peristálticas son pulsadores para cebarlas sin tener que pasar por arduino. A la izquierda de las peristálticas pondré un interruptor ON-OFF-ON que me permite desconectar las peristálticas del arduino y hacerlas funcionar de modo manual. Y encima del interruptor habrá un led que me indique que la fuente que alimenta las peristálticas está en funcionamiento. Esta fuente solo se activa cuando le toca funcionar a una peristáltica, el arduino da la orden a un relé, pero a través del interruptor ON-OFF-ON podemos activarlo manualmente y con los pulsadores hacer funcionar las peristálticas (una adición extra o cebar la peristáltica cuando ha quedado vacio el deposito de la disolución).

Aunque el Arduino me permite realizar varias funciones, prefiero tener separadas las cajas por el futuro mantenimiento.
 
Hola de nuevo.

Al final los paneles los haré en gris, me resultaba muy agobiante. Ya iré colgando fotos de como va quedando.

He modificado el código y tras las pruebas con el watchdog, no lo pondré por que en lugar de resetar si queda colgado el programa, se me quedaba colgado en las ordenes que le daba con el teclado.

Sigo con el retraso en la ejecución de la acción tras la pulsación de las teclas. Hay que esperar mucho rato. Supongo que también es debido a los cambios de pantalla, pero me gusta obtener la mayor información posible.

Después del accidente de la noche del día 28/7 al 29/7 estoy más convencido de la automatización, aunque también estas cosas fallan. Paré las bombas de movimiento y la de subida para dar de comer y como estaba haciendo otras cosas me olvidé de conectarlas. Consecuencia, tras 10 horas sin funcionar se me han muerto todos los peces y con el miedo en el cuerpo de pensar que más puede caer. Voy a hacer cambios de agua por que seguro que tambien han muerto muchos microorganismos y se van a disparar los parámetros. El día 1 de agosto me voy de vacaciones. Que miedo.

Aquí os dejo el código que va a pasar a funcionar en breve, en cuanto tenga todo montado que ha de ser antes del día 1. Esta casi a punto.



Código:
  ///////////////////////////////////////////////////////////
  //                                                       // 
  //         PROYECTO ARDUINO ANTONIO RIVEROLA             // 
  //                                                       // 
  ///////////////////////////////////////////////////////////
  
  // Librerías
//  #include <avr/io.h> 
//  #include <avr/wdt.h>
  #include <Wire.h>                       //Libreria de comunicacion I2C 
  #include <LiquidCrystal_I2C.h>          //Libreria para LCD 
  #include <OneWire.h>                    //Temperatura
  #include <DallasTemperature.h>          //Temperatura
  #include <Ultrasonic.h>                 //Sensor distancia ultrasonido 
  #include <Keypad.h>                     //Teclado matricial 4x3
  
  ///////////////////////////////////////////////////////////
  //            Definimos las constantes:                  //
  ///////////////////////////////////////////////////////////
  
  //Definimos los PINS
  
  #define TEMP                 2
  #define LUZSUMP              3
  //Ultrasonido sump pin       7
  //Ultrasonido sump pin       8
  //Ultrasonido pin            9
  //Ultrasonido pin            10
  #define NIVEL_SUMP_MAX       13  
  #define CALENTADOR           22
  #define VENTILADOR           24
  #define RELE_PERISTALTICAS   26
  #define BOMBAS_MOVIM         28 
  #define SKIMMER              30
  #define BOMBA_SUBIDA         32
  #define BOMBA_RELLENO_SUMP   34
  #define BOMBA_RELLENO        36
  
  #define ONE_WIRE_BUS 2            //temperatura, pin de entrada
  #define Reloj 0x68                // Reloj
  int pin_peristaltica1 = 14;//PERISTALTICA 1
  int pin_peristaltica2 = 15;//PERISTALTICA 2
  int pin_peristaltica3 = 16;//PERISTALTICA 3
  
  LiquidCrystal_I2C lcd(0x27,20,4);       //Selecciona la dirección 0x27 para el LCD con 4 lineas y 20 caracteres 
  Ultrasonic ultrasonico1(7,8);           //Declaramos el sensor ultrasonico para el sump en los Pines Digitales 7 y 8   
  Ultrasonic ultrasonico2(9,10);          //Declaramos el sensor ultrasonico para el relleno en los Pines Digitales 9 y 10   
  OneWire oneWire(ONE_WIRE_BUS);          //temperatura
  DallasTemperature sensors(&oneWire);    //temperatura
  
  long Old_Millis = 0;
  
  ///////////////////////////////////////////////////////////
  //           Variables del programa                      //
  ///////////////////////////////////////////////////////////
  
  char* reef = "    ANTONIO REEF    ";            //Selecciona el nombre/version del programa 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  int Retraso=5000;
  //Definimos las constantes del teclado matricial
 
  const byte ROWS = 4; // Four rows
  const byte COLS = 3; // Three columns
  
  // Matriz
  
  char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'#','0','*'}
  };
  
  //Conexiones ROW0, ROW1, ROW2 and ROW3 y COL0, COL1 y COL2 en los pienes
  byte rowPins[ROWS] = {37, 39, 41, 43}; //conexiones de 4 filas del keypad
  byte colPins[COLS] = {45, 47, 49}; //conexiones de 3 columnas del keypad
  // Creamos el Keypad
  
  Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  ///////////////////////////////////////////////////////////
  //Realizamos el setup de todos los componentes           //
  ///////////////////////////////////////////////////////////
  
  void setup() 
  {   
//    wdt_disable();  //Watchdog
    sensors.begin();
    Wire.begin(); 
    Serial.begin(9600); 
    lcd.init();                          //Inicia el LCD 
    lcd.backlight();                     //Activa iluminacion LCD 
  
   // Pines de salida
    pinMode(NIVEL_SUMP_MAX , OUTPUT);  //Indica nivel alto en el sump
    pinMode(LUZSUMP , OUTPUT);  //Luz Sump
   //Pines de salida del rele
   
    pinMode(CALENTADOR, OUTPUT); //Calentador
    pinMode(VENTILADOR, OUTPUT); //Ventilador
    pinMode(RELE_PERISTALTICAS, OUTPUT);//Rele del trasnformador de 12V para Peristalticas y luz sump
    pinMode(BOMBAS_MOVIM, OUTPUT); //Bombas movimiento Urna
    pinMode(SKIMMER, OUTPUT); //Bombas del skimmer
    pinMode(BOMBA_SUBIDA, OUTPUT); //Bomba subida
    pinMode(BOMBA_RELLENO_SUMP, OUTPUT); //Bomba de relleno al sump
    pinMode(BOMBA_RELLENO, OUTPUT); //Bomba emergencia por si se queda vacio el deposito de relleno (solo vacaciones)
  
   //Pines de salida Peristalticas    
    
    pinMode(pin_peristaltica1, OUTPUT); 
    pinMode(pin_peristaltica2, OUTPUT);  
    pinMode(pin_peristaltica3, OUTPUT);
    
//    if (minute < 2)  Retraso=1000;
//    else if (hour < 5) Retraso=10000;
//    else Retraso=3000;
  
  //No entiendo como funciona este punto
 /*   byte n;
    for(n=31; n < 46; n = n + 2)
     {
     digitalWrite( n, HIGH);
     } */
    //Las bombas y skimmner tienen que estar activados
    
    digitalWrite(BOMBAS_MOVIM ,HIGH); 
    digitalWrite(SKIMMER,HIGH); 
    digitalWrite(BOMBA_SUBIDA,HIGH);
   
  // la primera vez debemos poner en hora, activa esta parte y luego vuelve a quitarla
 /* 
  second = 50;
  minute = 9;
  hour = 12;
  dayOfWeek = 7;
  dayOfMonth = 28;
  month = 7;
  year = 13;
  
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
 */
//  wdt_enable(WDTO_8S); //Watchdog
  } 
   
  ///////////////////////////////////////////////////////
  //                                                   //
  //     Entramos en el bucle del codigo principal      //
  //                                                   //  
  ///////////////////////////////////////////////////////
  
  void loop()
  {
//    wdt_reset();    //Watchdog  
  if ( (millis() - Old_Millis) > 3000) // 7 segundos
    {
    Old_Millis = millis();    
    infolcd();                           //Envía la información a la pantalla LCD   
    getDateDs1307
    (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Obtenemos la hora
    sensors.requestTemperatures();        //Activa los sensores de temperatura
    Temperatura();                        //Control de la temperatura
    MirarNiveles(minute, hour);           //Niveles del sump
    Relleno();                            //Nivel del deposito de relleno
    Peristalticas(second, minute, hour);  //Puesta en marcha peristalticas en segundos 
    Bombas();
    }
    Menu();                               //Menu
  }    
  
  ///////////////// 
  //  FUNCIONES  // 
  ///////////////// 
  
  // Convierte números normales decimales a BCD (binario decimal codificado) 
  byte decToBcd(byte val) 
  { 
    return ( (val/10*16) + (val%10) ); 
  } 
  
  // Convierte BCD (binario decimal codificado) a números normales decimales  
  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(Reloj);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));      
   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) 
  { 
    
    Wire.beginTransmission(Reloj);
    Wire.write(0); 
    Wire.endTransmission(); 
    Wire.requestFrom(Reloj, 7);
  
    *second     = bcdToDec(Wire.read() & 0x7f); 
    *minute     = bcdToDec(Wire.read()); 
    *hour       = bcdToDec(Wire.read() & 0x3f);   
    *dayOfWeek  = bcdToDec(Wire.read()); 
    *dayOfMonth = bcdToDec(Wire.read()); 
    *month      = bcdToDec(Wire.read()); 
    *year       = bcdToDec(Wire.read()); 
  } 
  
  //Dibujamos la pantalla fecha y temperaturas 
  
  void infolcd(){
    lcd.clear(); 
    lcd.setCursor(0,0); 
    lcd.print(reef);
    lcd.setCursor(0,1);
      lcd.print("   ");  
    if (hour<10)
      {
      lcd.print("0");
      lcd.print(hour,DEC);
      }
    else
      {
      lcd.print(hour, DEC);
      }
    lcd.print(":");
    if (minute<10)
      {
      lcd.print("0");
      lcd.print(minute,DEC);
      }
    else
      { 
      lcd.print(minute, DEC);
      }  
      
      // Esto pone nombre del dia
  
        lcd.print(" ");
      switch (dayOfWeek) 
   {
      case 1:
        lcd.print("   Lunes"); 
        break;
      case 2:
        lcd.print("  Martes"); 
        break;
      case 3:
        lcd.print("Miercoles"); 
        break;
      case 4:
        lcd.print("  Jueves"); 
        break;
      case 5:
        lcd.print(" Viernes"); 
        break;
      case 6:
        lcd.print("  Sabado"); 
        break;
      case 7:
        lcd.print(" Domingo"); 
        break;
     }
      
    lcd.print("   ");
      
    lcd.setCursor(0,2);    
    lcd.print(" FECHA:  "); 
    if (dayOfMonth < 10) lcd.print("0"); 
    lcd.print(dayOfMonth, DEC); 
    lcd.print("/");    
    if (month < 10) lcd.print("0"); 
    lcd.print(month, DEC);   
    lcd.print("/");
    lcd.print("20");   
    if (year < 10) lcd.print("0"); 
    lcd.print(year, DEC);
    lcd.print(" ");
    //Marca la temperatura del acuario y estado del calentador y ventilador
    
      lcd.setCursor(0,3); 
      lcd.print(" T: ");
      lcd.print(sensors.getTempCByIndex(0)); //Index 0 , es el primer sensor
      lcd.print("\337");
      if ((digitalRead(CALENTADOR) == HIGH))    
      lcd.print("  CAL ON ");
      if ((digitalRead(VENTILADOR) == HIGH))    
      lcd.print("  VENT ON");
      if ((digitalRead(CALENTADOR) == LOW) && (digitalRead(VENTILADOR) == LOW))    
      lcd.print("  CAL OFF");
      
       p();  // Pausa 3 segundos
       
  } 
  
    
  // Pausa 3 segundos:
  
  void p ()
  { 
  delay (3000);
  } 
  //////////////////////////////////////////////////////////////
  //                      FUNCION MENU                        //
  //////////////////////////////////////////////////////////////
  void Menu ()
  {
    float t0 = 0;
    sensors.requestTemperatures();  
    t0 = sensors.getTempCByIndex(0);    
    lcd.clear(); 
    lcd.setCursor(0,0); 
    lcd.print(reef);
     
  //Teclado matricial 4x3
 
  char key = kpd.getKey();
    if(key)  // Check for a valid key.
    {
      switch (key)
      {
      case '1':  // Comida: Paramos bombas de movimiento y de subida
      lcd.clear(); 
      lcd.setCursor(0,2); 
      lcd.print("PARO PARA DAR COMIDA");      
      digitalWrite(BOMBAS_MOVIM, LOW);
      digitalWrite(BOMBA_SUBIDA, LOW);
      delay (300000); // 5 minutos de paro
      digitalWrite(BOMBAS_MOVIM, HIGH);
      digitalWrite(BOMBA_SUBIDA, HIGH);
//      wdt_reset();    //Watchdog
        break;
      case '2':  //Limpieza skimmer
      lcd.setCursor(0,2); 
      lcd.print("PARO LIMPIAR SKIMMER");      
      digitalWrite(SKIMMER, LOW);
      delay (300000);
      digitalWrite(SKIMMER, HIGH);
//      wdt_reset();    //Watchdog
        break;
      case '3':  //Cambio calcetin sump
      lcd.setCursor(0,2); 
      lcd.print("PARO LIMPIAR BAJANTE");      
      digitalWrite(BOMBA_SUBIDA, LOW);
      delay (300000);
      digitalWrite(BOMBA_SUBIDA, HIGH); 
//      wdt_reset();    //Watchdog
        break;
      case '4':  //Limpieza sump
      lcd.setCursor(0,2); 
      lcd.print(" PARO LIMPIEZA SUMP ");
      lcd.setCursor(0,3); 
      lcd.print(" PULSA 5 AL ACABAR  ");          
      digitalWrite(BOMBA_SUBIDA, LOW);
      digitalWrite(SKIMMER, LOW);
      digitalWrite(CALENTADOR, LOW);  
        break;
      case '5':  //Restaurar sump
      digitalWrite(BOMBAS_MOVIM, HIGH);
      digitalWrite(BOMBA_SUBIDA, HIGH);
      digitalWrite(SKIMMER, HIGH);
         if(t0 < 25.70)
          { 
          digitalWrite (CALENTADOR, HIGH); 
          }
          if(t0 > 26.00)
          { 
          digitalWrite (CALENTADOR, LOW);
          }
        break; 
    }
  }
  }
 
 
//////////////////////////////////////////////////////////////////
//                                                              //
// COMPRUEBA EL NIVEL DE AGUA DEL SUMP Y DEPOSITO DE RELLENO    //
//                                                              //
//////////////////////////////////////////////////////////////////
  void MirarNiveles(int minutos, int horas) 
  { 
 
  int Nivel11 = 17;  //Hay que ajustar los cm exactos del nivel cuando este puesto en su sitio
  int Nivel12 = 13;
 
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print(reef);    
  
   if (ultrasonico1.Ranging(CM) >= Nivel11) 
      {
      lcd.setCursor(1,1); 
      lcd.print("SUMP OFF   ");
      lcd.print(ultrasonico1.Ranging(CM)); 
      lcd.print(" cm");
      digitalWrite(BOMBA_RELLENO_SUMP,HIGH); 
//      wdt_reset();    //Watchdog
      }   
   if (ultrasonico1.Ranging(CM) <= Nivel12)
      {
      lcd.setCursor(1,1); 
      lcd.print("SUMP OK    ");
      lcd.print(ultrasonico1.Ranging(CM)); 
      lcd.print(" cm");
      digitalWrite(BOMBA_RELLENO_SUMP,LOW); 
//      wdt_reset();    //Watchdog
      }
  }
  // DEPOSITO DE RELLENO
  //Medidas = 42*21*42,  0,88 litros/cm. Total = 37 litros
  void Relleno()
  {
  int Nivel1 = 45;  //Hay que ajustar los cm exactos del nivel cuando este puesto en su sitio
  int Nivel2 = 15;
  
  int CmAgua;
  float Litros;
   
  CmAgua=54-ultrasonico2.Ranging(CM);
  Litros=CmAgua*0.88; 
      lcd.setCursor(0,2); 
      lcd.print("RELLEN"); 
      lcd.print(" "); 
      lcd.print(Litros);    //Indica los litros que quedan en el deposito de relleno
      lcd.print("L");
      lcd.print(" ");
      lcd.print((Litros/37)*100);  //Indica el porcentaje del deposito de relleno, cuanto queda
      lcd.print("% ");
      //lcd.print(ultrasonico2.Ranging(CM)); 
      //lcd.print(" cm");
  
  lcd.setCursor(0, 3);    //Dibuja una barra de nivel con lo que queda del deposito
  lcd.print("MIN ");      //Con un minimo y un maximo
  
  if (Litros > 3)  lcd.print((char)255);
  if (Litros > 6) lcd.print((char)255);
  if (Litros > 9) lcd.print((char)255);
  if (Litros > 12) lcd.print((char)255);
  if (Litros > 15) lcd.print((char)255);
  if (Litros > 18) lcd.print((char)255);
  if (Litros > 21) lcd.print((char)255);
  if (Litros > 24) lcd.print((char)255);
  if (Litros > 27) lcd.print((char)255);
  if (Litros > 30) lcd.print((char)255);
  if (Litros > 33) lcd.print((char)255);
  if (Litros > 36) lcd.print((char)255);
  
  
  lcd.setCursor(17, 3);
  lcd.print("MAX");
  
   if (Nivel1 <= ultrasonico1.Ranging(CM))
      {
      digitalWrite(BOMBA_RELLENO,HIGH);
      }   
   
    
   if (Nivel2 >= ultrasonico1.Ranging(CM))
      {
      digitalWrite(BOMBA_RELLENO,LOW);
      }

     p();  // Pausa 3 segundos  
}

/////////////////////////////////////////////////////////
//                PERISTALTICAS                        //
/////////////////////////////////////////////////////////

  void Peristalticas(int segundos, int minutos, int horas)
  { 
  //El tiempo se establece en segundos para mayor precisión
  //Aun hay que precisar el tiempo necesario para cada peristaltica  
   
  int InicioPeristaltica1=72000;  //72000 = 20:00  
  int FinPeristaltica1=72060;     //72060 = 20:01
  int InicioPeristaltica2=72300;  //72300 = 20:05
  int FinPeristaltica2=72360;     //72360 = 20:06
  int InicioPeristaltica3=72600;  //72600 = 20:10
  int FinPeristaltica3=72660;     //72660 = 20:11
  int Tiempo; 
  Tiempo=((horas*3600)+(minutos*60)+segundos); 
    digitalWrite(RELE_PERISTALTICAS, LOW);
  //PERISTALTICA 1 
  if (Tiempo >= InicioPeristaltica1 && Tiempo <= FinPeristaltica1)//Damos la orden de encendido y apagado// 
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica1, HIGH); 
    } 
    else
    { 
    digitalWrite(pin_peristaltica1, LOW);
    digitalWrite(RELE_PERISTALTICAS, LOW);
    } 
    
  //PERISTALTICA 2 
  if (Tiempo >= InicioPeristaltica2 && Tiempo <= FinPeristaltica2)//Damos la orden de encendido y apagado// 
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica2, HIGH); 
    } 
    else
    { 
    digitalWrite(RELE_PERISTALTICAS, LOW);
    digitalWrite(pin_peristaltica2, LOW); 
    } 
    
  //PERISTALTICA 3 
  if (Tiempo >= InicioPeristaltica3 && Tiempo <= FinPeristaltica3)//Damos la orden de encendido y apagado// 
    { 
    digitalWrite(RELE_PERISTALTICAS, HIGH);
    digitalWrite(pin_peristaltica3, HIGH); 
    } 
    else
    { 
    digitalWrite(RELE_PERISTALTICAS, LOW);
    digitalWrite(pin_peristaltica3, LOW); 
    } 
  } 
////////////////////////////////////////////////////////////
//                CONTROL TEMPERATURAS                    //
////////////////////////////////////////////////////////////

  void Temperatura()
  {
    float t0 = 0;
    sensors.requestTemperatures();  
    t0 = sensors.getTempCByIndex(0);
  
    //Configuracion de la temperatura
    
    if(t0 < 25.70)
    { 
    digitalWrite (CALENTADOR, HIGH);
    }
    if(t0 > 26.00)
    { 
    digitalWrite (CALENTADOR, LOW);
    }
    if(t0 > 26.40)
    { 
    digitalWrite (VENTILADOR, HIGH);
    }
    if(t0 < 26.10)
    { 
    digitalWrite (VENTILADOR, LOW);
    }
  }
///////////////////////////////////////////////////////////
//                 PANTALLA LCD BOMBAS                   //
///////////////////////////////////////////////////////////
 
   void Bombas()
   {
    lcd.clear(); 
    lcd.setCursor(0,0); 
    lcd.print(reef);
    lcd.setCursor(0,1); 
      if ((digitalRead(BOMBAS_MOVIM) == HIGH))    
      lcd.print("MOVIM ON  ");
      if ((digitalRead(BOMBAS_MOVIM) == LOW))    
      lcd.print("MOVIM OFF ");
      if ((digitalRead(SKIMMER) == HIGH))    
      lcd.print(" SKIMM ON ");
      if ((digitalRead(SKIMMER) == LOW))    
      lcd.print(" SKIMM OFF");
    lcd.setCursor(0,2); 
      if ((digitalRead(BOMBA_SUBIDA) == HIGH))    
      lcd.print("SUBID ON  ");
      if ((digitalRead(BOMBA_SUBIDA) == LOW))    
      lcd.print("SUBID OFF ");
      if ((digitalRead(BOMBA_RELLENO_SUMP) == HIGH))    
      lcd.print(" RELL  ON ");
      if ((digitalRead(BOMBA_RELLENO_SUMP) == LOW))    
      lcd.print(" RELL  OFF");
 
     p();  // Pausa 3 segundos  
    }

Si véis algo que se pueda mejorar estoy abierto a todas las posibilidades.


Un saludo y buenas vacaciones.
 
Última edición:
No jodas. Todos se te han muerto.

ufffff. Que mal trago. Lo siento compañero.

Enviado desde mi GT-I9100 usando Tapatalk 2

Hola Felix,

Menos 3 Cromis viridis que estaban boqueando en la superficie y los diferentes caracoles que se encierran y aguantan mucho tiempo. El cangrejo ermitaño fuera del caparazón, una estrella boca arriba, la lysmata. Y todo lo que no se ve que serán bacterias y microfauna que alguna se ve movida por las bombas. Y los peces que aún no he encontrado que estarán perdidos entre las rocas. No se lo que me encontraré cuando llegue a casa. Hoy voy a ir a por más agua a Polinya y preparar más agua para hacer cambios.

Espero que la Ophiura, que por suerte no ha caido, haga su trabajo y se coma los restos que encuentre. Pero todo ha ocurrido en menos de 10 horas. ¿Cómo es posible que baje tanto la saturación de O2 del agua? Además te encuentras a los animales en perfecto estado, como si estuviesen dormidos, con la coloración perfecta. Una pena.

Ahora a esperar que no caiga nada más y despues del verano cogerlo con más ganas.

¿Cómo llevas tu arduino?
 
Última edición:
Pues reclame a paypal pq no me llegaba y me han devuelto el dinero. Ayer lo volvi a pedir. Y estoy ultimando los detalles con gankuu para la pantalla.

A ver si en la proxima kdd estoy menos pez y con mi proyecto mas avanzado y estabilizado. Quiero cortar la urna para hacer rebosadero y poner sump

Enviado desde mi GT-I9100 usando Tapatalk 2
 
En estas cosas los de paypal son unos fenómenos, el problema es que entonces el envío se te puede ir a los 3 meses.

Ya he leido tu proyecto de rebosadero. Estoy de acuerdo con los demás. No dejes el rebosadero muy alto que como tengas algún problema se te saldrá el agua fuera de la urna. Calcula el nivel mínimo paa saber cuanto puede admitir tu sump en caso de fallar la bomba de subida y lo mismo por si se te obtura el bajante que entonces la bomba sube agua pero no baja y se te puede rebosar por todos los lados.

Dale margen tanto en la urna como en el sump, que cuando menos te lo esperas...

Un saludo
 
joder compañero que mal me sabe lo que te a ocurrido
por cierto que programa arduino utilizas para grabar y de donde te as bajado las librerias que a lo mejor pruebo tu codigo
 
joder compañero que mal me sabe lo que te a ocurrido
por cierto que programa arduino utilizas para grabar y de donde te as bajado las librerias que a lo mejor pruebo tu codigo

Hola isoriano,

Las librerías son las estandares que circulan por toda la red, no he hecho ninguna modificación. Yo soy de cortar y pegar y ajustar para que el código se adapte a mis necesidades. De programación ni idea. Tras muchas horas mirando los códigos he conseguido interpretar lo que pretendía conseguir el usuario que lo hizo y así, no mejorarlo si no adaptarlo. De ahí las carencias que tiene mi código.

Viendo como tenía hecho su programa el compañero jmerino de Sabadell, me encantó la posibilidad de tener subcarpetas con los apartados principales que permite visualizar y modificar algo rápidamente. Te lo aconsejo se ve limpio y ordenado. Ya te pasaré por mp si quieres esta organización. El post de jmerino es el MaEVAReff.

Todo lo que necesites hoy, que mañana empiezo vacaciones y que sea lo que Dios quiera.

Un saludo.
 
pues si no te sabe mal me pasas el arduino comprimido con las librerias por skyp driver a [email protected] asi me lo podre mirar
saludos y que tengas unas buenas vacaciones que con todo lo que te a pasado ya te las mereces
 
Atrás
Arriba