DS18b20 negative Temperaturen... vermutlich fehlerhafte Werte

  • Versuchsanordnung:


    1x RasPi
    1.x Steckbrett mit 6-7 Sensoren paralell
    1x Sensor im Dachboden verbaut (jetzt Sonne und um die 30°C)
    1x "Test-Sensor" der war jetzt über 24 Stunden in einer Pillendose im Gefrierfach
    (siehe Bild)
    [Blocked Image: http://raspiazubi.square7.ch/w…ds/2014/05/testsensor.jpg]
    die Kupferleitungen um die Dose gewickelt (Wärme über Leitungen vermindern), und alles in ein Handtuch gewickelt.


    wenn ich die Temperaturen mit dem Pathon-skript auslese, dann bekomme ich sehr fragwürdige Werte. Auch beim Auslesen mit PHP sind die Werte nicht glaubwürdig..


    Beispiel Bildschirmausgabe Raspi-Python:

    Code
    1. Durchlauf starten ------------------------> 2014-05-05 16:35:00
    2014-05-05 16:35:01 10 SensorID: 28-000005293706 Dachboden --> 28.88 °C
    2014-05-05 16:35:02 11 SensorID: 28-000005296ee9 Hof --> 17.81 °C
    2014-05-05 16:35:03 12 SensorID: 28-000005298ddb Naehzimmer --> 17.75 °C
    2014-05-05 16:35:04 13 SensorID: 28-000005299f57 Test-Sensor --> -0.13 °C
    2014-05-05 16:35:05 14 SensorID: 28-00000529d1a0 Büro --> 17.94 °C
    2014-05-05 16:35:06 15 SensorID: 28-00000529ab41 Keller --> 17.81 °C
    2014-05-05 16:35:06 16 SensorID: 28-00000529dffa Keller --> 17.75 °C
    2014-05-05 16:35:07 17 SensorID: 28-0000051ae8a6 Brunnen --> 17.69 °C
    -------------------------(Durchlauf fertig)--> 2014-05-05 16:35:07


    Beispiel über PHP (Apache2 am RasPi: (Reihenfoge unterschiedlich)


    ich hätte an dieser Stelle am Test-Sensor eine Temp von -19 °C erwartet!!!
    (denn der Sensor steckte zu diesem Zeitpunkt noch fest im Eis aus dem Gefrierfach.


    die Werte meiner Variablen habe ich per Php- echo ausgeben lassen...


    hier die verwendete Funktion:


    [code=php]function jm_readTemp($sensorfile){


    $ok = FALSE;
    while ($ok == FALSE) { // auslesen so lange wiederholen bis erfolgreich
    $file = fopen("/sys/bus/w1/devices/" . $sensorfile . "/w1_slave", "r");
    $zeile1 = fgets($file); //z.B.: "b7 00 4b 46 7f ff 09 10 89 : crc=89 YES"
    //echo "zeile1 = " . $zeile1 . "<br>" . "substring = " . substr($zeile1,36,3) . "<br>";
    $zeile2 = fgets($file); // z.B.: "b5 00 4b 46 7f ff 0b 10 9e t=11312"
    echo "zeile2 = " . $zeile2 . "<br>";
    echo "substring = ". substr($zeile2,29,5) . "<br>";
    fclose($file);


    if (substr($zeile1,36,3) == "YES") { // wenn auslesen erfolgreich https://php.net/manual/de/function.substr.php
    $ok = TRUE;
    $tempString = substr($zeile2,29,8); // holt die letzten 5 Zeichen aus zeile2
    $temp = floatval($tempString)/1000; // in float wandeln und Dezimalpunkt setzen https://php.net/manual/de/function.floatval.php
    } // if


    return round($temp,2); // runden auf 2 Nachkommastellen https://php.net/manual/de/function.round.php
    } // while
    } //Function
    [/php]


    Daher nun meine Fragen an das Forum:


    Hab irgend einen Denkfehler in meinem Skripten?
    Hat jemand brauchbare Messwerte im Minus-Bereich?
    Kann es sein, dass Feuchtigkeit die Werte verfälscht?

  • Hallo,


    erstmal zwei Gegenfragen ;)


    1. Stimmen die Messungen in Keller, Brunnen, Nähzimmer, etc.? Die sehen ja eigentlich brauchbar aus.


    2. Der eingefrorene Testsensor:
    Hoffentlich und wie hast Du diesen wasserdicht isoliert?
    Oder etwa gar nicht? :(


    Gruß, mmi

  • Alle Sensoren außer Dachboden und Testsensor stecken im Steckbrett neben dem RasPi. Daher auch die vergleichbaren Werte.


    Sobald der Testsensor in den positiven Bereich kommt, zeigt auch dieser wieder "vernünftige" Werte.


    aktuell liegt der Testsensor neben den Steckbrett_:


    ----------
    SensorID Messstelle ° C
    28-000005293706 Dachboden 6.5
    28-000005299f57 Test-Sensor 16.81
    28-000005296ee9 Hof (außen) 16.81
    28-000005298ddb Nähzimmer 16.81
    28-00000529d1a0 Keller 16.88
    28-00000529ab41 Keller 16.81
    28-00000529dffa Keller 16.88
    28-0000051ae8a6 Brunnen 16.69
    -----------


    Isolierung gegen Feuchtigkeit:


    1. jeder Pin kleiner Schrumpfschlauch über Lötstelle zum Kabel
    2. mit Heißkleber an der Lochrasterplatine ummantelt


    ..obwohl ich 100%ige Dichtheit nicht garantieren kann, denke ich nicht dass es hier ein Problem gibt, denn :
    -) ich bekomme ein YES in der ersten Zeile beim auslesen
    -) sobald der Sensor aus den Eis befreit war, hat er (noch feucht) wieder brauchbare Werte geliefert.

  • Guten Morgen, Ihr Scherzbolde,


    habt Ihr mal ins Datenblatt von Dallas geschaut, insbesondere wie negative Temperaturen bitmäßig abgebildet werden?


    http://datasheets.maximintegrated.com/en/ds/DS18S20.pdf


    Ich denke, dass da ein wenig Umrechnung bei negativen Temperaturen gefordert wird.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • hmm..


    das Datenblatt hatte ich zwar schon mehrmals angesehen, aber ich bin mit dem Englisch doch etwas auf Kriegsfuß!


    Vermutlich hatte ich daher nicht gründlich genug recherchiert!
    mea culpa, mea culpa, mea maxima culpa …


    Aber zur Rettung meiner Ehre muss ich sagen, dass ich davon ausgegangen bin, dass die Umrechnung bereits vom System erledigt wird, und dann die ordentlichen Werte in das virtuelle Filesystem von 1-Wire geschrieben werden.


    so eine Datei sieht dann folgendermaßen aus:
    ------------
    0c 01 4b 46 7f ff 04 10 bc : crc=bc YES
    0c 01 4b 46 7f ff 04 10 bc t=16750
    ------------
    wenn ich mich richtig informiert habe, dann wird vom System bei jeden Zugriff auf die Datei "/sys/bus/w1/devices/28-000xxxxxxx/w1_slave" der entsprechende Sensor eingelesen, und die "Text-Daten" dann über unsere Skripte zerlegt.


    Also sehe ich hier keinen direkten Zugriff auf die Hardware!


    Aber ich denke das sollte hier mal wirklich abgeklärt werden!


    Ich werde heute im Laufe des Tages einen neuen Sensor 100% wasserdicht verbauen, und mit langem Kabel in die Tiefkühltruhe (zusammen mit Vergleichsthermometer) legen. Dann hoffe ich, dass ich zuverlässig Minus-Temperaturen loggen kann!


    Meine Bitte an das Forum: jeder der hierzu Infos hat, soll diese bitte hier eintragen!
    [hr]
    http://www.msxfaq.de/verschied…astelbude/raspi-1wire.htm
    https://raspiprojekt.de/forum/…ensoren-rrd-tool-etc.html
    http://www.it-adviser.net/rasp…it-ds18b20-1-wire-sensor/
    https://learn.adafruit.com/ada…perature-sensing/overview

  • Umrechnen ist nicht notwendig - außer die Division durch 1000.


    Ich habe das PHP Script mal aus der Funktion und der while Schleife befreit und es auf meinen Sensor im Tiefkühlschrank losgelassen und folgende Werte bekommen:



    Das schaut doch schon ganz gut aus - vor allem weil das neben dem Sensor liegende Kühlschrankthermometer den Wert bestätigt.


    Mein Sensor habe ich übrigens nicht 100% wasserdicht verbaut. Wie die meisten meiner Sensoren ist er auf einem kleinen Platinchen in einer leeren Schnupftabakdose (Affiliate-Link)verbaut. Für meine Raumsensoren ist dann mittig ein Loch gebohrt wo der Sensor etwas rausguckt, im Tiefkühlschrank habe ich auf das Loch verzichtet und die Seiten der Dose etwas mit Isolierband abgeklebt, das hält seit Monaten.


    Wasserdichte Sensoren habe ich nur in die Aquarien gehängt, hier jedoch die fertige Variante genommen.

  • Yep...


    genau so hatte ich die Werte eigentlich auch erwartet.


    Danke für die Info!!!!


    (ich selbst bin erst am löten....)


    Nachtrag:


    ich habe jetzt bemerkt, dass ich beim Teilen von $zeil2 zuerst (beim echo) 5 Zeichen nutze...


    ..aber später, beim 2. Aufruf für die echte Berechnung 8 Zeichen verwende. ( weil ich beim testen versuchen wollte, ob das Minus-Zeichen bei 5 Character durchkommt)


    Da ich nun nicht mehr nachvollziehen kann wann ich von 5 auf 8 geändert hatte, kann es durchaus sein dass ich durch das Minuszeichen ($TempString hat dann ja 6 Zeichen)
    die letzte Stelle rausgefallen ist.


    Das würde dann auch meine Messwerte von -1,9 bis -1,1 °C erklären!
    [hr]
    so gesehen währe dann 6 Zeichen die Richtige Wahl!
    [hr]
    hab das python-skript nun auch noch mal angesehen..
    --------
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # temp.py
    # frei nach Michael Weigend (Raspberry Pi programmieren mit Python)


    import os, sys, time, MySQLdb, datetime
    os.system("sudo modprobe wire")
    os.system("sudo modprobe w1-gpio")
    os.system("sudo modprobe w1-therm")


    def readTemp():
    ok =False
    while not ok:
    f = open(deviceFile, "r")
    first, second = f.readlines()
    f.close()
    if first.find("YES") != -1:
    ok = True
    tempString = second.split("=")[1]
    return str(round(float(tempString) / 1000,2))
    #return tempString
    ---------------


    hier wird die zeile2 nach dem "=" geteilt, und so kommt das Minuszeichen und alle Stellen des Messwertes durch..


    tempString = second.split("=")[1]

  • um das Thema nun ordentlich abzuschließen...


    letzter Stand der Visualisierung der Temperaturen...


    Screenshot NEXUS5:
    [Blocked Image: https://scontent-b-vie.xx.fbcdn.net/hphotos-prn2/t1.0-9/10338744_657857667619208_5198735539454653375_n.jpg]


    Die Lösung für mein Problem mit negativen Temperaturen war vermutlich das Minus-Zeichen. Denn dadurch hatte ich die letzte Stelle beim Auslesen nicht immer in der Berechnung. (Abschließende Test steht jedoch noch aus.)


    stelle dann das lauffähige Skript gerne hier im Forum vor, wenn Interesse besteht!


    Danke an alle die mir bei der Fehlersuche geholfen haben!!

  • Hallo,


    versuch das auslesen doch mal so:


    $temp = explode("t=", $sensor);
    echo $temp[1]/1000;


    Hat bei mir noch keine Probleme verursacht, auch nicht bei negativen Temperaturen.

  • aktueller Stand meiner Funktion: (leider noch nicht ausgetestet)


    [code=php]//Temperaturen lesen: übernimmt SensorID vom 1-Wire Sensor,
    // und liefert die Temperatur als float (mit 2 Kommastellen)
    // angepasst für das 1-Wire Filesystem am RaspberryPI, und muss daher am RasPi laufen
    function jm_readTemp($sensorfile, $nachkommastellen){
    $ok = FALSE;
    while ($ok == FALSE) { // auslesen so lange wiederholen bis erfolgreich
    $file = fopen("/sys/bus/w1/devices/" . $sensorfile . "/w1_slave", "r");
    $zeile1 = fgets($file); //z.B.: "b7 00 4b 46 7f ff 09 10 89 : crc=89 YES"
    //echo "zeile1 = " . $zeile1 . "<br>" . "substring = " . substr($zeile1,36,3) . "<br>";
    $zeile2 = fgets($file); // z.B.: "b5 00 4b 46 7f ff 0b 10 9e t=11312"
    //echo "zeile2 = " . $zeile2 . "<br>";
    //echo "substring = ". substr($zeile2,29,5) . "<br>";
    fclose($file);
    if (substr($zeile1,36,3) == "YES") { // wenn auslesen erfolgreich https://php.net/manual/de/function.substr.php
    $ok = TRUE;
    $tempString = explode("t=", $zeile2); // teilt den String zeile2 in ein Array // Teilstring holen https://php.net/manual/de/function.explode.php
    $temp = floatval($tempString[1])/1000; // in float wandeln und Dezimalpunkt setzen https://php.net/manual/de/function.floatval.php
    } // if
    if ($nachkommastellen <= 1) { // wenn kein Wert übergeben wird
    $nachkommastellen = 0;
    } // if

    if ($nachkommastellen >= 3) { // wenn falscher Wert übergeben wird
    $nachkommastellen = 3;
    } // if

    return round($temp,$nachkommastellen); // runden auf 0-3 Nachkommastellen https://php.net/manual/de/function.round.php
    } // while
    } //Function
    [/php]


    und der Aufruf...
    [code=php]<?php echo(jm_readTemp('28-00000529dffa', 1));?>[/php]


    habe erst heute die neuen Teile erhalten, und muss die neuen Sensoren erst verbauen.