Leer termopar con Max31855

Cerrado
inigohe
Hot Gun
Mensajes: 7
Registrado: Lun Mar 12, 2012 9:37 am

Buenos dias a todos...

He estado observando los trabajos de compañeros y otros desarrollos comerciales para aplicaciones en torno a los hornos de reflow y he realizado la siguiente adaptación de pseudo shield que Ryan Mcleng emplea para leer un termopar con el Arduino.

Se emplea un Maxim 31855 y un level shifter para poder trabajar con 5 voltios

El resultado es sensiblemente mas grande que el comercial, pero al menos a mi, me permite poder realizarlo empleando componentes throught hole menos los integrados claves que son de montaje superficial en formato Soic16, con un poco de esfuerzo se suelda y el metodo de la plancha para hacer el pcb.

Os pongo el esquematico en eagle

Imagen

Imagen

Imagen

En principio he probado con una sonda tipo K que me han prestado en el curro, la lectura es correcta y difiere un poco de la temperatura real, he realizado una medida de hielo con agua y sal; el resultado es cerca de dos grados de diferencia.

Habria que reescribir el script arduino de modo que se introdujera un coeficiente de corrección, de modo que al iniciar arduino solicite el valor leido por Arduino en una temperatura conocida y tangible.

De este modo ya tendriamos una lectura muy proxima a la realidad.

Un saludo.

inigohe
Última edición por inigohe el Lun Mar 26, 2012 11:59 am, editado 1 vez en total.
Avatar de Usuario
MISTER CHIP
Administrador
Mensajes: 5469
Registrado: Sab Ago 22, 2009 8:07 pm

Gracias por tus apuntes amigo inigohe. Espero sea de grán ayuda a tod@s los que se fabrican sus propios hornos. Va un punto para ti. ... Tan solo he de hacer una leve corrección: Muevo Tema del subforo de Reflow a Hornos/Convencionales.

Te felicito por la buena cara que va cogiendo ese proyecto ;)

Un saludo.
inigohe
Hot Gun
Mensajes: 7
Registrado: Lun Mar 12, 2012 9:37 am

Buenas...

Gracias por los halagos, no los merezco. Solamente he adaptado el proyecto de un fiera en el asunto!!!. Por cierto, para poder graficar los resultados procedentes del puerto serie he empleado el siguiente programa...
RealTerm y Kst.

La única pega que tengo es poder implementar el software del arduino, en principio he pensado emplear un rele de 10 amperios para el prototipo, este controlara una el encendido y apagado de una fuente de calor p.e. una bombilla incandescente. La visualización de datos se haria con una pantalla lcd y las variables se introducirian mediante pulsadores.

Un saludo.

inigohe
Avatar de Usuario
aprendiz
ReballingAdicto!!
Mensajes: 2103
Registrado: Mar Jun 08, 2010 10:40 pm

Excelente y felicidades, estare al pendiente de este proyecto......................

Muchas gracias por el aporte............


Saludos y suerte.......
Rework Arduino 1.0
Horno Arduino TJI-800


[infobox]Enlaces de interés [/infobox]
inigohe
Hot Gun
Mensajes: 7
Registrado: Lun Mar 12, 2012 9:37 am

Saludos:

He modificado el script de ejemplo, 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.
  http://creativecommons.org/licenses/by-sa/3.0/
*/
                                            // 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);
}
Imagen

Captura de los datos tomados, acercando un mechero al termopar...

Imagen

http://www.youtube.com/watch?edit=vd&v=H4l_9DVBPCs

Un saludo.

inigohe
inigohe
Hot Gun
Mensajes: 7
Registrado: Lun Mar 12, 2012 9:37 am

Saludos...

Aqui os cuelgo la ultima modificacion del script, es sencilla, pongo una entradilla y luego recojo dos valores de temperatura en tiempo real y amortiguado... y los represento tanto en un lcd 20x4 como en el puerto serie...
/*
  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.
  http://creativecommons.org/licenses/by-sa/3.0/
*/

#include <MAX31855.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,7,6,5,4,3,2);

// Arduino 1.0 pre-defines these variables
#if ARDUINO < 100
int SCK = 13;
int MISO = 12;
int SS = 10;
#endif
int LED = 9;
const int muestras =5;
int lecturas[muestras];
int indexado=0;
double total=0;
double media=0;
int correccion=0;
int msg=0;

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

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

void setup()

{
  lcd.begin(20, 4);
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  for(int lectura_actual=0;lectura_actual<muestras;lectura_actual++)
  lecturas[lectura_actual]=0;
}

void loop() {
if(msg==0)
{
  
  lcd.setCursor(0,0); 
  lcd.print("Control de Temperat.");
  lcd.setCursor(0,1); 
  lcd.print("para horno de reflow");
  lcd.setCursor(0,2); 
  lcd.print("v.1.0");
  lcd.setCursor(10,3); 
  lcd.print("by inigohe");
  delay(10000);
  msg=1;
  lcd.clear();}
  
  x = temp.readMAX31855(&tempTC, &tempCJC, &faultOpen, &faultShortGND, &faultShortVCC, temp_unit);
  
  total=total-lecturas[indexado];
  lecturas[indexado]=tempTC-correccion;
  total=total+lecturas[indexado];
  indexado=indexado+1;
  
    if (indexado>=muestras)
        indexado=0;
    media=total/muestras;
    
    Serial.print("\t");
    Serial.print(tempTC-correccion);
    lcd.setCursor(0,0); 
    lcd.print("La temperatura es");
    lcd.setCursor(12,1); 
    lcd.print(tempTC-correccion);
    lcd.setCursor(19,1); 
    lcd.print("C");
    lcd.setCursor(0,2); 
    lcd.print("La temp.suavizada es");
    lcd.setCursor(12,3);
    lcd.print(media);
    lcd.setCursor(19,3);
    lcd.print("C");
    Serial.print("\t");
    Serial.print(tempCJC);
    Serial.print("\t");
    Serial.print(faultOpen);
    Serial.print(faultShortGND);
    Serial.println(faultShortVCC);
    Serial.print(media);

  
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}
Un saludo.

inigohe
inigohe
Hot Gun
Mensajes: 7
Registrado: Lun Mar 12, 2012 9:37 am

Buenas, por cierto se me olvido colgar el pdf con el pcb del Max31855, no os asusteis no soy experto en el tema y solamente me remiti a colocar los componentes de una manera clara y facil. Seguro que hay mejores formas de hacerlo, pero...

Imagen

http://www.4shared.com/office/QSGDPe92/ ... ought.html, aqui teneis el fotolito, para hacerlo con la plancha y el toner.

Fijaros que los componentes smd van logicamente en la cara cobre y atentos a las polaridades de los condensadores y diodos...

Un saludo.

inigohe
Cerrado