Acuariofilia Madrid

Versión completa: Aula Arduino para principiantes.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
También podría ser que en un dispositivo, los dos bytes se generen de golpe en el sensor y por eso pregunte si hay dos datos disponibles y que en el otro sensor nunca se genere más de un byte en el sensor y que espere a que se lea cada uno de ellos para generar el siguiente, o puede que se generen dos de golpe y el tercero solo se genere después de leer los dos primeros o que existan determinadas pausas de tiempo para la disponibilidad de los datos etc...

Son detalles del protocolo que nosotros no podemos saber salvo que investiguemos un poco.

Lo importante es encontrar una forma de que funcione para tirar de ese hilo y afortunadamente tenemos la demo.

No se puede dar nada por sentado ni fiarse de nada, porque el demonio está en los detallitos. Hay que verificar especialmente lo que supuestamente no puede fallar porque cuando algo no funciona y no das con la causa, puede que estés pasando por alto lo que falla una y otra vez.
Bueno, pues ya funciona el pH, y lo mejor es que funciona con el código original, sin tocar nada.
Después de estar todo el día de ayer probando cosas, y sin conseguir nada, lo dejé por imposible, y esta mañana al levantarme se me ocurre ¿porque no probar el código de Cao1 en el programa de prueba del sensor?
Entonces copio el código de LinealSensor en el programa de prueba y... funciona IGUAL.

Exactamente puse esto en el código de prueba.
Código:
while(Wire.available() < 2);  //pruebas
highbyte = Wire.read(); // high byte * B11111111
lowbyte = Wire.read(); // low byte

