Temperatur-Logger

Dieses Programm liest die Temperatur aus einem DS1820 Temperatursensor und gibt den Wert zusammen mit einem Zeitstempel eines DS1307 auf einem LCD und der seriellen Konsole aus.

Dieses Programm ist eine Kombination der beiden Beispielprogramme

RTC_und_Temperatur.ino
/**
* Dieses Programm liest die Temperatur aus einem DS1820 Temperatursensor und gibt den Wert
* zusammen mit einem Zeitstempel eines DS1307 auf einem LCD und der seriellen Konsole aus.
* Kombination der beiden Beispielprogramme
*  - oneWire-Temperatursensor.ino
*  - RTC_LCD.ino
* Für Erläuterungen bitte die ausführlichen Kommentare in den beiden Programmen lesen.
*/
 
#include <LiquidCrystal.h>
#include <DS1307.h>
#include <OneWire.h>
 
LiquidCrystal lcd(12, 8, 7, 4, 2, 1);
DS1307 rtc(A5, A4);
OneWire sensor(10);
 
unsigned long prev_time;
String line1;
String line2;
 
byte addr[8];
byte data[12];
byte i;
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char buf[20];
 
void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  rtc.halt(false);
  sensor.search(addr);
  sensor.reset_search();
}
 
void loop() {
  if (Serial.available() > 0) {
    set_RTC();
  }
  if ((millis() - prev_time) > 999) {
    display_RTC();
    readTemp();
    prev_time = millis();
  }
}
 
void readTemp() {
  sensor.reset();
  sensor.select(addr);
  sensor.write(0x44,1);
  //delay(1000);
  sensor.reset();
  sensor.select(addr);
  sensor.write(0xBE);
 
  sensor.read_bytes(data, 9);
 
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (TReading*100/2);    
 
  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
 
  sprintf(buf, "%c%d.%d\337     ", SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract);
 
  lcd.setCursor(9,1);
  lcd.print(buf);
  Serial.println(buf);
}
 
/* Funktionen set_RTC() und display_RTC() von http://www.internet-for-all.de/arduino/bausteine/171-uhrenmodul-ds1307-mit-lcd-anzeige.html */
void set_RTC(){
  // Read received characters, build values and set RTC:
  int year, month, day, wday;
  int hour, minute, second;
 
  rtc.halt(true); 
  delay(10);
  wday= (Serial.read() - 48);
  rtc.setDOW(wday);
 
  day   =  (Serial.read() - 48) *10 +  (Serial.read() - 48);
  month =  (Serial.read() - 48) *10 +  (Serial.read() - 48);
  year  =  (Serial.read() - 48) *10 +  (Serial.read() - 48) + 2000;
  rtc.setDate(day, month, year);
 
  hour   =  (Serial.read() - 48) *10 +  (Serial.read() - 48);
  minute =  (Serial.read() - 48) *10 +  (Serial.read() - 48);
  second =  (Serial.read() - 48) * 10 + (Serial.read() - 48);
  rtc.setTime(hour, minute, second);
  rtc.halt(false);   
}
 
void display_RTC(){
  line1 = rtc.getDOWStr(FORMAT_SHORT);
  line1+=" ";
  line1+=rtc.getDateStr();
  line2 =String(rtc.getTimeStr());
  Serial.print(line1);
  Serial.print(" ");
  Serial.println(line2);
  lcd.setCursor(0,0);            // move to the beginning of the first line
  lcd.print(line1);
  lcd.setCursor(0,1);            // move to the beginning of the second line
  lcd.print(line2);
}