vineri, 25 ianuarie 2013

Arduino ca multimetru


    Daca avem un alimentator reglabil care nu are un panou de indicare macar a tensiunii, putem realiza aceasta (momentan de moft, pana transferam pe un Atmel sperarat) un asemenea indicator pentru: tensiune, curent consumat, putere consumata si rezistenta echivalenta a consumatorului. Afisarea o putem face pe un afisaj cu 16 caractere a 2 randuri (clasic pentru aplicatiile Arduino).
    
     Modul clasic de conectare a unui consumator la alimentatorul reglabil este urmatorul:
     Conectarea unui voltmetru se face in paralel cu consumatorul, iar ampermetrul se monteaza in serie, in circuit:

    Arduino UNo are 6 intrari analogice (AN0.. AN5), dar pentru aceasta aplicatie sunt necesare doar 2 (una pentru voltmetru si una pentru ampermetru). In mod normal, referinta este de 5V, dar pentru aceasta aplicatie vreau sa folosesc pe cea interna de 1,1V pentru a avea o rezolutie mai buna, deoarece la curent rezistenta inseriata in circuit trebuei sa fie mica pentru a avea o cadere de tensiune scazuta, altfel alimentatoul nu mai este pentru ce a costruit adica sursa de tensiune stabilizata. De obicei, tensiunea pe acea rezistenta trebuie sa fie sub 1V.. eu as merge sub 0,5V. Pentru partea de tensiune trebuie realizat un divizor de tensiunea.

    Un mod de conectare al placii Arduino pentru a masura tensiunea pe consumator si curentul consumat de acesta este:


    Pe rezistenta de putere R0 vom masura caderea de tensiune, care este direct proportionala cu consumul, iar de pe R1 vom masura tensiunea care este proportionala cu tensiunea de pe consumator.

    Pentru a putea dimensiona divizorul rezistiv format din R1 si R2 trebuie sa stim tensiunea maxima debitata de sursa, iar pentru dimensionarea rezistentei R0 trebuie sa stim curentul maxim debitat.
    Sursa mea are la iesire, o tensiune stabilizata, reglabila intre 1,35 si 17,6V, deci pot alege ca tensiunea maxima pe care o pot masura sa fie... 30V. Curentul debitat este cam 2,2A daca retin bine, deci e sufient ca domeniul maxim masurat sa fie 3A.
    Daca nu am ales bine valorile maxime nu e o problema ca la PIC-uri sau AVR-uri, deoarece pot face usori modificari in program... si abia daca sunt multumit pot sa fac un modul independent cu un Atmega328 si un afisaj LCD.
    Divizorul rezistiv este de forma:
   
     Pentru cazul nostru U0max=30V, iar U1max=1,1V (folosim tensiunea de referinta de 1,1V de la Atmel 328). Daca alegem un curent de Imax=10mA cand tensiunea este maxima), obtinem urmatoarele valori ale rezistentelor:
    Deoarece sunt sanse foarte mari sa nu gasim acele valori, trebuie sa retimen ca intre cele 2 valori trebuie sa existe raportul:
   Cel mai simplu e sa folosim in locul uneia din ele o grupare serie de rezistenta cu semireglabil (de preferat, multitura). Sa zicem ca gasim la magazin o rezistenta de 100 ohmi (valoare apropiata de cea calculata), atunci pentru R1 trebuie sa avem 2627,3 ohmi si asta o putem obtine dintr-o rezistenta de 2 kohmi (sau 2k2) inseriata cu un semireglabil de 1 kohmi.



     Verificam puterile disipate pe rezistente, pentru cazul cel mai defavorabil:
     Daca e varianta inlocuirii rezistentei R2 cu o grupare serie: rezistenta R2' si semireglabil S1, puterile disipate vor fi:

    Pentru rezistenta necesara masurarii curentului, pentru o cadere de tensiune maxima de 0,3V la 3A avem:

    Va trebui sa punem o rezistenta cu puterea de minim 2W.


    Folosind programul specializat de editare CadSoft EAGLE PCB Design Software am desenat schema partii de masurare, care se intercaleaza intre alimentator si consumator (montaj) avand si un conector pentru legarea la placa ARDUINO: 
    Montajul ar putea arata asa:

iar "virtual", realizat cu Eagle3D asa:


    Un mic turorial de desenare cu programul gasiti in articolul meu numit Cum facem un cablaj iar un mic tutorial video despre partea de 3D (virtuala) este:


    Revenind la modul de legare in circuit, acesta este destul de simplu:
   
 
