Temperatur-Sensor DS1820 am Raspberry Pi mit Python

Veröffenticht am 07.10.2015    von     in der Kategorie Raspberry Pi, Sensoren, Temperatur WebApp     bisher 29 Reaktionen


Temperatursensor am Raspberry Pi mit Python auslesen In diesem Beitrag und dem dazugehörigen Video zeige ich dir neben dem Anschluss und der Installation, wie du einen Temperatur-Sensor DS1820 am Raspberry Pi mit Python auslesen kannst.

 

Projekt Demonstration

 

Hardware

Für die Temperaturmessung kannst du alle vorhandenen Modelle des Raspberry Pi verwenden. Solltest du noch keinen besitzen, würde ich an deiner Stelle gleich den Raspberry PI 2 Model B kaufen.

In diesem Video verwende ich den DS18B20 IC digital Temperatursensor inklusive 1m Kabel in der wasserdichten Ausführung.

Der Anschluss an den Raspberry Pi erfolgt über den Pin 1 (3,3 Volt Spannung), Pin 6 (GND) und Pin7 (Datenleitung). Zwischen die 3,3Volt-Leitung und die Datenleitung wird ein 4,7 K-Ohm Widerstand geschaltet.

Steckplatinen-Schaubild DS18B20 Sensor Anschluss

Die fritzing Projektdatei habe ich für dich zum Download bereitgestellt.

 

Installation des DS18B20

Folgende Befehle werden über das Terminal eingegeben. Zuerst lasse ich mir die vom System geladenen Module anzeigen.

Danach kommt die Aktivierung des 1-Wire Buses mit folgenden Befehlen.

Damit man sieht, ob die Aktivierung des Moduls geklappt hat, wiederholt man den lsmod Befehl.

Als nächstes erweitern wir die notwendigen Dateien für die automatische Aktivierung des Buses und des Sensors nach einem Neustart. Ab der Kernel Version 3.8 ist die Ergänzung der Datei /etc/modules nicht mehr notwendig, in dem Video habe ich es trotzdem gemacht. Hierzu öffnest du die Datei in deinem Texteditor mit dem Befehl

und fügst folgende drei Zeilen ein.

Ab Kernel 3.8 ist die Datei config.txt für das Laden der Module zuständig. Diese rufst du mit dem Befehl

auf und hängst folgende zwei Zeilen an, der Kommentar ist optional.

Danach führst du einen Neustart des Raspberry Pi aus.

Nach dem Neustart kannst du mit dem Befehl

die korrekte Aktivierung des 1-Wire Bus überprüfen.

Das System schreibt immer den aktuellen Wert des Sensors in eine Datei. Diese befindet sich in einem durch die Sensor-Kennung bestimmten Verzeichnis. Dieses findest du, indem du mit

in das Busverzeichnis wechselst und den Befehl zur Anzeigen des Inhaltsverzeichnisses ausführst.

Bei einem Sensor werden dir nun zwei Verzeichnisse angezeigt. Ein Verzeichnis ist “w1_bus_master1”, das für uns wichtige Verzeichnis ist das mit einer Code-Bezeichnung, in meinem Fall “28-000005d2e508”.

Mit dem folgenden Befehl kannst du dir nun den Inhalt der Datei “w1_slave” mit dem Sensor-Wert bzw. der Temperatur anzeigen lassen.

 

das Python-Programm

Als Erweiterung zu dem folgenden Programm-Code stelle ich in meinem Beitrag “Mehrere DS1820 Sensoren am Raspberry Pi mit Python einlesen” ein Programm mit Funktionen zur automatischen Einbindung der DS1820 Sensoren zur Verfügung.

 

Grundlage für meinen Beitrag bzw. die Umsetzung des Einsatzes des Temperatursensor an meinem Raspberry Pi ist der Beitrag “Raspberry Pi – Temperaturmessung mit DS18B20 1-Wire Sensor” von Marcus Hottenrott und der Beitrag “Raspberry Pi: 1-Wire Temperatursensor DS1820” von Prof. Jürgen Plate.

 

In diesem Beitrag verwende ich Affiliate Links zum Amazon Partnerprogramm. Für dich entstehen dadurch keine Mehrkosten.

