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.
Nueva versión del Medidor de pH para cerveza [link!]
(la versión que se describe en este artículo continúa siendo funcional).
/*
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");
}
}
Pulsador 1 + Pulsador 3: Calibrado en 7pH.
Pulsador 2 + Pulsador 3: Borrado del calibrado.
Publicar comentario