Introducción:

Este artículo pretende explicar cada una de las decisiones que se han tomado a la hora de programar este módulo para nuestro CAO (Controlador de Acuarios por Ordenador).

Los módulos son de descarga gratuita y licencia de uso Creative Commons-BY, para que podáis darles el uso que os apetezca.

Se optó por una marca de hardware bastante económica para el medidor. Ya habíamos hablado un poco de él. Se trata de Arduino PH Shield, de Dormant Labs (En Adelante PhShield) para abreviar.

El tema del medidor del PH para mi proyecto CAO me ha dado bastantes quebraderos de cabeza. Estuve bastante tiempo probando PhShied con con ayuda del código de prueba de Reza Hussain, (al cual envío un saludo y mi agradecimiento por la atención prestada). Es un software que podéis descargar en Reza’s Blog: Arduino Dormant Labs PH Shield Tutorial.

Para las pruebas de PhShield he usado tres sondas, y he chequeado los resultados con un par de medidores, marca Milwaukee. Las calibraciones se hicieron con soluciones tampones a PH 4 y PH 7.

Mi valoración general del producto:

Ya hablé un poco de él comparándolo superficalmente con otros productos similares en un artículo anterior a este, pero en aquel artículo no pude dedicarme demasiado a profundizar sobre las peculiaridades de PhShield que tiene virtudes innegables.

Me parece que destaca por su sencicillez de diseño, sencillez de uso, y por su economía. Dicho esto, vi que el tema de la compensación de la temperatura recurriendo a un sensor en la placa del circuito no resultaba el sistema idóneo para su aplicación en acuariofilia. Una solución podría haber sido medir temperatura del acuario para compensarla. Se trata de algo perfectamente factible por software, pero después trabajar en esta línea la abandoné porque empecé a darme cuenta de que era algo innecesariamente rebuscado para mis necesidades.

Estudiando el software de demo de Reza Hussain:

Lo primero que deseo advertir es que la firma de Reza Hussain está serigrafiada en la PCB de la PhShield y que su software de demo para este producto tiene un carácter oficial y de probada utilidad por ser el padre de la criatura. Mi código debe considerase una mera aportación extraoficial y me alegraré si resulta de utilidad para alguien.

Estudiando el código de Reza Hussain, he comprobado que este está diseñado para calibrar el PH a 25 ºC (cosa lógica ya que esta es la temperatura de referencia mencionada en las características de muchas sondas) para así compensar las diferencias de temperatura cuando se mida el PH a una temperatura diferente. Lo peculiar es que en la demos esto se hace midiendo con el sensor de temperatura de la placa. Es decir, tal y como está codificado el ejemplo de demostración, se asume que las soluciones a medir pueden estar a temperatura variable, pero siempre a temperatura ambiente porque al leer el PH es la que se mide para compensarla. Para la acuariofilia este podría no sería el enfoque idóneo porque el acuario estaría siempre dentro de unos rangos de temperatura bastante constantes regulados por un termostato y sin embargo la temperatura ambiente no tendría relación alguna con la temperatura de trabajo de la sonda.

En mis pruebas con este programa de demo, una vez calibrado el aparato, las medidas de los valores de PH en los tampones no eran todo lo perfectas que cabría esperar. Las posteriores medidas sobre la solucion tampón no daban ni 4.0 ni 7.0 sino valores ligeramente diferentes. Las causas pueden ser varias. Quizás ese código al manejar internamente voltajes y al asimilar el PH=7 a cero voltios, está siguiendo la lógica de funcionamiento de una sonda de PH ideal. No se puede entenderse este códico si no se conoce el funcionamiento de las sondas de PH. Estamos hablando de un enfoque muy válido pero por alguna razón no parece funcionar demasiado fino con algunas sondas imperfectas.

Mi planteamiento, como veremos más tarde, ha sido mucho más directo y sencillo y los resultados, (lo que realmente importa) fueron muy buenos. La mejor de las sondas que yo usé tenía un año de antigüedad y la peor más de cuatro. El comportamiento de todas ellas se vio beneficiado. Especialmente el de mi peor sonda. Lecturas de soluciones tampón después de la calibración, proporcionaban valores exactos incluso con la sonda que conservo en un cajón desde hace cuatro años después de otros tres de servicio.

Así pues para poder explicar lo que hice y la razón de porqué lo hice empecemos comentando los principios básicos de la medición de PH.



Principios de medición de pH:

