DS18B20

Hallo Zusammen

ich bin gerade am Aufbau einer Solaranlage die ich mit einem Arduino steuere .
Sie funktioniert schon ganz gut.
Die Temperaturen werden mittels zweier PT100 ,deren Werte mittels einer Schaltung in ein Analogsignal 0-5V gewandelt werden , eingelesen.
Diese Werte werden an den Pins 1 und 2 eingelesen .
Nun möchte ich aber den PT 100 mit der Auswerteschaltung an Pin 1 durch einen DS18B20 ersetzen.
Leider sind alle Versuche bisher kläglich gescheitert.
Ach ja ich sollte noch erwähnen dass ich noch ein relativer Anfänger bin.

Hier mal der Sketch:

/*
  Differenztemperatursteuerung Sonnenkolektor mit 2XPT100
  
*/

// Laden der Libary:
#include <LiquidCrystal.h>

// initialisieren der LCD Pins ( Für das Orginal Arduino-Pad )
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//die Variablen deklarieren
float tempK;
float tempS;
int tempPin1 = 1;
int tempPin2 = 2;
int Pumpe = 13;
int Differenztemperatur = 0;      //Hier nichts eingeben
int Schalttemperatur = 8;         //Hier die Schalttemperatur der Differenz Kolektor -> Speicher, bei der die Pumpe gestartet wird, eingeben
int Hysterese = 2;                //Hier die Hysterese der Differenz, bei der die Pumpe abgeschalet wird, eingeben
int SpeicherTempMax = 85;         //Hier die Maxtemperatur des Speichers, bei der die Pumpe ausgeschaltet wird, eingeben
int SpeicherTempMaxHysterese = 2; //Hier die Hysterese der Ausschaltemperatur des Speichers, bei der die Pumpe wieder eingeschaltet wird, eingeben
int KolektorTempMax = 150;        //Hier die Maxtemperatur des Kolektors, bei der die Pumpe ausgeschaltet wird, eingeben
int KolektorTempMaxHysterese = 2; //Hier die Hysterese der Ausschaltemperatur des Kolektors, bei der die Pumpe wieder eingeschaltet wird, eingeben


void setup(){
  // Die Festen Texte übermitteln
  lcd.begin(16, 2);
  lcd.print("Kol=");
  lcd.setCursor(0, 1);
  lcd.print("Sp=");
  lcd.setCursor(10, 0);
  lcd.print("Dif") ;
  lcd.setCursor(8, 1);
  lcd.print("Pumpe") ;

  pinMode (Pumpe, OUTPUT);

}

void loop(){
  tempK = analogRead(tempPin1);           //lesen des Eingangswertes Pin 1 ( Kolektor )
  tempK = (5.0 * tempK * 50.0)/1024.0-31 ;  //Konvertieren in ein Temperatursignal -20°C bis +220°C
 

  // das Ergebnis ans Display senden
  lcd.setCursor(4, 0);
  lcd.print(tempK,1); // Die Temperaur des Kolektors wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben

 

  tempS = analogRead(tempPin2);           //lesen des Eingangswertes Pin 2 ( Speicher )
  tempS = (5.0 * tempS * 21.9)/1024.0 - 4.8;  //Konvertieren in ein Temperatursignal 0°C bis +100°C
  
  // das Ergebnis ans Display senden
 
  lcd.setCursor(3, 1);
  lcd.print(tempS,1); // Die Temperaur des Speichers wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben

  Differenztemperatur = tempK - tempS;
  
  lcd.setCursor(13, 0);
  lcd.print(Differenztemperatur,1); // Die Differenztemperatur wird geschrieben
  lcd.print("K ");
  
 
  
  if(Differenztemperatur > Schalttemperatur && tempS < SpeicherTempMax - SpeicherTempMaxHysterese && tempK < KolektorTempMax - KolektorTempMaxHysterese) // Wenn Diff.temp über Schalttemp. oder Speichertemp nicht über 84°C und Kol.temp nicht über 179°C
  digitalWrite(Pumpe, HIGH); // Pumpe wird eingeschaltet Pin 13
 
  if(Differenztemperatur < Schalttemperatur - Hysterese || tempS > SpeicherTempMax || tempK > KolektorTempMax) // Abschaltpunkt eingestellte Schalttemperatur - Hysterese oder Speichertemp über 85°C oder Kol.temp. über 180°C
  digitalWrite(Pumpe, LOW); // Pumpe wird ausgeschaltet Pin 13
  lcd.setCursor(13, 1);
 
 lcd.print(digitalRead(Pumpe) == HIGH? "Ein":"Aus"); // Anzeige des Schaltzustandes der Pumpe
 
 
  // sleep...
  delay(1000);
  
  
}

