Vale, ya he estado testeando un buen rato el sistema. Las conclusiones son extrañas, a ver si tu entiendes mejor los resultados.
En primer lugar los valores que da data en CAO y en el programa test de Cyberplant (en adelante, programa test) son los mismos, la única diferencia que CAO toma muchísimos más valores por segundo ya que en el de test hay un delay de 400ms entre toma y toma. Por tanto en el programa test cada valor que aparece en la salida serial es distinto mientras que en CAO cambia entre cada 10 a cada 14 tomas, no es constante.
Testeando en ph4, da estos valores:
Código:
2813.00
2809.00
2801.00
2807.00
2806.00
2800.00
2828.00
2812.00
2812.00
2820.00
2816.00
2838.00
2828.00
2820.00
2822.00
2828.00
Y en ph7 da
Código:
76.00
84.00
66.00
69.00
82.00
53.00
82.00
76.00
63.00
79.00
70.00
61.00
72.00
70.00
80.00
78.00
El comportamiento con las disoluciones controladas da un resultado claro y predecible, pero, cuando pruebo en el acuario las medidas se vuelven locas:
Código:
704.00
-989.00
-483.00
723.00
-548.00
-769.00
-951.00
-468.00
718.00
-669.00
-736.00
784.00
Esto pasa tanto en CAO como en el programa test y no tengo ni idea xq ocurrirá. Si pruebo en agua del grifo también pasa algo parecido, aunque no tan heavy.
Qué ocurre? que CAO intenta hacer una interpolación directa tras obtener una media cada X tomas y claro, el programa se vuelve loco. Unas veces da valores positivos, otras veces negativos... pero rara vez da un valor que se aproxime siquiera a lo que es.
El programa test es el siguiente
Código:
#include <SoftwareSerial.h>
#include "Wire.h"
#define pHtoI2C 0x48
float voltage, data;
float pH;
byte highbyte, lowbyte;
const int numReadings = 10;
float readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
float total = 0; // the running total
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
// Чтение pH
Wire.requestFrom(pHtoI2C, 2);
while(Wire.available() < 2); // same as CAO
highbyte = Wire.read(); // high byte * B11111111
lowbyte = Wire.read(); // low byte
data = highbyte * 256 + lowbyte;
voltage = data * 2.048 / 327.68; // mV
total -= readings[index];
readings[index] = ((-59.16 * voltage / (273.15 + 26)) + 7.0);
// pH = ((the slope of the electrode * voltage / (absolute zero + temp liquid)) + isopotential point)
// for Calibration isopotential point change float 7.0 during the measurement.
// for the slope of the electrode change float "-59.16" during the measurement pH 4.0 or pH 10.0
// change float "25" for temperature compensation
total += readings[index];
index++;
// if we're at the end of the array...
if (index >= numReadings)
// ...wrap around to the beginning:
index = 0;
pH = total / numReadings;
Serial.println(pH);
delay(500);
}
Como puedes ver el resultado que da también es una media de un número X de lecturas que encima ha corregido con su fórmula, y las va acumulando en un array. Por tanto el resultado es que justo al empezar a leer no da valores buenos, pero cuando lleva ya 10-15 segundos funcionando el programa ya SÍ aparece un resultado correcto de lectura de ph, incluso con ese data de entrada tan dispar y loco.
Ahora bien, por qué esa lectura de data Antonio??
AÑADO:
He hecho más pruebas, si vuelvo a meter la sonda de ph en el acuario después de haberla metido en la disolución ph7, el resultado es el mismo, pero si la meto en el acuario después de haberla metido en la disolución ph4, el resultado cambia a:
Código:
589.00
2424.00
1036.00
452.00
2396.00
1522.00
310.00
456.00
519.00
2297.00
918.00
373.00
No entiendo nada, no he manejado sondas de ph en la vida y no entiendo este comportamiento.