Las sondas de medición (electrodos) cuando están nuevas, entregan una respuesta lineal de 59.16 mv/pH (milivoltios por grado de PH) a 25 ºC. Para cero ºC darían 54.20 mV/pH y para 100ºC darían 74.04 (mV/pH).

Los pHs ácidos entregarán valores positivos de voltaje, los pHs alcalinos entregarán valores negativos y una solución neutra a pH 7, entregará 0 voltios. Con todo ello podríamos calcular el pH midiendo mV en la sonda. En esto se basan muchos programas incluido el de Reza Hussain, pero luego justificaré que la obtención de milivoltios es un paso intermedio innecesario y en el caso de sondas imperfectas podría no ser aconsejable.

Compensación de temperatura si o no:

El hardware de PhShield incluye un sensor de temperatura en la placa. Los medidores de pH suelen tener en cuenta la temperatura para poder compensar las diferencias de temperaturas. Algunos medidores usan sondas caras que incluyen un sensor de temperatura en la propia sonda.

Si midieramos el pH en el acuario y no compensamos temperatura, lo que tendríamos que hacer en lugar de calibrar a 25ºC sería calibrar usando soluciones tampón que se encuentren a la misma temperatura del acuario. En muchos casos esta podría no ser muy diferente de 25 ºC ya que la acuarifilia de peces ornamentales es mayoritariamente de climas tropicales. Calibrando el medidor de pH a con tampones la temperatura del acuario, no habrá nada que compensar más tarde.

Hay otro factor importante que minimiza los errores por no compensar la temperatura cuando se trata de acuariofilia. En la mayorías de los acuarios, no suelen medirse pHs extremos. Los valores de pH de la mayoría de los acuarios son moderados, es decir, próximos a pH 7.

La medida de una solución a pH 7 en una sonda ideal nunca requiere ser compensada. Esto es así porque una sonda de pH introducida en una solución neutra entregará cero voltios con intependencia de la temperatura, (véase la tabla y más adelante el gráfico).

* pH 2 pH 3 pH 4 pH 5 pH 6 pH 7 pH 8 pH 9 pH 10 pH 11 5ºC -.30 -.24 -.18 -.12 -.06 0 .06 .12 .18 .24 15ºC -.15 -.12 -.09 -.06 -.03 0 .03 .06 .09 .12 25ºC 0 0 0 0 0 0 0 0 0 0 35ºC -.15 -.12 -.09 -.06 -.03 0 .03 .06 .09 .12 45ºC -.30 -.24 -.18 -.12 -.06 0 .06 .12 .18 .24 55ºC -.45 -.36 -.27 -.18 -.09 0 .09 .18 .27 .36

Para un aparato calibrado a 25ºC una medida sin compensar realizada a 15º o a 35 ºC nos daría un error de solo 0.03 grados de pH. Intentamos ilustrar esto el la siguiente gráfica.

Para medir pHs extremos a temperaturas muy diferentes de la temperatura de calibración sí sería imprescindible la calibración, pero esta circunstancia en acuariofilia no se va a dar casi nunca. Además en acuariofilia generalmente nos basta con una precisión de décimas de grado.

Una circunstancia que podría causar que una sonda genere algo de voltaje a pH 7, sería que estuviera afectada con algo de suciedad. Esto podría desplazar la gráfica de la recta en sentido vertical. Una sonda sucia con este comportamiento podría confundir a los programas que presuponen cero voltios a pH 7. Nosotros solo hacemos una suposición que también hacen el resto de medidores; suponemos que la respuesta es de tipo lineal, pero no supondremos nada más.

Explicación del funcionamiento de un medidor de pH:

Antes de explicar nuestro procedimiento, tenemos que explicar algunos detalles sobre el hardware. El circuito de los medidores de pH se basan en el uso de amplificadores operacionales de alta impedancia que usan una fuente de alimentación simétrica.

Concretamente los integrados usados en algunos de estos medidores de pH para Arduino son:

pHduino TL072

BNC Sensor Shield TL072

Arduino PH Shield de Dormant Labs TLC2272A

Hay muchos más integrados que podrían servir, pero lo importante de este componente es entender cual es su función. Lo que hace es amplificar el voltaje a su entrada de forma lineal. El circuito en nuestro caso hace algo más, traslada el voltaje a valores de potencial compatibles con Arduino, es decir, comprendidos entre 0v y 5v. De esta forma Arduino podrá leer el voltaje y entregará valores entre 0 y 1023.

