Dies ist eine alte Version des Dokuments!


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.

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);
}
f11/technik/arduino/programme/temperatur-logger.1362435646.txt.gz · Zuletzt geändert: 2019/09/29 12:01 (Externe Bearbeitung)
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0