Medidor de pH para cerveza - Parte 2: Software

Dificultad: Fácil.

Tiempo aproximado: 1 hora.

Coste aproximado: 0€ (montaje previo)

Utilidad: Útil

En el anterior artículo vimos como montar nuestro Medido de pH para cerveza [link!], ahora veremos cómo realizar la programación del mismo y su calibrado.

Programación de nuestro Medidor de pH para Cerveza:

Como la base de programación de nuestro medidor de pH es un Arduino NANO, necesitaremos del programa necesario para la programación del mismo:

Programa: Arduino IDE

Instalaremos el programa Arduino IDE y lo ejecutaremos, conectaremos nuestro Arduino mendiante el cable usb al PC, seleccionaremos nuestro modelo de placa, y nuestro modelo de procesador. Por costes, muchas veces se fabrican mismas placas con diferentes procesadores, en la web del fabricante te debería de decir que procesador lleva y sino es cuestión de ir probando:

Tendremos que agregar las librerías necesarias para ejecutar la programación que indicamos más adelante:
- Liquidcrystal:
Programa > Incluir Librería > Administrar Bibliotecas...

Atlas Gravity:
Que aunque no la encontremos, la puedes descargar [link!]
Y la incluiremos por .ZIP


Con todo listo, ya podemos pasar a programar el código nuestro Arduino, con el siguiente código:
Podéis copiar el código del post, o descargarlo [link!].
Sí usáis el link de descarga recomiendo utilizar Notepad++ para su lectura, copia ó edición.


/*
COMANDOS DE CALIBRADO:
 PUNTO BAJO: "cal,4"
 PUNTO MEDIO: "cal,7"
 PUNTO ALTO: "cal,10"
 LIMPIAR CALIBRADO: "cal,clear"
*/

#include "ph_grav.h"                                  //Archivo para el sensor pH.
#include "LiquidCrystal.h"                            //Archivo para la pantalla LCD
#include "Wire.h"                                     //Archivo para el sensor de Temperatura
#include "OneWire.h"                                  //Archivo para el sensor de Temperatura
#include "DallasTemperature.h"                        //Archivo para el sensor de Temperatura

const int pinDatosDQ = 12;                            //Pin Digital para el sensor de Temperatura
const int pulsadorPin8 = 8;                           //Pin 8 = Para el botón de pulsación 1.
const int pulsadorPin9 = 9;                           //Pin 8 = Para el botón de pulsación 2.
const int pulsadorPin10 = 10;                         //Pin 10 = Para el botón de pulsación 3.

int valorPulsador8 = 0;                                //AMPLI botones
int valorPulsador9 = 0;                                //AMPLI botones
int valorPulsador10 = 0;                                //AMPLI botones

float TempAnterior=0.00;                              //AMPLI TEMP almacena temperatura previa.
float TempActualCB=0.00;                              //AMPLI TEMP temp Centigrados
OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);

String inputstring = "";                              //cadena para guardar los datos entrantes de la PC
boolean input_string_complete = false;                //señalización para indicar si hemos recibido todos los datos de la PC
char inputstring_array[10];                           
Gravity_pH pH = A0;                                   //Pin A0 = para el sensor de pH
LiquidCrystal pH_lcd(2, 3, 4, 5, 6, 7);               //pines digitales LCD (2 -> RS, 3 -> E, 4 to 7 -> D4 to D7)


void setup() {
  Serial.begin(9600);                                 //habilitar puerto serie
  pH_lcd.begin(20, 4);                                //Iniciar interfaz LCD y definir el tamaño LCD (20 columnas y 4 filas)
  pH_lcd.setCursor(0,0);                              //Posición columna 0, fila 0.
  pH_lcd.print("-----Lectura pH-----");               //Caracteres para mostrar en display de la posición anterior.
  pH_lcd.setCursor(0,2);                              //Posición columna 0, fila 2.
  pH_lcd.print("-----Temperatura----");               //Caracteres para mostrar en display de la posición anterior.
  if (pH.begin()) { Serial.println("Loaded EEPROM");}
  Serial.println(F("Use commands \"CAL,4\", \"CAL,7\", and \"CAL,10\" to calibrate the circuit to those respective values"));
  Serial.println(F("Use command \"CAL,CLEAR\" to clear the calibration"));
 {
    // Activamos los pines de entrada y salida
    pinMode(pulsadorPin8, INPUT);
    pinMode(pulsadorPin9, INPUT);
    pinMode(pulsadorPin10, INPUT);
}
 }


void serialEvent() {                                  //si el puerto serie de hardware_0 recibe un carácter
  inputstring = Serial.readStringUntil(13);           //lee la cadena hasta que veamos un <CR>
  input_string_complete = true;                       //establecer la bandera utilizada para decir si hemos recibido una cadena completa de la PC
}