Algunas placas de medidores de pH usan para el ajuste un procedimiento diferente que consiste en ajustar la ganancia del amplificador y los rangos de medida gracias al uso de resistencias ajustables (trimmers). En teoría esto nos permitiría tener una mayor precisión para medir dentro de un determinado rango de valores de pH, pero mis conclusiones son que esa ventaja teórica es innecesaria y complica el tratamiento software de la información. Me gusta mucho más la sencillez del hardware de PhShield que entre otras cosas me ha permitido usar el método interpolación lineal directa que describiré a continuación.

Contemplando el proceso de medición en su conjunto:

Podemos resumir el proceso de medición como la combinación de tres correspondencias lineales:

La correspondencia entre PH y milivoltios en la sonda es como ya vimos de tipo lineal .

y es como ya vimos de tipo . La correspondencia entre milivoltios en la sonda y el voltaje entregado por el amplificador operacional es también lineal .

y el es también . La correspondencia entre el voltaje de 0 a 5 voltios de la entrada analógica de Arduino y el valor de salida de Arduino entre 0 y 1023 también es lineal.

En resumidas cuentas las correspondencias lineales se encadenan de la siguiente forma:

pH –> mV –> InputAnalog(0v..+5v) –> Ardu(0..1023)

Todas estas relaciones son transitivas así que el valor del pH tendrá una correspondencia lineal con los valores entregados por Arduino dentro del rango 0..1023. Es decir:

pH –> Ardu(0..1023)

Me referiré a este principio, que necesito llamar de alguna forma, como Interpolación lineal directa y me temo que esta simplificación no se podría usar con equipos que usan calibración con trimmers ya que la correspondencia mV –> InputAnalog(0v..+5v) no sería fija sino ajustable.

Nosotros no asumiremos que la sonda entrega 0v a PH 7, lo cual solo es cierto para sondas en perfecto estado. Las sondas con problemas de diverso tipo, tales como presencia de suciedad, podrían no dar 0v a pH 7. Usando el sistema adoptado para este módulo, podremos continuar midiendo con una precisión más que aceptable usando sondas ligeramente defectuosas.

Ello será así siempre que la sonda continúe entregando respuesta lineal, y esa circunstancia podría ser algo que tarde más tiempo en deteriorarse. Lo digo sin absoluta seguridad, pero al menos es lo que parece haber ocurrido con una de mis sondas que decidí no tirar a la basura y conservarla bien guardada en un cajón con la punta húmeda y protegida. Resulta que con mi software ha vuelto a funcionar con una gran precisión dentro del rago de valores que me interesa para el acuario que es el único que he verificado. Las sondas no son baratas y prolongar su vida útil me parece muy interesante.

En mi programa existe una función experimental que a partir de los datos de calibración, nos devuelve un dato que podría servir para diagnósticar el estado de la sonda en función de la proximidad de los valores para las soluciones tampón.

Precisión teórica y real de la lectura de pH:

La precisión de PhShield atendiendo al rango de valores de voltaje que proporcionará Arduino se se puede averiguar experimentalmente. En las pruebas que yo hice hice, PhShield es capaz de dar del orden de uno 67 valores diferentes por cada grado de pH). Esto nos daría una precisión teórica muy considerable de 0.015 grados de pH, pero en la práctica hay otros factores a considerar.

Debido a las interferencias eléctricas, la precisión real siempre es menor a esta precisión teórica. Las interferencias suponen una limitación muy importante. Para minimizarlas, el cable de las sondas de pH, son apantallados y el conector es de tipo BNC. El circuito debe ser instalado dentro de una caja metálica con chasis conectado a masa.

No solo las interferencias afectan a la medida. La distribución de los iones en la solución afecta a la medida, y para minimizar tal efecto, tendríamos que tomar una muestra de agua del acuario y someterla a un agitador magnético.

Para minimizar errores, nuestro programa realiza 600 medidas y luego las promedia. Cuando se trata de calibrar, multiplica por diez este número de lecturas.

Una sensibilidad mayor que la proporcionada por PhShield podría no ser útil ya que un exceso de amplificación de la señal amplificaría igualmente a las interferencias eléctricas recogidas por el equipo y las variaciones de distribución iónica. PhShield es un aparatito sin excesivas pretensiones, pero da muy buena resolución y para nosotros dicha precisión es superior a la que se necesita habitualmente en acuariofilia.

