Zu grobe Temperaturausgabe mit DS18B20 Temp-Sensor ??

Guten Abend !

Ich habe einen Temp.-Sensor DS18B20 digital der nur Werte in 0,5°C Schritten ausgiebt also so: 20,0
20,5 21,0 usw .

Ich hätte es gerne aber in 0,01 Schritten also 2Stellen hinter dem Komma: 20,73 z.B.

Was bitte habe ich falsch gemnacht?

Auszug:

int temp_sensor = 5;                   // Pin 5 Bord ist verbunden mit DS18B20 Sensorausgang

float temperature = 0;                 // Variable zum speichern der Temperatur
int lowerLimit = 25;                   // definiert die niedrige Temperaturschwelle
int higherLimit = 30;                  // definiert die hohe Temperaturschwelle 

OneWire oneWirePin(temp_sensor);
DallasTemperature sensors(&oneWirePin);



void loop() {
 Serial.print("Temperaturabfrage des Sensors : ");              // DISPLAY "Lese die Temperatur des Sensors aus"
 sensors.requestTemperatures();
 Serial.println("ERGEBNIS");   
  delay(2000);                                              // DISPLAY "erledigt"

.........................

Gruß Ronald, der keine Ahnung hat..

Auszug:

Wieviel Bit Auflösung soll dir der DS denn liefern?

(Nein, ich will das nicht wissen! Du sollst dem DS das sagen. Dann bekommst du das auch)

Na da danke ich Dir für Deine umfassende Antwort!

Wenn Du hunderstel-Grad haben willst dann nicht mit diesem Sensor.

https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Der DS18B20 hat eine Genauigkeit von 0,5°C im Bereich von -10°C bis +85°C, von 2°C im Bereich von -55°C bis +125°C und eine Auflösung von 9 bis 12 Bit bei einem Meßbereich von -55 bis +125°C.

Eine Auflösung von 0,5°C; 0,25°C, 0,125°C und 0,0625°C sind einstellbar und entsprechen einer Auflösung von 9,10,11 und 12 Bit.

Eine höhere auflösung als die Genauigkeit hat keinen Sinn weil die Kommastellen reine Hausnummern sind.

Das ist so wie mit einem Lineal das mm Aufteilung hat zehntel mm messen zu wollen.

Wenn Du 1/100°C messen willst dann brauchst Du einen Sensor und eine Auswertungselektronik die das kann und auch dementsprechend teuer ist.

Grüße Uwe

der_elektrische:
Na da danke ich Dir für Deine umfassende Antwort!

  1. wenn Du Fragen stellst, dann gib auch einen sinnvollen und ausführbaren Sketch.
  2. Lies Dir das Datenblatt der verwendeten Hardware durch
  3. Bleib ruhig.

Grüße Uwe
Moderator

Hi

Er schrieb Nichts davon, hunderstel Grad messen zu wollen - lediglich zwei Nachkommastellen wurden explizit genannt und werden bei 12bit auch geliefert, wenn auch nur Differenzen von knapp über einem halben zehntel Grad (0,0675K) dabei heraus kommen.
Obwohl diese gewonnene Temperatur nur eine Genauigkeit von 2K aufweisen, so sind die Temperatur-Änderungen immer noch 0,0675K (wobei das letzte Bit als Hausnummer angesehen werden kann, aber egal).
Somit zeigt mir mein Windfang-Sensor gerade 10,13°C und es ist mir ziemlich wurscht, ob's Da jetzt in Wirklichkeit 10,55° oder gar nur gute 9°C sind.
Allerdings kann ich ziemlich sicher sein, daß die hier am PC erfasste Temperatur (immerhin 23,75°C) um ca. (23,75 - 10,13 = 13,62) dreizehneinhalb (~ 13,5) Grad höher ist, als im Windfang.
Die Sensoren sind, alle zusammen gesteckt und ohne Wind (!!) 0,8 oder 0,9 Grad auseinander - also bei der Differenz-Temperatur könnten beide Extreme aufeinander treffen - dann sind's in Wirklichkeit nur 12,7K Differenz - auch Das werde ich überleben.

Da Dein DS18B20 nur halbe Grad anzeigt, wurde Dieser irgendwo schon Mal auf 9bit konfiguriert.
Das musst Du nur wieder auf 12bit bringen.

MfG

@postmaster-ino

Ich hätte es gerne aber in 0,01 Schritten also 2Stellen hinter dem Komma: 20,73 z.B.

Das heißt meiner Interpretation nach er will auf 100stel genau messen.

Grüße Uwe

Etwas OT, aber passend zum Thema:

Ein US-Amerikaner hat mir mal erzählt, "kein Mensch" würde je auf die Idee kommen, Temperaturen als float zu behandeln. Der Unterschied zwischen 70 und 71 Fahrenheit ist so klein, dass da jede weitere Unterteilung übertrieben ist.

Ich vermute, wenn print(float) per default nur 1 Nachkommastelle anzeigen würde, wäre der Wunsch von Ronald (der_elektrische) auch moderater ausgefallen ...

:wink:

Bei einer Messung von Wassererwärmung pro Zeiteinheit ist mir 12-bit Auflösung schon recht. Bei Wetterdaten nicht so wichtig.

Ich denke nicht über die Sinnhaftigkeit einer genauen Temperaurmessung nach sondern kommentiere die Sinnlosigkeit von x Nachkommastellen wenn der Sensor bei weitem (wir reden von 50 mal ungenauer) diese Genauigkeit nicht bringt.
Grüße Uwe

Ich bedanke mich bei allen die sich hier so sehr ins Zeug gelegt haben. Das eine Temperaturmessung immer auch dem Zweck sinnvoll angemessen sein sollte verstehe ich.

Ich will die schleichende Erwärmung an einem Dieselmotor bei bestimmten Betriebszuständen erfassen. Dazu habe ich zunächst erst einmal einen Versuch gestartet bei dem ich seriell die Daten erfassen kann.
Wenn es mir gelänge diese Daten zeitgleich auch auf einem 20,4 Display auszugeben wäre ich schon weiter.Die LEDs stehen nur stellvertredend für eventuelle Schaltaufgaben.

Also die Temperatur muss nicht zwingend super genau werden, die Toleranzen sind relativ. Ich würde nur gerne auch etwas mehr als dies 9 bit -Ausgabe haben wollen , gut wäre vielleicht wenn es 11 bit Auflösung wären.
Das denke ich würde voll und ganz reichen.

Hier der ganze Sketch:

// Setzt die nachfolgenden LEDs als Ausgabe
 pinMode(redLedPin,OUTPUT);
 pinMode(greenLedPin,OUTPUT);
 pinMode(yellowLedPin,OUTPUT);
 }
 
 sensors.getAddress(sensor1,0);                  //sind nachträglich eingebaut worden wegen der Nachkommastellen
  sensors.setResolution(sensors2,11);            //sind nachträglich eingebaut worden wegen der Nachkommastellen
 sensors.begin();                                // der sollte unbedingt so bleiben
}