void loop() {
  sensorDS18B20.requestTemperatures();
  TempActualCB = sensorDS18B20.getTempCByIndex(0);  // Temperatura en grados Celcius
   valorPulsador8 = digitalRead(pulsadorPin8);
   valorPulsador9 = digitalRead(pulsadorPin9);
   valorPulsador10 = digitalRead(pulsadorPin10);
        
 if ((valorPulsador8 == HIGH) && (valorPulsador9 == HIGH)) {
          pH.cal_low();                                //función de llamada para calibración de punto bajo
    Serial.println("CALIBRADO EN 4");
  }
 if ((valorPulsador8 == HIGH) && (valorPulsador10 == HIGH)) {
      pH.cal_mid();                                   //función de llamada para calibración de punto medio
    Serial.println("CALIBRADO EN 7");
 }
 if ((valorPulsador9 == HIGH) && (valorPulsador10 == HIGH)) {
      pH.cal_clear();                                  //función de llamada para borrado de calibrado.
    Serial.println("CALIBRADO BORRADO");
  }

   if (input_string_complete == true) {                //verificar si los datos recibidos
    inputstring.toCharArray(inputstring_array, 30);   //convertir la cadena a una matriz de caracteres
    parse_cmd(inputstring_array);                     //enviar datos a la función pars_cmd
    input_string_complete = false;                    //restablecer la bandera utilizada para decir si hemos recibido una cadena completa de la PC
    inputstring = "";                                 //limpiar la cuerda
  }
    if (TempActualCB != TempAnterior) {
     TempAnterior = TempActualCB;
     //
     pH_lcd.setCursor(6, 3);                          //Posición columna 6, fila 3.
     pH_lcd.print(TempActualCB);                      //Caracteres para mostrar en display de la posición anterior [temperatura de la sonda].
    pH_lcd.print(" C");                               //Añadir caracter "C" al display.
     //
     delay(1000);  // espera 1 segundo / wait 1 second
  }
  Serial.println(pH.read_ph());                       //lectura de pH de salida al monitor en serie
  pH_lcd.setCursor(8, 1);                             //Posición columna 8, fila 1.
  pH_lcd.print(pH.read_ph());                         //Caracteres para mostrar en display de la posición anterior [sonda pH].
  delay(1000);

}



void parse_cmd(char* string) {                      //Para llamar a funciones de calibración
  strupr(string);                                   //convertir cadena de entrada a mayúsculas

  if (strcmp(string, "CAL,4") == 0) {               //compare la cadena de entrada del usuario con CAL, 4 y si coinciden, continúe
    pH.cal_low();                                   //función de llamada para calibración de punto bajo
    Serial.println("CALIBRADO EN 4");
  }
  else if (strcmp(string, "CAL,7") == 0) {          //compare la cadena de entrada del usuario con CAL, 7 y si coinciden, continúe
    pH.cal_mid();                                   //función de llamada para calibración de punto medio
    Serial.println("CALIBRADO EN 7");
  }
  else if (strcmp(string, "CAL,10") == 0) {         //compare la cadena de entrada del usuario con CAL, 10 y si coinciden, continúe
    pH.cal_high();                                  //función de llamada para calibración de punto alto
    Serial.println("CALIBRADO EN 10");
  }
  else if (strcmp(string, "CAL,CLEAR") == 0) {      //compare la cadena de entrada del usuario con CAL, CLEAR y, si coinciden, continúe
    pH.cal_clear();                                 //función de llamada para borrar la calibración
    Serial.println("CALIBRATION CLEARED");
  }
}


Podeís editar el código si lo necesitáis, para incluir algo más, cambiar el texto del display, utilizar otros pines del Arduino NANO...

Si teneis alguna desviación en la temperatura podeis corregirla, editando la siguiente línea:
pH_lcd.print(TempActualCB+valor de corrección);



Con el código copiado y modificado si lo veis conveniente:
-Pulsamos en compilar y esperamos que nos de mensaje de "Compilado".


Verificaremos el puerto COM de nuestro dispositivo Arduino:


Si nos aparecieran varios comprobamos en el Administrador de Dispositivos de Windows:


Pulsaremos en "Subir" para grabar nuestro código en nuestro Arduino, y esperaremos a recibir el mensaje de "Subido":


Calibrado de nuestro medidor de pH para Cerveza:

1.- Prepararemos nuestras soluciones de pH especificas para calibrar, teniendo en cuenta el factor de corrección de temperatura ya que para eso tenemos también sonda de temperatura:


2.- Podemos hacerlo de dos maneras:
-Desde los botones:
Con las sondas dentro de la solución y a la temperatura adecuada pulsar la secuencia según corresponda:

Pulsador 1 + Pulsador 2: Calibrado en 4 pH.

Pulsador 1 + Pulsador 3: Calibrado en 7pH.

Pulsador 2 + Pulsador 3: Borrado del calibrado.


- O desde la consola del programa Arduino IDE, la misma consola no servirá para ver las mediciones y para comprobar el funcionamiento correcto de los botones y la sonda:
Desde Arduino IDE pulsaremos en el icono de la lupa y nos abrira la conexión por puerto COM:

Aquí veremos las lecturas de pH. y nos dirá al principio los cuatro comandos que podemos enviar para calibrar el Medidor de pH desde la consola.
CAL,4 - Calibrar en 4.
CAL,7 - Calibrar en 7.
CAL,10 - Calibrar en 10.
CAL,CLEAR - Borrar calibrado.

*Se recomienda hacer un borrado del calibrado antes de calibrarlo de nuevo.

Por último, unos consejos de conservación de la sonda de pH:
- Tenerla cubierta siempre con su tapa.
- El electrodo no puede dejarse secar. Se recomienda una solución especifica de electrodos, o solución de pH4.01.
- No usar nunca agua destilada.

Publicar un comentario

0 Comentarios