MaEVAReef - Controlador de acuario

12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Quiero dejar claro, que yo no he inventado ni creado nada, me he limitado a seguir los avances del foro principal creado por jmcadsl pongo el link porque es de obligada lectura
Link Post principal Arduino

Mi única intención con este post, es ordenar lo que yo he hecho para que quien se quiera adentrar en este mundillo lo tenga mas facil.

Hola a todos, en este post pretento explicar los avances que he conseguido con el Arduino UNO, lo he dividido en cuatro mensajes para ir colocando como sigue:

1 - Este mensaje, explicación y detalles finales (fotos)
2 - Todo lo referente a componentes necesarios (electrónica)
3 - Codigo de las diferentes funciones creadas
4 - Conclusiones de las modificaciones efectuadas

Agradecimientos a jmcadsl por meterme de lleno en este tema y a todos los que hemos seguido con el intercambio de opiniones/experiencias en el post principal que es de obligada lectura y participacion para todos los interesados en este micromundo.

MaEvaReef 0.1 Adjunto el zip con el codigo que estoy ejecutando en fecha 18/09/11
Ver el archivos adjunto MaEvaReef_v0_1.zip

MaEvaReef 0.2 Versión a fecha 1/1/12
Ver el archivos adjunto MaEvaReef_v0_2.zip



Foto del arduino, para que todos sepamos de lo que hablamos:
5bf5c505.jpg

Se pueden encontrar kits en ebay por menos de 30€ o el trasto solo por las tiendas de electrónica por unos 23€.



Foto con 2 de las 3 peristalticas de la regleta de conexiones y donde está incorporado el arduino.
30a769de.jpg


Pineado que he utilizado para que luego se entienda bien el código:
06a135aa.jpg


Como podeis ver no me queda ningún pin libre, por lo que para nuevas funcionalidades tendré que pensar en el arduino Mega que ya tengo por casa. Lo bueno es que el Mega respeta el conexionado del Duemilenove y UNO por lo que todo lo que hay con el Mega funciona exactamente igual.
 
Última edición:
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Botones Arriba/Abajo/MenuOK:
1k, 10k, 3.3k para los botones (utilizo tres botones en un pin analógico, por eso las resistencias)
Cable negro grueso = Positivo
Cable negro fino = Negativo
Cable naranja = Pin analógico del Arduino
3ada9381.jpg


En función de que botón se pulse se obtiene un valor, este valor se puede modifican cambiando los valores de las resistencias. Con las que he utilizado yo el código de los botones a declarar es el siguiente:

Mi codigo:
Código:
//Arduino UNO .. valores leidos de los botones con el UNO
int v_arriba = 318;
int v_abajo  = 93;
int v_menu   = 178;

Os dejo el menú que utilizo aunque adelanto que todavía no está terminado, pero ya hay bastante para adaptarlo a vuestras necesidades si lo creeis oportuno. Esta plagiado de PepePotamo (gracias).