void loop() {
 Serial.print("Temperaturabfrage des Sensors : ");              // DISPLAY "Lese die Temperatur des Sensors aus"
 sensors.requestTemperatures();
 Serial.println("ERGEBNIS");   
  delay(2000);                                              // DISPLAY "erledigt"


 temperature = sensors.getTempCByIndex(0);
 

 digitalWrite(redLedPin, LOW);                                      //Setzt die 3LEDS als Ausgabe wenn die untere Temperaturgrenze unterschritten wird
 digitalWrite(greenLedPin, LOW);
 digitalWrite(yellowLedPin, LOW);   
                                 
 Serial.print("Die Temperatur betraegt ");
 Serial.print(temperature  );
 Serial.print(" Grad Celsius");
 
 //Setup the LEDS to act as outputs
 if(temperature <= lowerLimit){
  Serial.println(",              Gelbe LED aktiviert");
  digitalWrite(yellowLedPin, HIGH);
  Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit
 }
 else if(temperature > lowerLimit && temperature < higherLimit){
  Serial.println(",                Gruene LED ist aktiviert");
  digitalWrite(greenLedPin, HIGH);
  Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit 
 }
 else if (temperature >= higherLimit){
   Serial.println(",                Rote LED ist aktiviert");
   digitalWrite(redLedPin, HIGH);
   Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit

   
                       
 }
   delay(1500);
}

Hier der ganze Sketch:

Falsch!

