1-Wire Temperatursensor

Hier ein Beispiel wie man einen 1-Wire Temperatursensor auslesen kann. Verwendet wurde ein DS1820 von Dallas.

Benötigte zusätzliche Library:

Das Datenblatt und die Beschaltung des Dallas DS1820 ist hier beschrieben:

oneWire-Temperatursensor.ino
/**
*  Dieses Programm liest einen DS1820 1-Wire Temperatursensor aus.
*  In diesem Fall ist nur ein Sensor angeschlossen. Für mehreren Sensoren am 1-Wire Bus 
*  muss der Quelltext modifiziert werden.
*/
 
#include <LiquidCrystal.h>
#include <OneWire.h>
 
LiquidCrystal lcd(12, 8, 7, 4, 2, 1); // init LCD, Ports an eigene Verdrahtung anpassen!
OneWire sensor(10); // init OneWire Sensor an Port 10
 
/*
  Beispiel für eine Adresse eines DS1820.
  Achtung: Jeder Baustein hat eine eigene 8 Byte Adresse!
  Wenn man die Adresse weis und nur einen Baustein anspricht kann diese
  Adresse auch vorgegeben werden.
*/
//byte addr[8] = {0x10, 0x59, 0x87, 0x77, 0x2, 0x8, 0x0, 0xCE}; // 8 byte array für die Adressen
byte addr[8]; // 8 byte array für die Adressen
 
byte data[12]; // 12 byte array für Daten. Der DS1820 liefert aber nur 9.
byte i;
 
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char buf[20];
 
void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  sensor.search(addr); // suche ersten 1-Wire Sensor und schreibe gefundene Adresse in addr
  sensor.reset_search(); // reset search, nächster search() Aufruf würde wieder bei erstem Sensor starten
}
 
void loop() {
  /* Sensor Adresse ausgeben (optional)*/
  Serial.print("Address: ");
  for (i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
 
  /* Sensordaten ausgeben */
  sensor.reset(); // Reset des 1-Wire Bus. Vor jeder Kommunikation mit einem Sensor nötig
  sensor.select(addr); // Sensor mit Adresse ansprechen
  sensor.write(0x44,1); // Starte Kommunikation bei Spannungsversorgung über Vdd/GND Pins (nicht per 1-Wire Bus siehe Datenblatt)
  delay(1000);
  sensor.reset();
  sensor.select(addr);
  sensor.write(0xBE); // schreibt Sensordaten in Scratchpad (Speicherbereich für Sensordaten)
 
  sensor.read_bytes(data, 9); // einlesen von 9 Datenbytes. Der DS1820 liefert nur 9.
  /* einlesen der Daten optional auch so möglich */
  //for (i = 0; i < 9; i++) { // 9 Datenbyte
    //data[i] = sensor.read();
  //}
 
  /* Testausgabe der Rohdaten auf 1. Zeile des LCD und Seriell (optional) */
  lcd.setCursor(0,0);
  Serial.print("Data: ");
  for (i = 0; i < 9; i++) { // 9 Datenbyte
    lcd.print(data[i], HEX);
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  // Ende Testausgabe
 
  /* Umwandlung in Celsius Darstellung mit Nachkomma und Vorzeichen aus Beispielcode http://playground.arduino.cc/Learning/OneWire */
  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() schreibt in Variable buf den String "%c%d.%d\337C     " wobei:
     %c (character) durch Vorzeichen + oder - ersetzt wird
     %d mit Temperatur aus Variable Whole
     %d mit Temperatur (Nachkommastellen) aus Variable Fract
     \337 ist ASCII Code für Celsius-Kringel °
     C für Celsius
  */
  sprintf(buf, "%c%d.%d\337C     ", SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract);
 
  lcd.setCursor(8,1);
  lcd.print(buf);
  Serial.println(buf);
}