Mi codigo:
Código:
void Menu(){
  int OPMENU = 1;
  int refrescarMENU = 1;
  int boton_pulsado;
  int NOSALIR = 0;
  //
  int peristaltica = 0;
  int rele = 0;
  //
  int p1 = EEPROM.read(ml_p1);
  int p2 = EEPROM.read(ml_p2);
  int p3 = EEPROM.read(ml_p3);
  int on  = EEPROM.read(luz_on);
  int off = EEPROM.read(luz_off);
  //
  LCD_Reset(1);
  setCur(3,1); Serial.print("CONFIGURACION");
  delay(1000);
  while (NOSALIR==0){
    wdt_reset();    //Watchdog
    boton_pulsado = analogRead(boton);

    if (boton_pulsado == v_arriba) {OPMENU--; delay(200); refrescarMENU=1; if (OPMENU==0) {OPMENU=8;}};
    if (boton_pulsado == v_abajo ) {OPMENU++; delay(200); refrescarMENU=1; if (OPMENU==9) {OPMENU=1;}};
  
    if ((OPMENU < 5)&&(refrescarMENU==1)){
      LCD_Reset(1);
      setCur(0,0); Serial.print("1.Comida 10min     "); if (OPMENU == 1) {Serial.print("<");};
      setCur(0,1); Serial.print("2.Cambio de agua   "); if (OPMENU == 2) {Serial.print("<");};
      setCur(0,2); Serial.print("3.Luz SUMP         "); if (OPMENU == 3) {Serial.print("<");};
      setCur(0,3); Serial.print("4.Calibrar PH      "); if (OPMENU == 4) {Serial.print("<");};
      refrescarMENU=0;
      delay(300);
    } else if ((OPMENU >= 5)&&(refrescarMENU==1)){
      LCD_Reset(1);
      setCur(0,0); Serial.print("5.Conf. Peristal.  "); if (OPMENU==5){Serial.print("<");};
      setCur(0,1); Serial.print("6.Cebar Peristal.  "); if (OPMENU==6){Serial.print("<");}; 
      setCur(0,2); Serial.print("7.Prueba Reles     "); if (OPMENU==7){Serial.print("<");};
      setCur(0,3); Serial.print("8.Salir            "); if (OPMENU==8){Serial.print("<");};
      refrescarMENU=0;
      delay(300);
    }
    if (boton_pulsado == v_menu) NOSALIR=1;
    }
    ////ACTUAR EN CONSECUENCIA DE LA OPCION PULSADA
    LCD_Reset(1);
    delay(300);
    
    switch (OPMENU){
      case 1:
        Aviso(6, 600);
        NOSALIR = 0;
        break;
      case 2:
        Aviso(7, 600);
        NOSALIR = 0;
        break;
      case 3:
        NOSALIR = 0;
        OPMENU  = 1;      
        while (NOSALIR==0){
          wdt_reset();    //Watchdog
          boton_pulsado = analogRead(boton);
          if (boton_pulsado == v_menu) {OPMENU++; delay(300); if (OPMENU==3) {NOSALIR=1;}};
  
          setCur(0,0); Serial.print("Luz SUMP config.:");
          setCur(0,2); Serial.print("1.Encendido: ");
          setCur(15,2); Serial.print(on); Serial.print("  ");
          setCur(0,3); Serial.print("2.Apagado:   ");
          setCur(15,3); Serial.print(off); Serial.print("  ");
          
          if (OPMENU == 1){
            setCur(19,2); Serial.print("<");
            setCur(15, 2);
            if (boton_pulsado == v_arriba){delay(300); on++;Serial.print(on);};
            if (boton_pulsado ==  v_abajo){delay(300); on--;Serial.print(on);};
            if (on < 0){on = 23;};
            if (on > 23){on = 0;};
            EEPROM.write(luz_on, on);
          } else {
            setCur(19,2); Serial.print(" ");
            setCur(19,3); Serial.print("<");
            setCur(15, 3);
            if (boton_pulsado == v_arriba){delay(300); off++;Serial.print(off);};
            if (boton_pulsado ==  v_abajo){delay(300); off--;Serial.print(off);};
            if (on < 0){on = 23;};
            if (on > 23){on = 0;};
            EEPROM.write(luz_off, off);
          } 
                   
        }
        break;
      case 4:
      
        break;
      case 5:
        NOSALIR = 0;
        OPMENU  = 1;  
        while (NOSALIR==0){
          wdt_reset();    //Watchdog
          boton_pulsado = analogRead(boton);
          if (boton_pulsado == v_menu) {OPMENU++; delay(300); if (OPMENU==4) {NOSALIR=1;}};
  
            setCur(0,0); Serial.print("Perist.config: 20:00");
            setCur(0,1); Serial.print("P1 ml x dia: ");
            setCur(15,1); Serial.print(p1); Serial.print("  ");
            setCur(0,2); Serial.print("P2 ml x dia:  ");
            setCur(15,2); Serial.print(p2); Serial.print("  ");
            setCur(0,3); Serial.print("P3 ml x dia:  "); 
            setCur(15,3); Serial.print(p3); Serial.print("  ");
            
          if (OPMENU == 1){
            setCur(19,1); Serial.print("<");
            setCur(15, 1);  
            if (boton_pulsado == v_arriba){delay(300); p1++;Serial.print(p1);};
            if (boton_pulsado ==  v_abajo){delay(300); p1--;Serial.print(p1);};
            EEPROM.write(ml_p1, p1);
          } 
          if (OPMENU == 2){
            setCur(19,1); Serial.print(" "); setCur(19,2); Serial.print("<");
            setCur(15, 2);
            if (boton_pulsado == v_arriba){delay(300); p2++;Serial.print(p2);};
            if (boton_pulsado ==  v_abajo){delay(300); p2--;Serial.print(p2);};
            EEPROM.write(ml_p2, p2);
          }
          if (OPMENU == 3){
            setCur(19,2); Serial.print(" "); setCur(19,3); Serial.print("<");
            setCur(15, 3);
            if (boton_pulsado == v_arriba){delay(300); p3++;Serial.print(p3);};
            if (boton_pulsado ==  v_abajo){delay(300); p3--;Serial.print(p3);};
            EEPROM.write(ml_p3, p3);
          } 
                   
        }
        break;
      case 6:
        NOSALIR = 0;
        OPMENU  = 1;  
        //Cebar peristalticas
        while (NOSALIR==0){
          wdt_reset();    //Watchdog
          boton_pulsado = analogRead(boton);
          if (boton_pulsado == v_menu) {
            delay(300); 
            if (peristaltica==0) {
              NOSALIR=1;
            }else{
              switch (peristaltica){
                case 1:
                  digitalWrite(peristaltica1, HIGH);
                  delay(5000);
                  digitalWrite(peristaltica1, LOW);
                  break;
                case 2:
                  digitalWrite(peristaltica2, HIGH);
                  delay(5000);
                  digitalWrite(peristaltica2, LOW);
                  break;
                case 3:
                  digitalWrite(peristaltica3, HIGH);
                  delay(5000);
                  digitalWrite(peristaltica3, LOW);
                  break;
              }
            }
          };
  
          setCur(0,0); Serial.print("Cebado Peristaltica");
          setCur(1, 2); Serial.print("Peristaltica "); setCur(15, 2); Serial.print(peristaltica); Serial.print(" ");
          setCur(0, 3); Serial.print("Salir=0");
          setCur(15,2);
            
          if (boton_pulsado == v_arriba){delay(300); peristaltica++;Serial.print(peristaltica);};
          if (boton_pulsado ==  v_abajo){delay(300); peristaltica--;Serial.print(peristaltica);};
          if (peristaltica == -1){peristaltica = 0;};
          if (peristaltica ==  4){peristaltica = 3;};
                   
        }
        break;  
      case 7:
        NOSALIR = 0;
        OPMENU  = 1;  
        //Prueba de reles
        while (NOSALIR==0){
          wdt_reset();    //Watchdog
          boton_pulsado = analogRead(boton);
          if (boton_pulsado == v_menu) {
            delay(300); 
            if (rele==0) {
              NOSALIR=1;
            }else{
              switch (rele){
                case 1:
                  digitalWrite(rele1, HIGH);
                  delay(5000);
                  digitalWrite(rele1, LOW);
                  break;
                case 2:
                  digitalWrite(rele2, HIGH);
                  delay(5000);
                  digitalWrite(rele2, LOW);
                  break;
                case 3:
                  digitalWrite(rele3, HIGH);
                  delay(5000);
                  digitalWrite(rele3, LOW);
                  break;
                case 4:
                  digitalWrite(rele4, HIGH);
                  delay(5000);
                  digitalWrite(rele4, LOW);
                  break;
              }
            }
          };
  
          setCur(0,0); Serial.print("Prueba de reles");
          setCur(8, 2); Serial.print("Rele "); setCur(15, 2); Serial.print(rele); Serial.print(" ");
          setCur(0, 3); Serial.print("Salir=0");
          setCur(15,2);
            
          if (boton_pulsado == v_arriba){delay(300); rele++;Serial.print(rele);};
          if (boton_pulsado ==  v_abajo){delay(300); rele--;Serial.print(rele);};
          if (rele == -1){rele = 0;};
          if (rele ==  5){rele = 4;};
                   
        }
        break;
      
    } 
    LCD_Reset(1);
    delay(300);   
}
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Placa para PH/ORP:
Para la lectura del PH estoy utilizando una placa amplificadora que compre a Phidgets exactamente el modelo 1130, no recuerdo el precio pero era bastante cara, tiene un pequeño switch para la lectura del ORP, pero hay que cambiar tambien la sonda, por lo que de momento me basaré en leer el PH, de momento no he conseguido lecturas buenas.
Enlace Phidgets
Yo lo compre exactamente aqui:

