DFROBOT pH Meter Pro V2 and Peristaltic pumps setup

Hello everybody,
I have a DFROBOT pH Meter Pro V2 and 2 Peristaltic pumps that I want to use to maintain the PH level between 5.5 and 6.5. For now I want this done by pressing a button I will atomized it at a later time.
The main problem I have is that I tried following this post:

But the formula doesn’t work for my PH meter, I’ve run the sample code below to calibrate using the Arduino IDE and I was able to calibrate my PH sensor without problems:

/*
 * file DFRobot_PH.ino
 * @ https://github.com/DFRobot/DFRobot_PH
 *
 * This is the sample code for Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2
 * In order to guarantee precision, a temperature sensor such as DS18B20 is needed, to execute automatic temperature compensation.
 * You can send commands in the serial monitor to execute the calibration.
 * Serial Commands:
 *   enterph -> enter the calibration mode
 *   calph   -> calibrate with the standard buffer solution, two buffer solutions(4.0 and 7.0) will be automaticlly recognized
 *   exitph  -> save the calibrated parameters and exit from calibration mode
 *
 * Copyright   [DFRobot](http://www.dfrobot.com), 2018
 * Copyright   GNU Lesser General Public License
 *
 * version  V1.0
 * date  2018-04
 */

#include "DFRobot_PH.h"
#include <EEPROM.h>

#define PH_PIN A1
float voltage,phValue,temperature = 25;
DFRobot_PH ph;

void setup()
{
    Serial.begin(115200);  
    ph.begin();
}

void loop()
{
    static unsigned long timepoint = millis();
    if(millis()-timepoint>1000U){                  //time interval: 1s
        timepoint = millis();
        //temperature = readTemperature();         // read your temperature sensor to execute temperature compensation
        voltage = analogRead(PH_PIN)/1024.0*5000;  // read the voltage
        phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
        Serial.print("temperature:");
        Serial.print(temperature,1);
        Serial.print("^C  pH:");
        Serial.println(phValue,2);
    }
    ph.calibration(voltage,temperature);           // calibration process by Serail CMD
}

float readTemperature()
{
  //add your code here to get the temperature from your temperature sensor
}

What would be the formula to get the PH between 1 and 14 like I do under Arduino and not in this format:
image

Thank you all for your help.

1 Like

There was a previous discussion on this: [I want a node] Ph meter and TDS meter node driver

I saw that but for whatever reason the formula to convert the PH sensor output doesn’t give me the right reading using the formula on that post as you can see on the picture below:
image

Thanks,

1 Like

hello @genghiskhano
Le pediremos apoyo a @franco-scev como traductor (Español / inglés).
Intentaré ayudarte.
Según mi experiencia con electrodos de PH, Conductividad, y otros transductores de membranas de permeabilidad selectiva de iones por ej: [+K], [+Na], etc… La electrónica asociada a todos ellos siempre es muy sensible a los ruidos, por ser amplificadores de instrumentación con muy alta impedancia de entrada.
Por lo tanto usted debe primero asegurarse tener un muy buen tratamiento de la relación Señal/Ruido antes de continuar con otra fase del tratamiento de su señal.
Una solución practica si usted no cuenta con un osciloscopio, puede usar el Serial Plotter del Arduino IDE, Enviando la señal directa de su módulo de PH, con la mayor frecuencia de muestreo posible y la mayor velocidad en Baudios del puerto serie. De esta forma usted tendría que ver un valor estable y continuo, tal como si estaría viendo una señal de Corriente Continua CC o lo mas estable posible.
Si usted no ve eso en este tipo de módulo deberá asumir que su problema no es el software que está desarrollando. Su problema es el ruido y haga lo que haga programando no tendrá el resultado esperado.
Si usted no sabe como hacerlo todo este trabajo previo, lo ayudaré también con eso.
Cumplir con este paso es muy importante cuando se trata de Instrumentación y/o Metrología, porque el ruido puede sumarle falsas componentes de continua en los circuitos desviando los valores medidos.
Si usted ya resolvió esto en su proyecto tendrá que recordar que en este tipo de circuitos con amplificadores de instrumentación con alta impedancia de entrada (siempre) deben tener sus filtros pasabajos en el Hardware y en lo posible también de software.
Infiero que el código que usted tiene en Arduino IDE le permitió calibrar porque la librería de DFRobot_PH.CCP está haciendo el filtrado pasa bajo.
Le pido que sume el Datasheet de su dispositivo. eso puede ayudar mucho para darle mas recomendaciones y buenas practicas en la instrumentación.
Usted puede hacer un simple filtro pasa bajos digital haciendo un promedio de algunas pocas medidas. estimo que entre 3 a 15 medidas puede ser más que suficiente.
Cuanto mas ruido su circuito tendrá que aumentar la cantidad de mediciones, por esa razón siempre es mejor eliminar ruido primero.
Mientras Usted verifica esto yo tratare de hacer para Usted una librería XOD a su necesidad.
No se olvide. La regla número uno de la instrumentación es eliminar el ruido antes de hacer el tratamiento de señales.
GIGO: Garbage comes in, Garbage comes out

