Documente Academic
Documente Profesional
Documente Cultură
Actividad Dirigida
Medidor de pH
Con control de histéresis de medida
15 de Enero de 2015
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
Índice
0. Introducción……………………………………………………………………….……………………………………2
1. Electrodo de pH……………………………………………………………………………………………………..…3
2. Acondicionamiento de señal…………………………………………………………………………………….3
a. Amplificador no inversor……………………………………………………………………………..4
b. Restador inversor……………………………………………………………………………………..…5
3. Circuito de alimentación………………………..………………………………………………………………..6 1
4. Shield Arduino.………………………………………………………………………………………………………..7
5. Arduino………….………………………………………………………………………………………………………..8
a. Esquema de conexionado…………………………………………………………………………….8
b. Funcionalidad digital…………..……………………………………………………………………….9
c. Calibrado del sistema………………………………..……………………………………………….10
d. Programación……………………………………..……..………………………………………………11
6. Lisado de material y presupuesto del proyecto……………………………………………………....15
7. Conclusiones……………………………………………………………………………………………….…………16
8. Posibles Mejoras….………………………………………………………………………………………………..16
9. Bibliografía y web grafía…………………….…………………………………………………………….…….17
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
0. INTRODUCCIÓN
La realización de este prototipo ha sido promovida por mi interés personal en el control de
variables que determinen la calidad del agua, aún y no siendo la química una de mis pasiones,
la agricultura intensiva y la cría o mantenimiento de peces requieren de ciertos cuidados
respecto a la calidad del ‘alimento’ o de su hábitat natural que en muchas ocasiones es muy
ventajoso, pueda ser automatizado el proceso de acondicionamiento de dichos medios.
2
De esta manera, esta actividad se centra exclusivamente en tratar de iniciar al realizador y a
posteriores lectores en el funcionamiento de uno de los elementos más utilizados a día de hoy,
al menos a un nivel no industrial, para la monitorización de una de las propiedades de los
medios acuáticos como es el pH.
1. Electordo de pH
Como nos indica la propia real academia española, se define pH como:
<<Índice que expresa el grado de acidez o alcalinidad de una disolución. Entre 0 y 7 la disolución es ácida, y de 7 a
14, básica. >>
Para llevar a cabo la realización de esta actividad se hace uso de un electrodo de pH como el
que se muestra en la Figura1, este electrodo es de procedencia asiática y por lo tanto no se
tiene conocimiento de sus especificaciones técnicas, por lo cual, los pasos siguientes se 3
realizarán en base a un conjunto de pruebas para hallar la sensibilidad de esta sonda y así
poder hallar las especificaciones básicas a tener en cuenta para el acondicionamiento de señal.
De esta manera se establece que los valores para pH 0 y 14 son de 300/350m V y -300/-350m
V aproximadamente siendo el valor 0 el correspondiente a pH 7 y entendiendo que el
comportamiento es de generación de una curva tensión lineal correspondiente a la variación
del pH de la disolución respecto de la referencia de 0 – pH7.
2. Acondicionamiento de señal
El acondicionamiento de señal procedente del electrodo de pH utilizado en este montaje, se
procesa mediante dos etapas analógicas para su posterior lectura digital.
Estas dos etapas se pueden observar de manera conjunta en la Figura 2, en primer lugar se
amplifica la señal de tensión procedente del electrodo gracias a un amplificador operacional
en configuración de amplificador no inversor, y posteriormente se añade un offset a la señal
procesada por el amplificador con un amplificador operacional en configuración de restador
inversor. De esta manera, conseguimos que la pequeña señal de tensión producida por la
medición de pH de nuestro electrodo, que bien puede ser de polaridad positiva o negativa, se
halle en un rango de 0 V a 4 V siendo 0 y 14 los valores de pH respectivos.
a. Amplificador no inversor
Partiendo de datos experimentales, la señal en tensión proporcionada por el electrodo estará
comprendido entre -350m V y 350m V, de esta manera, y como hemos decidido que el valor
de entrada al convertidor analógico digital del módulo Arduino sea de 4V, debemos amplificar
estas señales para que sean comprendidas entre -2 V y 2V respectivamente. Esta amplificación
se llevara a cabo mediante un amplificador operacional TL081 alimentado por una tensión
simétrica de +5V y -5V 4
Y por último observamos como en la segunda conexión del interruptor que nos permite
seleccionar entre modelos de amplificación hallamos la ganancia que nos permitirá el ajuste de
ganancia deseado para nuestro prototipo. Este modelo sigue los siguientes criterios:
=
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
Que fijando las resistencias R7 y R6 de la figura con los valores 270K y 30K respectivamente y
colocando un potenciómetro de ajuste de 100K nos queda:
=
=
5
De esta manera aseguramos que la ganancia se halla entre las posibles según la posición
de nuestro potenciómetro y en caso de obtener sensibilidades distintas a la del electrodo
utilizado en este prototipo, el sistema continuaría funcionando, así como la calibración
correcta del sistema independientemente de la tolerancia de los componentes, ya que
esta afectaría en mayor medida a las resistencia de valor alto.
b. Restador inversor
Una vez adecuada la amplitud de la señal de entrada, se debe añadir un offset que nos permita
obtener la entrada al conversor analógico digital deseada de 0 – 4 V. Para ello utilizamos un
restador inversor el cual sigue la siguiente ecuación de comportamiento:
De esta manera, el potenciómetro nos permitirá ajustar este valor para minimizar el efecto de
las tolerancias de los componentes.
Figura 4. Restador inversor con el cual se aplica un offset a la señal de salida del amplificador
3. Circuito de alimentación
Los amplificadores operacionales utilizados en la adecuación de la señal procedente del
electrodo utilizan una alimentación simétrica de +/- 5 V. Teniendo en cuenta que podemos
conectar a modo de shield nuestro prototipo, debemos generar esta alimentación a partir de la
alimentación del módulo Arduino.
Teniendo en cuenta que Alimentamos a 12V desde un adaptador de corriente todo el sistema,
y que no tendremos posibilidad de utilizar dos sistemas de alimentación como pueden ser
baterías, se opta por la utilización de un circuito integrado ICL7660 el cual, mediante la
utilización de interruptores en continua oscilación y un condensador, genera una tensión igual
a la aplicada en el pin de tensión negativa pero con un cambio de polaridad. De esta manera ya
hemos conseguido una alimentación simétrica de +/- 11.5V, debido a que el módulo Arduino
incorpora un diodo rectificador.
Por último y como se muestra en la Figura 5, mediante dos reguladores, 7805 y 7905 y sus
correspondientes condensadores, conseguimos una alimentación simétrica de +/- 5 V.
Figura 5. Etapa de generación de alimentación simétrica +/-5 V a partir de una tensión de entrada mínima de 7,6 V
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
4. Shield Arduino
Toda la circuitería nombrada en el apartado 3, así como el conexionado del visualizador LCD
utilizado para la visualización y los indicadores LED se han montado sobre una placa de PCB a
topos de paso 2.54 mm como se puede observar en las Figuras 6 y 7.
Figura 6. Cara TOP del prototipo shield para Arduino construido para esta actividad
Figura 7. Cara BOTTOM del prototipo shield para Arduino construido para esta actividad
Esta shield se conecta directamente sobre el módulo Arduino Mega 2560 mediante los pin
dorados sujetos en la parte inferior. De esta manera se consigue un bloque funcional.
5. Arduino
a. Esquema de conexionado
La funcionalidad Configuración mediante el indicador “<” nos permite ajustar los valores,
consigna e histéresis mediante el uso de los botones “+” y “-“de manera que nos
desplazaremos con pulsaciones leves del botón “Modo”.
Para volver al modo de medida simplemente debe volver a mantenerse pulsado el botón
“Modo” de manera prolongada.
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
10
Una vez ajustado el 0, lavar el electrodo en agua destilada con mucho cuidado y dejar lo más
limpio posible para no contaminar el buffer de pH 4 donde se debe sumergir de nuevo y
ajustar el potenciómetro de ganancia hasta lograr una lectura de pH4 en el sistema.
Se debe repetir tantas veces como sea necesario para poder asegurar un mínimo de calidad en
las lecturas recibidas por nuestro sistema.
Figura12. Material utilizado en la calibración del prototipo (Buffer pH 4 y 7, agua destilada, y bote mezclado para limpieza)
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
d. Programación
/* Medidor de PH con control de medida por histéresis
La interfaz de usuario esta basada en 3 pulsadores encargados del cambio de modo de oper
ación,
Medidor-Configuración-
Calibración, pudiendo navegar entre ellas en ese orden gracias a la Pulsación continuada
del boton Mode(pin25), además, la modificación de los valores consigna, y los valores d
e 'histeresis' pueden ser modificados mediante los botones UP(pin31) y DOWN(pin33)
Por ultimo, se incluyen 3 indicadores LED encargados de la visualización del estado del
pH Medido respecto de la consigna e histeresis configurados, de la siguiente manera:
- Sobrepaso (rojo-pin38)
- Correcto (verde-pin40)
- Por debajo (rojo-pin42) */
void setup(){
lcd.begin(20, 4); //Configuración de LCD 20 caracteres x 4 líneas
//Configuración de pines de entrada
pinMode(buttonMode, INPUT);
pinMode(buttonUp, INPUT);
pinMode(buttonDown, INPUT);
pinMode(PHUP, OUTPUT);
pinMode(PHOK, OUTPUT);
pinMode(PHLOW, OUTPUT);
}
void loop() {
//Lectura del valor analógico
sensorValue = analogRead(sensorPin);
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
//**********************************************************************************
//Proceso digital que asegura que cada, como mínimo 10 lecturas, el valor de
//pH medido es el que se encuentra en el sistema en media aritmética, dado que tras
//la lectura directa se ha detectado una oscilación de la lectura de unas 4 cuentas
//alrededor de esta media
//**********************************************************************************
/*Comprobamos si el valor leído es mayor o igual al valor máximo establecido
o a una distancia de 15 cuentas del adc respecto del minimo (valor empírico
para estabilidad)*/
if(sensorValue>=valuemax||sensorValue>=valuemin+15){
valuemax = sensorValue;
newmax=0; //reset de contador 12
}
else newmax++; //en caso contrario sumamos uno al contador de lecturas no guardadas
if(newmax>=10){ //si en 10 lecturas no hemos guardado, refrescamos el valor
newmax = 0; //reset de contador
if(sensorValue>=(valuemin+(valuemax-valuemin)/2))valuemax=sensorValue;
}
/*Comprobamos si el valor leido es menor o igual al valor minimo establecido
o a una distancia de 15 cuentas del adc respecto del máximo (valor empírico
para estabilidad)*/
if((sensorValue<valuemax)&&(sensorValue<=valuemin||sensorValue<=valuemax-15)){
valuemin = sensorValue;
newmin = 0; //reset de contador
}
else newmin++; //en caso contrario sumamos uno al contador de lecturas no guardadas
if(newmin>=10){ //si en 10 lecturas no hemos guardado, refrescamos el valor
newmin = 0; //reset de contador
if(sensorValue<=(valuemin-(valuemax-valuemin)/2))valuemin=sensorValue;
}
/* En caso de detectar que hay una distancia mayor a 10 cuentas (valor empírico)
entre los valores establecidos se resetean dichos valores a la lectura actual*/
if((valuemax-valuemin)>=10){
valuemax=sensorValue;
valuemin=sensorValue;
}
//Media aritmética para la visualización de medida
pHvalue = (((valuemax-valuemin)/2+valuemin)*7)/41;
//************************************************************************************
// Modo de visualización
//************************************************************************************
if(Mode==0){
if (changeMode){//Imprimimos estos valores, solo en caso que hayamos cambiado d modo
changeMode = false;
lcd.clear();
lcd.print("=> MEDIDOR DE PH <=");
lcd.setCursor(0, 1);
lcd.print("Lectura: __,_");
lcd.setCursor(0, 2);
lcd.print("Consigna: __,_");
lcd.setCursor(0, 3);
lcd.print("Hist: +__,_/-__,_");
}
lcd.setCursor(10, 1);
lcd.print(pHvalue/100);
lcd.print((pHvalue%100)/10);
lcd.setCursor(13, 1);
lcd.print((pHvalue%100)%10);
lcd.setCursor(10, 2);
lcd.print(consigna/100);
lcd.print((consigna%100)/10);
lcd.setCursor(13, 2);
lcd.print((consigna%100)%10);
lcd.setCursor(7, 3);
lcd.print(histup/100);
lcd.print((histup%100)/10);
lcd.setCursor(10, 3);
lcd.print((histup%100)%10);
lcd.setCursor(13, 3);
lcd.print(histdown/100);
lcd.print((histdown%100)/10);
lcd.setCursor(16, 3);
lcd.print((histdown%100)%10);
}
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
//************************************************************************************
// Modo de Configuración
//************************************************************************************
if(Mode==1){
if (changeMode){//Imprimimos estos valores, solo en caso que hayamos cambiado d modo
changeMode = false;
lcd.clear();
lcd.print("=> CONFIGURACION <=");
lcd.setCursor(0, 1);
lcd.print("Consigna: __,_");
lcd.setCursor(0, 2);
lcd.print("Histeresis(+): __,_"); 13
lcd.setCursor(0, 3);
lcd.print("Histeresis(-): __,_");
}
lcd.setCursor(19, sel+1);
lcd.write(60);
if(sel>=1) lcd.setCursor(19, sel);
if(sel<=0) lcd.setCursor(19, 3);
lcd.write(254);
lcd.setCursor(15, 1);
lcd.print(consigna/100);
lcd.print((consigna%100)/10);
lcd.setCursor(18, 1);
lcd.print((consigna%10));
lcd.setCursor(15, 2);
lcd.print(histup/100);
lcd.print((histup%100)/10);
lcd.setCursor(18, 2);
lcd.print((histup%100)%10);
lcd.setCursor(15, 3);
lcd.print(histdown/100);
lcd.print((histdown%100)/10);
lcd.setCursor(18, 3);
lcd.print((histdown%100)%10);
}
//************************************************************************************
// Modo de Calibración
//************************************************************************************
if(Mode==2){
if (changeMode){//Imprimimos estos valores, solo en caso que hayamos cambiado d modo
changeMode = false;
calibracion=true;
lcd.clear();
lcd.print("==> CALIBRACION <==");
lcd.setCursor(0, 1);
lcd.print("ADC: ____ > PH: __,_ ");
lcd.setCursor(0, 2);
lcd.print("Max: ____ Min: ____");
lcd.setCursor(0, 3);
lcd.print("UP:_ DOWN:_");
}
lcd.setCursor(5, 1);
lcd.print(sensorValue/1000);
lcd.print((sensorValue%1000)/100);
lcd.print((sensorValue%100)/10);
lcd.print(sensorValue%10);
lcd.setCursor(16, 1);
lcd.print(pHvalue/100);
lcd.print((pHvalue%100)/10);
lcd.setCursor(19, 1);
lcd.print((pHvalue%10));
lcd.setCursor(5, 2);
lcd.print(valuemax/1000);
lcd.print((valuemax%1000)/100);
lcd.print((valuemax%100)/10);
lcd.print(valuemax%10);
lcd.setCursor(16, 2);
lcd.print(valuemin/1000);
lcd.print((valuemin%1000)/100);
lcd.print((valuemin%100)/10);
lcd.print(valuemin%10);
lcd.setCursor(3, 3);
lcd.print(Up);
lcd.setCursor(15, 3);
lcd.print(Down);
}
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
else calibracion=false;
//************************************************************************************
// Botón Modo
//************************************************************************************
BMode = digitalRead(buttonMode);
counter = 0;
while(!BMode){
BMode = digitalRead(buttonMode);
delay(1); //anti-rebote
if(counter<=1023) counter = counter++; //pulsación larga
else {
counter=0; 14
Mode=Mode++;
if(Mode>=3) Mode=0;
changeMode = true;
break;
}
}
if((counter>=1)&&(counter<=1023)&&(Mode==1)){ //Si se ha pulsado pero no se llega a
cambio de modo
sel = sel++; //cambio de slección en configuración
if(sel>=3) sel = 0;
}
//************************************************************************************
// Boton +
//************************************************************************************
/*Bloqueamos el valor maximo asumible mediante consigna + histeresis superior y el
mínimo consigna - histeresis inferior a un valor no comprendido ente 0 y 140*/
Up = digitalRead(buttonUp);
if(!Up){
if(Mode==1&&sel==0){
if(consigna<140) consigna++;
if(consigna+histup>140) histup--;
if(consigna-histdown<0) histdown--;
}
if(Mode==1&&sel==1){
if((consigna+histup)<140) histup++;
}
if(Mode==1&&sel==2){
if((consigna-histdown)>0) histdown++;
}
}
//************************************************************************************
// Botón -
//************************************************************************************
/*Bloqueamos el valor maximo asumible mediante consigna + histeresis superior y el
mínimo consigna - histeresis inferior a un valor no comprendido ente 0 y 140*/
Down = digitalRead(buttonDown);
if(!Down){
if(Mode==1&&sel==0){
if(consigna>0) consigna--;
if(consigna+histup>140) histup--;
if(consigna-histdown<0) histdown--;
}
if(Mode==1&&sel==1){
if(histup>0) histup--;
}
if(Mode==1&&sel==2){
if(histdown>0) histdown--;
}
}
//************************************************************************************
//Estado de nivel (LED)
//************************************************************************************
if(pHvalue<(consigna-histdown)||calibracion==true) digitalWrite(PHLOW, LOW);
else digitalWrite(PHLOW, HIGH);
if((pHvalue<=(consigna+histup)&&pHvalue>=(consigna-histdown))||calibracion==true)
digitalWrite(PHOK, LOW);
else digitalWrite(PHOK, HIGH);
if(pHvalue>(consigna+histup)||calibracion==true) digitalWrite(PHUP, LOW);
else digitalWrite(PHUP, HIGH);
delay(200);
}
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
7. Conclusiones
Tras la realización del primer prototipo según los valores desconocidos del electrodo de pH y
las diferentes pruebas realizadas sobre placa de prototipos previas al montaje expuesto en
este documento, se ha concluido que un hardware bien diseñado puede evitar dolores de
cabeza a programadores encargados de diseñar sistemas basados en la adquisición de datos.
Además, tras haber tenido pocas tomas de contacto previas a la programación sobre Arduino
16
se ha hecho latente el gran abanico de posibilidades que brinda esta plataforma gracias a la
información que incluye de forma predeterminada y la gran comunidad de soporte dedica al
desarrollo de aplicaciones cotidianas y profesionales con esta plataforma.
Por último, se debe tener en cuenta que se ha despreciado un gran factor que puede afectar a
las lecturas de pH mediante este método de medida como es la temperatura, aun así, las
lecturas proporcionadas por nuestro sistema y como se define en los objetivos de esta
actividad, sirven perfectamente para entender el comportamiento de los electrodos de pH y su
comportamiento.
8. Posibles Mejoras
Es aconsejable que para futuros montajes de un prototipo como el que se expone en este
documento se tengan en cuenta diversos puntos que pueden crear conflictos.
El uso de un condensador cerámico en paralelo a los pulsadores, así como el uso de pulsadores
de calidad pueden evitar posibles rebotes que pueden ser captados por el sistema, así como la
configuración de este para el uso de interrupciones a las pulsaciones y no realizar lecturas de
estos en un bucle como se ha realizado.
Para evitar las oscilaciones producidas por interferencias externas de la red es aconsejable el
montaje de un filtro para 50Hz y mayores frecuencias de entrada al convertidor analógico
digital del Arduino así como a las alimentaciones de los circuitos integrados encargados de la
adecuación de señal.
Para evitar posibles falsos contactos y una facilidad de montaje es aconsejable realizar el
montaje de un prototipo como el expuesto en un circuito impreso diseñado específicamente
para esta aplicación, reduciendo la posibilidad de error, capacidades parasitas y sensibilidad al
ruido.
Por último se aconseja la utilización de amplificadores operacionales rail to rail, dado que en
este montaje se ha utilizado un LM358N, el cual, alimentado a 5 V solo es capaz de administrar
una tensión máxima de salida de 3.56 V (valor experimental).
Medidor de pH Jose Manuel López Torres EUETIB
15/01/2015
http://www.intersil.com/content/dam/Intersil/documents/icl7/icl7660.pdf Consultado:
12/01/2015