Schönen guten Tag,
ich habe ein kleines Problem mit dem richtigen Auswerten des Temperatursensors.
Die Temperaturmessung habe ich aus diesem Beispiel Arduino Playground - KtyTemperatureExtDe, nur ich versteh den "float kty" teil nicht. Ich habe den Sensor seit Tagen in einer Klimakammer zusammen mit einem Kalibriergerät und der Sensor zeigt immer eine niedriegere Temperatur an.
Derzeit misst das Kalibrieter Gerät 5,5 °C und mein Sensor 4,3°C. Ich habe einmal die Spannung am Sensor gemessen und die liegt bei 1,216V. Der Sensor ist zwar sehr stabil aber leider hat er immer eine Abweichung von 0,2°C bis 2,4°C.
Woran kann das liegen, bzw. wie kann ich den Fehler beheben?
Ich stell euch nochmal meinen Code rein ( dieser ist etwas umfangreicher, temperatur wird auf LCD ausgegeben und zusätzlich auf SD gespeichert. Außerdem kann ich die Speicherabstände einstellen und habe eine RTC mit ein gebaut ).
#include <Wire.h>
#include <SD.h>
#include <RTClib.h>
#include <LiquidCrystal.h> // LCD Lib
LiquidCrystal lcd ( A2, A1, 6 , 5, 2, 3 ); // LCD Pinbelegung
RTC_DS1307 RTC;
File myFile;
const int chipSelect = 4;
const int hoch = 7; // Taster für Hochzählen defenieren
const int runter = 8; // Taster für Runterzählen defenierern
int l = 0;
double Wert = 1; // Wert = Fließkommazahl
void setup()
{
// Port als INPUT defenieren
pinMode ( hoch, INPUT );
pinMode ( runter, INPUT );
digitalWrite ( hoch, HIGH );
digitalWrite ( runter, HIGH );
Wire.begin(); //RTC
RTC.begin(); //RTC
// Definition der LCD
lcd.begin ( 16,2 );
lcd.print ("Init SD card...");
delay ( 2000 );
if (!SD.begin(chipSelect)) {
lcd.clear ();
lcd.print ("Card failed");
return;
}
lcd.clear ();
lcd.print ("card init.");
delay ( 2000 );
lcd.clear ();
lcd.print ( "Log: " );
lcd.print ( Wert );
lcd.print ( " min." );
}
// 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 -= 153; // auf Fluke angepasst !!!
return (temp);
}
void loop()
{
DateTime now = RTC.now();
float read_temp = kty(0);
String dataString = "";
// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(read_temp);
dataFile.close();
// print to the lcd too:
lcd.setCursor ( 0,1 );
lcd.print ( "Temp: " );
lcd.print ( read_temp,1 );
lcd.print(0xDF,BYTE);
lcd.print ( "C" );
}
if (dataFile)
{
dataFile.close();
}
File dataFile2 = SD.open("Time.txt", FILE_WRITE); // Zeit in Datei schreiben
// if the file is available, write to it:
if (dataFile2) {
dataFile2.print(now.hour(),DEC);
dataFile2.print(".");
dataFile2.print(now.minute(),DEC);
dataFile2.print(".");
dataFile2.println(now.second(),DEC);
dataFile2.close();
}
l = 0;
// if the file isn't open, pop up an error:
// delay Schelife alle 100 ms Abfrage der Taster
for ( l = 0; l <= Wert * 600; l++ )
{
// Taster für Hochzählen abfragen
if ( digitalRead ( hoch ) == LOW )
{
Wert += 1.0f;
lcd.clear();
lcd.print ( "Log: " );
lcd.print ( Wert );
lcd.print ( " min." );
// Entprellung
while ( digitalRead ( hoch ) == LOW ) {}
}
// Taster für Runterzählen abfragen
if ( digitalRead ( runter ) == LOW )
{
Wert -= 1.0f; // zählt in 0,1'ner schritten hoch
lcd.clear();
lcd.print ( "Log: " );
lcd.print ( Wert );
lcd.print ( " min." );
// Entprellung
while ( digitalRead ( runter ) == LOW ) {}
}
delay ( 100 );
}
}
Ich hoffe ihr könnt mir irgendwie weiter Helfen!!!
Liebe Grüße