mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS18B20 2 Grad zu kalt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe in kleines Problem mit folgendem Aufbau:


Hardware:
ESP8266 (Sonoff POW) + DS18B20 mit ca. 1m Kabel und 4.7k Pullup an GPIO3 
(RXD, 3.3V, GND)

Software:
Tasmota (5.13.1a)

Problem:
Der Sensor zeigt nach dem Booten des ESP8266 etwa 2,5 Grad zu viel an 
(reproduzierbar).
Nach ca. 4 Betriebsstunden sind es 2 Grad zu wenig!


Wir der gleiche Sensor an ein Pollin Net-io angeschlossen stimmt die 
Temperatur exakt !!!

Nutze ich einen "nackten" ESP8266 mit folgenden Arduino Script tritt der 
gleiche Messfehler auf.

Ein "nackter" AVR auf dem Breadboard, programmiert mit BASCOM misst 
ebenfalls richtig!

Dabei ist es völlig egal ob der "alte" Sensor oder ein frisch 
ausgepackter angeschlossen wird.


Kann mir das mal Jemand erklären ???

Danke schonmal
Michael


#include <Wire.h>
#include "SSD1306.h" 
#include <OneWire.h>
#include <DallasTemperature.h>

SSD1306  display(0x3c, D1, D2);

#define ONE_WIRE_BUS D3  // DS18B20 pin
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

float temp;


void setup(){
  display.init();
  //display.flipScreenVertically();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  temp = 50;
}

void displayTemp(){
  display.clear(); 
  display.drawString(16, 24, String(temp)); 
}

void loop(){

  DS18B20.requestTemperatures(); 
  temp = DS18B20.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(temp);
  
  displayTemp();
  display.display();
  
  delay(3000);
}

Autor: Serviervorschlag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die TO92 Gehäuse nass sind, spinnen die meistens.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Miss mal nicht alle 3 Sekunden, sondern warte eine Minute.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Egal ob TO92 oder in Metallhülse, der Fehler bleibt der gleiche. Auch 
wenn ich alle 5 Minuten manuell eine Messung anstoße ...

Der Sensor hängt im Pool, die ganze Zeit war ein Net-io dran (Ethersex 
Firmware), da lief der Sensor seit vorletzten Jahr völlig problemlos, 
auch durch die Winter hinweg.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Kann mir das mal Jemand erklären ???

Ich versuche es mal mit Fragen:
Die Prüfsumme des DS1B20 wird richtig empfangen?
Die Versorgung des DS18B20 erfolgt extern/parasitär?
Die Versorgungsspannung ist stabil, insbesondere während des Strompeaks 
des ESP8266?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Stromversorgung erfolgt vom Sonoff bzw. Labornetzteil, nicht 
parasitär.

Mit dem Oszi kann ich keine Auffälligkeiten bei der Stromversorgung 
erkennen, auch nicht wenn der Esp mal etwas mehr zieht.

Ob die Prüfsumme bei der Tasmota Firmware korrekt ist kann ich nicht 
sagen. Bei den AVRs (Bascom) passt alles und auch die Temperatur.

Es sind auch alle Arduino libs für den Esp auf dem neuesten Stand.

Autor: T-Fühler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf welche Auflösung und "conversion time" wird der sensor 
Initialisiert?
https://www.maximintegrated.com/en/app-notes/index.mvp/id/4377

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meinem Bascom Programm Standard mit 12 Bit und ~750ms.

Bei Tasmota und der Standard-Arduino-Lib auch mit 12 Bit und ~750ms.


Ist ja nicht mein erstes Mal mit diesen Sensoren ...
Mein Problem ist ja nur dass der ESP8266 mit einem DS18B20 falsche 
Temperaturen misst.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist ja nicht mein erstes Mal mit diesen Sensoren ...

Dann schau Dir doch einfach mal hüben und drüben die Rohdaten an, damit 
kannst Du extrem einfach entscheiden ob der Fehler in der Hardware oder 
in der Software liegt.