Ich hoffedass mir hier jemand helfen kann.
Schonmal vielen Dank im Vorraus

http://arduino.cc/playground/Learning/OneWire

Achtung Du definierst den analogen Eingang als pin1. Das funktioniert mit analogRead. Wenn Du aber die gleiche Variable für onewire nimmst, ist das dann der digitale Pin 1. Dieser ist zu vemeiden, da dort die seriele Schnittstelle liegt. Grüße Uwe

Und wiedereinmal ein großartiger und sinnvoller Vote - Danke dafür.

hallo,

schau dir das mal an:

LCD-Thermometer mit DALLAS DS1820 bzw. DS1822

=> http://www.dl8ma.de/Arduino/Thermometer_Dallas_ds1820

dort hab ich zwei Varianten um Temperaturen aus dem Dallas DS182x abzufragen beschrieben

Gruss Jürgen

Danke jmayer für die Hilfe

ich hab den Sketch von Deiner Seite mal ein bischen verändert da ich leider die LCD4Bit_mod Libary nicht gefunden habe und in meinem zurzeit mit 2 PT100 laufenden Sketch auch die normale LCD Libary verwende.

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

*/

#include <OneWire.h>
#include <LiquidCrystal.h>


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);// initialisieren der LCD Pins ( Für das Orginal Arduino-Pad )
[font=Verdana]#define COLS 16                     //Anzahl der Spalten
#define COLS 16                     //Anzahl der Spalten
#define ROWS 2                      //Anzahl der Zeilen
OneWire ds(12);                                          // 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.clear();
 
  if ( !ds.search(addr)) {                              // Sensor angeschlossen?
      ds.reset_search();
      lcd.print( "Sensor nicht" );
      lcd.setCursor(2, 0);
      lcd.print( "gefunden :-(" );
      return;
  }

  lcd.print("Thermometer");                           // Ausgabe des Sonsortyps
 
  if ( addr[0] == 0x10 or addr[0] == 0x28)              // 1-Wire family code
    lcd.print(" 1820" );
  if ( addr[0] == 0x22)
    lcd.print(" 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.setCursor(2, 0); 
  if (SignBit) // negative Werte ermitteln
  {
     lcd.print("-");
  }
  lcd.print( itoa( Whole, buffer, 10 ) );
  lcd.print(".");
  if (Fract < 10)
  {
     lcd.print("0");
  }
  lcd.print( itoa( Fract, buffer, 10 ) );
  lcd.print( " Grad" );
}

Der Sensor wird auch ausgelesen nur die Werte sind falsch ( sehr hoch bei Zimmertemperatur 184.00)
Es ligt wahrscheinlich daran dass ich einen DS18B20 Sensor habe
Auch wird die zweite Zeile nicht angesprochen
Der Eintrag
#define COLS 16 //Anzahl der Spalten
#define ROWS 2 //Anzahl der Zeilen
hat leider auch nichts gebracht
Weiß vileicht jemand wo ich da falsch liege.

hallo,

Ich würde die Variante 2 - mit Dallas Temperatur Control Library - verwenden.

Ist einfacher und flexibler.

Gruss Jürgen