Share on Facebook1Share on Google+0Tweet about this on Twitter0Pin on Pinterest0Share on LinkedIn0



Servus, ich bin Wolfgang.

Blogger – Maker – web & mobile Developer – Dobermann Besitzer.

Mit meinem über die Jahre gesammelten Wissen als Webworker möchte ich dir Hilfestellungen und Anregungen zur Nutzung der sich aus dem digital Lifestyle ergebenden Möglichkeiten und Notwendigkeiten geben.

Einen aktuellen Schwerpunkt auf meinem Blog bildet das Thema IoT im Zusammenspiel mit dem Raspberry Pi.


Hinterlasse einen Kommentar

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

29 Reaktionen (25 Kommentare)

  • Lea schrieb am 12. Mai 2017:

    Hallo,
    ich bin ein absoluter Python-Anfänger, dadurch war ich echt glücklich das deine Anleitung so detailliert ist.
    Die Installation und das Abschreiben vom Pythonprogramm ging auch gut. Wenn ich jetzt allerdings versuche das Programm zu starten,
    soll man es ja erst speichern und dann kommt folgende Meldung:
    I/O Warning
    Non-ASCII found, yet no encoding declared. Add in a line like “# -*- coding: utf-8 -*.” to your file
    Choose OK to save this file as utf-8
    Edit your generall options to silence this warning

    Wenn ich dann Ok drücke kommt:
    I/O Error
    [Errno 2] No such file or directory:
    ‘/var/www/messprogramm.py’

    Kann mir vielleicht jemand helfen?
    Danke im vorraus

    • Wolfgang schrieb am 12. Mai 2017:

      Hallo Lea,
      das Programm kannst du in jedem Verzeichnis abspeichern. Die Fehlermeldung bedeutet nur, der gewählte Pfad /var/www/ ist nicht vorhanden. Daher öffne deinen Editor nicht mit /var/www/messprogramm.py sondern nur mit z.B. messprogramm.py. Im Normalfall befindet sich die Datei dann im Verzeichnis /home/pi/.
      Viele Grüße
      Wolfgang

  • Felix schrieb am 8. Mai 2017:

    Servus Wolfgang!

    Ich habe folgendes Problem, und zwar wenn ich cat /sys/bus/w1/devices/ meine Bezeichnung /w1_slave eingebe kommt folgende Meldung:
    cat: meine Bezeichnung: Datei oder Verzeichnis nicht gefunden.
    Mir ist allerdings auch aufgefallen, dass ich eine sehr komische Bezeichnung für meinen Sensor habe: 00-400000000000 00-800000000000 00-c00000000000
    Ich hoffe du kannst mir weiterhelfen 🙂

    Liebe Grüße

    Felix

    • Wolfgang schrieb am 9. Mai 2017:

      Hallo Felix,
      die Sensoren müssen beim Booten des Systems angeschlossen sein. Die angegebenen Bezeichnungen lassen darauf schließen, dass dein Sensor nicht im System eingebunden wurde. Ein Neustart dürfte in solchen Fällen helfen.

      Viele Grüße
      Wolfgang

  • Jörn schrieb am 31. Januar 2017:

    Servus Wolfgang,

    bei der Suche nach einer Lösung um die Vor- und Rücklauftemperaturen unserer Heizung auszulesen, bin ich über Deine Seite “gestolpert” 🙂

    Vielleicht kannst Du mir einen Tipp geben.

    Das Script läuft soweit ohne Fehler durch – nachdem ich die Sensor-ID ersetzt und die Hinweis von Matthias mit den Prix befehlen in Klammern gesetzt habe. Allerdings bekomme ich keine Werte ausgegeben. Hast Du eine Idee, woran es liegen kann?

    Gruß
    Jörn

    • Wolfgang schrieb am 31. Januar 2017:

      Hallo Jörn,
      hast Du Dir zum Test den Messwert vor dem return am Ende der Funktion aktuelleTemperatur() mit einem print ausgeben lassen? Dies wäre mein erster Schritt um der Sache etwas näher zu kommen, wenn auch hier kein Wert ausgegeben wird, über das Terminal mal mit “cat /sys/bus/w1/devices/DEINE SENOSORBEZEICHUNG/w1_slave” den Wert auslesen, vielleicht liegt ja dort das Problem.

      Viele Grüße
      Wolfgang

      • Joern schrieb am 1. Februar 2017:

        Moin Wolfgang,

        vielen Dank fuer Deine schnelle Antwort!

        Ich weiss nicht, ob ich hier den ganzen Code posten kann. Ich hab nun zwischen der Zeile rueckgabewert = ‘%6.2f’ % temperature und return(rueckgabewert) ein print (aktuelleTemperatur) eingebaut.

        Als Ergebnis bekomme ich nun ausgegeben!?

        Frage ich den Sensor mit cat /sys/bus/w1/devices/28-0316556d5fff/w1_slave ab, erhalte ich die Temperatur.

        • Wolfgang schrieb am 1. Februar 2017:

          Hallo Jörn,
          das print soll den Wert von “rueckgabewert” ausgeben, daher musst Du den Befehl entsprechend angeben, also print rueckgabewert bzw. print (rueckgabewert).

          • Jörn schrieb am 1. Februar 2017:

            Kaum macht man es richtig 😉

            Die Temperatur wird nun ausgegeben.

            Aktuelle Temperatur :
            17.94

            Also liegt das Problem wohl im unteren Teil des Codes.

          • Wolfgang schrieb am 1. Februar 2017:

            Sehr schön 😉
            Wie lautet den Dein print Befehl im unteren Bereich?
            print “Aktuelle Temperatur : “, messdaten, “°C”, “in der “, schleifenZaehler, “. Messabfrage”
            bzw.
            print (“Aktuelle Temperatur : “), messdaten, (“°C”), (“in der “), schleifenZaehler, (“. Messabfrage”)

  • Matthias schrieb am 7. Dezember 2016:

    Hallo, ich bin Anfänger was Sachen Programmierung angeht. Der Temp Sensor ist angeschlossen und es geht auch soweit das ich ihn mir anzeigen lassen kann beim Befehl
    cat /sys/bus/w1/devices/ meine id eingetragen /w1_slave

    Wo es bei mir aufhört ist bei dem Pyton Programm . Habe mit sudo nano test.py aufgerufen und das Programm dort reinkopiert. Die Temp id natürlich abgeändert. und gespeichert. aber egal was ich versuche ich bekomms nicht zum laufen.
    Wer könnte mir da helfen?
    Vielen lieben dank schon mal im vorraus
    Gruß Matthias

    • Wolfgang schrieb am 7. Dezember 2016:

      Hallo Matthias,
      da es sich um ein Python-Programm handelt, kannst du das Programm direkt mit der IDLE schreiben und ausführen. Rufe hierzu dein Programm mit sudo idle test.py aus dem Terminal auf und führe es über den Menüpunkt “Run” oder mit der Funktionstaste F5 aus.
      Viele Grüße
      Wolfgang

      • Matthias schrieb am 8. Dezember 2016:

        Vielen lieben dank für die schnelle Antwort. Finde ich echt Klasse.
        Leider kommt diese Fehlermeldung dabei raus:

        Traceback (most recent call last):
        File “/usr/bin/idle”, line 5, in
        main()
        File “/usr/lib/python2.7/idlelib/PyShell.py”, line 1545, in main
        root = Tk(className=”Idle”)
        File “/usr/lib/python2.7/lib-tk/Tkinter.py”, line 1813, in __init__
        self.tk = _tkinter.create(screenName, baseName, className, interactive, want objects, useTk, sync, use)
        _tkinter.TclError: no display name and no $DISPLAY environment variable

        Bor , keine Ahnung was der von mir will, Grübel.

        Herzlichen Dank nochmal für deine Hilfe , hoffe du kannst mir hier auch weiterhelfen ?

        Gruß Matthias

        • Wolfgang schrieb am 8. Dezember 2016:

          Gerne doch…
          Wenn ich die Meldung richtig deute, verwendest du den Raspberry Pi nicht im Desktop-Modus. Die IDLE benötigt meines Wissens allerdings diese. Solltest Du ohne Desktop arbeiten wollen/müssen, dann musst du dich in dieser Richtung beschäftigen oder Python zum Beispiel über den Webserver aufrufen.
          Viele Grüße
          Wolfgang

          • Wolfgang schrieb am 8. Dezember 2016:

            Wie heißt es so schön, viele Wege führen zum Ziel … 😉
            Auf alle Fälle freut es mich, dass du es zum Laufen gebracht hast. 🙂
            Viele Grüße und viel Spaß mit deinem RasPi
            Wolfgang

          • Matthias schrieb am 8. Dezember 2016:

            So nach langer suche Problem gelöst. Als 1. Aufruf mit Python 2.7.9 dann die print Befehle in Klammern setzten.

            print(“Temperaturabfrage für “), schleifenAnzahl,
            print(” Messungen alle “), schleifenPause ,(” Sekunden gestartet”)

            Jetzt gehts.

            Danke für die Hilfe 🙂

          • Matthias schrieb am 8. Dezember 2016:

            So jetzt bin ich meinem Prob doch schon viel näher gekommen , dank dir 🙂
            Hast recht muss den Befehl über Desktop aufrufen ABER dann kam trotzdem eine Fehlermeldung und das Programm läuft jetzt erst wo ich die Zeile:

            print “Temperaturabfrage für “, schleifenAnzahl,
            ” Messungen alle “, schleifenPause ,” Sekunden gestartet”

            rausgelöscht habe.
            Jetzt bringt er mir alle sec die Aktuelle Temp in Schleife. Komisch oder ?

  • Stephan schrieb am 20. November 2016:

    Hallo,

    Ich verwende genau das Python Script was auf der Seite angegeben ist,
    aber leider führt der Raspi das Script nicht vollständig aus, und gibt die Meldung aus :
    Das die Zeile 33 nicht definiert ist .

    woran könnte das liegen ?

    Gruß Stephan

    • Wolfgang schrieb am 21. November 2016:

      Hallo Stephan,
      in der Zeile 33 mit “messdaten = aktuelleTemperatur()” wird der Rückgabewert der aufgerufenen Funktion aktuelleTemperatur() bestimmt. Stimmt den der Funktionsaufruf und in der Funktion der Name der Datei?
      Viele Grüße
      Wolfgang

  • Nick schrieb am 2. November 2016:

    Is there a way to wire the thermometer to a USB and then connect to the Pi via USB (instead of going through the board and pins)?

    • Wolfgang schrieb am 3. November 2016:

      Hello Nick,
      a 1 wire to USB possibility is not known to me. Perhaps such a solution would be realized via an Arduino or similar.
      Best wishes
      Wolfgang

  • Tom schrieb am 30. Juni 2016:

    Leider klappt es bei mir nicht, wenn ich den Code so übernehme. Ich bekomme folgenden Fehler:
    file = open(“/sys/bus/w1/devices/28-000005d2e508/w1_slave”)
    IOError: [Errno 2] No such file or directory: ‘/sys/bus/w1/devices/28-000005d2e508/w1_slave’

    Ich arbeite über Eclipse und einer SSH Verbindung zum Pi. Könnte es daran liegen? Hast Du vielleicht einen Lösungsansatz für mich?
    Vielen Dank!

    • Wolfgang Raab schrieb am 30. Juni 2016:

      Hallo Tom,
      an Eclipse liegt es nicht. Du musst das verwendeten Verzeichnis “28-000005d2e508” mit dem Sensor-Kennung bestimmten Verzeichnis auf Deinem Raspberry Pi ersetzen. Das Verzeichnis findest Du über die Terminaleingabe: cd /sys/bus/w1/devices
      Viele Grüße

  • Viktor schrieb am 11. Mai 2016:

    Hat alles geklappt.
    Schön wäre eine detailiertere Aufschlüsselung der einzelnen Anweisungen. z.B. die Definition der split-Anweisung.
    Aber dafür gibt es sicher was zum Nachlesen…
    Klasse Arbeit. Danke!

    • Wolfgang Raab schrieb am 11. Mai 2016:

      Hallo Viktor,
      vielen Dank für Deinen Kommentar.
      Viele Grüße
      Wolfgang