7381d1dc.jpg


Sonda PH
Pues ya voy por la segunda sonda, las dos las he comprado al mismo vendedor, por lo que espero que la segunda salga mejor. La primera no iba muy fina y un día dejo de dar lecturas, como no sabía de donde venía el problema, me decidí a comprar otro modelo que es el que estoy probando ahora y liquido de calibración.
Ya puedo decir que está probada y funciona muy bien. Al calibrarla no he tenido ni que rectificar valores. Está perfectamente calibrada y obtengo valores correctos (para mi).

sonda_PH.jpg


El codigo de momento es muy sencillo porque estoy en pruebas, pero los valores son buenos.
Muestro el valor en milivoltios y su conversion en PH, donde muestro el valor en mv irá el ORP(o eso creo)

Mi codigo:
Código:
//Medicion de PH
void PH(){

  setCur(16,1);
  vsonda_ph = 0.0178 * analogRead(sonda_ph) - 1.889;
  Serial.print(vsonda_ph);
  setCur(17,2);
  vsonda_orp = analogRead(sonda_ph);
  Serial.print(vsonda_orp,0);
  
}
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Boyas de nivel:
Las boyas de nivel son para el OTA por lo que en mi caso eran el motivo principal por el que montar Arduino para ahorrarme trabajo. He puesto varias con diferentes usos, los iremos detallando mas adelante (espero). Yo tengo de dos tipos, las del enlace son unas de ellas y personalmente me han dado mejor resultado porque el cable que traen es mas largo y las soldaduras quedan fuera del agua. Esto último me dio problemas con el termoretractil y el agua marina, supongo que no estaban bien selladas, pero con estas boyas el problema desaparece.

