joi, 17 ianuarie 2013

Arduino ca termometru folosind senzorul KTY81-110

    Placa Arduino are 6 intrari analogice (convertor analogic numeric in 1024 trepte - adica 2 la puterea 10) si poate fi folosit ca simplu termometru sau termometru cu pana la 6 puncte de masura...
    Am cautat mai multe variante de realizare si ma hotarasem la MCP9700, LM35 sau KTY81-110.. din pacate nu am gasit la pret acceptabil decat pe KTY81-110.
    KTY81-110 este un termistor PTC (vezi datasheet-ul la http://www.nxp.com/documents/data_sheet/KTY81_SER.pdf ). Din informatiile de pe site, este destul de liniara variatia rezistentei cu temperatura.
    Am gasit informatii despre modul de conectare si masurare si la arduino pe site, dar cel mai bine este explicat la http://www.sprut.de/electronic/temeratur/temp.htm#ptc si tot acolo pe site la http://www.sprut.de/electronic/pic/projekte/thermo/thermo.htm .
    Modul de conectare este foarte simplu: o rezistenta de 2,7kohmi conectata intre +5V si pinul de masura (de obicei, AN0), iar KTY-ul se conecteaza intre pinul de masura si masa (GND).
    La http://playground.arduino.cc/Deutsch/KtyTemperatureExtDe este prezentata o schema, care masoara temperatura cand este apasat un buton:
iar infomatia este afisata pe monitorul calculatorului (monitorizare seriala). Am modificat un pic sketch-ul si am obtinut:

/*
  Programm um die Temperatur mit einem KTY-Sensor zu messen und 
  durch drücken eines Tasters auszugeben.
*/

void setup()
{
// Definition der seriellen Schnittstelle
Serial.begin(9600); 

}
// Funktion zum auslesen der Temperatur
 float kty(unsigned int port) {
         float temp              = 82;
// ADCSRA Register zurücksetzen 
         ADCSRA = 0x00;
// ADC aktivieren und Teiler auf 128 setzen               
         ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
// MDMUX Register zurücksetzen
         ADMUX = 0x00;
// AVCC mit externen Kondensator am AREF Pin 
         ADMUX = (1<<REFS0);
// Zuweisen des Kanals des Multiplexers 
         ADMUX |= port;   

// schleife zum Auslesen der Spannung
         for (int i=0;i<=63;i++) 
         {
                 ADCSRA|=(1<<ADSC);
                 while (ADCSRA & (1<<ADSC));
                 temp += (ADCL + ADCH*256);
         }

         // Umrechnen in Temperatur
         temp /= 101;
         temp -= 156; // not 256
       return (temp);
 }

void loop()
{
  // Anweisung zur Ausgabe der Temperatur auf dem seriellen Port wenn der Taster gedrückt wird.

// Aufruf der Funktion um die Temperatur auszulesen
    float read_temp = kty(0); 
// Ausgabe der Temperatur auf dem seriellen Port
    Serial.println(read_temp); 
// 1 Sekunde warten bevor der nächste Tastendruck ausgelesen wird
    delay(1000); 

}

     La http://playground.arduino.cc/Main/Kty81-110 este prezentat programul simplificat pentru citire si afisare pe monitorul calculatorului. (acolo am gasit ca e o eroare de formula,dar pana nu am atestat nu am fost sigur....).

    Modul de conectare, pentru a afisa temperatura pe ecranul LCD tip 1602A (16 coloane cu 2 randuri si LED pentru iluminare fundal):
     Sketch-ul modificat pentru afisarea temperaturii pe LCD-ul 16x2 este:

/*
  LiquidCrystal Library - display() and noDisplay()

  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 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 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
 http://arduino.cc/en/Tutorial/AnalogInput
 http://arduino.cc/forum/index.php/topic,21371.0.html
 http://www.tehnic.go.ro
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int sensorPin = A0;    // select the input pin for the KTY81-110
int sensorValue = 0;  // variable to store the value coming from the sensor
int outputValue = 0;   // value output to the %
int outputValue1 = 0;   // value output to cursor


void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (5000);
  lcd.clear();
}

// Funktion zum auslesen der Temperatur
 float kty(unsigned int port) {
         float temp              = 82;
// ADCSRA Register zurücksetzen 
         ADCSRA = 0x00;
// ADC aktivieren und Teiler auf 128 setzen               
         ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
// MDMUX Register zurücksetzen
         ADMUX = 0x00;
// AVCC mit externen Kondensator am AREF Pin 
         ADMUX = (1<<REFS0);
// Zuweisen des Kanals des Multiplexers 
         ADMUX |= port;   

// schleife zum Auslesen der Spannung
         for (int i=0;i<=63;i++) 
         {
                 ADCSRA|=(1<<ADSC);
                 while (ADCSRA & (1<<ADSC));
                 temp += (ADCL + ADCH*256);
         }

         // Umrechnen in Temperatur
         temp /= 101;
         temp -= 156; 
       return (temp);
 }


void loop() {
  
// Anweisung zur Ausgabe der Temperatur auf dem seriellen Port wenn der Taster gedrückt wird.
// Aufruf der Funktion um die Temperatur auszulesen
    float read_temp = kty(0); 
// Ausgabe der Temperatur auf dem seriellen Port
    lcd.setCursor(0, 0);
    lcd.print("temperatura este");
    lcd.setCursor(5, 1);
    lcd.print(read_temp);
    // put sign
   lcd.write(0b11011111);
    lcd.print("C");
// 1 Sekunde warten bevor der nächste Tastendruck ausgelesen wird
   
  //lcd.print(")");
  delay(1500);
  lcd.clear();
    }

     Pentru a verifica exactitatea masuratorilor folosind algoritmul asta, am masurat temperatura apei care se formeaza deasupra unei bucati de gheata, cand aceasta se topeste si am constat ca am o eroare de cca. 2 grade, deoarece imi indica -2:

    Am corectat in sketch valoarea pentru a-mi afisa zero:

valoarea afisata fiind acum:

Un comentariu:

  1. pentru senzorul KTY81-210 ce constante punem in sketch ? am incercat
    temp /= 202;
    temp -= 115.2;
    dar nu e chiar bine.
    Imi puteti spune cum se calculeaza aceste valori?
    Multumesc
    Tony

    RăspundețiȘtergere