Ahora si que ya tenía claro que algo estaba pasando por alto algo en el programa, y empiezo a estudiar bien la función ReadSensor, hasta que llego a la línea
Código:
char *Cao1_LinealSensor::ReadSensor(char *Buff){
    if (!Calibrated()){
        SerFmt.Fmt(Buff, F("??"));
        return Buff;
    }
Bien pues, parece ser que si no se ha calibrado ninguna vez la sonda, no entra en la función de leer el valor ¿es así Antonio?, porque a partir de que he calibrado la sonda, ha funcionado sin tener que tocar nada del código original, solo cambiando la dirección I2C que en este es 0x48, por supuesto

[Imagen: VHGRovg.jpg]
Por cierto ese pH mostrado no es agua del acuario
En efecto.

Para poder dar un valor en grados, se necesita interpolar entre dos valores de referencia obtenidos para valores de pH conocidos.

La traza que yo te dije que pusieras no habría obtenido ninguna salida y eso es un dato importante porque indica que ni siquiera pasa por ese punto y eso es una invitación a mirar por donde pasa la ejecución y por donde no.

Tirando del hilo de las trazas también habrías llegado hasta allí. Big Grin

Por lo que me dices, Dormant Labs y Tindie son compatibles. Una estupenda noticia.
(17-09-2015, 07:47 PM)Antonio Castro escribió: [ -> ]En efecto.

Para poder dar un valor en grados, se necesita interpolar entre dos valores de referencia obtenidos para valores de pH conocidos.

La traza que yo te dije que pusieras no habría obtenido ninguna salida y eso es un dato importante porque indica que ni siquiera pasa por ese punto y eso es una invitación a mirar por donde pasa la ejecución y por donde no.

Tirando del hilo de las trazas también habrías llegado hasta allí. Big Grin

Por lo que me dices, Dormant Labs y Tindie son compatibles. Una estupenda noticia.

Si Antonio, lo que me dio la mayor pista fué descomentar la traza que hay en Read1Rawsensor, al entrar en el menú de "diagnóstico de sonda" si que veía los valores de H y L, mientras que sin entrar en ningún menú la traza no la veía por ninguna parte.
(17-09-2015, 07:56 PM)rubenmas escribió: [ -> ]
(17-09-2015, 07:47 PM)Antonio Castro escribió: [ -> ]En efecto.

Para poder dar un valor en grados, se necesita interpolar entre dos valores de referencia obtenidos para valores de pH conocidos.

La traza que yo te dije que pusieras no habría obtenido ninguna salida y eso es un dato importante porque indica que ni siquiera pasa por ese punto y eso es una invitación a mirar por donde pasa la ejecución y por donde no.

Tirando del hilo de las trazas también habrías llegado hasta allí. Big Grin

Por lo que me dices, Dormant Labs y Tindie son compatibles. Una estupenda noticia.

Si Antonio, lo que me dio la mayor pista fué descomentar la traza que hay en Read1Rawsensor, al entrar en el menú de "diagnóstico de sonda" si que veía los valores de H y L, mientras que sin entrar en ningún menú la traza no la veía por ninguna parte.

El demonio está en los detallitos. Smile
Pues a falta de unas pequñas mejoras en la iluminación, ya tengo montado CAO1 en su sitio definitivo y funcionando.

A la fecha y la hora no hagáis caso, la modifiqué sin darme cuenta y menos mal que me di cuenta después de hacer las fotos, sino con la emoción así se queda.

[Imagen: eyn6B5D.jpg]

[Imagen: sywrMbX.jpg]
Por lo que parece, modificaste un mueble para hacer tu brico.
No parece complicado y ha quedado muy chulo.
(23-09-2015, 11:15 AM)Antonio Castro escribió: [ -> ]Por lo que parece, modificaste un mueble para hacer tu brico.
No parece complicado y ha quedado muy chulo.

No he modificado el mueble, es una pieza de DM mecanizada convenientemente para mi propósito, y después pintada de blanco para que que más integrada con el mueble. Se aguanta sola, simplemente aplicada hacia el fondo del mueble.
Muy sencillo de hacer.

Tiene una madera pegada a 90º en la parte baja que hace de base, todos los componentes están atornillados a la parte trasera de esta madera. A parte la fuente de alimentación en la parte baja hace un poco de contrapeso para que no se vuelque hacia adelante.

Algo así visto de perfil:

[Imagen: st4HTvL.png]

Cuando pueda hago una foto de la parte trasera.
Pero respeta la estética del mueble y queda muy bien. Ya veo que no tocas el mueble, con un solo tornillo de sujeción.
Antonio, tengo la refrigeración de la pantalla de leds que había en el kit del acuario refrigerada por agua con una bomba. Entonces lo que quería hacer es que esta bomba por medio de un relé se ponga en marcha coincidiendo con el inicio del fotoperiodo y se apague de igual manera.

Había pensado en usar la función "Momento_NADO", si lo he entendido bien, lo que tendría que hacer es.

Código:
BombaRefrig = Momento_NADO('D', 50); //Para que devuelva la décimas de minuto del 5% del día
if (BombaRefrig=>240)
{
digitalWrite(Pin_Rele_12V_INI+2, HIGH);
}
else
digtalWrite(Pin_Rele_12V_INI+2, LOW);

Si la función pasa las décimas del día, y yo tengo puesto que el día dure 8 horas (4800 décimas de minuto), la función devolverá 240, o sea el 5% de las 8 horas? O no funciona así esta función.
Me parece que sí es eso.

Creo recordar que esa es una de esas funciones que implementé como función de librería por si alguien necesitaba algo así, pero creo que no está suficientemente probada porque no necesité aplicarla en ningún caso concreto.

La idea es que la planificación de ciertas tareas deben tener en cuenta el fotoperiodo porque es el único reloj que entienden los peces y plantas del acuario.

Si programáramos una tarea siempre a una hora fija con escaso margen de seguridad, una modificación del fotoperido podría hacer que su acción ocurriera con la luz apagada cuando no es eso lo que deseamos.

En el código incluyo algunos ejemplos para un hipotético comedero:

Cao1_FotoPeriod.cpp:// Desayuno = Momento_NADO('A', 750); // Alba 75% (finalizando el alba)
Cao1_FotoPeriod.cpp:// Almuerzo = Momento_NADO('D', 300); // Dia 30% (Empezando el día)
Cao1_FotoPeriod.cpp:// Comida = Momento_NADO('D', 600); // Dia 60% (Pasado el medio día)
Cao1_FotoPeriod.cpp:// Merienda = Momento_NADO('D', 900); // Dia 90% (Finalizando el dia)
Cao1_FotoPeriod.cpp:// Cena = Momento_NADO('N', 100); // Noche 10% (ya empezada la noche)

Puedes poner una traza para verificar que funciona tal y como se espera, y tampoco está de más incluir algún indicador led en ese tipo de salidas que puedan ofrecer dudas.

Cualquier cosa que surja me lo comentas.
Ya lo tengo solucionado, la función Momento_NADO, devuelve el valor en décimas de minuto del porcentaje del momento del día que queramos, o sea el 5% del día ( sería así FotP.Momento_NADO('D',50) a mi me da un resultado de 8617 décimas de minuto, por tanto lo he solucionado de la siguiente manera.

Código:
if ((FotP.RTC_DMdD())>=(FotP.Momento_NADO('D',50)) && ((FotP.RTC_DMdD())< (FotP.Momento_NADO('D',950))))
             {
        SerFmt.Fmt(0, F("*** BombaRefrig=%d"), FotP.RTC_DMdD() ); // TRAZA
               digitalWrite(Pin_Rele_12V_INI + 2, LOW); // Relé en PIN 24 la bomba de refrigeración de los leds Pin_Rele_12V_INI
              }
            else
               digitalWrite(Pin_Rele_12V_INI + 2, HIGH);

Compruebo si el día está entre el 5% y el 95% y si es así se pone en marcha la bomba de refrigeración. Los relés están al revés porque mi placa de relés se activa por nivel bajo, pero esto lo modificaré.
(26-09-2015, 05:07 PM)rubenmas escribió: [ -> ]Ya lo tengo solucionado, la función Momento_NADO, devuelve el valor en décimas de minuto del porcentaje del momento del día que queramos, o sea el 5% del día ( sería así FotP.Momento_NADO('D',50) a mi me da un resultado de 8617 décimas de minuto, por tanto lo he solucionado de la siguiente manera.

Código:
if ((FotP.RTC_DMdD())>=(FotP.Momento_NADO('D',50)) && ((FotP.RTC_DMdD())< (FotP.Momento_NADO('D',950))))
             {
        SerFmt.Fmt(0, F("*** BombaRefrig=%d"), FotP.RTC_DMdD() ); // TRAZA
               digitalWrite(Pin_Rele_12V_INI + 2, LOW); // Relé en PIN 24 la bomba de refrigeración de los leds Pin_Rele_12V_INI
              }
            else
               digitalWrite(Pin_Rele_12V_INI + 2, HIGH);

Compruebo si el día está entre el 5% y el 95% y si es así se pone en marcha la bomba de refrigeración. Los relés están al revés porque mi placa de relés se activa por nivel bajo, pero esto lo modificaré.

OK. El parámetro NADO no es un porcentaje es el tanto por mil.
5% = 5/100 = 50 / 1000 -hi.gif
Por cierto estoy pensando en pillarme yo también un sensor de ph.

Cuál es el que estáis montando de tindie? el de cyberplant o el mini?

https://www.tindie.com/products/CyberPla...rod_search

https://www.tindie.com/products/SparkysW...interface/

Preferiría el de cyberplant por no tener que soldar los cables, tengo conectores de sobra para utilizarlo directamente. Pero dice que para usarlo en un puerto I2C con más dispositivos hay que utilizar las resistencias pull-up. Dónde tendría que colocar dichas resistencias?? en ninguno de mis I2C he tenido que hacerlo...
El pull-up es entre Vcc 5v+ y el pin digital (en este caso SDA)

Pero creo que en las placas mega ya lo lleva incorporado, y el uso de pull-up es para el bus en general, y no por poner uno o n módulos en el bus