cc8ff8ed.jpg


Mi codigo:
Código:
//Control de bomba de relleno automatico por 2 boyas en el sump
//ON  ON  = Nivel Ideal
//OFF ON  = Nivel Máximo    
//ON  OFF = Nivel Minimo
void Relleno(){
  
  int rellenos = 0;
  int rellenos_tot = 0;
  int boya_nivel_max = 0;
  int boya_nivel_min = 0;
  boya_nivel_max = digitalRead(boya_sump_max);
  boya_nivel_min = digitalRead(boya_sump_min);
  setCur(16,3); 
 
  if (digitalRead(boya_sump_max)==HIGH && digitalRead(boya_sump_min)==HIGH){
    Serial.print("MED");
    digitalWrite(rele4, LOW);  
  }else if (digitalRead(boya_sump_max)==LOW && digitalRead(boya_sump_min)==HIGH){
    Serial.print("MAX");
    digitalWrite(rele4, LOW);
  }else if(digitalRead(boya_sump_max)==HIGH && digitalRead(boya_sump_min)==LOW){
    Serial.print("MIN");
    rellenos = EEPROM.read(repo_dia);
    if (rellenos < 8){
      EEPROM.write(repo_dia, rellenos+1);
      rellenos_tot = EEPROM.read(repo_mes);
      EEPROM.write(repo_mes, rellenos_tot+1);
      digitalWrite(rele4, HIGH);
      Aviso(4, 4);
      digitalWrite(rele4, LOW);
    }
    //Poner mensaje en pantalla de bomba de relleno activa
    //Crear codigo para control de que la bomba no esté mas de 10 segundos activa y que no rellene mas de 3 veces en un dia.    
  }else{
    Serial.print("ERR");
    Aviso(5, 3);
    //Poner mensaje en pantalla de error en la informacion
    //Paramos la bomba de relleno por posible error en los sensores de nivel
    digitalWrite(rele4, LOW); 
  }
 
 
}

Adicionalmente tengo una boya de nivel en el deposito de reposición. Solo la tengo a modo de aviso, porque al reponer tan poco tiempo y una cantidad máxima, no tengo problemas de que se queme la bomba al funcionar en vacío.

