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:
/* 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" ); } |
/*
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