Go Down

Topic: Arduino Temperaturmessung mit KTY81-120 (Read 2 times) previous topic - next topic

Gehacktes

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?


Gehacktes

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

Gehacktes

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:
Code: [Select]
#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ß

sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Gehacktes

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 :)

Gruß

Go Up