Arduino Temperaturmessung mit KTY81-120

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

Die while-Schleife in folgendem Code

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

sieht etwas merkwürdig aus - die Anweisung

                 temp += (ADCL + ADCH*256);

wird nur einmal ausgeführt, das ist bestimmt nicht richtig.

Ciao,

Rudi

Wieso nur einmal?
Ich sehe da 64 mal in der for-Schleife. Die leere while-Schleife ist dazu da, um auf den A/D - Wandler zu warten.

Allgemein scheint die Funktion (in Gleitkomma) ungefähr so zu rechnen:

Temperatur = (82 + 64*Analogwert)/101 - 153

Der Sensor scheint also ein lineares Signal zu liefern.
Da es einen kalibrierten Vergleich gibt würde ich einfach die 82 weglassen und mit zwei Vergleichspunkten selbst kalibrieren.

Gruß

Ah, sorry, das hatte ich nicht verstanden - ich meinte auch "nur einmal in der while-Schleife" - mir war nicht klar, dass das eine Warteschleife sein sollte. Das Semikolon ist so klein und versteckt, dass man es auch genauso gut übersehen hätte können.

Aus diesem Grund mache ich in so einem Fall das Semikolon immer auf einer eigenen Zeile - damit klar ist, dass das dort absichtlich steht;-)

Rudi

Danke erstmal :).

Ich werde morgen früh gleich mal die 82 aus der Formel entfernen und schauen was passiert. Anschließend werde ich dann die Formel den Werten anpassen. Hoffe das war dann der Fehler.

Ich hab das aus dem Beispiel entnommen und dachte damit das es richtig wäre.

Ich werde morgen direkt berichten ob es richtig ist und funktioniert.

Liebe Grüße

Aber ansonsten ist der Code soweit okey oder habt Ihr noch irgendwelche Verbesserungsvorschläge?

Die Funktion float kty ( unsigned int port ) liest direkt über die Register des Arduino 64 Analogwerte nacheinander.

for ( int i=0;i<=63;i++ )
         {
                 ADCSRA|=(1<<ADSC); //Startet ADC Convertierung
                 while (ADCSRA & (1<<ADSC)); // warteet bis Konvertierung fertig
                 temp += (ADCL + ADCH*256); // liest Werte aus Register und setzt sie zu einer 10 Bit Zahl zusammen und macht die Summe.
         }

Die 82, 101 und 153 sind für die Umrechnug.

Der KTY81-120 ist im Vergleich zum KTY81-110, welcher im Playground verwendet wird etwas ungenauer. ( Widerstandswerte bei 25 Grad +/-2% zu +/-1% des ..110.

Von der gemessenen Spannung ausgehend (1,216V) und unter der Annahme genau 5,000V Betriebsspannung errechne ich mit der Formel in Deinem Sketch 5,59 Grad, also 0,1 Grad Abweichung zu dem Referenzwert von 5,5Grad.

Hast Du versucht die Werte (ADCL + ADCH*256) auf die serielle Schnittstelle auszugeben und zu kontrollieren ob alle 64 Werte gleich sind?

Grüße Uwe

Schönen guten Morgen,

nein das werde ich gleich mal machen!
Oh dann werde ich wohl besser mal den KTY81-110 kaufen, weil es hier schon auf Genauigkeit an kommt, denn es müssen zuverlässige Werte sein die ich bekomme!

Ich stelle das Ergebnis dann gleich hier rein :slight_smile:

Gruß

Ich habe das jetzt probiert die ADCL und ADCH aus zu lesen, aber es werden mir nur irgendwelche undefenierbaren Symbloe angezeigt und keine Werte. Die Symbole ändern sich aber nicht ( vielleicht ist das ja auch was gutes ).

Ich habe noch ein wenig rum probiert, also bei 25 Grad ist der Sensor sehr genau aber wenn es wieder runter oder hoch geht mit der Temperatur dann gibt es die großen Abweichungen. Um nochmal ein paar Werte zu nennen: bei 25,30 Grad hat er eine Abweichung von 0,06 Grad, bei 27,7 Grad hat er eine Abweichung von 0,56 Grad und bei 21,00 Grad hat er eine Abweichung von 0,7 Grad.

Das liegt bestimmt am Sensor oder? Der wird nicht Linear genug sein oder die Formel zur Berechnung der Temperatur ist nicht genau oder beinhaltet einen Fehler.

Ich versuch es jetzt mal mit einem digitalen Sensor " DS1820", vielleicht klappt es damit besser!!! Aber wenn Ihr noch irgendwelche Ideen zu dem KTY habt, würde ich die gern erfahren und versuchen um zu setzen.

Gruß

Also ich habe jetzt den DS1820 Serial ausgelesen und er zeigt die gleiche Temperatur an, wie die, die auf dem Vergleichgerät steht.

Jetzt ABER das große Problem, der Code des DS1820 lässt sich nicht mit dem Code der LCD Anzeige, des Datenloggers oder/und des RTCs kombinieren. Wenn ich alles zusammen packe, dann loggt der µc nix mehr auf die SD Karte und auf der LCD wird auch nix angezeigt ( außer das, was im void setup angezeigt werden soll ). Außerdem lassen sich die Taster nicht mehr bedienen.

Gibt es irgendwie eine Debug funktion in dieser Arduino Software?

Ich stell euch nochmal den Quellcode rein wo ich Serial abfrage:

#include <OneWire.h>

OneWire  ds(10);  // on pin 10

void setup(void) 
{
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  
  if ( !ds.search(addr)) 
  {
    ds.reset_search();
    delay(250);
    return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) 
  {
      return;
  }
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    default:
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(100);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
  
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  
  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  Serial.print("Temp: ");
  Serial.print(celsius,1);
  Serial.println(" C");
}

und den wo alles in Kombination ist ( vielleicht findet Ihr den Fehler ):

#include <Wire.h>
#include <SD.h>
#include <OneWire.h>
#include <RTClib.h>

OneWire  ds(10);  

#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." ); 
}

 void loop()
{ 
  DateTime now = RTC.now();
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  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 += ",";
    }
  }
 
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      return;
  }
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    case 0x22:
      type_s = 0;
      break;
    default:
    return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  lcd.setCursor(0,1);
  lcd.print("Temp: ");
  lcd.print(celsius);
  lcd.print(0xDF,BYTE);
  lcd.print(" C");
  