redLedPin ist schonmal undefiniert. :stuck_out_tongue:
( ausserdem hast du die Zeile

void setup() {

verloren.

Ausserdem: Code Tags hast du schonmal benutzt.

Also die Temperatur muss nicht zwingend super genau werden, die Toleranzen sind relativ. Ich würde nur gerne auch etwas mehr als dies 9 bit -Ausgabe haben wollen , gut wäre vielleicht wenn es 11 bit Auflösung wären.
Das denke ich würde voll und ganz reichen.

Die Meßgenauigkeit und die Auflösung sind 2 Größen die annähernd gleich sein müssen damit die Messung sinnvoll ist (zB keine Nachkommastellen angibt die aus der Luft gegriffen sind) oder ein Meß- und Schaltungsaufwand getrieben wird der danach nicht angezeigt wird (supergenaue Messung auf 100stel aber dann anzeige ohne Kommastellen).

Damit Du Zehntel-Grad anzeigen kannst brauchst Du eine genauere Messung als einen Ds18B20.

Grüße Uwe

Der arme Kerl will doch nur wissen, wie man die 9bit auf 11 oder 12bit umstellt. Der Rest ist irrelevant.
Wie stellt man denn den Wert von 9bit auf 11bit?

Lieben Gruß,
Chris

Hi

Code-Tags [ code ] und [ /code ] wären hilfreich.
Deine LED-Schalterei würde ich in ein switch/case-Block packen, wird übersichtlicher.
Auch brauchst Du nicht in jedem Durchlauf die LEDs ausschalten - wenn eine LED dunkel gehört, reicht ein Ausschalten hier.
Um nicht in jedem Bereich, wo die unterste LED aus sein soll ein digitalWrite einbauen zu müssen, würde ich mir überall nur 'merken', welchen Zustand welche LED haben soll, blöd gesprochen:
rot_neu=true;
Unterhalb der Festlegung, Wer Wie leuchten soll:
if (rot_neu!=rot){
digitalWrite(rot_pin,rot_neu);
rot=rot_neu;
}

Ob jetzt die Prüfung oder die Manipulation des Ausgang mehr Zeit beansprucht, müsste man messtechnisch erfassen - da der Arduino mit identischem Code viele verschiedene µC ansprechen kann, dürfte sich hier ein entsprechender Overhead zeigen.
Wenn die Prüfung und Nichtausführung schneller als die reine Ausführung ist, würde ich Das So wählen (ein Oszi und ein wackelnder Pin zum Messen sind hier von Vorteil, ein LA statt Oszi könnte aber auch reichen).

Dann lasse bitte die delay() in der Loop weg - suche dafür bitte die Nachtwächter-Erklärung.
Im Setup lasse ich mir delay() noch gefallen, da bei einem Init ggf. Wartezeiten einzuhalten sind, in der loop() zu >99% aber störend und wird Dir irgendwann auf die Füße fallen, wenn Du Deinen Sketch erweitern willst.

Ein LCD sehe ich in Deinem Sketch-Bruchstück aber nicht (der obere Teil bis ins setup() rein fehlt wohl ebenfalls).

MfG

Edit
Da Er die Umstellung auf 11bit bereits selbst in den Code eingebracht hat, dürfte eine Anpassung auf 12bit ebenfalls im Bereich Seiner Möglichkeiten liegen.

Edit2
Jetzt ist ein Sketchbeispiel im Anhang gelandet :confused: - ist aber kein LCD enthalten, ist hier also unpassend.
Da Es jetzt aber eh schon hochgeladen ist, belasse ich Den hier drin.
Noch wird darin KEIN Lüfter angesteuert, dieser Sketch soll (eigentlich schon lange) zwei quietschende Lüfter in den Netzgeräten der Käsefräse und der Frässpindel ansteuern - also eher Deren Ersatz-Lüfter.

DS18B20_Luefter_ATtiny.ino (6.38 KB)

Hallo,

ich glaube hier verwechseln viele den Unterschied zwischen Auflösung und Genauigkeit.

Der DS18B20 kann mit bis zu 12Bit Auflösung messen. Dafür gibts Register.
Das einfachste ist für den TO er verwendet die Lib dafür.

Bsp. sind enthalten, entsprechene Einstellungen vornehmen, glücklich zurücklehnen.

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

int greenLedPin = 2;                   // Pin 2 Bord ist verbunden mit grüner LED
int yellowLedPin = 3;                  // Pin 3 Bord ist verbunden mit gelber LED
int redLedPin = 4;                     // Pin 4 Bord ist verbunden mit roter LED

int temp_sensor = 5;                   // Pin 5 Bord ist verbunden mit DS18B20 Sensorausgang

float temperature = 0;                 // Variable zum speichern der Temperatur
int lowerLimit = 25;                   // definiert die niedrige Temperaturschwelle
int higherLimit = 30;                  // definiert die hohe Temperaturschwelle 

OneWire oneWirePin(temp_sensor);
DallasTemperature sensors(&oneWirePin);


void setup(void) {
  Serial.begin(9600);    
  
  // Setzt die nachfolgenden LEDs als Ausgabe
  pinMode(redLedPin,OUTPUT);
  pinMode(greenLedPin,OUTPUT);
  pinMode(yellowLedPin,OUTPUT);
  }
  
  sensors.getAddress(sensor1,0);                  //sind nachträglich eingebaut worden wegen der Nachkommastellen
   sensors.setResolution(sensors2,11);            //sind nachträglich eingebaut worden wegen der Nachkommastellen
  sensors.begin();                                // der sollte unbedingt so bleiben
}

void loop() {
  Serial.print("Temperaturabfrage des Sensors : ");              // DISPLAY "Lese die Temperatur des Sensors aus"
  sensors.requestTemperatures();
  Serial.println("ERGEBNIS");   
   delay(2000);                                              // DISPLAY "erledigt"


  temperature = sensors.getTempCByIndex(0);
  

  digitalWrite(redLedPin, LOW);                                      //Setzt die 3LEDS als Ausgabe wenn die untere Temperaturgrenze unterschritten wird
  digitalWrite(greenLedPin, LOW);
  digitalWrite(yellowLedPin, LOW);   
                                  
  Serial.print("Die Temperatur betraegt ");
  Serial.print(temperature  );
  Serial.print(" Grad Celsius");
  
  //Setup the LEDS to act as outputs
  if(temperature <= lowerLimit){
   Serial.println(",              Gelbe LED aktiviert");
   digitalWrite(yellowLedPin, HIGH);
   Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit
  }
  else if(temperature > lowerLimit && temperature < higherLimit){
   Serial.println(",                Gruene LED ist aktiviert");
   digitalWrite(greenLedPin, HIGH);
   Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit 
  }
  else if (temperature >= higherLimit){
    Serial.println(",                Rote LED ist aktiviert");
    digitalWrite(redLedPin, HIGH);
    Serial.println(" .                                                   .");//nachträglich eingefügt wegen Ablesbarkeit

    
                        
  }
    delay(1500);
}

Sorry das der Code nicht vollständiug war! War keine Absicht. Ich muss erst einmal Eure Hinweise lesen und versuchen zu verstehen. Werde mir auch die Links ansehen. Mal sehen ob ichs hin bekomme als Greenhorn ... :confused:

 ...
     pinMode(yellowLedPin,OUTPUT);
  }
  
  sensors.getAddress(sensor1,0);     