Mi codigo:
Código:
//Control de nivel deposito reposicion
//Si la boya se desactiva damos aviso en el segundo 30 de cada minuto
void Deposito_reposicion(){
  int boya_repo_estado = 0;
  boya_repo_estado = digitalRead(boya_repo);  

  if (boya_repo_estado == LOW) {    
    if ( second == 30){
      Aviso(10, 3);
    }
  } 
}
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Peristalticas:
Yo me decidi por comprar 3 peristalticas a las que todavia no se que uso les daré, pero de momento las he configurado y están listas para su uso.
Para conectarlas he utilizado esquema que está en el hilo principal, lo buscaré y lo pondré aqui para que sea mas ágil.
Se alimentan directamente del Arduino por lo que se simplifican bastante las conexiones.

peristaltica.jpg

Conexión al Arduino:
conexion.gif

Yo no he utilizado la resistencia que indica en la imagen porque con esta no funcionaba.

De momento he programado en pruebas que se enciendan a las 20:00 y cada 5 minutos la siguiente.
La cantidad de mililitros se configura por menú de forma independiente.

Mi codigo:
Código:
//Control de peristalticas
void Peristaltica(){

  if(hour == 20 && minute == 00 && second < 2 ){
    digitalWrite(peristaltica1, HIGH);
    Aviso(11, EEPROM.read(ml_p1));
    digitalWrite(peristaltica1, LOW);
  }
  
  if(hour == 20 && minute == 05 && second < 2 ){
    digitalWrite(peristaltica2, HIGH);
    Aviso(12, EEPROM.read(ml_p2));
    digitalWrite(peristaltica2, LOW);
  }
  
  if(hour == 20 && minute == 10 && second < 2 ){
    digitalWrite(peristaltica3, HIGH);
    Aviso(13, EEPROM.read(ml_p3));
    digitalWrite(peristaltica3, LOW);
  }
  
}
 
Última edición:
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Placa de 4 reles:
Será la encargada de activar/desactivar las diferentes bombas/calentador/luz/bomba reposición en mi caso.
Consta de 6 cables:
3, 4, 5 y 6 a respectivos pines digitales del Arduino
1 y 2 para la alimentación a 5v. Yo los alimento directamente de la salida del Arduino si problemas.

placa4rele.jpg
 
Última edición:
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Pantalla LCD:
en mi caso 4x20 Blanco sobre azul con interface serial (no la recomiendo)
Me ha dado muchos quebraderos de cabeza al no poder utilizar la libreria SLCD, recomiendo alguna que haga uso de esta librería porque se agilizan las cosas.
Hoy compraría una de Sparkfun seguro que no dan problemas con las librerias.
Enlace Sparkfun
Fotos de la información final que muestro en pantalla.....La fecha/hora/nombre_reef cambian cada 20 segundos...
Creo que se puede apreciar bien, muestro temperatura de Urna, Sump y Exterior.... Fecha/hora/Nombre ... PH (Pruebas), ORP (despues...), estado de los 4 reles....
1. Bomba de retorno activada (OFF, RET) - Controlada por boya en la urna principal para que no rebose.
2. Calentador (OFF, CAL) - Controlado por la sonda de temperatura del Sump.
3. Luz Sump (OFF, LUZ) - Controlado por menu de configuración encendido-apagado.
4. Reposicion (MIN, MED, MAX, ERR) - Controlado por 2 boyas de nivel en el sump, repongo un máximo de 8 veces al días durante 4 segundos. (mi acuario es muy pequeñito).
fa078796.jpg

0e057771.jpg

71157021.jpg


Tengo una funcion que dibuja en pantalla todos los textos (solo textos, no valores). Simple pero efectivo.

Mi codigo:
Código:
//Dibujamos la pantalla principal
void infolcd(){
  setCur(0,0);
  Serial.print("URN");
  setCur(8,0);
  Serial.print(223, BYTE);
  Serial.print("C");
  setCur(0,1);
  Serial.print("SUM");
  setCur(8,1);
  Serial.print(223, BYTE);
  Serial.print("C");
  setCur(12,1);
  Serial.print("PH");
  setCur(0,2);
  Serial.print("EXT"); 
  setCur(8,2);
  Serial.print(223, BYTE);
  Serial.print("C");
  setCur(12,2);
  Serial.print("ORP");

  setCur(0,3);
  Serial.print("Rls|");
  setCur(7,3);
  Serial.print("|");
  setCur(11,3);
  Serial.print("|");
  setCur(15,3);
  Serial.print("|");
  setCur(19,3);
  Serial.print("|");
}
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Sondas de Temperatura:
He fabricado 3 con una resistencia de 4,7k y 3 DS1820
Cableado de RCA, Termoretractil y cola de neopreno para el aislamiento.