Autor: T-Fühler (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Michael schrieb:
> In meinem Bascom Programm Standard mit 12 Bit und ~750ms.
>
> Bei Tasmota und der Standard-Arduino-Lib auch mit 12 Bit und ~750ms.
>
>
> Ist ja nicht mein erstes Mal mit diesen Sensoren ...
> Mein Problem ist ja nur dass der ESP8266 mit einem DS18B20 falsche
> Temperaturen misst.

Und meine These ist, das der ESP8266 den Sensor anders konfigriert, als 
die anderen Boards, das Problem also nicht am sensor liegt sondern am 
Steuerprogramm. Welche Konfig werte beeinflussen noch die ausgegebene 
Temperatur? Muss erst irgend eine Kalbrieroutine gestartet werden?

Ich würde auch die Werte jetzt nicht als komplett "falsch" bezeichnen 
sondern als "mit deutlich geringer Genauigkeit". Das kann auf 
Unterschiede bei der Initialisierung rückführbar sein. Am besten mal 
alle Register auslesen und deren Inhalte vergleichen.

Vielleicht liegt ja das Problem an den verwenden typen und bei der 12(?) 
bit zu float Umwandlung wird sehr grosszügig gerundet. Wäre nicht das 
erste mal, das der Sensor richtig misst aber bei der Formatierung der 
Anzeige passiert Marks. Oder der Klassiker; 1/x ist nicht das gleiche 
wie 1.0/x.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
T-Fühler schrieb:
> Vielleicht liegt ja das Problem an den verwenden typen und bei der 12(?)
> bit zu float Umwandlung wird sehr grosszügig gerundet. Wäre nicht das
> erste mal, das der Sensor richtig misst aber bei der Formatierung der
> Anzeige passiert Marks. Oder der Klassiker; 1/x ist nicht das gleiche
> wie 1.0/x.


Ich glaube da liegt der Hund begraben ...


Tasmota rechnet so:
t = ConvertTemp(sign  temp12  0.0625);

t (float)
ConvertTemp (rechnet bei Bedarf in Fahrenheit um)
sign (Vorzeichen)
temp12 (12 Bit Wert vom Sensor)


Ich habe das jetzt mal wie folgt geändert:
t = sign * temp12;
t = t / 16;

Nun zeigt mir der Sonoff auf der Weboberfläche 17.12 statt 15.10 Grad.
Werde gleich mal mit dem analogen Thermometer nachmessen.

Autor: Jörn P. (jonnyp)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Sieht nach Software Fehler aus. Im 12-bit modus braucht der Sensor 750ms 
bis das Ergebnis der Messung im scatchpad steht. Holst du die Daten dort 
früher ab bekommst du das Ergebnis der vorherigen Messung oder auch 
Mist.
Nach  einem Reset oder Power_On (ohne einen Messbefehl) steht im 
scratchpad
+85°C als ein Testwert des Sensors. Das hilft vielleicht bei der 
Fehlersuche.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Ich habe das jetzt mal wie folgt geändert:
> t = sign * temp12;
> t = t / 16;

NB: Mir kam die Methode, das Zweierkomplement des Sensors zunächst in 
sign/magnitude umzurechnen, um es anschliessend zusammen zu 
multiplizieren, anfangs etwas umständlich vor:
      int8_t sign = 1;
      uint16_t temp12 = (data[1] << 8) + data[0];
      if (temp12 > 2047) {
        temp12 = (~temp12) +1;
        sign = -1;
      }
Aber eines muss man diesem Code lassen. Er funktioniert völlig konform 
zum C Standard, selbst dann, wenn die Hardware Integers im dafür m.W. 
längst ausgestorbenen Einerkomplement darstellt. Respekt. Andernfalls 
erhält man mit
      int16_t temp12 = (data[1] << 8) + data[0];
bereits Sechzehntel mitsamt Vorzeichen.

Negativ fällt dann aber doch auf, dass bei
      int8_t sign = ...
      uint16_t temp12 = ...
      ...
      ... sign * temp12 * 0.0625 ...
die Teilrechnung sign * temp12 auf einem 16-Bitter sinnigerweise ohne 
Vorzeichen stattfindet, weil
    int8_t * uint16_t => int * unsigned => unsigned * unsigned
während es auf einem 32-Bitter wie dem ESP8266 zu
    int8_t * uint16_t => int * int
wird. Besser wäre beispielsweise
      ... sign * (temp12 * 0.0625) ...

: Bearbeitet durch User
Beitrag #5420994 wurde vom Autor gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.