luns, 18 de febreiro de 2013

Sensor de temperatura con NTC e Arduino III

Para as prácticas utilizamos un termistor NTC, un sensor de temperatura LM35, unha pantalla LCD 16x2 (para a presentación dos datos) e unha placa Arduino Duemilanove.
Despois de buscar en diversas páxinas entre elas o Playground de Arduino, refixemos varios Sketchs sobre uso dun LCD 16x2 e dun sensor LM35, quedando o noso programa así:

/* Este Sketch foi elaborado a partires dos Sketchs de Arduino Playground sobre uso de
pantallas de cristal líquido compatibles coa pantalla LCD 16x2 de Hitachi HD44780 driver, en
concreto se usou unha LMB162ABC.

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 25 July 2009
 by David A. Mellis

Ademais se modificou un Sketch para o calculo da temperatura cun sensor LM35
coa correcion da formula para o calculo da temperatura, despois de comprobar a
temperatura cun 3º sensor (un sensor barométrico BMP085).

A formula inclue a suma dun 2:
       float temperatura=2+(5.0 * media * 100.0) / 1024;
pois no DataSheet do LM35 a montaxe que utilicei a recomenda entre +2ºC e +150ºC,
polo tanto, considerei que Vout=0V cando T=+2ºC

Sketch final de Manuel Andujar o 4-2-2013.
*/

#include       // librería do LCD

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);    // Inicialización LCD

const int Nlecturas = 200;    // Numero de lecturas para cada medida de temperatura

int lecturas[Nlecturas];      // Vector de lecturas para a temperatura no LM35
int lecturas2[Nlecturas];     // Vector de lecturas para o NTC
int indice = 0;               // Indice da lectura realizada
long total = 0;               // Total de todas as lecturas temperatura
long total2 = 0;              // Total de todas as lecturas NTC
long media = 0;               // Promedio das lecturas temperatura
long media2 = 0;              // Promedio das lecturas NTC

int inputPin = 0;             //Entrada conectada ao LM35
int inputPin2 = 1;            //Entrada conectada ao NTC

byte Grao[8] = {              // variable tipo byte, podemos crear un máximo
  B00100,                     // de 8 caracteres.
  B01010,                     // Aquí se utilizou para crear o símbolo de grao.
  B01010,
  B00100,
  B00000,
  B00000,
  B00000,
};

void setup() {
  lcd.begin(16, 2);             // Establece o número de filas e columnas do LCD
  lcd.print("T. LM35=");        // Estas primeiras instrucións son para crear os letreros
  lcd.createChar(0, Grao);      // permanentes na pantalla LCD
  lcd.setCursor(12, 0);
  lcd.write(0);
  lcd.setCursor(13, 0); 
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("T. NTC=");
  pinMode(9,OUTPUT);
  analogWrite(9,20);
  for (int i = 0; i < Nlecturas; i++)
  lecturas[i] = 0;
  for (int i = 0; i < Nlecturas; i++)
  lecturas2[i] = 0;
}

void loop() {
  total= total - lecturas[indice];            // Resta a ultima lectura
  total2= total2 - lecturas2[indice]; 
  lecturas[indice] = analogRead(inputPin);    // Lee a entrada analoxica 0 que e onde esta conectado o potenciometro
  lecturas2[indice] = analogRead(inputPin2);
  total= total + lecturas[indice];            // Engade a lectura ao total
  total2= total2 + lecturas2[indice]; 
  indice++;                                   // Incrementa o indice para pasar a seguinte posicion do vector lectura
  if (indice >= Nlecturas)                    // Finaliza o proceso de promediado            
    {  indice = 0;                          
       media = total / Nlecturas;
       media2 = total2 / Nlecturas;
       float temperatura=2+(5.0 * media * 100.0) / 1024;         // Calculo temperatura LM35
       float VNTC=media2*(5/1023.0);                        // Hai que recordar que
       float RNTC=VNTC*9850/(5-VNTC);                      // como R limitadora estou a usar unha R=9850 Ohmios
       float TNTC = (log(RNTC)-log(2600.816))/(-0.037);     // Formula obtida a partir das medicions previas,
       lcd.setCursor(9, 0);                                // ver a folla de calculo determinacion parametros NTC
       lcd.print(temperatura,1);                // Temperatura do LM35
       lcd.setCursor(9, 1);
       lcd.print(TNTC,1);                       // Temperatura do NTC
     }
  delay(5);
}


Con este programa podemos realizar a calibración de diversos NTC para poder ser usados como sensores de temperatura.

domingo, 10 de febreiro de 2013

Sensor de temperatura con NTC e Arduino II


Xa que dispoñemos dun sensor de temperatura LM35, imos a utilizalo como referencia de temperatura.
Así, mediremos co Arduino a Resistencia do termistor a diferentes temperaturas e pasaremos a táboa de valores de temperatura e resistencia do NTC a unha folla de cálculo, obteremos o gráfico resultante cunha liña de tendencia exponencial e a súa fórmula correspondente.
Posteriormente utilizaremos esa fórmula para obter no Arduino os valores de temperatura co NTC.
Despois das probas iniciais, démonos conta que o NTC ten unha resposta moito máis “viva” aos cambios de temperatura que o LM35, polo cal debemos tomar as medidas de R do NTC cando a temperatura sexa estable, esperando o tempo necesario.
Realizamos as medidas en diversas aulas do Instituto con temperaturas diferentes pero estables (sen correntes de aire) e tamén nun forno de casa (partindo dunha temperatura próxima ós 50 ºC) e tomando medidas mentres se vai arrefriando o forno lentamente.
A Gráfica Resistencia - Temperatura da NTC foi a seguinte:
Como pode verse na figura, a ecuación da liña de tendencia exponencial para os valores de R e T da NTC obtidos é:
 f(x) = 2600,816 * exp (-0,037 * x)
Esta, polo tanto, é a fórmula que describe a resistencia do termistor coa temperatura:
R = 2600,816 * exp (-0,037 * T)
Para realizar os cálculos de Temperatura no Arduino necesitamos obter a función inversa da anterior, polo que aplicando logaritmos:
Ln(R) = Ln(2600,816) + Ln (exp(-0,037*T))
Ln(R) – Ln(2600,816) = -0,037 * T
T = Ln((R / 2600,816) / (-0,037)
Con esta ecuación podemos obter o valor aproximado da Temperatura do NTC para un valor de R.
En próximas entradas describiremos a montaxe e o programa do Arduino...

Sensor de temperatura con NTC e Arduino

-->
A partir da nosa tarxeta Arduino e un termistor NTC de valor nominal 1KOhmio queremos realizar un sensor de temperatura.
O primeiro paso, foi buscar información sobre termistores, tanto PTC como NTC en Wikipedia e en outra páxinas do que deducimos que era mellor opción usar un NTC para o cometido que nos propoñiamos.
Despois de buscar en Internet atopei unha boa explicación de como usar un NTC como sensor de temperatura.
Para un NTC, para un marxe de temperatura de 0ºC ata 50 ºC, podemos aproximar o seu comportamento pola función:
dando lugar a unha gráfica exponencial como a seguinte:

Nesta páxina propoñen unha boa solución, calculando a resistencia da NTC para 2 valores coñecidos de temperatura. A falta dun termómetro de precisión, o máis sinxelo é utilizar os puntos de ebulición e conxelación da auga. E a partir destes datos coñecidos calcular a Beta da fórmula anterior:
Seguiremos en próximas entradas...