Ayuda con max31855

Buenos dias a todos...

He estado trabajando estos dias en realizar de modo facil un interface para la lectura de temperaturas mediante un termopar tipo K. El proyecto comercial es de Ryan McLeng y tiene a disposicion de todos el esquematico y los ficheros gerber de su trabajo, el tema es que por un metodo casero... es inviable dado el tamaño de los componentes y la placa.

Para poder hacerlo en casa, rehice el fichero eagle, para emplear el minimo de componententes superficiales posibles, excepto el Max31855 el level shifter y el regulador de tension de 3.3 v, el resto son componentes throught hole y facilmente localizables. Los componentes superficiales son en encapsulado Soic16, con un poco de paciencia se sueldan...

El resultado es el siguiente:

La libreria que emplea es la MAX31855.h que McLeng tiene en su repositorio.

El ejemplo tipo para la lectura de temperaturas es el siguiente:

/*
read_MAX31855.ino

TODO:
Clean up code and comment!!
Also make use of all library functions and make more robust.

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
CC BY-SA 3.0 Deed | Attribution-ShareAlike 3.0 Unported | Creative Commons
*/

#include <MAX31855.h>

// Adruino 1.0 pre-defines these variables
#if ARDUINO < 100
int SCK = 13;
int MISO = 12;
int SS = 10;
#endif
int LED = 9;

// Setup the variables we are going to use.
double tempTC, tempCJC;
bool faultOpen, faultShortGND, faultShortVCC, x;
bool temp_unit = 1; // 0 = Celsius, 1 = Fahrenheit

// Init the MAX31855 library for the chip.
MAX31855 temp(SCK, SS, MISO);

void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
}

void loop() {
x = temp.readMAX31855(&tempTC, &tempCJC, &faultOpen, &faultShortGND, &faultShortVCC, temp_unit);

Serial.print(tempTC);
Serial.print("\t");
Serial.print(tempCJC);
Serial.print("\t");
Serial.print(faultOpen);
Serial.print(faultShortGND);
Serial.println(faultShortVCC);

digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}

Aqui vienen mis dudas...

Es posible emplear un bucle for para calcular la temperatura media de 10 muestras???

for (int i=0;i<10;i++)

temp_media=temp_TC(i)/10

De igual modo quisiera introducir un valor de correccion ya que hay un error aproximado de dos grados, respecto de una lectura con un medio de referencia como es el agua con hielo y sal, que en condiciones normales es inalterable y igual a 0ºC.

Este no da problemas

int correccion_temperatura= (valor real)

"temp_TC-correccion_temperatura".

No se si he cometido alguna barbaridad, no controlo mucho la sintaxis del entorno de programacion arduino.

Gracias por los consejos

La corrección de temperatura está bien. Para suavizar las lecturas puedes hacer la media de los últimos X valores tomados. Para ello creas un array donde los vas almacenando conforme vas tomando las lecturas. Tienes el ejemplo en el IDE, lo tienes explicado en http://arduino.cc/en/Tutorial/Smoothing

Saludos:

Gracias por la respuesta, he modificado el script dando resultados prometedores...

/*
read_MAX31855.ino

TODO:
Clean up code and comment!!
Also make use of all library functions and make more robust.

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
CC BY-SA 3.0 Deed | Attribution-ShareAlike 3.0 Unported | Creative Commons
*/
// Se instalan las librerias necesarias
#include <MAX31855.h>

// Se predefinen las siguientes variables
#if ARDUINO < 100
int SCK = 13;
int MISO = 12;
int SS = 10;
#endif
int LED = 9;
const int muestras =5; // Nº de muestras a realizar
int lecturas[muestras]; // Array de las muestras
int indexado=0; // Posicion dentro del Array
double total=0; // Suma total de los componentes del Array
double media=0; // Media Aritmetica
int correccion=2; // Temperatura que marca el agua con hielo y sal es 0ºC. La diferencia
// entre el valor marcado por el termopar y 0 ºC, nos da el coeficiente corrector
// Puesta a punto de las variables que se van a emplear
double tempTC, tempCJC;
bool faultOpen, faultShortGND, faultShortVCC, x;
bool temp_unit = 0; // Unidades de Temperatura 0 = Celsius, 1 = Fahrenheit

// Iniciamos el Max31855
MAX31855 temp(SCK, SS, MISO);

void setup() {
Serial.begin(9600); // Se inicia la comunicacion por el puerto serie
pinMode(LED, OUTPUT);
for(int lectura_actual=0;lectura_actual<muestras;lectura_actual++)
lecturas[lectura_actual]=0; // Se pone a cero el Array
}

void loop() {
x = temp.readMAX31855(&tempTC, &tempCJC, &faultOpen, &faultShortGND, &faultShortVCC, temp_unit);

total=total-lecturas[indexado]; //Se resta el ultimo valor del array
lecturas[indexado]=tempTC+correccion; //Sumamos 1 a 1 los valores de cada componente del Array
total=total+lecturas[indexado];
indexado=indexado+1;

if (indexado>=muestras)
indexado=0;
media=total/muestras;

Serial.print("\t");
Serial.print(tempTC+correccion);
Serial.print("\t");
Serial.print(tempCJC);
Serial.print("\t");
Serial.print(faultOpen);
Serial.print(faultShortGND);
Serial.println(faultShortVCC);

Serial.print("Tra Media");
Serial.print(" ");
Serial.print(muestras);
Serial.print(" ");
Serial.print("muestras");
Serial.print("\t");
Serial.print(media);
Serial.print(" ");
Serial.print("C");
Serial.print("\t");

digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}

Captura Kst del flujo de datos...

Un saludo.

inigohe