File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(celsius);
    dataFile.close();

    // print to the lcd too:
  lcd.setCursor ( 0,1 );
  lcd.print ( "Temp: " );
  lcd.print ( celsius,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;
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 );
 }
}

Besten Dank schonmal

Gruß

Auf den ersten Blick fällt mir nichts auf. Aber ich vermute mal, dass irgendeins der return angesprungen wird.
Einen Debugger gibt es leider nicht. Man kann sich nur mit Statements über LCD oder der seriellen Konsole behelfen.
Gib doch einfach vor UND nach jedem return einen spezifischen Text mit nachfolgendem delay auf dem LCD aus. Dann hast Dus vermutlich recht schnell gefunden.

Hallo,

vielen Dank! Das ist echt eine gute idee, hab gerade auch ein wenig rum probiert wieder und jetzt kann ich die Temperatur zumindest mal auf die LCD anzeigen lassen. Ich gucke mal was der Fehler war und versuche in dieses Programm dann die restlichen Progammteile ein zu fügen. Wenn das dann wieder nicht geht mach ich das was du gesagt hast!

Gruß

Ich weiß schonmal etwas mehr.
Ich habe jetzt das Programm soweit, das die RTC, die LCD, alle Taster und der Ds1820 laufen. Sobald ich aber die SD Karte mit einprogramieren will, dann macht der nix mehr!
Das komische ist, wenn ich die SD Karte einprogrammiert habe, dann läuft die Schleife nichtmal durch bis sie zu dem Punkt kommt wo der Code für die SD Karte steht, sondern bleibt im void loop in der if Bedingung stehen

if ( !ds.search(addr)) 
  {
    ds.reset_search();
    delay(250);
// unzwar hier
    return;
  }

Wenn ich den SD Karten skript allein benutze ohne den DS1820 funktioniert das auch. Hier mal der Code für die SD:

#include <SD.h>

const int chipSelect = 4;
OneWire  ds(10);  // on pin 10

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.print("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.clear();
  Serial.print("card initialized.");
}

void loop()
{
  
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println("Temperatur");
    dataFile.close();
  }  
  delay ( 500 );
}

Und der jetzt funktionierende Code

#include <Wire.h>
#include <RTClib.h>
#include <OneWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd( A2, A1, 6, 5, 2, 3 );
OneWire  ds(10);  // on pin 10
RTC_DS1307 RTC;

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() {
lcd.begin(16,2);

  pinMode ( hoch, INPUT );
  pinMode ( runter, INPUT );
  digitalWrite ( hoch, HIGH );
  digitalWrite ( runter, HIGH );
  Wire.begin();          //RTC
  RTC.begin();           //RTC
  
  lcd.clear ();
  lcd.print ( "Log: " );
  lcd.print ( Wert );
  lcd.print ( " min." ); 
}