- continuarea este in partea a doua -

marți, 22 ianuarie 2013

Arduino ca termometru folosind senzorul KTY81-110 (partea a 2-a)




   Deoarece programul pentru calcularea temperaturii cu termistorul KTY81-110 de pe site-ul Arduino este destul de "ciudat" folosindu-se de calculatiile de la http://www.sprut.de/electronic/temeratur/temp.htm#ptc iar eu am gasit valorile coeficientilor de variatie a rezistentei termistorilor PTC de tipul KTY putin diferiti la http://www.nxp.com/documents/other/SC17_GENERAL_TEMP_1996_3.pdf, m-am apucat sa verific si eu calculele sa vad daca sunt diferente mari.
    Variatia rezistentei unui terrmistor cu variatie pozitiva a rezistentei (PTC) din seria KTY are formula:
    Pentru KTY81-110, la 25 de grade Celsius rezistenta lui este de 1000 ohmi.
    In imaginea de mai jos sunt prezentate valorile gasite pentru A si B din cele 2 surse mentionate mai sus si ce rezultate am obtinut (solutii in ecuatia de gradul 2, diferente, erori, etc) si am constatat ca valorile sunt foarte apropiate si erorile prea mici... calculatia s-a facut exact cum e montat termistorul inseriat cu o rezistenta de 2k7:


    Acum o sa pot scrie un program pentru Arduino mult mai usor de interpretat si apoi sa il pot folosi, de exemplu, la un termostat sau un termometru cu mai multe zone de masurare.

    Am realizat un programior, care respecta modul de calcul indicat mai sus:


/*
  LiquidCrystal Library 

  The circuit - see https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZfMYmYSvTFan1Gb1cHkI7MoWO93ywKD3k6pbVL2ld7No9_YImJHRk-huKGWK4uZljuyAqq_qmEzkhIg7m4zHzGlq-Gsw2wvEysCrFw7pfLpP1qF8udSOUYxjAyRAhFujrCAXf015wDX57/s1600/arduino_1602A_LCD_thermometer_KTY81_110.png
 * 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 (for grade sign)
 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.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 (resistor 2k7 at +5V and A0 + thermistor at A0 and GND)

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();

lcd.print(" termometru cu");  
  lcd.setCursor(3, 1);
  lcd.print("KTY81-110");
  delay (5000);
  lcd.clear();
}

void loop() {
// citire valoare pe intrarea analogica 
  float temp = analogRead(sensorPin); 
  // float sqrt(float temp);
  float ukty = 5 * temp / 1023.0 ;

float a = 0.00001874*1000;
float b = 0.007884*1000;
float c = 1000 - 2700*ukty/(5-ukty);
float delta = b * b - 4 * a * c;
float delta1 = sqrt (delta);
float x2 =(-b + delta1)/(2 * a);
float temp1 = x2 + 25 ;

// partea de afisare
    lcd.setCursor(0, 0);
    lcd.print("temperatura este");
    lcd.setCursor(5, 1);
    lcd.print(temp1);
    // put sign
   lcd.write(0b11011111);
    lcd.print("C");
// se odihneste si el 1,5 secunde
    delay(1500);
// sterge cu buretele tabla :-D
  lcd.clear();
    }

    Spre surprinderea mea, reactia este mai buna la modificarea temperaturii...

    Un scurt filmulet cu noul sketch scris de mine:

    Am mai modificat sketch-ul anterior, punamd mai multe explicatii (comentarii) si facand inainte de afisare o mediere cu valoarea anterioara...


/*
  LiquidCrystal Library 

  The circuit - see https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZfMYmYSvTFan1Gb1cHkI7MoWO93ywKD3k6pbVL2ld7No9_YImJHRk-huKGWK4uZljuyAqq_qmEzkhIg7m4zHzGlq-Gsw2wvEysCrFw7pfLpP1qF8udSOUYxjAyRAhFujrCAXf015wDX57/s1600/arduino_1602A_LCD_thermometer_KTY81_110.png
 * 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 (for grade sign)
 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.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;  // se impuna ca intrarea analogica 0 sa fie folosita
// termisorul PTC model KTY81-110 este conectat intre masa si intrarea Ao
// intre plus si intrarea A0 este montata o rezistenta de 2k7 (2700 ohmi)
// consideram ca temperatura initiala este de 20 grade Celsius
float temp2 = 20;
float temp0 = 20;
// valoarea rezistentei inseriate
float R = 2700;

void setup() {
  // anuntam ca afisajul LCD are 16 coloane si 2 randuri
  lcd.begin(16, 2);
  // afisam pe primul rand un mesaj
  lcd.print("www.tehnic.go.ro");  
  // mutam scrierea pe randul 2 si coloana 0 (prima)
    lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  // lasam 5 secunde textele
  delay (5000);
  // stergem ecranul
  lcd.clear();
  
// afisam un al doilea mesaj
lcd.print("  termometru cu");  
  lcd.setCursor(1, 1);
  lcd.print("KTY81-110 ver.2");
  delay (5000);
  lcd.clear();
}

void loop() {
// citire valoare pe intrarea analogica 
  float temp = analogRead(sensorPin); 
  // tensiunea pe senzorul KTY81-110 este
  float ukty = 5 * temp / 1023.0 ;

// definim coeficientii ecuatiei de gradul 2
// coeficintul lui dT^2 este B x R25
float a = 0.00001874*1000;
// coeficientul lui dT este A x R25
float b = 0.007884*1000;
// coeficientul liber 
float c = 1000 - R * ukty / (5 - ukty);
// calculam pe delta
float delta = b * b - 4 * a * c;
// extragem radical din delta
float delta1 = sqrt (delta);
// calculam solutia
float x2 =(-b + delta1)/(2 * a);
// temperatura fata de 0 grade Celsius
float temp1 = x2 + 25 ;
// facem o medie cu valoarea anterioara
float temp2 = (temp1 + temp0) /2.0; 
// partea de afisare
    lcd.setCursor(0, 0);
    lcd.print("temperatura este");
    lcd.setCursor(5, 1);
    lcd.print(temp2);
    // afisam semnul de grad
   lcd.write(0b11011111);
    lcd.print("C");
// se odihneste si el 1,5 secunde
    delay(1500);
// memoreaza ultima temperatura calculata
    temp0 = temp2;
// sterge cu buretele tabla :-D
  lcd.clear();
    }

    Am facut un nou filmulet cu termometrul... de la initializare, apoi cum creste temperatura daca tin senzorul intre degete:

     Deoarece inca nu sunt foarte stabile rezultatele, trebuie sa fac mai multe masuratori, apoi sa fac media si, abia, atunci sa afisez rezultatele...
    M-am hotarat sa faca 100 masuratori la 100ms diferenta intre ele si apoi sa afisez temperatura medie plus o mica pauza de o secunda jumate:


/*
  LiquidCrystal Library 

  The circuit - see https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZfMYmYSvTFan1Gb1cHkI7MoWO93ywKD3k6pbVL2ld7No9_YImJHRk-huKGWK4uZljuyAqq_qmEzkhIg7m4zHzGlq-Gsw2wvEysCrFw7pfLpP1qF8udSOUYxjAyRAhFujrCAXf015wDX57/s1600/arduino_1602A_LCD_thermometer_KTY81_110.png
 * 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 (for grade sign)
 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.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;  // se impuna ca intrarea analogica 0 sa fie folosita
// termisorul PTC model KTY81-110 este conectat intre masa si intrarea Ao
// intre plus si intrarea A0 este montata o rezistenta de 2k7 (2700 ohmi)
// valoarea rezistentei inseriate
int R = 2700; // asta e valoare standard
              // dar pot fi variatii de pana  la +/-10%
              // faceti corectiile aici !!!

void setup() {
  // anuntam ca afisajul LCD are 16 coloane si 2 randuri
  lcd.begin(16, 2);
  // afisam pe primul rand un mesaj
  lcd.print("www.tehnic.go.ro");  
  // mutam scrierea pe randul 2 si coloana 0 (prima)
    lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  // lasam 5 secunde textele
  delay (5000);
  // stergem ecranul
  lcd.clear();
  
// afisam un al doilea mesaj
lcd.print("  termometru cu");  
  lcd.setCursor(1, 1);
  lcd.print("KTY81-110 ver.3");
  //delay (5000);
  
}
      
void loop() {

float tempmedie = 0;
float sumatemp;
   // facem o bucla sa citim 100 de valori ale temperaturii
   for (int i=0; i <= 100; i++){
 // citire valoare pe intrarea analogica 
  int temp = analogRead(sensorPin); 
  // tensiunea pe senzorul KTY81-110 este
  float ukty = 5 * temp / 1023.0 ;

// definim coeficientii ecuatiei de gradul 2
// coeficintul lui dT^2 este B x R25
float a = 0.00001874*1000;
// coeficientul lui dT este A x R25
float b = 0.007884*1000;
// coeficientul liber 
float c = 1000 - R * ukty / (5 - ukty);
// calculam pe delta
float delta = b * b - 4 * a * c;
// extragem radical din delta
float delta1 = sqrt (delta);
// calculam solutia
float x2 =(-b + delta1)/(2 * a);
// temperatura fata de 0 grade Celsius
float temp1 = x2 + 25 ;
// aduna temperatura cu suma valoarilor anterioare
 sumatemp = sumatemp + temp1;
// se mai odihneste si el 100ms 
 delay(100);
   }
   tempmedie = sumatemp / 100;

 // partea de afisare 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("temperatura este");
    lcd.setCursor(5, 1);
    lcd.print(tempmedie);
    // afisam semnul de grad
   lcd.write(0b11011111);
    lcd.print("C ");
   delay(1500);
  // sterge cu buretele tabla :-D
 // lcd.clear();
  return;
  } 

   Varianta 3 se prezinta cam asa:

    
    Am zis sa fac si niste corectii, in sensul ca rezistenta mea nu are exact 2700 ohmi, am considerat ca am cam 2650 ohmi (e facuta dintr-o rezistenta de 2k2 care are 2140 ohmi la masurare si din 2 rezistente de 1k in paralel care au cam 1027 ohmi, deci masurat 2153 ohmi)
si la temperatura medie am facut o mica ajustare (de 0,3 grade Celsius).







    Sketch-ul modificat (versiunea 3m) este:
/*
  LiquidCrystal Library 



 * 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.




  */