Imagino que usted necesita hacer esto para un proyecto productivo o industria, y la contabilidad de sus medidas de PH pueden ser criticas o sensibles a los mejores resultados esperados.
La medida de PH tiene una desviación en función de la temperatura.
Le dejo esto, quizás pueda ser útil para Usted:
https://es.omega.com/prodinfo/medidor-ph.html
:wink:

Muchas gracias por tu ayuda, no necesito traduccion el problem no es el ruido .
El sensor PH me da la leida correcta bajo Arduino IDE como no puedes ver:
image

no se que es lo que XOD hace para darme el resultado en el formato que puedes ver en la primera foto en este post. necesito la formula para convertir el resultado de XOD a el mismo resultado que me da el Arduino IDE.

Saludos.

Yo tengo un medidor manual, para verificar el PH.
de repente tu pedes darme la formula exacta del condigo de arduino que use para calibrar el medidor:

#include "DFRobot_PH.h"
#include <EEPROM.h>

#define PH_PIN A1
float voltage,phValue,temperature = 25;
DFRobot_PH ph;

void setup()
{
    Serial.begin(115200);  
    ph.begin();
}

void loop()
{
    static unsigned long timepoint = millis();
    if(millis()-timepoint>1000U){                  //time interval: 1s
        timepoint = millis();
        //temperature = readTemperature();         // read your temperature sensor to execute temperature compensation
        voltage = analogRead(PH_PIN)/1024.0*5000;  // read the voltage
        phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
        Serial.print("temperature:");
        Serial.print(temperature,1);
        Serial.print("^C  pH:");
        Serial.println(phValue,2);
    }
    ph.calibration(voltage,temperature);           // calibration process by Serail CMD
}

float readTemperature()
{
  //add your code here to get the temperature from your temperature sensor
}

En el siguiente respuesta te hago el equivalente del código que tienes ahí en XOD y publico la primera Versión de la Biblioteca.
Juntos trataremos de depurara .
No dejaría de hacer un proceso mas riguroso y preciso de ajustes. porque si su proyecto está destinado a la cria de peses para carne, PH, Temperatura, DBO y DQO son críticos para sus rendimientos de conversión de nutrientes a peso y la salubridad de su estanques, perdiendo mucho margen de ganancia bruta.
Voy a hacer lo posible para desarrollarte el modelo matemático que necesitas para que te quede un instrumento lo mas confiable posible. Pero necesito que me mandes las mediciones siguientes con las soluciones a una temperatura a no menos de 22°C y que no se pasen de 27°C,
Ideal, sería si están a 25°C y lo más parecido posible, la temperaturas de las muestras.
Ten en cuenta que yo desconozco el desempeño de tu módulo, por Ej si entrega los resultados en un rango entre 0V a 3.3V o lo hace entre 0V a 5V. Si su escala es directa o inversa. etc. Todo dato técnico que puedas sumar ayuda mucho.

Toma tres medidas analógicas en Volts, esperando que estabilice las mediciones con la mejor resolución que puedas a la salida de tu módulo.
1°Un PH conocido lo más alcalino que puedas.
2° repite el paso anterior pero ahora con una solución lo mas ácida que puedas.
3° aunque no es necesario puede ayudar repite con PH lo más neutro que puedas
Has una tabla similar a esta y mándame publica aquí el resultado.
te tendría que quedar algo así

PH…Volts …°C
3.2 …X,XX Volts … 24.3°C
6.8…X,XX volts …25.7°C
12,4…X,XX Volts …24.6°C

Hola tome mas de tres medidasm, dime si esto te sirve y si no dejame saber.
muchas gracias por toda tu ayuda.

