1-Wire Sensor mit Datenbank

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Mein erstes Projekt mit dem Raspberry und der Programmiersprache Python:

    Die Temperaturen von mehreren Sensoren soll in eine Datenbank geschrieben werden.
    Da mein raspberry headless läuft (also ohne Bildschirm, Tastatur) sollen die Daten über einen WEB-Server präsentiert werden.

    Die Anregung für dies Projekt habe ich hier gefunden:
    Keine Ausgabe auf Webpage mit Linux

    Für Leute, die sich noch nicht so gut mit Python, MySQL oder Datenbanken auskennen, kann dies vielleicht hilfreich sein.

    Voraussetzung:

    • Webserver
    • PhP5
    • MySQL Datenbank
    • phpMyAdmin
    • Für die Grafik: JPGRAPH
    • Ich emppfehle MobaXterm für den Zugriff von Windows auf den raspberry
      wesentlich komfortabler als Putty
    • 1-Wire Sensoren


    Die Software wurde in Python geschrieben.
    In dem Paket sind folgende Dateien enthalten:

    • avrio.py Das Hauptprogram
    • avrio_database.py Ein Modul mit den Funktionen für die Datenbank
    • avrio_html.py Ein Modul, um eine HTML Datei zu erzeugen
    • avr-graph.php Ein PHP-Script, welches, den Temperaturverlauf als Grafik zeigt
    • avrio-writedb.sh Des kleines shell script, welches von cron aufgerufen wird


    Wenn avrio.py das erste Mal gestartet wird, werden die Parameter abgefragt und eine Konfigurationsdatei erzeugt (avrio-config.txt).
    Z.b. User/Pw für MySQL und die Datenbank-Parameter.
    Anschließend erzeugt das Programm die Datenbank und die Datenbank-Tabelle.
    Die bei der Installation angeschlossenen 1-Wire Sensoren werden automatisch erkannt und in die Konfigurations-Datei geschrieben.

    avrio-1.png

    Mit einem Editor (z.B. nano) erfolgt in der Datei die Zuordnung zu den Datenbankfeldern.
    avrio-2.png

    Als nächstes wird das Hauptprogram gestartet, welches ohne die Angabe von Parametern die Sensoren ausliest und die Daten in die Datenbank schreibt:
    > python avrio.py

    avrio-3.png

    Die Daten können auf mehrere Arten angezeigt werden:
    Über die Kommandozeile die letzten 3 Einträge aufrufen
    > python avrio.py -r 3

    avrio-4.png

    Über den Webserver kann man eine Seite aufrufen, die das Programm erzeugt:
    > python avrio.py -w
    Dann im Browser: http://192.168.178.60/avrweb/avr-single.html

    avrio-5.png

    Über den Webserver kann man eine Seite aufrufen, die eine Grafik erzeugt:
    http://192.168.178.60/avrweb/avr-graph.php

    avrio-6.png


    Falls jemand Fehler findet oder Anregung hat, bitte melden.

  • schönes Projekt. Wenn du beim abfragen den CRC der Temperatursensoren abfängst ist es noch besser. Dazu einfach prüfen, ob in dem File ein YES oder NO vorkommt. In PHP habe ich das so gelöst:
    $crcfail = preg_match("/NO/", $thermometerReadings);
    while ($crcfail) {
    sleep(2);
    $thermometer = fopen($thermometer_sensor_path, "r");
    $thermometerReadings = fread($thermometer, filesize($thermometer_sensor_path));
    $crcfail = preg_match("/NO/", $thermometerReadings);
    }

    Also wenn der DS18S20 einen CRC Fehler macht, warte ich 2 Sekunden und versuche eine neue Messung. So gehst du sicher, dass keine falschen Daten in die Datenbank geschrieben werden.

  • Heinz60
    Vielen Dank für den Hinweis - da wäre ich nicht drauf gekommen.

    In Pythyon habe ich dies wie folgt umgesetzt:


    while (!sleep()) {sheep++};

    Einmal editiert, zuletzt von ThomasH (8. März 2013 um 19:22)

  • Sehr schön, also das mit google werd ich wohl auch so machen :)

    Danke

    ps. wielang sind deine kabel an den Sensoren ? weil du so viele hast.

  • Jetzt kommt die Enttäuschung: die Kabellänge beträgt z.Zt. noch 5 cm.

    Das ganze läuft noch als Prototyp, da ich erst noch die Ansteuerung von Servo-Motoren erledigen muss.
    Der Rapsberry wird im Wintergarten platziert, wo er Lüftungsschlitze steuert.
    Im März schwankt die Temperatur von -5 bis tagsüber 20 Grad.
    Den Schrittmotoren traue ich nicht, da ich keine definierte Nullstellung habe und ich die Position der Lüftungsschlitze nicht über weitere Sensoren erfassen möchte.
    Nicht das der Schrittmotor nach einem Stromausfall das zweite Mal in die gleiche Richtung dreht und die Lüftung zerstört.

    Deine Frage hat mich aber motiviert, die Netzwerkkabel (Cat5) zur Heizung zu legen: ca. 8m.
    Und dann kam die Enttäuschung: er hat den neuen Sensor nicht erkannt und dann auch noch den Sensor direkt am raspberry nicht mehr lesen können.
    Ab und zu kam nur 0 Grad, manchmal fand er gar keine Sensoren mehr.

    Abhilfe: zweites Netzteil mit 5V für die Sensoren und Widerstand von 4,7k schrittweise auf 2k gesenkt.
    Ergebnis: keine Verbesserung.
    Aus Frust habe ich dann doch lieber Tatort gesehen und werde mich demnächst mit Messgeräten auf die Fehlersuche begeben.

    Wenn jemand eine Anleitung kennt, wie man statt probieren die Fehler messen kann, bitte melden.

    while (!sleep()) {sheep++};

  • Das php-Script für google charts war fehlerhaft - es zeigte nur den ersten Sensor.
    Die korregierte Version hängt hier an.

    Hier findet man übrigens die Parameter, um die Grafik zu formatieren:
    https://developers.google.com/chart/interact…llery/areachart

    Die Sensoren werden jetzt auch alle erkannt:
    - einer direkt am Raspberry
    - zwei im Heizungskeller (8m Cat.5 Kabel)
    - einer auf der Terasse (weitere 6m)

    Der Fehler ist mir etwas peinlich, aber vieleicht hilft meine Blödheit, anderen das zu vermeiden:
    Die Messung ergab nur noch 2V anstatt 3V am Sensor - so viel Spannungsabfall konnte gar nicht sein.
    Dei Ursache: GND und VDD waren vertauscht.
    Ich hatte über google noch mal die das Anschlussbild geladen - nur dieses mal war es das Gehäuse von unten.

  • wozu dient die Zeile 14 wenn du $conn in Zeile 18 nicht verwendest?
    korrigiere bitte mal Zeile 32 und speichere das query nicht in der selben variable wie das result. geht zwar ist aber sehr unsauber.

    Ansonsten sehr hübsch, danke!

    Einmal editiert, zuletzt von Heinz60 (26. März 2013 um 21:04)

  • Hallo Heinz60

    Hier werden die mysql-Funktionen beschrieben:
    http://selfphp.de/funktionsrefer…ionen/index.php

    // Mit mysql_connect() öffnet man eine Verbindung zu einer MySQL-Datenbank.
    // Im Erfolgsfall gibt diese Funktion eine Verbindungskennung, sonst false zurück
    mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');

    // Mit mysql_select_db() wählt man eine Datenbank aus.
    // Im Erfolgsfall gibt diese Funktion true, sonst false zurück.
    mysql_select_db($dbname)or die ('Error connecting to database');

    // Mit mysql_query() sendet man eine SQL-Anfrage (Anfrage) an einen Datenbankserver.
    // Die Funktion mysql_query() liefert im Erfolgsfall true, sonst false zurück.
    mysql_query($sql) or die ('Error selecting data');

    Das script habe ich entsprechend geändert - inkl. der Kommentare.

    Gruß,
    Thomas

    P.S.
    Ich ergänze dies gern, da der Raspberry im 24/7-Betrieb laufen soll und auch kleine Fehler sich dann auf Dauer bemerkbar machen.

  • Letzten nervige Fragen hoffe ich :)

    Habe sowas ähnliches wie dieses Hardwarebasteleien zuhause liegen sollte gehen oder ?
    Und wenn ich 2+ anschliessen möchte dann schliesse ich die parallel an weil ja jeder Sensor einen eigerne "ID" hat richtig ?

    EDIT: Wenn ich länger Kabel verlege muss ich da auf irgend was achten ?

    Einmal editiert, zuletzt von NanoDev (27. März 2013 um 21:37)

  • Was heißt 'sowas ähnliches'?
    OneWire-Sensoren werden einfach parallel angeschlossen, das macht die so simpel.
    Bei längeren Kabeln solltest Du als Spannung für den Sensor (nicht für den Buswiderstand) 5Volt benutzen und mußt den Widerstand möglicherweise verkleinern.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!