Yo no tengo previsto usar más de un decimal en mi medidor de pH porque ello es más que suficiente en acuariofilia, pero en otro tipo de aplicaciones, por ejemplo en laboratorio usando agitadores magnéticos y controlando las interferencias lo mejor posible, podría tener más sentido mostrar las centésimas de grado de pH.

Dos botones en lugar de uno:

PhShiel viene con un único botón que por turnos se usa para calibrar a pH 7 y luego a pH 4. Yo utilizo un botón diferente para cada tampón. Suelo calibrar dos feces seguidas con el mismo tampón para verificar si ocurre alguna variación en la medida. (El botón de PhShield y el sensor térmico, son elementos opcionales por no tener relación con el resto del circuito electrónico).

Uso de datos (int) en lugar de datos (float) en el programa:

Arduino no tiene un tratamiento completo de datos en coma flotante. Por ejemplo: los printf no contemplan datos de coma flotante, y no existe ninguna posibilidad de usar double float que añadiría más precisión para cálculos complejos como es el caso de la interpolación de mínimos cuadrados. Yo en este módulo he procurado usar principalmente datos int y cuando he necesitado mayor precisión, he usado internamente en alguna función datos long. Lo que hago con esos datos enteros es que los considero décimas de grado pH. Es decir una función que devuelve 70 –> está devolviendo en realidad pH 7.o Todo esto se entiende mejor leyendo el código, pero quería advertirlo aquí.

Datos de calibración en la EEPROM:

No tendría ninguna gracia tener que recalibrar el medidor de pH cada vez que Arduino pierda la alimentación. Por eso los datos de calibracion se guardan en la EEPROM de Arduino que dependiedon de los modelos tienen más o menos EEPROM.

Placas con Atmel ATmega168, como Arduino Lilypad, el antiguo Nano, Diecimila etc.; solo disponen de 512 bytes de EEPROM.

Placas con Atmel ATmega328, como Arduino Duemilanove, Uno, Uno SMD, Lilypad oro el Freetronics KitTen/Eleven; disponen de 1Kbytes de EEPROM.

Placas con Atmel ATmega1280 o 2560, los de la serie Arduino Mega; disponen de 4Kbytes de memoria EEPROM.

Las memorias EEPROM soportan un número de operaciones de escrituras a cero por cada bit que estuviera previamente a uno porque es una operación destructiva. En Arduino este número de escrituras son 100.000. Tenga en cuenta que por ejemplo según lo que acabamos de decir, escribir siempre el mismo dato en la misma posición de la memoria no la desgasta.

Cuando un bit se agota por superar el límite de escrituras destructivas, el resto de los bits puede seguir funcionando, y cuando un byte se ve afectado por ello, no afectará a otros bytes. Si una posición EEPROM deja de funcionar, bastará con usar una zona diferente de la memoria.

En nuestro programa, los datos de calibración (dos bytes que almacenan un valor de tipo entero) serán guardados en la EEPROM acompañados de cuatro bytes con un valor fijo peculiar y reconocible como firma (o número mágico). Se hace así para distinguir en la EEPROM la memoria que contiene basura de la que tiene información útil.

Un vídeo donde muestro su uso:

Descarga y uso del módulo:

Descarga en tu directorio sketchbook el fichero: PRU_PhSh_CAO.ZIP (17,3 kB)

Descomprímelo ahí mismo, y ya podrás usarlo desde el IDE de Arduino. Incluye el módulo y un programita de demo PRU_PhSh_CAO.ino. En total son tres ficheros que suman unas 500 lineas de código con amplios comentarios en castellano. Contiene muchas trazas para seguir el funcionamiento del programa.

Puedes ver todo esto en el vídeo que acompaña al artículo. Los ficheros vienen empaquetados y son tres:

CAO_PhShield.h // fichero de cabecera del módulo que incluye declaraciones.

CAO_PhShield.cpp // Módulo C++. Incluye la clase para manejar el sensor como un objeto.

PRU_PhSh_CAO.ino // programa de prueba.

Para usar este software se supone que habréis comprado un Arduino PH Shield, de Dormant Labs, y que usareis un par de botones extra conectados a los pines declarados en el programa PRU_PhSh_CAO.ino.

#define PinPH A2

#define PinButt_PH7 3

#define PinButt_PH4 2

Si tenéis cualquier dificultad consultarmela en los comentarios. Espero que os sea útil.