Hallo Jürgen danke für die Hilfe. Ich versuche gerade den Sketch auf den Arduino zu laden. Allerdings wird die Libary DallasTemperaure nicht fablich unterlegt obwohl ich diese in das Verzeichnis Libarys kopiert habe. Im Unterverzeichnis DallasTemerature befinden sich dann unteranderem die zwei Dateien DallasTemerature.cpp und DallasTemerature.h wenn ich in der IDE auf Sketch Import Libay gehe wird die Lib auch angezeigt und wenn ich diese importiere wird die ebenfalls nicht rot unterlegt. Kannst Du mir sagen wieso das nicht funktioniert.

Danke Rudi01

In jeder Bibiothek ist außer den .h und .ccp Files auch noch eine Datei keywords.txt mit den Schlüsselwörtern. Auß dieser Datei nimmt der Editor im IDE di Information ob etwas ein Schlüssenwort ist oder nur eine Variable oder irgend ein anderer Text. Wenn diese Datei fehlt dann sind die Schlüsselwörter der Bibiothek nicht farblich hervorgehoben. Es funktioniert alles genauso, nur für den Programmierer ist die farbliche Hervorhebung besser. Wenn Du willst kannst Du Dir ja die Datei keywords.txt für die Bibiothek selber schreiben.

Grüße Uwe

Hallo zusammen

ich habe jetzt eine passende Kexword.txt gefunden. Die Funktion ist mir auch einigermaßen klar. So wie ich es sehe werden die darin enthaltene Keyworte im Sketch als Befehle benutzt . Wenn also im Sketch ein solches Keywort benutzwird das in der Keyword.TXT nicht enthalten ist dann gibts eine Fehlermeldung. So musste ich den Eintrag DallasTemperature sensors([u]&o[/u]neWire);in DallasTemperature sensors([u]O[/u]neWire); Umbenennen damit es in dieser Zeile beim Kompilieren keinen Fehler gab.

Jetzt werden aber noch viele andere Fehler ausgegeben und leider finde ich in den Keywords keine Äqivalenten Einträge die ich dann im Sketch umbenennen könnte.

sketch_may27b:19: error: no matching function for call to 'DallasTemperature::DallasTemperature(OneWire*)'

E:\Arduino\Software\Windows\libraries\DallasTemperature/DallasTemperature.h:63: note: candidates are: DallasTemperature::DallasTemperature(StratBase*)

E:\Arduino\Software\Windows\libraries\DallasTemperature/DallasTemperature.h:38: note: DallasTemperature::DallasTemperature(const DallasTemperature&) sketch_may27b.cpp: In function 'void setup()': sketch_may27b:28: error: no matching function for call to 'DallasTemperature::begin()'

E:\Arduino\Software\Windows\libraries\DallasTemperature/DallasTemperature.h:69: note: candidates are: void DallasTemperature::begin(uint8_t)

E:\Arduino\Software\Windows\libraries\DallasTemperature/DallasTemperature.h:78: note: void DallasTemperature::begin(NewOneWire&) sketch_may27b:30: error: 'class DallasTemperature' has no member named 'setResolution' sketch_may27b.cpp: In function 'void loop()': sketch_may27b:41: error: 'class DallasTemperature' has no member named 'requestTemperatures' sketch_may27b:43: error: 'class DallasTemperature' has no member named 'getTempCByIndex' sketch_may27b:47: error: 'class DallasTemperature' has no member named 'getTempCByIndex'

Ist es möglich dass ich die falsche Keyword Datei verwende? oder wie muss ich die Einträge im Sketch verändern damit dieser funkt

Vielen Dank für die Infos Rudi01

zeig mal den Code…

die keywords.txt sollte nur die Anzeige beeinflussen, der Code ist der selbe egal ob du eine keywords.txt hast oder nicht. Wenn du die Dallas Temperatur Control Library korrekt heruntergeladen und ausgepackt hast, müsste eine passende keywords.txt schon vorhanden sein.

die beiden Libraries (OneWire und Dallas Temperatur Control) hast du mit #include eingebunden?

Hi danke für die Antwort

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

Die Fehlercods:

ketch_may27b.cpp: In function ‘void setup()’:
sketch_may27b:28: error: request for member ‘begin’ in ‘sensors’, which is of non-class type ‘DallasTemperature ()(OneWire)’
sketch_may27b:30: error: request for member ‘setResolution’ in ‘sensors’, which is of non-class type ‘DallasTemperature ()(OneWire)’
sketch_may27b.cpp: In function ‘void loop()’:
sketch_may27b:41: error: request for member ‘requestTemperatures’ in ‘sensors’, which is of non-class type ‘DallasTemperature ()(OneWire)’
sketch_may27b:43: error: request for member ‘getTempCByIndex’ in ‘sensors’, which is of non-class type ‘DallasTemperature ()(OneWire)’
sketch_may27b:47: error: request for member ‘getTempCByIndex’ in ‘sensors’, which is of non-class type ‘DallasTemperature ()(OneWire)’

leider ist mein Englisch nicht so gut aber ich schließe aus den Fehlermeldungen dass die Einträge nich zur Library passen.

Ist es wirlich so dass eine fehlende oder falsche Keywords.txt nur die Anzeige beeinflusst.
denn ich musste den Eintrag DallasTemperature sensors(&oneWire);in DallasTemperature sensors(OneWire); Umbenennen damit es in dieser Zeile beim Kompilieren keinen Fehler gab.
Den Eintrag &oneWire gibts in Keywords nicht wol aber OneWire.
Di Library DallasTemperatur habe ich heruntergeladen und entpackt leider war die keyword.txt nich dabei die habe ich von woanders besorgt. Ich denke aber die Library ist immer gleich.

DallasTemperature sensors(&oneWire);

Wenn du die Zeile wieder in den Ursprungszustand änderst, kompiliert der Code ohne Probleme (LCD4bit habe ich beim Test entfernt)

ich habe die Library soeben nochmals heruntergeladen, da ist eine keywords.txt enthalten http://milesburton.com/Dallas_Temperature_Control_Library#Download

dass &oneWire nicht markiert wird ist verständlich. oneWire wurde von dir definiert und nicht von der Library. Um es zu veranschaulichen, auch das funktioniert.

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

Danke für den Link .Ich habe die Library von woanders her. Jetzt ist die richtige installiert.

das verstehe ich jetzt was bedeutet das & hier?

Ich versuche es jetzt mal und ändere auf die LiquidChristal Lirary

du kannst die LCD4bit verwenden, ich hatte das nur geschrieben weil ich diese Library nicht habe.

Bei dem & geht es um das Thema Zeiger (Pointer), damit wird die Adresse von oneWire übergeben.

Hi jetzt hab ichs geschaft vielen Dank für die Hilfe.
Ohne Euch hätt ichs nicht geschaft.
Hier der Sketch

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


LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Die Pins des LCD initialisieren

#define ONE_WIRE_BUS 12

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



OneWire oneWire(ONE_WIRE_BUS);                            // Datenleitung für Tempatursensor Dallas DS18xx -> Pin 12


DallasTemperature sensors(&oneWire);

void setup(void) {

  byte addr[8];  
  Serial.begin(9600);

  lcd.clear();
 
  sensors.begin();

  sensors.setResolution( 12 );
}

 


void loop() {
  
 
  float tempS = 0;
  char stringbuffer[ 17];
 
  sensors.requestTemperatures();                                         


  lcd.clear(); 
 
  tempS = sensors.getTempCByIndex(0);
 
  
  lcd.print( dtostrf( tempS, 5, 2, stringbuffer ) );
 
  lcd.print( "C" );
  
}

Jezt muss ich den Code nurnoch in mein bestehenden Sketch integrieren

Hallo

welcher Unterschied besteht zwischen der LCD4bit.h und der LiquidCrystal.h b.z.w. welche Vorteile bringt die Verwendung der LCD4bit.h die Befehle sind ja ein wenig anders und mit der normalen Lib lässt sich ein LCD auch mit 4bit ansteuern.