...

Mit der Klammer in der Mitte von setup() stimmt auch was nicht.

Das Problem ist für mich dass ich nicht wirklich weiter komme. Dazu sind hier viel zu viele Hinweise von euch gekommen.

Ich möchte mich naturlich auch ganz herzlich dafür bedanken!!

Aber wenn man wirklich erst blutiger Anfänger ist, und dann soviele Inputs hier bekommt, dann muss ich erst selektieren was wie gemeint ist. Da überfordert mich momentan erheblich.

So ist muss ich mal sehen wo ich jemanden finde der mir den Sketch entsprechend umschreibt, mir dabei aber auch erläutert was die Änderung dann bewirkt und warum dann dort an der Zeile.

Ich will es ja verstehen, jedoch braucht man dafür ohne Vorbildung etwas länger, ich jedenfalls.

Je mehr man weiß, desto mehr merkt man dass man gar nichts weiß. ;-))

Wie wahr!

Danke Euch
Gruß Ronald

themanfrommoon:
Der arme Kerl will doch nur wissen, wie man die 9bit auf 11 oder 12bit umstellt. Der Rest ist irrelevant.
Wie stellt man denn den Wert von 9bit auf 11bit?

Lieben Gruß,
Chris

Das sehe ich nicht so. Vieleicht aus Vorschädigung aus dem Schulunterricht. Da hätte es bei einer solchen Ausführung (Größere Auflösung als Genauigkeit) gleich mal negative Noten gehagelt.

Der Arme Kerl muß sich aber bewußt sein, daß eine größere Auflösung nicht mit einer größeren Genauigkeit einhergeht.

Grüße Uwe