24106560.jpg

Conexioado al Arduino:
conexion1wire.png


Mi Codigo:
Código:
//Control de temperatura
void Temperatura(){
  int valor = 0;

  float t0 = 0;
  float t1 = 0;
  float t2 = 0;
  valor = digitalRead(rele2);
  sensors.requestTemperatures();
  t0 = sensors.getTempCByIndex(0);
  t1 = sensors.getTempCByIndex(1);
  t2 = sensors.getTempCByIndex(2);
  temp_sump = t1;

  setCur(4,0);
  Serial.print(t0, 1); //Index 2 , es el tercer sensor
  setCur(4,1);
  Serial.print(t1, 1); //Index 0 , es el primer sensor
  setCur(4,2);
  Serial.print(t2, 1); //Index 1 , es el segundo sensor
  setCur(8,3);
  if (sensors.getTempCByIndex(1)<26.10 && sensors.getTempCByIndex(1)>26.00){
    if (sensors.getTempCByIndex(1)<26.10 && digitalRead(rele2) == HIGH){
      Serial.print("CAL");
      digitalWrite(rele2, HIGH);
    }else{     
      Serial.print("OFF");
      digitalWrite(rele2, LOW);
    }
  }else if (sensors.getTempCByIndex(1)>26.10){
    Serial.print("OFF");
    digitalWrite(rele2, LOW);
  }else{
    Serial.print("CAL");
    digitalWrite(rele2, HIGH);
    //if(valor == 0){
      //Aviso(2, 3);  Quitamos el aviso de encendido del calentador (No es necesario)
    //}
  }
  
}
 
Última edición:
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Modulo del reloj:
Este módulo es importante porque lo necesitamos para controlar el tiempo que transcurre entre una acción u otra y es en el que nos basaremos para las ejecuciones de código.

c2dde1a2.jpg

Conexioado al Arduino:
ds1307-01.gif


No se si toca aqui el codigo este, pero tiene que ver con recuperar informacion del reloj.

Mi codigo:
Código:
void fecha(int linea){  
  //Cada 30 segundos cambiamos entre mostrar la fecha y el nombre MABELEVA-REEF
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
 
  setCur(11,linea); 
  if (second >=0 && second <= 20){        //Pintamos la fech
    Serial.print(" ");
    if (dayOfMonth < 10) Serial.print("0");
    Serial.print(dayOfMonth, DEC);
    Serial.print("/");   
    if (month < 10) Serial.print("0");
    Serial.print(month, DEC);  
    Serial.print("/");
    if (year < 10) Serial.print("0");
    Serial.print(year, DEC); 
  }else if(second >= 20 && second <=40){  //Pintamos el nombre del reef
    Serial.print(reef);
  }else{                                  //Pintamos la hora
    Serial.print("    ");
    if (hour < 10) Serial.print("0");
    Serial.print(hour, DEC);
    Serial.print(":");  
    if (minute < 10) Serial.print("0");
    Serial.print(minute, DEC);
  }
}
 
14 Feb 2008
76
España
Provincia
Burgos
La pena es que los enlaces a ebay han caducado, si puedes poner otros válidos te lo agradecería porque he comprado un arduino mega y tengo que comprar todos estos componentes.
Gracias
 
24 Feb 2009
319
España
Provincia
Cartagena, Murcia.
Muy bueno el post, me ayudara mucho cuando me lance a por el arduino... por cierto como te han preguntado si fabricas en serie me apunto... jajaja....

Saludos....
 
15 Dic 2010
122
esp
Provincia
valencia
Hola, que tal todo, al fin lo tengo casi terminado, ahora estoy haciendo el montaje final, pero tengo un problemita con los botones, como esa parte me la copie de ti, a ver si me puedes echar una mano, pero al cuello no, jajajja

Cuando pulso los botones no responden siempre, al principio pensé que la culpa la tenia la alimentación, ya que todo lo alimentaba con el arduino y creía que no podía con todo, pero ahora ya lo alimento con la fuente y rara vez funcionan a la primera, siempre tengo que pulsarlos varias veces, en algunos casos desisto y todo, sabes que es lo que esta pasando ?

