Arduino -- Elektronik-Experimentierkasten -- Lectron Lehrsytem -- Jugendarbeit -- Elektronik -- Amateurfunk -- Notfunk -- Shop

LCD-Thermometer mit DALLAS DS1820 bzw. DS1822

Dieser einfache Thermometer mit LCD-Anzeige arbeitet mit einem Temperatursensor DALLAS DS1822 bzw. DS1820.



Die gemessene Temperatur wird auf dem LCD-Shield ausgegeben. Zusätzlich wird der Sensortyp ( DS1820 bzw. DS1822 ) angezeigt. Der Temperaturwert wird parallel auch über die serielle Schnittstelle als Zahlenwert gesendet.

Hardware:

Software:

Librarys:
Initialisierung ( setup() ):

Hier werden die serielle Schnittstelle und das LCD-Display initialisiert. Falls kein Sensor angeschlossen ist wird eine entsprechende Meldung ausgeben und das Programm gestoppt.

Bei einem erfolgreich erkannter Sensor wird der Sensortyp ( 1820 bzw. 1822 ) in der erste Zeile des LCD-Displays angezeigt. (gilt nur für Variante 1)

Programmschleife ( loop() ):

In der Programmschleife wird der Temperatursensor abgefragt, der Messwert ermittelt, formatiert und auf der LCD-Anzeige bzw. über die serielle Schnittstelle ausgegeben.

Die Umrechnung in Grad Celsius erfolgt abhängig vom Sensortyp. Der dafür notwendige unterschiedliche Umrechnungsfaktor wird automatisch ermittelt. In der Variante 2 erfolgt dies innerhalb der Dallas Temperatur Control Library.


Temperatursensoren:

Es können die DALLAS-1-Wire-Sensoren DS18S20, DS18B20 bzw. DS1822 angeschlossen werden:

DS 18S20 / DS18B20

Messbereich: -55oC + 125oC
Genauigkeit: +/- 0,5oC
Messwertauflösung: 0,5
oC
1-Wire family code: 0x10h

Datenblatt DS1820

DS 1822

Messbereich: -55oC + 125oC
Genauigkeit: +/- 2oC
Messwertauflösung: 0,06
oC
1-Wire family code: 0x22h

Datenblatt DS1822


Die Datenleitung des Temperatursensors wird an den Pin 10 des Arduinos angeschlossen.

Der Pullup-Widerstand (4k7) ist auf einem Prototypen-Shield aufgelötet. Der Sensor wird über Schraubklemmen angeschlossen.




Verbesserungsmöglichkeiten

Das Beispiel zeigt die grundlegene Funktionen eines Thermometers. Aufbauend auf dieser Basis können weitere Anwendungen wie z.B. ein Datenlogger, eine Telemetrieeinheit für APRS usw. weiterentwickelt werden.

Quellen:

Das 1-Wire-Protokoll für die Kommunikation mit dem Dallas-Sensor basiert auf diesem Beispiel:

Arduino Playground: Dallas Semiconductor's 1-Wire Protocol

Dallas Temperatur Control Library   (wird für Variante 2 benötigt)



Code: (Variante 1)

/*
  Thermometer mit Dallas 18xx und LCD-Shield
 
  03.09.2011  Jürgen Mayer, DL8MA, Grossheppach
     
  Dieser Beispielcode ist public domain.

*/

#include <OneWire.h>
#include <LCD4Bit_mod.h>

LCD4Bit_mod lcd = LCD4Bit_mod(2);

OneWire ds(10);                                          // Datenleitung für Tempatursensor Dallas DS18xx -> Pin 10

char buffer[20] = "";                                    // Speicherbereich für Datenkonvertierung

void setup(void) {

  byte addr[8]; 
  Serial.begin(9600);
  lcd.init();
  lcd.clear();
 
  if ( !ds.search(addr)) {                              // Sensor angeschlossen?
      ds.reset_search();
      lcd.printIn( "Sensor nicht" );
      lcd.cursorTo(2, 0);
      lcd.printIn( "gefunden :-(" );
      return;
  }

  lcd.printIn("Thermometer");                           // Ausgabe des Sonsortyps
 
  if ( addr[0] == 0x10 or addr[0] == 0x28)              // 1-Wire family code
    lcd.printIn(" 1820" );
  if ( addr[0] == 0x22)
    lcd.printIn(" 1822" ); 
}


void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;

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

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);               // Start Konvertierung, mit power-on am Ende

  delay( 750 );                   // Wartezeit
   
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);                 // Messwert ausgeben

  for ( i = 0; i < 9; i++) {      // 9 Bytes einlesen
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;
  if (SignBit)           
  {
    TReading = (TReading ^ 0xffff) + 1; 
  }
 
  if ( addr[0] == 0x10 or addr[0] == 0x28)    // Faktor abhängig vom Sensortyp
    Tc_100 = (TReading*100/2);   
  if ( addr[0] == 0x22)
    Tc_100 = (6 * TReading) + TReading / 4;
 
  Whole = Tc_100 / 100;          // Ganzzahlen und Brüche trennen
  Fract = Tc_100 % 100;

/* Ausgabe auf serieller Schnittstelle */

  if (SignBit)                   // negative Werte ermitteln
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.print(Fract);
  Serial.println();

/* Ausgabe auf LCD-Shield */

  lcd.cursorTo(2, 0); 
  if (SignBit) // negative Werte ermitteln
  {
     lcd.printIn("-");
  }
  lcd.printIn( itoa( Whole, buffer, 10 ) );
  lcd.printIn(".");
  if (Fract < 10)
  {
     lcd.printIn("0");
  }
  lcd.printIn( itoa( Fract, buffer, 10 ) );
  lcd.printIn( " Grad" );
}

 


Code: (Variante 2 - mit Dallas Temperatur Control Library)


/*
  Thermometer mit Dallas 18xx und LCD-Shield / Version mit Dallas Temperatur Control Library
 
  04.09.2011  Jürgen Mayer, DL8MA, Grossheppach

  Dieser Beispielcode ist public domain.
 */

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LCD4Bit_mod.h>

#define ONE_WIRE_BUS 10

char buffer[20] = "";                                     // Speicherbereich für Datenkonvertierung

LCD4Bit_mod lcd = LCD4Bit_mod(2);

OneWire oneWire(ONE_WIRE_BUS);                            // Datenleitung für Tempatursensor Dallas DS18xx -> Pin 10
DallasTemperature sensors(&oneWire);

void setup(void) {

  byte addr[8];  
  Serial.begin(9600);
  lcd.init();
  lcd.clear();
 
  sensors.begin();

  sensors.setResolution( 12 );

  lcd.printIn("Thermometer");                             
}


void loop(void) {

  float temperatur = 0;
  char stringbuffer[ 17];
 
  sensors.requestTemperatures();                                         

  Serial.println(sensors.getTempCByIndex(0));

  lcd.cursorTo(2, 0);  
 
  temperatur = sensors.getTempCByIndex(0);
 
  lcd.printIn( dtostrf( temperatur, 5, 2, stringbuffer ) );
 
  lcd.printIn( " Grad" );
}

 


03.11.2011

Dipl.-Ing. (FH) Jürgen Mayer, DL8MA - Weinstadt-Grossheppach
Impressum

zurück zu www.DL8MA.de