[Tutorial] DS18S20 Temperatur Sensor an einem Raspberry Pi

Hallo zusammen,

da ich mittlerweile mehrere DS18S20 Temperatur Sensoren betreibe und diese wirklich einfach in Betrieb zu nehmen sind, wird es Zeit für ein kleines Tutorial!

Der DS18S20 ist ein relativ günstiger Temperatur Sensor (ca. 2€, z.B. bei Reichelt) der vom Prinzip baugleich mit dem oft verwendeten DS18B20 ist. Die Pin-Anschlüsse sind identisch, somit kann das Tutorial auch ruhigen Gewissens für einen DS18B20 verwendet werden.

Der Unterschied zwischen beiden Sensoren besteht darin, dass der DS18S20 als Nachfolger des DS1820 konzipiert ist und immer einen 12bit Wert zurückgibt, während der DS18B20 je nach Abfrage zwischen 9 und 12bit zurückgeben kann. Vorteil bei 12bit sind der genauere Messwert, Nachteil der etwas höhere Stromverbrauch und die längere Konvertierungszeit von ca. 750ms.
Hier möchte ich allerdings nicht all zu tief in die Details gehen. Für die, die sich tiefer mit der Materie beschäftigen möchten hat Maxim einen englischsprachigen Vergleich herausgebracht: Comparison of the DS18B20 and DS18S20 1-Wire® Digital Thermometers

Ein kleiner Tipp: Besitzt man eine eigene Domain mit Mailfunktion, so kann man sich kostenlos von Maxim, dem Hersteller dieser und vieler anderer Mikrochips, kostenlose Samples bestellen! Dies funktioniert leider nicht mit Freemailern wie GMX oder Googlemail. Man muss nur etwas Zeit mitbringen bis die Samples aus Amerika ankommen.
Genug der Worte. Was wird benötigt?

  • ein oder mehrere DS18S20 oder DS18B20
  • ein 4,7K Ohm Widerstand
  • Kabel
  • Lötutensilien

Hier ein Steckplan für ein Breadboard. Es empfiehlt sicht Schaltungen stets vorher darauf zu Testen, da man hier alle Komponenten stecken und nicht löten muss.

DS18S20 Temperatur Sensor auf einem Breadboard

Wichtig ist, dass GPIO 4 benutzt wird (das blaue Kabel). Auf anderen GPIOs kann der Sensor nicht ohne weiteres ausgelesen werden! Eine Möglichkeit einen anderen GPIO zu nutzen findet man weiter unten in den Kommentaren. Außerdem solltem man darauf achten 3,3V und nicht die direkt daneben liegenden 5V zu verwenden (das rote Kabel), sonst kann das schnell das Ende des GPIO oder sogar des ganzen Pi’s sein.

Der dritte Anschluss, also das schwarze Kabel geht auf Ground. Wichtig ist noch der 4,7K Ohm Widerstand zwischen GPIO4 und 3,3V (Einbaurichtung von Widerständen ist generell egal).

Man kann auch mehrere Sensoren in Reihe stecken, da das ganze mit dem 1Wire Protokoll auf einem Bus läuft und fast beliebig erweiterbar ist.

Zwei DS18S20 Temperatur Sensoren in Reihe geschalten

 


ACHTUNG:
Seit Kernelversion 3.18.3 gibt es einige Änderungen, bitte den Kommentar von Ingo (weiter unten) anschauen und beachten! Das Tutorial wird demnächst angepasst.


Nachdem nun alles vorbereitet ist kommt der spannende Teil, den Sensor abfragen! Hierzu müssen wir erst einmal das 1Wire Protokoll aktivieren:

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm

Nun müsste unter /sys/bus/w1/devices/ ein Ordner a la 10-0008017b5e27 auftauchen (die ID des Sensors). Falls man den DS18B20 benutzt fängt der Name des Ordners mit 20- an.
Falls unter /sys/bus/ der w1 Ordner fehlt, so ist das aktivieren des 1Wire Protokolls fehlgeschlagen oder ihr nutzt nicht GPIO 4.

Ob das 1Wire Prokoll aktiviert ist lässt sich leicht mit

$ lsmod

herausfinden. Mit dem Befehl werden alle aktivieren Kernel Module mit Abhängigkeiten angezeigt.
Wurden die beiden Module erfolgreich geladen, müsste lsmod u.a. folgende Zeile ausgeben:

$ wire 24973 2 w1_gpio,w1_therm

Damit die beiden Kernelmodule bei jedem Start geladen werden, müssen sie noch in die Datei /etc/modules eingetragen werden. Dies erledigen wir mit folgendem Befehl:

$ sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

Nun den Sensor mit folgendem Befehl abfragen (Achtung, den Namen des Sensors bite anpassen!):

$ cat /sys/bus/w1/devices/10-0008017b5e27/w1_slave

Die Ausgabe sollte folgendermaßen aussehen:

2c 00 4b 46 ff ff 0f 10 d3 : crc=d3 YES
2c 00 4b 46 ff ff 0f 10 d3 t=21812

Hier ist der Wert am Ende der letzten Zeile der Wert den wir suchen (t=21812). Dies ist die Ausgabe des Sensors in Grad Celsius. Den Wert müssen wir jetzt noch durch Faktor 1000 teilen und wir erhalten eine Temperatur von 21,812 °C.
Um die Abfrage einfacher zu gestalten habe ich ein kleines Script geschrieben, dass den Wert direkt ausgibt wenn man einfach temp im Terminal eingibt.

Einfach eine neue Datei namens temp (ohne Endung) unter /usr/bin/ anlegen und folgenden Inhalt einfügen (Achtung auch hier wieder den Namen des Sensors anpassen!):

1
2
3
4
5
6
7
8
#! /bin/bash
 
# Temperatur des Sensors auslesen
tempread=`cat /sys/bus/w1/devices/10-0008017b5e27/w1_slave`
temp=`echo $tempread | egrep -o '[\-0-9]+$'`
temp2=`echo "scale=2; $temp / 1000" | bc` 
# Wert ausgeben 
echo "Gemessene Temperatur des Sensors" $temp2 "°C"

Danach muss noch ein Paket nachinstalliert und die Datei noch ausführbar gemacht werden:

$ sudo aptitude update
$ sudo aptitude install bc
$ chmod +x /usr/bin/temp

Fertig, nun kann man die Temperatur bequem mit temp abfragen 😀
Was ist nun aber, wenn man den Sensor regelmäßig automatisch abfragen lassen möchte um sich z.B. den Temperaturverlauf grafisch darstellen zu lassen?
Nichts leichter als das! Dies kann man relativ einfach mit MRTG realisieren. Dazu habe ich bereits ein Tutorial verfasst: [Tutorial] CPU, RAM & Temperatur Monitoring mit dem Raspberry Pi, einem DS18S20 und MRTG
Folgt man diesem Tutorial erhält man schöne Grafiken wie z.B. diese hier

Temperatur Graph von MRTG
Temperatur Graph von MRTG

Viel Spaß beim ausprobieren!

Gruß iro

PS: Falls dir das Tutorial gefallen hat, wäre es schön wenn du einen kleinen Kommentar hinterlassen würdest und auf eines der Werbebanner klickst. Dadurch kann unser Server und noch viele weitere spannende Kopfkino Projekte finanziert werden 😀

[Last Edit: 23.06.2015]

84 Kommentare zu „[Tutorial] DS18S20 Temperatur Sensor an einem Raspberry Pi

  1. Hallo
    Ich hoffe mir kann jemand helfen beim auslesen der werte mit MRTG über die grafik bekomme ich nur einen maximal wert von 2. 0C hier mal die mtg.cfg inhalte:

    ######################################################################
    # System: DS18S20 Temperatur Sensor
    # Contact: root
    # Location: attached to Raspberry Pi
    ######################################################################

    ### DS18S20 Temperatur SensorWohnzimmer

    TimeStrPos[temp_wohnzimmer]: RU
    Target[temp_wohnzimmer]: `/home/pi/skripte/mrtg/update_mrtg_temp.sh`
    Options[temp_wohnzimmer]: gauge,growright,nopercent,expscale,transparent
    Title[temp_wohnzimmer]: Temperatur Wohnzimmer
    PageTop[temp_wohnzimmer]:Temperatur Wohnzimmer
    MaxBytes[temp_wohnzimmer]: 125
    Step[temp_wohnzimmer]: 60
    Legend1[temp_wohnzimmer]: Gemessene Temperatur im Wohnzimmer
    LegendI[temp_wohnzimmer]: Innentemperatur
    LegendO[temp_wohnzimmer]:
    YLegend[temp_wohnzimmer]: Grad Celsius
    ShortLegend[temp_wohnzimmer]: Grad °C

    Und noch das update_mrtg_temp.sh skript:
    tempread=`cat /sys/bus/w1/devices/10-0008028eb146/w1_slave`

    temp=`echo $tempread | egrep -o ‘.{5}$’`

    temp2=`echo “scale=2; $temp / 1000? | bc`

    # Update database
    echo $temp2
    echo 0
    echo 0
    echo temperature

    danke 😉

    • Hey Gabriel,

      Muhkuh hatte das selbte Problem, das liegt an den Hochkommata und den Anführungszeichen. Außerdem muss nach der 1000 ein Anführungszeichen und kein Fragezeichen sein.
      Das ganze hat so auszusehen:

      temp=`echo $tempread | egrep -o '.{5}$'`
      temp2=`echo "scale=2; $temp / 1000" | bc`

      Gruß iro

      • Hallo Iro,
        Ich bin schon seit Tagen am probieren den Temp Sensor DS1820 auszulesen (über MRTG) das Script manuell aufgerufen funktioniert problemlos. Aber es kommen keine Daten in MRTG vom Sensor an. Der CPU Wert wird auch nicht angezeigt. Ich bin schon am verzweifeln …
        Hab heute gedacht dein obiger Tipp mit den Hochkommata würde funktionieren aber Pustekuchen.
        Vielleicht weisst Du RAT ???
        Hier die Dateien:

        mrtg.cfg (nur die Auszüge der beiden Temp-sensoren)

        ######################################################################
        # System: DS18S20 Temperatur Sensor
        # Contact: root
        # Location: attached to Raspberry Pi
        ######################################################################

        ### DS18S20 Temperatur SensorWohnzimmer

        TimeStrPos[temp_wohnzimmer]: RU
        Target[temp_wohnzimmer]: `/home/pi/skripte/mrtg/update_mrtg_temp.sh`
        Options[temp_wohnzimmer]: gauge,growright,nopercent,expscale,transparent
        Title[temp_wohnzimmer]: Temperatur Wohnzimmer
        PageTop[temp_wohnzimmer]: Temperatur Wohnzimmer
        MaxBytes[temp_wohnzimmer]: 125
        Step[temp_wohnzimmer]: 60
        Legend1[temp_wohnzimmer]: Gemessene Temperatur im Wohnzimmer
        LegendI[temp_wohnzimmer]: Innentemperatur
        LegendO[temp_wohnzimmer]:
        YLegend[temp_wohnzimmer]: Grad Celsius
        ShortLegend[temp_wohnzimmer]: Grad °C

        ### CPU Temperature Raspberry

        TimeStrPos[localhost.cpu_temp]: RU
        Target[localhost.cpu_temp]: `/home/pi/skripte/mrtg/cpu_temp_auslesen.sh`
        Options[localhost.cpu_temp]: gauge,growright,nopercent,expscale,transparent
        Title[localhost.cpu_temp]: Raspberry Pi Server CPU Temperatur
        PageTop[localhost.cpu_temp]: Raspberry Pi Server CPU Temperatur
        MaxBytes[localhost.cpu_temp]: 125
        Step[localhost.cpu_temp]: 60
        Legend1[localhost.cpu_temp]: CPU Temperatur Raspberry Pi Server
        LegendI[localhost.cpu_temp]: CPU Temperatur
        LegendO[localhost.cpu_temp]:
        YLegend[localhost.cpu_temp]: Grad Celsius
        ShortLegend[localhost.cpu_temp]: Grad °C

        Hier die Scripte:

        #!/bin/bash

        # Read temperature from sensor
        tempread=`cat /sys/devices/w1_bus_master1/10-000802b57b2c/w1_slave`

        temp=`echo $tempread | egrep -o ‚.{5}$’`

        temp2=`echo „scale=2; $temp / 1000“ | bc`

        # Update database
        echo $temp2
        echo 0
        echo 0
        echo temperature

        #!/bin/bash

        # Read cpu temperature
        tempread=`cat /sys/class/thermal/thermal_zone0/temp`

        temp=`echo „scale=2; $tempread / 1000“ | bc`

        # Wert ausgeben
        echo $temp
        echo 0
        echo 0
        echo temperature

        exit 0

      • Hey Irosaurus
        habe heute mal meinen alten RasPi rausgesucht und versucht als Thermometer einzurichten. Soweit funktioniert meine Schaltung. Ich kann über den Konsolenbefehl „cat /sys/bus.. etc“ den Sensor abfragen und bekomme auch einen Wert zurück.
        nur mit dem Skript funktioniert bei mir gar nichts…
        wenn ich in Zeile 5 “ ‚[\-0-9]+$‘ “ ha e gibt mir die Konsole den Fehler „egrep: Das Ende des angegebenen Intervalls ist nicht gültig“ aus.
        mit allen anderen Varianten die ich in den Kommentaren so finden konnte passiert einfach gar nichts.. Die Konsole scheint zu arbeiten und die angezeigte CPU Auslastung steigt auf 100% aber weiter tut sich nix…
        Vielleicht haSt du ja ne Idee woran das liegen kann?

  2. Hallo Iro,
    Ich lese z.Z. die Temp-Sensoren manuell aus (nicht über MRTG)
    Ich hätte das natürlich gerne über MRTG.
    Nun habe ich wieder mal das Script „update_mrtg_temp.sh“ im Terminal probiert. Ich bekomme jetzt diesen Fehler bei der Ausgabe:
    pi@raspberrypi ~/scripte/mrtg $ ./update_mrtg_tempn.sh
    (standard_in) 1: syntax error

    0
    0
    temperature

    Hier noch das Script:

    #!/bin/bash

    # Read temperature from sensor
    tempread=`cat /sys/bus/w1/devices/w1_bus_master1/28-000005113d27/w1_slave`

    temp=`echo $tempread | egrep -o ‚.{5}$’`
    temp2=`echo „scale=2; $temp / 1000“ | bc`

    # Update database
    echo $temp2
    echo 0
    echo 0
    echo temperature

    Hast Du einen Tipp woran es hakt?

  3. Hallo, wenn ich mit temp die Temperatur abfragen möchte kommt folgende Meldung: /usr/bin/temp: line 6: /: Is a directory
    „Gemessene Temperatur des Sensors“ „scale=2 „°C“
    was ist hier falsch ?

  4. Hallo,

    ich habe alles nach Anleitung gemacht.

    #! /bin/bash

    # Temperatur des Sensors auslesen
    tempread=`cat /sys/bus/w1/devices/10-000801605a2c/w1_slave`
    temp=`echo $tempread | egrep -o ‘.{5}$’`
    temp2=`echo “scale=2; $temp / 1000″ | bc`

    # Wert ausgeben
    echo “Gemessene Temperatur des Sensors” $temp2 “°C”

    Leider bekomme nur diese Fehlermeldung:

    /usr/local/bin/temp: Zeile 6: /: Ist ein Verzeichnis
    “Gemessene Temperatur des Sensors” “scale=2 “°C”

    Was mache ich falsch?

    Ansonsten eine gute Aneitung

    Gruß Felix

  5. Hier liegt der Hase im Pfeffer:
    temp=`echo $tempread | egrep -o ‘.{5}$’`

    Wenn die übergebene Temperatur unter 10°C liegt und nur noch 4 Stellen hat, wird das = zusammen mit dem Wert übergeben an bc, das dann jammert. (Bsp: ~2,5°C => „=2543“)

    Lösung suche ich gerade… habs mit den Mathebefehlen bei bash nicht so… wird wohl auf ein if then else hinauslaufen…

    • Es sollte tun, wenn du den regulären Ausdruck änderst – keine Mathe notwendig ^^
      temp=`echo $tempread | egrep -o ‘[0-9]+$’`
      Anstelle der letzten 5 Zeichen ‚.{5}‘ zum ende des textes ‚$‘ werden jetzt die letzten beliebig vielen (genauer: mindestens eine) Zahlen vom Ende her gesehen ‚[0-9]+$‘ übergeben.

  6. Hallo,
    Habs jetzt mal ausprobiert – bei mir keine Änderung. Manuell funktioniert es – ins MRTG eingebunden werden keine Daten eingelesen. Ich werde wohl doch mal MRTG neu installieren.

    Gruß
    Torsten

    • Hallo Oliver,

      ja und nein 😉 Um den ebenfalls verlinkten Vergleich bei Maxim zu zitieren: „[…] the DS18S20 is factory configured to always perform 12-bit conversions. The 12-bit data is then rounded to a 9-bit value and stored in the temperature register. To allow for greater than 9-bit resolution, a value for the Count Remain register is calculated. The Count Per °C register is set by the factory to be 16. Using the Count Remain and the Count Per °C registers and the formula above, up to 12-bit resolution can be obtained with the DS18S20.

      Das bedeutet also, dass der Sensor intern mit 12bit arbeitet, standardmäßig aber nur 9bit zurück gibt, da er als Ersatz für den DS1820 gedacht ist, welcher nur 9bit beherrscht und zurück gibt. Man kann den DS18S20 aber auch so abfragen, dass er einen 12bit Wert zurück gibt. Dazu müssen die beiden oben beschriebenen Register bei der Abfrage mit ausgelesen werden. Für die Zwecke hier ist das allerdings völlig überdimensioniert – uns reichen die 9bit Rückgabewert völlig aus 😀

      Gruß iro

  7. Also das Tutorial finde ich super. Toll das sich jemnd die mühe macht das zu erstellen.
    Leider zeigen mein Graphen für ds18b20 und cpu temperatur keine Werte. Die Scripts allerdings funktionieren, ich bekomme also Werte für die beiden Temperaturen. Allerdings scheinen diese nicht in rrd DB zu gelangen bzw., von MRTG angezeigt zu werden.Ich sehe nur zwei leere Graphen mit der Y-Achse Skala = 1.0. Hat jemand eine Tip für mich.
    Traffic Graf und CPU load funktionieren

    • Hallo Bernd,

      danke für die Blumen 😀 Immer schön wenn man ein positives Feedback bekommt 😀
      Zu deinem Problem, das hört sich schwer danach an, als würden die Rechte nicht passen. Bist du sicher, dass der mrtg Prozess genügend Rechte hat die Skripte auszuführen?
      Abgesehen davon, wo misst du denn? Innentemperatur oder Außentemperatur? Unterhalb von 10 °C gibt es momentan Probleme mit dem Skript, das muss noch gefixt werden.

      Gruß iro

  8. Hallo irosaurus und gibbsnich!

    Danke für diese wirklich verständlichen Tutorials, die ich als – bisher Nicht-Linuxer – verstehe und Ansatzpunkte für eigene Recherchen nach dem „Warum?“ finde!

    Bin über den Tor-Router zum Raspi gekommen und entdecke jetzt die Möglichkeiten 🙂
    Mein Projekt ist die Optimierung der Heizzeiten meiner Gasheizung. Dazu möchte ich – bevor ich zu MRTG gehe – eine Textdatei erzeugen, die alle 10 Min mit Uhrzeit die Temperatur zeilenweise erfasst. Habe schon ein Python-Skript gesehen, gibt es so etwas auch als Bash?
    Würde mich über Tipps freuen!

    Macht weiter so, Jungs! (Ihr seid bestimmt viel jünger als ich :))
    eckermann

    • Danke für Dein Lob, eckermann! Wir geben uns alle Mühe und bei solch netten Worte wissen wir auch sofort wieder warum 🙂
      Zu Deiner Frage:
      Ein solches Skript würde im so ziemlich einfachsten Fall so aussehen:
      #!/bin/sh
      value=$(the_command)
      curdate=$(date)
      echo $curdate "|" $value >> the_file

      In der ersten Zeile steht ein sogenanntes Shebang — einfach gesagt: Das Programm, das das Skript ausführen wird, in diesem Fall Bash.
      Die zweite Zeile ruft das Kommando namens „the_command“ auf und speichert den Wert in der Variable „value“. „the_command“ wäre in Deinem Fall ein anderes Skript, das einen „sinnvollen“ Wert zurück liefert. Wie hier z.B. das Temperaturausleseskript, das ich für diesen Fall so verändern würde, dass es tatsächlich nur den Temperaturwert ausgibt und nicht noch die drei anderen, mrtg-spezifischen Zeilen — obwohl man mit wenig Aufwand natürlich auch nur den gewollten Wert aus der Vier-Zeilen-Ausgabe rausholen könnte..
      Die dritte Zeile macht ungefähr das gleiche mit dem Rückgabewert des „date“-Kommandos (über verschiedene Parameter kannst Du dessen Ausgabe in so ziemlich jeder Art anpassen..).
      Die vierte Zeile fügt schließlich das Datum und den Wert getrennt durch ein | in eine neue Zeile in der Datei „the_file“ hinzu. Wenn sie noch nicht existiert, wird sie erzeugt werden.
      Du musst das Skript dann noch mit chmod +x the_script ausführbar machen und wahrscheinlich einen Symlink in einem Ordner, der in der $PATH-Variable steht (z.B. wahrscheinlich /usr/local/bin), einfügen, damit du es von jedem Pfad aus aufrufen kannst. Also wenn Du Dich im Ordner /usr/local/bin befindest: ln -s /pfad/wo/das/skript/liegt/the_script.
      Um das Hinzufügen alle 10 Minuten passieren zu lassen, würde ich einen cron-Job empfehlen. Wie der eingerichtet wird, kannst du z.B. hier erfahren.

      Hmm, das war jetzt ziemlich ausführlich 😉 Ich hoffe, es hilft Dir weiter!

      • Danke gibbsnich!

        Das sieht super und elegant aus! Mal sehen, ob ich das auch hin bekomme? Werde das ausprobieren, scheitern, ändern …, samt Irrwegen, bis die Drähte aus dem Kopf hängen. 🙂

        Der Mensch ist der Technik überlegen!
        …Öffne jetzt ’ne Flasche Wein…

        Grüße
        eckermann

        • Noch einmal vielen Dank für eure Anleitungen! Das hat alles prima geklappt! Gibt es eigentlich bezahl- und für den Raspi verwendbare Sensoren für die Bodenfeuchtigkeit? Dann ließe sich das Gewächshaus optimieren 😉

          Mit freundlichen Grüßen
          eckermann

          • Hey eckermann,
            danke für das Feedback 😀
            Zu deiner Frage, schau doch mal hier:
            Denke da kannst du dir sicher einige Anregungen holen 😉
            Gruß iro

  9. Hallo, danke für die ausführliche Anleitung.
    Das Nachbauen hat auf Anhieb funktioniert 🙂
    Die Raumtemperatur wird von den beiden angeschlossenen Sensoren korrekt gemessen.

    Allerdings habe ich folgendes Problem:
    Ich würde einen Sensor gerne am Heizungsrohr anbringen um die Temperatur des Rohrs zu messen.
    Die hier gemessene Temperatur beträgt angeblich allerdings nur 45 Grad, es sollte wesentlich (>80) mehr sein.

    Aktuell liegt er einfach nur auf dem Rohr, keine Ahnung ob das ein Problem sein könnte.

    Hast du eine Ahnung was falsch sein könnte?
    Macht es Sinn mal die 5V statt 3,3V zu probieren?

    • Hallo Dirk,
      auf keinen Fall 5V benutzen, damit zerschießt du dir den GPIO am Raspberry, wenn nicht noch mehr! Der Sensor misst bestimmt richtig, ich gehe eher davon aus, dass es zu wenig Kontaktfläche mit dem (vermutlich) runden Rohr gibt. Abhilfe könntest du schaffen indem du z.B. Wärmeleitpaste (wie vom CPU Einbau) zwischen Rohr und Tempfühler versuchst. Am besten wäre vermutlich wenn du die Möglichkeit hast dir ein Stück Metal so zu bearbeiten, so dass es direkt auf dem Rohr aufliegt und eine gerade Oberfläche hat auf dem du dann den Sensor montieren kannst. Evtl. hilft auch noch eine kleine Hülle aus Styropor, die dann alles ummantelt, so dass weniger Wärme abgestrahlt wird.
      Viel Spaß beim basteln 😉
      Gruß iro

  10. Hallo Iro,
    nettes Tutorial. Wollte nur darauf hinweisen, dass man nun auch andere GPIOs als #4 mit dem Sensor verwenden kann. Habe hier einen in Betrieb als Außensensor. Der GPIO 4 war vorher im Kernel Modul „hard coded“. Im aktuellen Raspbian Wheezy kernel 3.10.25+ kann man den GPIO in der /boot/cmdline.txt einstellen. Ich habe den Sensor an #25 angeschlossen.

    bcm2708.w1_gpio_pin=25

    Gruß aus Berlin

    • Hey luetzel,
      Danke für die Info! Das ist wirklich gut zu wissen 😉 Wird auf jeden Fall die Tage im Tutorial erwähnt!
      Vielen Dank noch mal 😀
      Gruß iro

  11. Hallo, nachdem ich es Hingekommen habe, den Temperatursensor zum laufen zu bekommen, möchte ich nun die Werte in eine Liste mit einem Zeitstempel einlesen, weiss jemand wie das geht ?
    Also das mit dem MRTG Diagramm ist mir zu ungenau.

  12. Hey,
    ich hab da eine Frage; und zwar würde ich gerne 2 Sensoren betreiben und ohne MRTG auslesen (Nur per Konsole). Ich habe die 2 angeschlossen aber in Reihe, bedeutet ich benutze nur einen Widerstand. Funktioniert das? Kann ein GPIO die Daten von 2 Sensoren hintereinander auslesen?

    Lg

    • Hey Piet,
      kurz und knapp, sollte ohne Probleme funktionieren 😀 Dann einfach das Script zum auslesen duplizieren, Namen ändern und im Inhalt nur die ID des Sensors ändern. Alternativ kannst du das Script auch anpassen, dass es beide Sensoren abfragt und ausgibt, aber ersteres wäre auf jeden Fall die einfachere Lösung 😉
      Gruß iro

  13. Hallo zusammen,
    gibt es schon neue Erkenntnisse zum Thema: Wie kann ich die Skala der Y-Achse ändern? Die Skala soll sich z.B. über den Bereich +10% des Max-Wertes und -10% des Min-Wertes erstrecken – so würde man auch die Schwankungen deutlicher erkennen können.
    Freue mich über jeden Tipp.
    Grüße
    Muhackl

    • Hallo Muhackl,
      wie schon geschrieben ist das mit MRTG so nicht möglich. Du kannst lediglich einen MaxBytes Wert setzen. Die Toleranz macht hier allerdings wenig Sinn, da MRTG alles was größer diesem Wert ist, ignoriert. Somit musst du also einfach dein Max+10% ausrechnen und diesen Wert eintragen.
      Ein Minimalwert zu setzen ist mit MRTG leider nicht möglich, hier kommt dann das RRDTool zum Einsatz. Da wir als Unterbau schon auf RRD setzen, könntest du dir eine eigene Abfrage der RRD DB mit dem RRDTool schreiben, der die Grafiken dann so erzeugt wie du haben möchtest. Weitere Infos wie man die Grafiken mit RRDTool skaliert, gibt es hier: http://oss.oetiker.ch/rrdtool/
      Gruß iro

    • Hallo Maxi,
      wie auf dem Bild zu sehen, einfach in Reihe schalten 🙂 Der Abstand zwischen den Sensoren sollte egal sein solange du 20-30 Meter nicht überschreitest 😉
      Gruß iro

  14. Hallo,

    danke für das ausführliche Tutorial. Ich habe zuvor noch nie etwas mit den GPIOs gemacht, hat alles super geklappt.

    Ich habe das Shellscript wie in den Kommentaren bereits beschrieben auf:

    temp=`echo $tempread | egrep -o ‘[0-9]+$’`

    geändert, somit funktionieren einstellige Temperaturwerte. Ein Problem habe ich jedoch noch, wie könnte man das Minus bei negativen Werten mitnehmen? Ich wäre über Ideen sehr froh 😉

    Danke!

    • Hallo Lukas,

      gute Frage 😀 Ich wollte mich selbst schon länger um das Thema kümmern, habe allerdings immer noch keinen Außensensor und somit keine negativen Werte.
      Falls du MRTG nutzt wird das allerdings nicht einfach werden, von Haus aus unterstützt MRTG keine negativen Werte. Allerdings gibt es in den Kommentaren hier oder im MRTG Monitoring Artikel eine Lösung wie auch negative Werte gespeichert und angezeigt werden können.

      @gibbsnich: Pass doch mal das Skript an dass auch negative Zahlen ausgegeben werden 😉

      Gruß iro

      • Hi,

        dann würde ich irgendwas auf RRDTool basierendes (Munin/Cacti) verwenden. Das ist aber bei mir nicht der Fall, ich übergebe den Wert per HTTP POST an einen anderen Server wo die Daten dann verarbeitete werden.

        Nur leider eben noch nicht als negativer Wert 😉

        Lukas

  15. Tolles Tutorial, gut erklärt 😉
    Hat mich neugierig auf die 1-Wire Technik gemacht. Ein paar Fragen hab ich noch:
    – Im Datenblatt vom DS18S20
    http://datasheets.maximintegrated.com/en/ds/DS18S20.pdf
    steht eine Auflösung von 0.5°C. Wie kommst du auf 21,812°C?
    – Die Ausgabe des Sensors ist:
    hex0 – hexFA (0°C – 125°C)
    hexFFFF – hexFF92 (-0,5°C – -55°C)
    Wandelt der Raspi das um?
    – Interessieren würde mich, ob jemand schon probiert hat, die 1-Wire-Technik über 433MHz Sender / Empfänger zu lösen. Also irgendwie den Initialisierungspegel (Master/Slave) zu emulieren. Oder eine einfache Möglichkeit, mehrere Sensoren über Funk am Raspi zu betreiben (Hausautomation).
    Grüße aus LA
    ralphi

    • Hey ralphi,

      das ist ne sehr gute Frage 😀 Kann ich dir leider auch nicht direkt beantworten warum der Raspi genauere Werte ausspuckt. Da der Raspi die Kommunikation per 1W übernimmt und wir nur die Ergebnisse aus einer Datei auslesen, hat man keinen Einblick wie die Umrechnung erfolgt.
      Allerdings wirft das Datenblatt auch folgendes aus:
      Resolutions greater than 9 bits can be calculated using the data from the temperature, COUNT REMAIN and COUNT PER °C registers in the scratchpad.
      Es scheint also durchaus möglich zu sein.

      Zum Thema 433MHz und 1W habe ich leider noch keine Erfahrungen gemacht. Mein letzten Versuche mit den billigen China 433MHz Empfängern/Sendern meinen Außentemperatursensor oder meine Funksteckdosen (RC-710) auszulesen, sind leider alle schief gelaufen. Allerdings wäre eine eigene Lösung mit Sensoren auf 1W/433MHz Basis wirklich interessant. Hausautomation wird die nächste große Baustelle 😉
      Falls du hierzu noch fündig wirst würde ich mich wirklich über Tipps und Links freuen!

      Viele Grüße
      iro

  16. Vielen Dank für das hilfreiche Tutorial.

    Als kleine Anmerkung für alle Raspbian User:

    Ich musste das Paket BC manuell installieren, um das Shell-Script ausführen zu können.

    sudo apt-get install bc

  17. Hey,

    Welche Kabel hast du benutzt um das breadboard mit dem GPIO zu verbinden?
    Die f/m Jumper? oder ganz normal aus einem Verdrahtungs-Set die du an den GPIO gelötet hast?

    • Moin bflerin,
      entweder die f/m Kabel oder ein Cobbler Breakout Board wie das von Adafruit – allerdings selbst gebastelt, das von Adafruit ist ja wucher 😉 War innerhalb von 30 Minuten selbst gelötet und das Material kostet nur ein paar Cent 😀
      Gruß iro

  18. Hi iro,
    hast du auch die Möglichkeit für einen Bilderupload in Deinem Blog?
    Hab auf Basis deiner Anleitung eine Heizungssteuerung gebaut.
    grüße aus LA
    ralphi

    • Hey ralphi,
      ist generell möglich, allerdings nur für registrierte Benutzer. Falls du aber Lust hast, dann kann ich dir gerne einen eigenen Account erstellen. Dann könntest du auch eigene Artikel/Projekte posten 🙂
      Was hälst du davon? 😀
      Gruß iro

      • Hi iro,
        danke für dein Angebot.
        Ich schätze deine kurzen und knackigen Tutorials.
        Ein Projekt passt eigentlich nicht rein und zu viele Bilder, enden noch in einer Slidshow 😐

        Wenn ich ehrlich bin, würde ich den Ratenschwanz an Fragen, in ein phpBB Forum verbannen und nur die wichtigsten Fragen in ein kurzes FAQ anbinden (dann wär’s noch knackiger ;-).

        Ich selber möchte mir jetzt auch wordpress aneignen und mal kucken, ob ich einen ähnlich wertvollen Blog hinbekomme.
        ralphi

        PS: ich hab jetzt auch DS18S20 daheim (vorher nur Muster DS18B20). Bei der Temp-Auflösung gibts keinen Unterschied! Wahrscheinlich nur ein Marketing-Gag.

  19. Hallo Iro,
    dein Tutorial ist super und alles hat bis jetzt funktionier. Aber wenn ich das Script

    #! /bin/bash

    echo „Gemessene Temperatur des Sensors“ $temp2 „°C“

    in /usr/bin speichern möchte erhalte ich nur die Fehlermeldung:“can´t open file to write“

    Zusätzlich wollte ich noch fragen wie man die temperatur irgendwie in ein Programm integrieren kann, da ich ein thermostat mit einem 434mhz sender und den alro funksteckdosen entwickeln möchte. Ist das eventuell sogar über das leafpad möglich also mit if und while schleife und so weiter.

    Grüße
    Luke

    • hey luke!
      wenn du nicht in /usr/bin schreiben darfst, dann hast du wahrscheinlich nicht die passenden rechte. du musst wahrscheinlich zum root benutzer werden oder das eine kommando mit sudo ausführen.
      integrieren kannst du die werte sicher auch in einen weiteren Zusammenhang. du kannst den Befehl, der die Temperatur abfragt, direkt in deinem Programm aufrufen und das Ergebnis verarbeiten. oder du kannst den Befehl regelmäßig ausführen lassen, die Temperatur in eine Datei schreiben lassen und die auslesen. die Datei kannst du in einen ordner legen, der von einem webserver serviert wird: schon ist der wert auch von woanders verarbeitbar. the sky is the Limit 😉

      gruß, gibbsn.

      • Vielen Dank für die schnelle Antwort! Aber eine Sache wäre da noch… Bei dem command

        sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

        bekomme ich die Fehlermeldung: „permission denied“ und wenn ich direkt in die datei gehe und es dort verändern möchte bekomme ich : „can´t open file to write“
        hängt das auch damit zusammen dass ich kein root bin? und wie werde ich zum root? weil ich habs mit sudo schon probiert funktioniert auch nicht.

        Grüße

        Luke

        • Hey Luke,
          zu root wird man mit „sudo su“ – sofern man die Rechte dazu hat 😀 Danach den Befehl nochmal ohne die beiden „sudo“ wiederholen.
          Gruß iro

  20. Hallo, hab hier sehr interessiert gelesen. Ein Lob an den Autor. Möchte auch die DS18B20 nutzen.
    Als kleinen Tipp zur Visualisierung und Steuerung möchte ich mal das FHEM-Projekt hierlassen. Das ist ein freier Server welcher sich mit vielen Sensoren und Aktoren unterhält und diese dann auch visualisieren kann z.B. über ein Web-Interface. Neben meiner Wetterstation und Funk-Heizkörpersystem MAX möchte ich nun auch die DS18B20 integrieren. Läuft wunderbar auf dem Raspi :).

    Übrigens ist der ominöse 0,5-Wert nur die Abweichung, also wie weit die gemessene Temp von der reellen abweichen kann/darf(Messfehler, lässt sich also kalibrieren) nicht aber die Auflösungsgenauigkeit.

    lg motsch

    • Hey motsch,
      danke für die Rückmeldung und den Hinweis – wieder etwas gelernt 🙂
      FHEM habe ich auch testweise am Laufen, sieht vielversprechend aus! Müsste nur noch die Zeit finden ein kleine Touch LCD anzuschließen das hier noch rumliegt und mehr Sensoren integrieren 😀
      Gruß iro

  21. Hallo Gemeinde,

    ich finde das ja ganz toll und auch nachvollziehbar, was ich hier als Windows-User mit dem RaspPi alles machen könnte…. und hier werden die Projekte durch Iosaurus super erklärt und durch die Kommentatoren gut ergänzt! Aber ich komme garnicht soweit… nach den beiden „modprobe“-Befehlen ( w1-gpio + w1-therm) habe ich zwar einen w1-busmaster – Eintrag in dem Verzeichnis, aber kein device ala „10xxxx“. Kann ich irgendwie prüfen, ob mein Sensor defekt ist? Was machen die Befehle, wenn sie mit modprobe in den Kernel geladen wurden? Geben die ein „Hallo, Sensor, melde Dich!“ aus, oder warten die, das da was passiert? Kann ich das irgendwie prüfen?
    (RaspPi B+ mit DS1820-Sensor, der früher über den Conrad-Temperaturdatenlogger im parasitären Modus funktioniert hat, nun aber für RaspPi-Einstieg herhalten darf)

    Gruß

    Obersimulant

    • Hallo Obersimulant,
      wenn lsmod anzeigt, dass die Module für 1wire geladen wurden, dann ist zu 99% der Sensor falsch angeschlossen. Hast du den Widerstand mit eingebaut? Falls + und – vertauscht ist, wird der Sensor sehr heiß. Wenn man das nicht schnell genug bemerkt, kann er dabei bestimmt auch drauf gehen. Aber prüf als aller erstes noch einmal deine Verkabelung anhand meiner Zeichnung.
      Gruß iro

      • Sorry, wenn ich mich jetzt erst melde, aber ich hab mir erst noch einen Cobbler und ein paar neue Sensoren besorgt und siehe da: Mit den neuen Sensoren gehts ( DS 18B20). Anscheinend habe ich die alten zerschossen.Vmtl. habe ich durch das Flachbandkabel die Anschlüsse verdreht. Durch den Cobbler (U-Form) hab ich sie nun beschriftet zum Breadboard geführt und es geht… 😉
        Nun werde ich mich mal an Dein Tutorial mit MRTG wagen!

        Vielen Dank für Deine Hilfe, Iro

  22. Bam! Geiles Tutorial!!! Geiler Blog!!!

    … Aber .. mit der Syntax [\-0-9] in Zeile „5“ aus dem Tutorial klappt das bei mir nicht… erst wenn ich die ‚.{5}$‘ einsetzt, wie es ursprünglich der Fall zu sein schien klappt das… Hat mich alles in allem aber enorm weiter gebracht… Ich baue mir einen Aquarien Computer und auch die Ausgabe in eine Grafik werde ich mir bei Euch „klauen“ … Habt Ihr einen Tip, wo ich ein Tutorial finde, damit ich Relais Temperatur abhängig schaltbar mache? Das werde ich mit $ if, then & else machen müssen, das ist klar… Schalten kann ich die bereits mit einer anderen .sh aber ich finde nichts wie ich die anbinden kann an den DS18B20 … Bin Linux / Shell / Python noob – aber lern willig 😉

    Also für einen „hint“ wäre ich mega Dankbar!

    Greeeeetz Chris

    • Hey Chris,
      danke für die Blumen 😀 Mit den Regex verzweifle ich jedes mal wieder aufs neue und muss gibbsnich fragen^^ Aber schau dir mal die ganzen Antworten an, da gabs verschiedene Regex die funktioniert haben 🙂
      Thema Relais schalten fallen mir spontan zwei einfach Lösungen ein, entweder du liest die Daten in einem loop mit for aus und lässt die Schleife alle X Sekunden/Minuten laufen. Oder noch einfacher mit einem Cron der alle X Minuten läuft und dein Script aufruft.
      Gruß iro

  23. Hi zusammen,

    bitte das Tutorial noch ergänzen, da die Einbindung der DS 1820 (und alles andere über GPIO) nicht mehr wie oben beschrieben ab der Kernelversion 3.18.3 funktioniert!!! (bzw. die function „device tree“ ab 3.18.3 deaktiviert werden muss )

    folgendes sollte geprüft werden:
    – Kernelversion kontrollieren (muss mindestens v3.18.3 sein) mit
    > uname -r

    wenn die Kernelversion >= 3.18.3 dann:
    folgende Zeilen in „/boot/config.txt“ eintragen:
    ># activating 1-wire with pullup
    >dtoverlay=w1-gpio-pullup

    falls eine Debug-Funktion gewünscht wird auch folgendes in die „config.txt“eintragen:
    ># activating device tree debugging (use: sudo vcdbg log msg)
    >dtdebug=on

    Debuggen kann man mit dem Befehl:
    >sudo vcdbg log msg

    In der Datei „modules“ sollten die Zeilen „w1_gpio“, „w1_therm“ + „w1_wire“ auskommentiert oder gelöscht werden.

    Danach ein Reboot!
    (Quelle: FhemWiki:http://www.fhemwiki.de/wiki/Raspberry_Pi_und_1-Wire#ab_2015_bzw._Kernelversion_3.18.3 )

    Gruß

    Ingo

    • Hey Ingo,

      vielen Dank für die Info über die Änderungen! Werde den Artikel demnächst mal überarbeiten müssen 😉

      Gruß iro

  24. Moin, toller Tutorial.
    Kann mir jemand sagen wie lang die Leitung vom Fühler sein darf?
    Ich würde gerne den DS18B20 nehmen mit 10m Leitungslänge.

    Danke

  25. Hallo,kann mir mal jemand sagen wie ich den Sensor Ds18b20 am Raspberry anschließen muss?!
    Am Sensor habe ich rot,blau und weiß.

    Danke

  26. Hallo, ich hoffe ihr könnt mir helfen ich habe meinen DS18B20 Sensor angeschloßen, der Sensor wird leider nicht erkannt. Aber ich habe den Ordner /modules garnicht.
    Wenn ich lsmode eingebe dann zeigt er an:
    wire 311248 2 w1_gpio,w1_therm

    was mache ich falsch?

    Vielen dank für die hilfe!!!

    • Hey dobi,
      solange alles funktioniert, brauchst du den Ordner nicht 😉 Falls es nicht funktioniert, dann schau dir bitte mal den Kommentar von Ingo an.
      Gruß iro

  27. Hallo,
    hoffe ihr Profis könnt mir weiterhelfen. Habe Raspberry Pi2 B geholt und ein paar DS18S20 Sensoren. Da die Kernelversion 3.18.13 ist, habe ich so wie Ingo beschrieben konfiguriert.
    dtoverlay=w1-gpio,gpiopin=4,pullup=on
    nach dem reboot:
    sudo modprobe w1-gpio pullup=1
    sudo modprobe w1-therm

    aber devices Ordner ist leer 🙁 Also Sensor wurde nicht erkannt.

    Sensor habe ich so wie oben beschrieben angeschlossen. Hab am Anfang leider den Sensor falschrum reingesteckt, sodass es verpolt wurde (Sensor war sehr heiß).
    Dieser Sensor könnte kaputt sein, aber habe noch zwei neue. Leider wurde keinen von den Sensoren erkannt.

    • Hey 2bndone,
      ich hab momentan leider keine Zeit das noch einmal mit dem neusten Kernel zu probieren. Sobald ich dazu komme, gibts hier ein Update 😉 Allerdings kann ich dich beruhigen, die Sensoren funktionieren normalerweise auch noch, nachdem sie sehr heiß geworden sind – hab ich auch schon getestet 😉
      Gruß iro

  28. Hallo zusammen,
    erstmal muß ich ein großes Lob an den Verfasser dieses Tutorials richten.
    Für mich als „Neuling“ des Raspberry Pi´s, ist schon erstaunlich, wie einfach das mit dem Programmieren geht, oder auch nicht. Wenn ein Punkt, Zeichen oder Leerstelle
    das Programm zum „Einsturz“ bringt und man händeringend nach Lösungen sucht.
    Ich habe das Programm, wie ganz oben beschrieben durchgeführt. Und wenn ich in LX den Befehl: temp eingebe, bekomme ich immer wieder die folgende Meldung:
    pi@raspberrypi ~ $ temp
    egrep: Das Ende des angegebenen Intervalls ist nicht gültig
    (standard_in) 1: syntax error
    Gemessene Temperatur des Sensors °C
    Dabei habe ich in dieser Zeile folgendes stehen:
    temp=`echo $tempread | egrep -o ‚[\-0-9]+$’`
    Kann mir jemand erklären, wie ich dem Fehler auf die Spur kommen kann.
    Danke allen schon mal vorab.
    Gruß aus der Eifel von Helma

    • Hey Helma,
      ich tippe mal auf die “ ` „. Ersetz die mal durch “ ‚ „. Wird bei Copy&Paste manchmal nicht richtig kopiert.
      Gruß iro

  29. schöne Beschreibung, habe damit meinen Sensor zum laufen bekommen. Danke!
    Vorgestern habe ich Jessie installiert.
    wenn ich hier den Sensor in die /etc/modules Datei eintrage, gibts beim booten eine Warnmeldung.
    Ich habe die Zeilen wieder gelöscht und nach einem Neustart ging es trotzdem.
    Scheinbar werden die Treiber automatisch geladen.
    Den Eintrag in /boot/config.txt musste ich aber trotzdem machen.

    Happy Pythoning,
    Thomas

    • Hey Thomas,
      danke fuer die Rueckmeldung 🙂 Du hast recht, mit Jessie werden die Treiber mittlerweile wohl automatisch geladen. Muss die Anleitung bald mal wieder updaten 😉
      Gruss iro

    • Hi Markus,

      klar, das geht, der Pi spricht ja zum Glück diverse Sprachen 😉 Das Vorgehen ist prinzipiell wie oben beschrieben: Du brauchst eine Skript-Datei und die muss periodisch ausgeführt werden (z.B. mit cron jede Minute), dort muss eine Bedingung eingebaut sein, wenn die „wahr“ ist, wird mit dem `mail`-Kommando (musst Du wahrscheinlich noch separat konfigurieren!) eine Mail verschickt. Ungefähr so:

      #!/bin/bash

      maxtmp=12

      tempread=`cat /sys/bus/w1/devices/10-0008017b5e27/w1_slave`
      temp=`echo $tempread | egrep -o 't=[-0-9]+$' | cut -d = -f 2`
      temp2=`echo "scale=2; $temp / 1000" | bc`

      if [ 1 -eq `echo "${temp2} > ${maxtmp}" | bc -l` ]; then
      mail -s "subjekt" email@address.com <<< "warnung: temperatur ist hoch" fi

  30. Hallo zusammen,
    der Beitrag ist zwar schon etwas älter, aber vielleicht kann mir hier trotzdem jemand einen Rat geben. Ich habe alles wie beschrieben durchgeführt, erhalte jedoch unter /sys/bus/w1/devices/ keine weiteren Ordner oder Dateien…erkennt er etwa den Snsor nicht oder was ist da los?

    gruß Lars

    • Hallo Lars,
      lies die Kommentare, das sollte die Antwort bringen 🙂 Mittlerweile muss man das 1-wire Protokoll anders einbinden. Die Lösung steht aber irgendwo 😉
      Gruß iro

  31. Guten Abend,

    in den letzten Kommentaren habe ich nun diese Zeile gelesen:

    temp=`echo $tempread | egrep -o ‚t=[-0-9]+$‘ | cut -d = -f 2`

    Aber auch etliche andere wie ‚[\-0-9]+$’`
    oder aber auch ‚.{5}$’`

    leider habe ich bei eingabe wie im zweiten Beispiel eine wie oft genannte Fehlermeldung und bei Versuch der anderen bekomme ich keine negativen Zahlen zustande. Beim auswerten der RRD Table werden auch keine zuverlässigen Daten gespeichert.

    Ich hoffe es kann mal jemand schreiben mit welcher „konfiguration“ zuverlässig negative Werte ausgelesen und dargestellt werden können.

    Vielen Dank

    Liebe grüße

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..