Si necesitas mas datos preguntarme sin dudar.

Saludos

Gracias
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Cuando pulso los botones no responden siempre, al principio pensé que la culpa la tenia la alimentación, ya que todo lo alimentaba con el arduino y creía que no podía con todo, pero ahora ya lo alimento con la fuente y rara vez funcionan a la primera, siempre tengo que pulsarlos varias veces, en algunos casos desisto y todo, sabes que es lo que esta pasando ?

Supongo que tienes una señal cambiante...es facil de solventar si has separado lo suficiente los valores de lectura de los botones.
Haz una pequeña rutina para leer los valores que recibes de los botones, y revisa como oscilan ej. boton arriba 120 a 134. Modifica tu codigo para que si el valor leido esta en ese intervalo lo recoja como una pulsación. No es perefecto porque es analogico, pero da un buen resultado.

Si además te pasa como a mí que tengo un delay de 3 segundos en la funcion principal, pues ya sabes que para entrar en el menu principal tienes que dejar el boton central/menu pulsado un tiempo para que entre en el menu, pero despues funciona de forma muy correcta.
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
La pena es que los enlaces a ebay han caducado, si puedes poner otros válidos te lo agradecería porque he comprado un arduino mega y tengo que comprar todos estos componentes.
Gracias

He actualizado los enlaces por unos mas genericos para que no fallen.
Espero que os sirvan.
 
15 Dic 2010
122
esp
Provincia
valencia
eso es lo que pasa, cuando pulso el botón da varios rangos y afortunadamente si tengo mucho margen entre los valores de los botones, lo que no he conseguido es poner en el código para que cuando pulso el botón 1 acepte un rango de valores en lugar de uno concreto, todos los intentos que he hecho me dan error al compilarlos, no doy con la forma de indicarle el rango, podrías ponerme un ejemplo de como seria el código para poderlo adaptar a los valores que tengo?

Saludos

Gracias
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
Pues como en mi casa ya hace muchisimo calor, he comprado unos vetiladores JEBO o algo parecido y para controlarlos he sacrificado la luz del sump durante unos meses y he reprogramado el rele para que me active y desactive los ventiladores con una tolerancia de 0.5 grados.

os dejo el codigo por si a alguien le interesa

Código:
//Control de los ventiladores
  setCur(12,3);
  if (sensors.getTempCByIndex(1)>27.00){      
    Serial.print("VEN");
    digitalWrite(rele3, HIGH);
  }else if (sensors.getTempCByIndex(1)<26.50){
    Serial.print("OFF");
    digitalWrite(rele3, LOW);
  }else if (digitalRead(rele3) == HIGH){
    Serial.print("VEN");
    digitalWrite(rele3, HIGH);
  }else{
    Serial.print("OFF");
    digitalWrite(rele3, LOW);
  }
 
12 Sep 2010
445
España
Provincia
Barcelona (Sabadell)
eso es lo que pasa, cuando pulso el botón da varios rangos y afortunadamente si tengo mucho margen entre los valores de los botones, lo que no he conseguido es poner en el código para que cuando pulso el botón 1 acepte un rango de valores en lugar de uno concreto, todos los intentos que he hecho me dan error al compilarlos, no doy con la forma de indicarle el rango, podrías ponerme un ejemplo de como seria el código para poderlo adaptar a los valores que tengo?

Saludos

Gracias


prueba con este codigo modificando los valores...en mi caso siempre esta entre 175 y 178 el boton menu.

Código:
if (vboton >= 175 && vboton <= 178){
    Menu();
}
 
25 Oct 2008
121
España
Provincia
Madrid
Hola:

Grandiosa labor JMerino, la verdad es que he aprendido bastante... aun me quedan algunas dudas espero no molestar con ellas:

1. Como has conectado los reles a las tomas de corriente??? Tendras de casualidad un esquema o fotos ????
2. De igual modo a si bien entiendo estas conectando 2 peristalticas, 4 reles, la LCD que seguro te consume 4 pines digitales, los termometros, los pulsadores, ph, relleno... luego quiero entender que has usado para ello un amplificador de PCF8575 o similar... podrias poner algun esquema de conexion ???? Como has resuelto el tema ????

Disculpa las dudas pero es que aun no me queda claro esto como lo has resuelto...

Gracias
 
Arriba