temperature:24.3^C pH:2.65
temperature:24.6^C pH:2.78
temperature:25.0^C pH:5.86
temperature:24.5^C pH:3.95
temperature:25.7^C pH:7.05
temperature:26.0^C pH:11.35
temperature:24.6^C pH:11.65

Falta una medica en cada vector medido, tiene tres valores, y no importa el orden en que los pases.
[Temperatura, PH, mV]
Donde
**Temperatura:**es la temperatura de la solución medida y es mejor cuanto más próxima esté estabilizada a 25°C

PH: es el valor medido en la solución con el PHmeter que tienes de referencia.

mV: son los milivolts medidos con tu tester a la salida del modulo (la salida que conectarías a la entrada analógica de tu microcontrolador.

Nota: por lo que veo la mayoría de estos dispositivos entregan a su salida la medición entre 0 Volts a 3 Volts. es un dato que necesito saber de tu dispositivo. Por favor confirma ese dato.
Existen tres grandes categorías de dispositivos de este tipo.
0 a 10V (Casi ya no se ven).
0 a 5v (son los más comunes de encontrar y mas fácil adaptar en la mayoría de los aurduinos)
0 a 3V (los más nuevos).

Es importante porque puede hacer que las medidas sean mal convertidas si esto no es tenido en cuenta.

Mañana te consigo la informacion que nececitas.
My sensor esta connectado a 5V
por que esta tan complicado hacer esto en XOD? el codigo para probar el sensor trabaja en el Arduino IDE sin ningun problema, no se puede sacar lo que necesitas de ese codigo?
Gracias

No es que sea tan complicado en Xod Todo lo contrario solo que necesito la información mínima.
Solo es que me demandaría muchas mas horas de trabajo hacer la ingeniería inversa. No dispongo de ese tiempo para proyectos no rentados.
Solo dedico unos cuantos minutos al día para donarlos ayudando a que alguien que quiere y necesite aprender o desarrollar su propio emprendimiento.
Mi forma de colaborar con tigo no es hacer lo que puedes hacer por si solo sin mi ayuda, ni hacer tu trabajo.
Intento colaborar a tu proyecto.

Gracias aprecio mucho tu ayuda.

Aqui sta la informacion que me pedistes:

gracias,

Un poco de Ingeniería Inversa e Instrumentación

Estimado @genghiskhano, veremos que en realidad todo esto es muy simple cuando
entendemos cómo funciona y se tiene la información necesaria lo más adecuada y
precisa.

Empecemos por el final

Seguro que muy pocos quieren entender de donde sale una ecuación tan simple y
solo quieren ir al grano. Por eso dejo aquí una primera aproximación de la
función, que puede ser más que suficiente para muchos proyectos simples.

Nota: No hay garantía que cumpla todas las necesidades o proyectos, lo hice lo
más versátil para que se pueda adaptar a cualquier módulo, aunque todo el
análisis está enfocado a un tipo en particular. Con un poco de análisis que
pueda aportar Usted desde lo que se explica en este artículo podrá ajustar estos
rudimentos básicos de instrumentación a los requerimientos e exigencias de su
proyecto.

puede encontrarlo
aqui

Seguiré mejorando este contenido si alguien lo necesita

Nota: Si no tiene los resultados que Ud. necesita, es muy posible que necesite
profundizar algunos conocimientos. No dude en pedirlos, si no están a mi alcance
juntos investigaremos hasta resolver el problema.

Para los que quieran profundizar

Intentaré dejar un paso a paso para aquellos que necesiten aprender
Instrumentación aplicando XOD.

Primero y principal tenemos que saber que no estamos queriendo hacer un proyecto
escolar donde podemos medir el PH del limón, vinagre, leche, agua del grifo,
lejía, etc. lo que demanda muy poca precisión, al igual que medir el PH de una
piscina. En estos casos, tener una desviación de las medidas no significa gran
problema para los fines prácticos de la didáctica escolar.

Debiéramos saber que estaremos operando con instrumental con criterio de
laboratorio industrial como mínimo. Lo que nos exige no superar una desviación
de la medida que no supere el (+/- 0.2%) de error a fondo de escala para que
resulte un instrumento confiable para nuestros requerimientos.

Lo otro que hay que saber en el caso de medir PH es que cuando estamos midiendo
con electrónica el PH, estaremos tomando dos dimensiones, (la tensión en mV que
entrega el electrodo de vidrio y la temperatura de la solución) para
transformarla en una sola medida denominada PH.

Es usual ver, que por lo general no se mide la temperatura en muchos
instrumentos de PH. Eso nos está dando un indicio; es posible que no sean de
buena calidad sus medidas, aunque toda la tecnología asociada a ello si lo sea.

De aquí podemos deducir una regla de oro de la instrumentación y en metrología.

"Los métodos y criterios de medición siempre son mas importante que el
instrumento, porque de ellos depende lograr la mejor medida que pueda
entregar ese instrumento"

Apliquemos esto al problema que nos trajo para resolver @genghiskhano.

Introducción a la ingeniería inversa

Prestemos atención al método deductivo, a partir de alguna hipótesis
probabilísticas sobre las incertidumbre que se tiene.

Con fines didácticos lo voy a plantear como un dialogo.

Paso 1

@genghiskhano. No resulta muy confiable la medida que Usted nos da en mV

¿porqué?

Porque estamos esperando valores entre (0…3.3)V o (0…5)V esperaríamos que el
valor de PH7 pueda ser próximo 1.5V o 2.5V según cada caso. Los valores que
vemos están muy por debajo.

Podemos hacer algo con el resto de la información?

Claro que sí. Los valores que usted muestra en XOD-watch puede ser suficiente.

Una vez más vemos primero el valor de PH7, porque esperamos ahí ver el
Offset del instrumento.

Los que aún no entienden que significan a medida que avancemos podrá descubrir
de que se trata, esa es la intención, que también aprenda por si mismo.

Sin entrar en un detalle profundo de la matemática implícita, sabemos que
analog-reade nos entrega valores de 0@1 independiente del Vref del ADC.

Esperaríamos que si estaría bien ajustado para nuestro instrumento para este
caso siempre deberíamos esperar un valor de [0.5] para ese caso.

Con un poco de matemática podemos inferir que nuestro Vref de nuestro ADC tiene
5V y el valor visto en el watch de [0.32] representan 1.6Volts entrando en
nuestra entrada analógica [A1].

Estamos con un corrimiento del Offset de 0.1Volts por arriba de los 1.5Volts
esperado. Es mucho para nuestra primer Hipotesis, no es bueno para ella, pero
podemos hacer un reajuste de la hipótesis porque si estaríamos operando con
3.3Va fondo de escala, el Offset tendría que ser de 1.65V eso mejora nuestra
situación, aunque aún no podemos confirmarlo con este solo indicio.

Por el momento no descartemos la primera hipótesis asumiendo ese corrimiento
como posible, igual podemos seguir aproximando una primera ecuación que nos
aproxime al valor en PH esperado.

Puede tener muchos orígenes esa desviación, pero también tiene muchas soluciones
tanto por Software como por Hardware, que podemos discutir en futuras
discusiones si alguien lo requiere.

Ahora sabemos dos factores muy importantes.

  • Nuestro ADC está operando con Vref=5V

  • Nuestro módulo nos entrega valores entre 0V y muy probablemente 3.3V o 3V

NOTA: Aunque en el segundo punto hay algunas posibles dispersiones de error
porque no podemos estar seguros si nuestro mayor valor será 3.3V o 3V, con un
poco de más trabajo podemos resolverla hasta tener una excelente medida de
laboratorio
.

Ahora necesitamos conocer la Pendiente

Para ello veremos el valor del segundo punto de Calibración, PH4 ->[0.43] x 5V=
2.15Volt

Tomemos por verdadero por el momento que nuestra escala es una recta
perfecta

De ser esto cierto podemos deducir con Matemática muy simple que la pendiente es
negativa. y si se trata de un fondo de escala de 3Volts deberíamos tener una
curva operativa ideal algo similar a la línea roja:

Pero tenemos un potencial operativo (Línea Verde) a nuestra configuración de
nuestro ADC que estamos desperdiciando y perdiendo mucha resolución (lo que
queda por aprovechar entre 3V y 5V que representa una pérdida del 40% de nuestra
resolución).

Esto impacta acentuando nuestros errores y la caída de la calidad y
confiabilidad de nuestras mediciones.

Con solo reprogramar el Vref de nuestro ADC podemos resolver y mejorar esto,
sin tener que hacer modificaciones del Hardware

Para simplificar las matemáticas diremos que la pendiente (p) de nuestra recta
operativa la calcularemos Así si operamos con valores de entrada (e) en
Volts (p) = -14 / 3 = -4.66666… Así si operamos con valores de entrada
(e) en Razones Absolutas (0…1) (p) = -14 / .6 = 23.3333… Y si todo
sería ideal, nuestra Función operativa sería esta: PH = (p) x (e)+14

:sweat: La Dura realidad de la instrumentación nunca es ideal

Cuando vamos a la práctica nos encontramos con esto. Lo tenemos como conjetura
de nuestra ingeniería inversa y la realidad. Difieren.

Vemos que entre la recta ideal (Roja), y nuestra Recta de Calibración de dos
Puntos hay una desviación importante, Esperábamos que el punto más próximo o de
contacto sea el de PH7 y no el de PH4.

Cuales pueden ser las causas?

Sabemos que la Temperatura nos desvía las mediciones, pero aún no la hemos
incluido en nuestras ecuaciones.

Esa es una causas. Otra es:

La escala operativa parece no ser precisamente 3V. Veremos si mejora el modelo
con 3.3V

Con un poco de matemática podemos deducir y achicar una de nuestras
incertidumbres.

Por lo que podemos ver en la gráfica, ahora la probabilidad de estar operando en
una escala de [0…3.3] Volts es mayor pero no determinante.

Ahí tenemos una mejora en Modelo Matemático, El punto de calibración de PH7
ahora está mucho más próximo a ser el punto de ´pivote con respecto a la
temperatura.

¿Que podemos hacer para ajustar Offset en PH7?

Bueno si el fondo de escala es 3.3V entonces su punto medio está en 1.65V.
Veamos que sucede si hacemos ese ajuste en el Modelo Matemático…

No está nada mal!! Es justo eso lo que esperamos ver.

¡Ahora sí llegó el momento de la temperatura!

Tenemos una desviación importante de la pendiente de nuestra curva.

Hay muchos factores que contribuyen a este fenómenos en un PHmeter, pero la
temperatura es el principal.

No debiéramos tomar como confiable una medida precisa de PH con electrodo de
vidrio, si no estamos tomando la temperatura de la solución y siguiendo
correctamente los protocolos de buenas prácticas en las mediciones de este
tipo.

Vemos que el error en este caso es grande, superando el estándar de instrumento
industrial con el que habíamos partido al principio del artículo. Puede ser
mucho peor en temperaturas extremas.

Antes de resolver el Modelo Matemático vemos cómo se comporta el modelo con
temperatura, y la causa por la que decíamos que PH7 era un punto pivote. una
buena imagen creo que dirá mucho más que unas cuantas palabras.

Veamos:

Comenzaremos a deducir el Modelo Matemático que define este comportamiento.

Vemos cuanto influye en nuestra medida de PH la temperatura.

También tendemos que descubrir un estándar. Todas las soluciones de calibración
están ajustadas su concentración de PH a 25°C, por lo tanto, todas las
calibraciones de equipo fuera de esa temperatura no serán confiables si no se
corrigen con la temperatura en forma manual o automática.

Lo otro que podemos ver el error se magnifica cuanto más alejado está de PH7.

También podemos deducir, que la temperatura afecta el coeficiente (p) de la
pendiente. Entonces, este factor de corrección de la pendiente está en función
que tan alejada está de la temperatura de 25°C.

Llamaremos a este coeficiente (d°t), y para simplificar el modelo lo
sumaremos a (p). También le daremos un nombre a este nuevo coeficiente que
surgirá de esta suma, lo llamaremos (k).

(k) = (d°t) + (p)

Hay que hacer pivotar la función operativa en el punto (1.65V,PH7).

Para ello tendremos que restarle a la entrada (e) el valor del Offset = 1.65V y
antes de multiplicarlo por (k) tendremos que sumarle 7. Quedaría algo así en su
forma más desarrollada:

PH = [(d°t) + (p)] [(e) – 1.65] +7

Limpiando un poco podemos escribir:

PH = k (e+1.65)+7

This formula worked for me:


I will continue testing and post my findings.

1 Like

Entonces ahora hagamos la librería

Veo que entendido muy bien el concepto!!!
Felicitaciones!!
Si acepta el desafío, juntos podemos hacer una librería muy bien documentada para usos profesionales y avanzados,
. :smiley: