GenericLab / CO2-soil-respiration-chamber

4 stars 2 forks source link

Error en las calibracion #19

Open nanocastro opened 6 months ago

nanocastro commented 6 months ago

Hoy estuvimos con el Mauri viendo el tema de la calibración. Algo no esta funcionando porque cuando se termina de calibrar cada sensor mide muy distinto y lejos del 400 que estamos forzando.
@MaximilianoGarcia716 ese codigo lo sacaste del .ino que yo te pase originalmente? porque ese codigo ahora recuerdo no andaba bien. En la librería del SDC41 https://github.com/Sensirion/arduino-i2c-scd4x/tree/master/src esta la función y es distinta a la que hemos usado
Una duda es si el ASC (autocalibración) está disabled?
Yo en su momento hice también un codigo para calibrar que en ppio funcionaba
//Calibrar void calibrar(){

Serial.println("# CO2 values before recalibration");

// measure 5 times for(repetition = 0; repetition < 5; repetition++) { // read measurement data: 2 bytes co2, 1 byte CRC, // 2 bytes T, 1 byte CRC, 2 bytes RH, 1 byte CRC, // 2 bytes sensor status, 1 byte CRC // stop reading after 12 bytes (not used) // other data like ASC not included Wire.requestFrom(SCD_ADDRESS, 12); counter = 0; while (Wire.available()) { data[counter++] = Wire.read(); }

// floating point conversion according to datasheet
co2 = (float)((uint16_t)data[0] << 8 | data[1]);
// convert T in degC
temperature = -45 + 175 * (float)((uint16_t)data[3] << 8 | data[4]) / 65536;
// convert RH in %
humidity = 100 * (float)((uint16_t)data[6] << 8 | data[7]) / 65536;

Serial.print("# ");
Serial.print(co2);
Serial.print("\t");
Serial.print(temperature);
Serial.print("\t");
Serial.print(humidity);
Serial.println();

delay(2000);

}

// wait for another 5 minutes to equilibrate sensor to ambient Serial.println("# Waiting 20 minutes for equilibration"); //delay(5 60 1000); timeElapse = getDataTimer+12e5; // 20 minutes in milliseconds while(millis() < timeElapse) {};

// stop scd measurement Wire.beginTransmission(SCD_ADDRESS); Wire.write(0x3f); Wire.write(0x86); ret = Wire.endTransmission(); Serial.println(ret);

// wait for sensor delay(20);

// assuming an external reference shows 400 ppm calibration = 400;

// prepare buffer with data for calibration // calculate CRC for each 2 bytes of data data[0] = (calibration & 0xff00) >> 8; data[1] = calibration & 0x00ff; data[2] = CalcCrc(data);

// send command for perform_forced_recalibration Wire.beginTransmission(SCD_ADDRESS); Wire.write(0x36); Wire.write(0x2F); // append data for calibration // 2 bytes calibraion, CRC Wire.write(data[0]); Wire.write(data[1]); Wire.write(data[2]); ret = Wire.endTransmission(); Serial.println(ret);

delay(400);

// read data: 2 bytes correction, 1 byte CRC Wire.requestFrom(SCD_ADDRESS, 3); counter = 0; while (Wire.available()) { data[counter++] = Wire.read(); }

if(CalcCrc(data) != data[2]) Serial.println("# ERROR: recalibration CRC return value");

calibration = ((uint16_t)data[0] << 8 | data[1]);

Serial.print("# Value after recalibration\n# "); Serial.println(calibration-32768);

// output format Serial.println("CO2(ppm)\tTemperature(degC)\tRelativeHumidity(percent)");

// start scd measurement again in periodic mode, will update every 2 s Wire.beginTransmission(SCD_ADDRESS); Wire.write(0x21); Wire.write(0xb1); Wire.endTransmission();

// wait for first measurement to be finished (> 5 s) delay(10000); }

MaximilianoGarcia716 commented 6 months ago

Usé el código que estaba subido con modificaciones según la datasheet, mayormente tiempos de calibración, recuerdo que fueron pocas las modificaciones, entre ellas multiplexarlo, está en la página 13 de la datasheet

https://sensirion.com/media/documents/48C4B7FB/6426E14D/CD_DS_SCD40_SCD41_Datasheet_D1_052023.pdf

Se me ocurre que pasa 1 de 3 cosas: No se tiene concentración constante de CO2 No se tiene concentración homogénea de CO2 La calibración falla

Con Santi lo calibramos en la ventana con la cámara abierta y funcionó 90% de las veces, a veces parece que el mismo aparato no corta la calibracion de forma correcta y salen mal las concentraciones, si pasa eso calibras una segunda vez y deberia funcionar.

El código del github de sensirion corre cuando llamas sus funciones, creo que son las mismas que estuve usando

nanocastro commented 6 months ago

hola Maxi... che ahi calibramos todos los sensores con mi viejo dispositivo y eso anda bien y los sensores miden coherente (alrededor de 400ppm) y no presentan tanta variación.
Los llevamos con esa calibración al multiplexado y miden con mucha variación... van de 200 a 700 a veces nunca se estabilizan... hay algo mal en la medición me parece, mas que en la calibración.
Nos vamos a tener que poner a revisar porque asi no lo podemos usar