void loop()
{ 
  DateTime now = RTC.now();
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  
  if ( !ds.search(addr)) 
  {
    ds.reset_search();
    delay(250);
    return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      return;
  }  
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    default:
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(750);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();

  }
  // convert the data to actual temperature
  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
    lcd.setCursor ( 0,1 );
    lcd.print("Temp.: ");
    lcd.print(celsius,1);
    lcd.print(0xDF,BYTE); // 0xDF, BYTE geht nur für LCD
    lcd.print("C");
    
    // 1/2 Sekunde warten bevor der nächste Tastendruck ausgelesen wird
    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 );
 }
}

Woran kann das liegen? Ich blick da langsam nicht mehr durch :/. Hoffe Ihr könnt mir da Helfen!!!!!

Gruß

Du verwendest für den DS1820 den Pin 10.
Wie ist der SD Kartenleser angeschlossen? Ist das ein Shield?
Kann es sein, dass der auch Pin 10 verwendet? Dann wäre es klar, dass nach der initialisierung (SD.begin) der DS1820 nicht mehr ansprechbar ist.

Nein ich habe eine selbst erstellte Platine und da sind die Pins 4, 11, 12 und 13 in Benutzung. Und mit dem KTY hat es ja auch funktioniert. Ich versuchs eben nochmal mit einem anderen Pin! Kann man dafür auch einen Analogen Pin verwenden?

Ich habe jetzt nochmal andere Pins benutzt und bei allen das gleiche

Ich weiß nicht warum es auf einmal funktioniert aber das tut es jetzt :).

Ich habe den Sensor jetzt auf Pin 9 gelegt und jetzt passt es. hab vorhin aber schon einmal andere Pins benutzt und da hat es nicht geklappt. Naja egal jetzt gehts!

Danke für eure Hilfe!

hier nochmal der Code:

#include <Wire.h>
#include <RTClib.h>
#include <OneWire.h>
#include <SD.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd( A2, A1, 6, 5, 2, 3 );
const int chipSelect = 4;
OneWire  ds(9);  // on pin 10
RTC_DS1307 RTC;

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()
{
  lcd.begin(16,2);
  pinMode ( hoch, INPUT );
  pinMode ( runter, INPUT );
  digitalWrite ( hoch, HIGH );
  digitalWrite ( runter, HIGH );
  Wire.begin();          //RTC
  RTC.begin();           //RTC
  
  lcd.print("Init SD card...");
  delay( 500 );
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    lcd.print("Card failed");
    // don't do anything more:
    return;
  }
  lcd.print("card init.");
  lcd.clear();
  lcd.print("LOG: ");
  lcd.print(Wert);
  lcd.print("min.");
}

void loop()
{
  DateTime now = RTC.now();
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;

  if ( !ds.search(addr)) 
  {
    ds.reset_search();
    delay(250);
    return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      return;
  }  
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    default:
      return;
  } 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(750);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();

  }
  // convert the data to actual temperature
  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }

  celsius = (float)raw / 16.0;
    lcd.setCursor ( 0,1 );
    lcd.print("Temp.: ");
    lcd.print(celsius,1);
    lcd.print(0xDF,BYTE); // 0xDF, BYTE geht nur für LCD
    lcd.print("C");
    
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(celsius);
    dataFile.close();
  }  
  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();
  }
  for ( l = 0; l <= Wert * 590; 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 );
 }
}

Gruß

Schön, dass es funktioniert. Ich würde das Ganze zur besseren Lesbarkeit noch strukturieren, indem ich für separate Vorgänge Funktionen anlege. Eine Funktion für das Auslesen der RTC, eine zum Auslesen des Temperaturwertes, eine zum Schreiben auf SD-Karte, eine zur Anzeige auf dem LCD. Zur Veranschaulichung bzw. Orientierung , wie das mit den Funktionen läuft, habe ich in meinem Uhren-Thread ein bisschen Quellcode zu stehen: http://arduino.cc/forum/index.php/topic,88238.45.html Hier sieht man, dass dadurch die loop() quasi selbsterklärend wird.

Vielen Dank :)!

Das wollte ich eig. auch von Anfang an machen, aber da ich nicht genau wusste wie das funktioniert hab ich das erstmal sein gelassen!

Aber das werde ich gleichmal versuchen um zu setzen und mich ein wenig in dem Thread belesen!!!!

Besten Dank und euch allen ein schönen sonnigen Tag :slight_smile:

Gruß