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:
valoarea afisata fiind acum:
pentru senzorul KTY81-210 ce constante punem in sketch ? am incercat
RăspundețiȘtergeretemp /= 202;
temp -= 115.2;
dar nu e chiar bine.
Imi puteti spune cum se calculeaza aceste valori?
Multumesc
Tony