// 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;  // se impuna ca intrarea analogica 0 sa fie folosita
// termisorul PTC model KTY81-110 este conectat intre masa si intrarea Ao
// intre plus si intrarea A0 este montata o rezistenta de 2k7 (2700 ohmi)
// valoarea rezistentei inseriate
int R = 2650; // valoatre standard 2700
// corectia bruta s-a facut pentru a arata 0 in apa de deasupra unei bucati de gheata


void setup() {

  // anuntam ca afisajul LCD are 16 coloane si 2 randuri
  lcd.begin(16, 2);
  // afisam pe primul rand un mesaj
  lcd.print("www.tehnic.go.ro");  
  // mutam scrierea pe randul 2 si coloana 0 (prima)
    lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  // lasam 5 secunde textele
  delay (5000);
  // stergem ecranul
  lcd.clear();
  
// afisam un al doilea mesaj
lcd.print("  termometru cu");  
  lcd.setCursor(0, 1);
  lcd.print("KTY81-110 ver.3m");
  //delay (2000);
}


      

void loop() {

float tempmedie = 0;
float sumatemp;
   // facem o bucla sa citim 100 de valori ale temperaturii
   for (int i=1; i <= 100; i++){
 // citire valoare pe intrarea analogica 
  int temp = analogRead(sensorPin); 
  // tensiunea pe senzorul KTY81-110 este
  float ukty = 5 * temp / 1023.0 ;


// definim coeficientii ecuatiei de gradul 2

// coeficintul lui dT^2 este B x R25
float a = 0.00001874*1000;
// coeficientul lui dT este A x R25
float b = 0.007884*1000;
// coeficientul liber 
float c = 1000 - R * ukty / (5 - ukty);
// calculam pe delta
float delta = b * b - 4 * a * c;
// extragem radical din delta
float delta1 = sqrt (delta);
// calculam solutia
float x2 =(-b + delta1)/(2 * a);
// temperatura fata de 0 grade Celsius
float temp1 = x2 + 25 ;
// aduna temperatura cu suma valoarilor anterioare
 sumatemp = sumatemp + temp1;
// se mai odihneste si el 100ms 
 delay(100);
   }
   tempmedie = sumatemp / 100;
 // aplicam corectie fina si la rezultat
   tempmedie = tempmedie + 0.3;
 // partea de afisare 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("temperatura este");
    lcd.setCursor(5, 1);
    lcd.print(tempmedie);
    // afisam semnul de grad
   lcd.write(0b11011111);
    lcd.print("C ");
   delay(1500);
  // sterge cu buretele tabla :-D
 // lcd.clear();
  return;
  } 
    Un filmulet cu o calite mai buna a imaginii, fata de celelalte, este:

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: