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.