DS1820: hin und wieder Aussetzer

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich habe 12 DS1820 Temperatursensoren laufen, die hin und wieder für Probleme sorgen.
    Aufbau:
    Alle 5 Minuten führe ich per PHP (crontab job) den Befehl aus zum Erfassen der Temperaturen und schreiben in die Datenbank. Wenn ich dann die "Temperaturseite" manuell im Browser aufrufe, habe ich Werte drin stehen, die maximal 5 Minuten alt sind - lese also von der Datenbank, da dies schneller funktioniert als direktes Lesen der DS1820 Sensoren.

    Da ich bereits auf 2 Widerstände angewiesen bin, weil mit einem 4,7KOhm die Anlage nicht laufen wollte, habe ich mit den Widerständen (kleiner und größer) versucht, dem Problem entgegen zu wirken - leider ohne Erfolg.

    Nach ca. 1-3 Tagen äußert sich das Problem so, dass die w1_slave Datei (in der der Temperaturwert drin steht), sich nicht mehr lesen lässt. Die Seite, die alle 5 Minuten aufgerufen wird und die Datei lesen möchte, bleibt hängen beim Lesen der w1_slave. Mit sudo nano w1_slave geht das lesen auch nicht. Wenn ich an der Stelle den Raspberry neu starte geht alles wieder.

    Kann mir jemand Tipp geben, wo ich an der Stelle ansetzen soll? Da nach dem Neustart die Temperaturen ja gehen, ist es eher Software, nicht die Hardware, oder?

    Einmal editiert, zuletzt von AndyKL (13. Juli 2015 um 08:11)


  • Hallo,
    ich habe 12 DS1820 Temperatursensoren laufen, die hin und wieder für Probleme sorgen.
    Aufbau:
    Alle 5 Minuten führe ich per PHP (crontab job) den Befehl aus zum Erfassen der Temperaturen und schreiben in die Datenbank. Wenn ich dann die "Temperaturseite" manuell im Browser aufrufe, habe ich Werte drin stehen, die maximal 5 Minuten alt sind - lese also von der Datenbank, da dies schneller funktioniert als direktes Lesen der DS1820 Sensoren.

    Da ich bereits auf 2 Widerstände angewiesen bin, weil mit einem 4,7KOhm die Anlage nicht laufen wollte, habe ich mit den Widerständen (kleiner und größer) versucht, dem Problem entgegen zu wirken - leider ohne Erfolg.

    Nach ca. 1-3 Tagen äußert sich das Problem so, dass die w1_slave Datei (in der der Temperaturwert drin steht), sich nicht mehr lesen lässt. Die Seite, die alle 5 Minuten aufgerufen wird und die Datei lesen möchte, bleibt hängen beim Lesen der w1_slave. Mit sudo nano w1_slave geht das lesen auch nicht. Wenn ich an der Stelle den Raspberry neu starte geht alles wieder.


    Was machst du ? Brauerei überwachen ?

    Ist der 18B20 aktiv, saugt dieser 9 mA. Fragst du alle 12 Sensoren gleichzeitig ab, sollte dir der Bus zusammen krachen. -> 108 mA. Ferner braucht der für die Auswertung 750 ms Zeit. Mit nem Millimeter mit "Min/Max Funktion - kann man sowas messen. Oder mal das Oszi dran hängen und schau was deine Volts machen ...

    Und ich bin mir Sicher - du hast alle Leitungen sauber verlegt -> Leitungslänge, Querschnitt, etc. Das ist nichts schlimmes - aber pfuscht dir halt zusätzlich mit rein. Am 3.3 Volt Ausgang können max. 50mA geliefert werden.
    Hast schon mal mindestens 72 Meter. Ist viel bei dem Querschnitt.

    Hast auch mal versucht - einfach ein Paar Sensoren abzuhängen - längste Strecken? Weniger ist manchmal mehr. In der E-Technik wirft man Last ab - und fügt keine neue hinzu. Wenn du schon einen 2. Widerstand benötigst, bist du evtl schon über der SPEC. (Spezifikation) :thumbs1:

    Lösungen:
    Deine Buslast ist zu hoch - das kann funktionieren - aber wie bei Bus-Systemen in der E-Technik : meistens der erste oder letzte spinnt. 50 mA werden konstant geliefert. Du missbrauchst eigentlich den I2C Bus.

    Bis sich die Sensoren auf dem Bus "einig" sind, wer zuerst senden darf ist der Strom erst mal "hoch" - so denke ich mir das - Das mag eine Zeit gut gehen... Aber.... Teufel...
    Sensoren mit ihrer Adresse ansprechen, anstelle mit dem "Such Befehl" - und dann Zeitlich verschoben abfragen.

    Möglichkeit : großer Kondensator als Stütze - aber bei 12 Sensoren tendiere ich doch eher dazu - hier nochmals "einzuspeisen" - Sprich nochmal ein Netzteil.


    ESP8266+18B20 - schau dir das mal an. Geht ohne Raspberry oder Arduino. Dann wäre es eine Strom und WLAN Sache.

    Hat’s gerochen und gestunken, war’s Gerät von Tele…….n !

    M**le, M**le sprach die Tante, als die Waschmaschine brannte …

    Einmal editiert, zuletzt von freelncr77 (13. Juli 2015 um 10:45)


  • Ein Schaltplan, die Information über die Anzahl der Sensoren, die Länge der Busleitung und die Art der Stromversorgung wäre ganz nett um hier helfen zu können!

    Hallo,
    wie oben beschrieben handelt es sich um 12 Sensoren.
    Länge der Leitungen insgesamt schätze ich auf ca. 40 Meter.
    Stromversorgung 5V von Raspi + zusätzliches Netzteil 5 V für mehr Stabilität. Gemessen am DS1820 komme ich auf genau 5V.


    Sprich nochmal ein Netzteil.

    Also ein zusätzliches Netzteil habe ich im Einsatz, da die Spannung ohne diesen ziemlich eingesackt ist. Mit dem zusätzlichen Netzteil ist die Spannung jetzt sehr konstant.

    Was hälst du von der Idee, das Schreiben der Werte (alle 5 Minuten) auf 2 zu teilen? Also erst mal die ersten 6 Sensoren lesen lassen und in DB schreiben und danach die restlichen 6 Sensoren lesen und schreiben lassen.

    Einmal editiert, zuletzt von AndyKL (13. Juli 2015 um 10:54)

  • Hallo,
    wie oben beschrieben handelt es sich um 12 Sensoren.
    Länge der Leitungen insgesamt schätze ich auf ca. 40 Meter.
    Stromversorgung 5V von Raspi + zusätzliches Netzteil 5 V für mehr Stabilität. Gemessen am DS1820 komme ich auf genau 5V.

    Also ein zusätzliches Netzteil habe ich im Einsatz, da die Spannung ohne diesen ziemlich eingesackt ist. Mit dem zusätzlichen Netzteil ist die Spannung jetzt sehr konstant.

    Was hälst du von der Idee, das Schreiben der Werte (alle 5 Minuten) auf 2 zu teilen? Also erst mal die ersten 6 Sensoren lesen lassen und in DB schreiben und danach die restlichen 6 Sensoren lesen und schreiben lassen.

    Gibt es noch weitere Vorschläge, Ideen?
    Ich versuche noch mal zu schildern, was in der PHP-Datei drin steht, welche alle 5 Minuten per Crontab ausgeführt wird:

    - exec("sudo modprobe wire");
    - exec("sudo modprobe w1-gpio pullup=1");
    - exec("sudo modprobe w1-therm");
    - danach nacheinander lesen der 12 w1_slave Dateien, z.B. $file = ('/sys/devices/w1_bus_master1/28-12345678/w1_slave');
    - wenn Dateien gelesen (ca. 12 Sekunden), wird in die Datenbank geschieben

    Irgendwann, nach 1-2 Tagen ist das Lesen nicht mehr möglich, nach einem Neustart geht es dann.

    Einmal editiert, zuletzt von AndyKL (15. Juli 2015 um 08:51)

  • Gibt es noch weitere Vorschläge, Ideen?
    Ich versuche noch mal zu schildern, was in der PHP-Datei drin steht, welche alle 5 Minuten per Crontab ausgeführt wird:

    - exec("sudo modprobe wire");
    - exec("sudo modprobe w1-gpio pullup=1");
    - exec("sudo modprobe w1-therm");
    - danach nacheinander lesen der 12 w1_slave Dateien, z.B. $file = ('/sys/devices/w1_bus_master1/28-12345678/w1_slave');
    - wenn Dateien gelesen (ca. 12 Sekunden), wird in die Datenbank geschieben

    Irgendwann, nach 1-2 Tagen ist das Lesen nicht mehr möglich, nach einem Neustart geht es dann.

    Hallo,
    schade, dass niemand zu dem Problem was beitragen kan...

  • Deine zwei Widerstände ... Spannungen teilen sich im Verhältnis zu ihren Widerständen. Der Vorwiderstand kann nur eine bestimmte Last fahren sonst bricht er ein und das Verhältnis ändert sich. -> siehe belasteter Spannungsteiler , unbelasteter Spannungsteiler.
    Da sind so viele Sensoren dran, dass dein "Vorwiderstand" der mit den Sensoren den Spannungsteiler bildet, belastet ist.
    Somit teilt sich die Spannung anders auf.

    Netzteil - gut. OK. Parasitär lösen und hier nicht einen Vorwiderstand von den 5V+ auf das Signal nehmen, sondern genau die Spannung die der Sensor benötigt (anderes Netzteil DC/DC Wandler / StepDown Converter ) - direkt speisen zwischen Signal und GND. Diese Spannung sollte sehr glatt/sauber sein.

    Ich denke mir: Dein Signal kommt nicht sauber von irgend einem Sensor. Die Datei / ein Device wird zum /lesen / schreiben geöffnet und bleibt offen ->Datei gesperrt. Klar geht das nach einem Reboot wieder.

    Hast du die einzelnen Sensoren auch mal mit einem Lese-Timeout oder Error-Handler (was passiert wenn Sensor 5 nicht gelesen) versehen?
    Und wirft dein Script auch Log-Files ? Kannst du ja selber in dem Shell Script einbinden... "Lese Sensor 1:" weil sonst kommst du nie auf den Trichter und siehst nicht an welchem Sensor es hängt.
    echo "Lese Sensor1" >> log.txt

    Hat’s gerochen und gestunken, war’s Gerät von Tele…….n !

    M**le, M**le sprach die Tante, als die Waschmaschine brannte …

    Einmal editiert, zuletzt von freelncr77 (20. Juli 2015 um 03:57)

  • Hallo AndyKL,

    bist Du Dir sicher, dass es eine so gute Idee darstellt, im Abstand von 5 Minuten


    Ich versuche noch mal zu schildern, was in der PHP-Datei drin steht, welche alle 5 Minuten per Crontab ausgeführt wird:

    Code
    - exec("sudo modprobe wire");
    - exec("sudo modprobe w1-gpio pullup=1");
    - exec("sudo modprobe w1-therm");


    auszuführen? Nomrmalerweise werden diese Kommandos ein einziges Mal beim Hochfahren aufgerufen. Ich bin mir noch nicht einmal sicher, welche Auswirkungen dieses ständige Aufrufen haben könnte. Ist auf jeden Fall ungewöhnlich.

    Du brauchst doch nur die Dateien auszulesen, die nach Aufruf dieser Zeilen und Anwesenheit geeigneter Sensoren im System vorhanden sind. Und dann ordentlich schließen.

    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

    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.

  • Ich hoffe mal nicht, wie ich hier von jemandem gelesen habe, dass Du den Pullup an +5V vom RasPi hast, das wäre falsch! Parasitäre Stromversorgung ist ebenfals falsch, da das vom RasPi nicht unterstützt wird und zudem hier auch als falscher Begriff benutzt wird. Du solltest den Bus mit einem Pullup von minimal 1k gegen +3,3V betreiben. Auf keinen Fall bei so vielen Sensoren die Spannungsversorgung des Raspberry mit nutzen. Auf alle Fälle sehr sauber und sicher verkabeln und die Sensoren mit einer eigenen Stromversorgung betreiben. RasPi und Sensoren haben dann wirklich nur die Busleitung und GND gemeinsam. An den Sensoren liegt dann +5V und GND von der externen Stromversorgung, also hat die nur GND mit dem RAsPi gemeinsam. Dann solltest Du tatsächlich mal versuchen, eine Fehlerbehandlung in Dein Programm einzubauen und die Fehler protokollieren zu lassen.

  • Vielen Dank für das Feedback!!!

    Ich versuche ohne Zitate auf manche Frage bzw. Aussagen einzugehen:

    - der Wiederstand ist gegen 3,3 V von Raspi gelegt (das scheint dann richtig zu sein)
    - ja ich verwende leider die 5 V von Raspi und zusätzlich 5 V vom Netzteil. Vielleicht sollte ich an der Stelle GRN + die 5V von Raspi kappen, dann würde ich nur noch die externe Spannungsversorgung nutzen

    - ich habe die 3 Befehle alle 5 Minuten ausgeführt, da ich der Meinung war, dass dies notwendig sei, damit die Temperaturen bzw. Werte in der Datei updatet wird
    exec("sudo modprobe wire");
    exec("sudo modprobe w1-gpio pullup=1");
    exec("sudo modprobe w1-therm");

    Dies war wohl ein Fehler und daher habe ich folgendes sofot umgesetzt:
    - in Crontab beim booten EINMALIG die Befehle ausführen
    - alle 5 Minuten die Textdateien lesen ohne die Befehle

    Ich werde bald berichten, ob nach der ersten Maßnahme die Abstürze noch vorhanden sind. Die Spannungsversorgung auf extern zu legen werde ich auch bald umsetzen.

  • Hallo,
    das Lesen der Temperaturen hat sich heute Nach leider wieder aufgehängt.
    Und das obwohl ich gestern umgestellt habe, dass nachfolgende Befehle nur beim Starten ausgeführt werden:
    exec("sudo modprobe wire");
    exec("sudo modprobe w1-gpio pullup=1");
    exec("sudo modprobe w1-therm");

    UND

    Die Spannungsversorgung (5Volt) NUR von externen Netzteil kommt.

    Jetzt möchte ich diese Anregung verfolgen:


    Hast du die einzelnen Sensoren auch mal mit einem Lese-Timeout oder Error-Handler (was passiert wenn Sensor 5 nicht gelesen) versehen?
    Und wirft dein Script auch Log-Files ? Kannst du ja selber in dem Shell Script einbinden... "Lese Sensor 1:" weil sonst kommst du nie auf den Trichter und siehst nicht an welchem Sensor es hängt.
    echo "Lese Sensor1" >> log.txt

    Dein Ansatz hört sich sehr gut an, dass ich generell ein Logfile über die Sensoren drüber laufen lasse.
    Nur der Code, mit dem ich die Temperatur lese ist ein PHP Code und hat mehrere Zeilen:
    $file = ('/sys/devices/w1_bus_master1/28-011453f18aff/w1_slave');
    //Datei lesen Zeile für Zeile
    $lines = file($file);
    //Gib Temperatur von der zweiten Zeile raus, also nach =
    $temp1 = explode('=', $lines[1]);
    //nette Formatierung
    $temp1 = number_format($temp1[1] / 1000, 1, '.', '');
    echo $temp1;
    Danach SQL Statement mit update Temperautren ...

    Hast du zufällig einen direkten "Raspberry" Code wie ich Temperatur lesen kann?

  • Hallo AndyKL,

    mit PHP kenne ich mich zu wenig aus. Aber was passiert denn, wenn ein Sensor keine Sensor-Datei erzeugt, die Du anscheinend hartcodiert ausliest.

    Ich würde es so machen, dass Dein Programm die jeweils vorhandenen Sensordateien ausliest und dann die Werte in die Datenbank schiebt.

    Wenn Dir Dein Programm dann immer noch hängen bleibt, dann kann man die Sensoren ausschließen.

    Als letzter Kandidat bliebe dann Dein Code, der Daten in die Datenbank schreibt.

    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

    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.


  • mit PHP kenne ich mich zu wenig aus. Aber was passiert denn, wenn ein Sensor keine Sensor-Datei erzeugt, die Du anscheinend hartcodiert ausliest.


    Ich habe zur Zeit diesen "Aufhänger" und mache bewusst kein Reboot um zu testen.
    Das Verhalten ist also so, dass immer die Datei w1_slave erzeugt wird, diese aber nicht lesbar ist.
    Wenn ich jetzt per Filezilla direkt auf dem Raspi lesen möchte, dass dauert es ewig und irgendwann bekomme ich leeres Textdokument angezeigt.


    Ich würde es so machen, dass Dein Programm die jeweils vorhandenen Sensordateien ausliest und dann die Werte in die Datenbank schiebt.


    Das mache ich im Normalfall

    Und dann gibt es z.b. den Befehl, um sich die Anzahl der Sensoren anzuzeigen:

    cat /sys/devices/w1_bus_master1/w1_master_slave_count

    Wenn ich den per Putty ausführe, dann hängt sich Putty auf, also kann nicht verarbeitet werden.

    Einmal editiert, zuletzt von AndyKL (21. Juli 2015 um 10:08)

  • Nachdem sich die Temperaturen wieder aufgehängt haben, habe ich Neustart gemacht und mittels nachfolgenden Befehls mir die Anzahl der Temperaturen angezeigt.

    cat /sys/devices/w1_bus_master1/w1_master_slave_count

    Ich habe insgesamt 12 Temperaturen und die Anzahl der Temperaturen, die per Befehl zurück kommt schwankt zw. 9 und 12.

    Jetzt ist mir aufgefallen, dass ich mit PHP immer Versuche die Datei w1_slave zu lesen.
    Was passiert aber, wenn es den Ordner und dann auch die Datei nicht gibt und versucht wird zu lesen?

    Aus diesem Grund habe ich jetzt "if file exist" eingebaut und schaue, ob jetzt Temperaturen ausfallen werden.

    Einmal editiert, zuletzt von AndyKL (21. Juli 2015 um 12:39)

  • Fehler abfangen ist eine Grundlage der Programmierung, auch in PHP. Solche Sachen sollte man von vornherein berücksichtigen und bei jeder Variable nachdenken, was passiert, wenn sie 0 ist, was passiert, wenn Sie NULL ist, was passiert, wenn sie nicht existent ist, was passiert, wenn sie den falschen Typ hat usw.. Es gibt unterschiedliche Meinungen dazu, aber nach meiner sollte man die Variablen initialisieren, auch wenn die Sprache zulässt ohne Initialisierung Variablen zu nutzen.

  • Hallo.


    Aus diesem Grund habe ich jetzt "if file exist" eingebaut und schaue, ob jetzt Temperaturen ausfallen werden.


    Dieses "if fle exist" hat nichts mit dem ausfall der Sensoren zu tun, ist aber wie raspiprojekt schon sagte ein absolutes muss.

    Du solltest Dir den Vorgang mal vor Augen halten, wann was passiert.
    1. Sensor steckt, raspi wird gebootest und Sensor erkannt.. File existiert.
    2.Sensor wird jetzt gezogen (nicht gelesen) File existiert aber weiter... lässt sich überprüfen, warum?
    Das File existiert so lange, bis der 1. Leseversuch des Files kommt.Der Leseversuch stösst w1-therm an, w1-therm prüft den Sensor, wenn existent wird das File mit dem aktuellen Wert upgedatet.
    Wenn w1-therem nichts findet, wird erst jetzt das File gelöscht.
    Das sollte man sich vor Augen halten.

    Du werkelst da mit 3,3V und 54V rum... ein Schaltplan wäre hilfreich.

    Habe selbst 8 Sensoren an ca 20m Kabel seit Monaten im 24/7 Modus problemlos im Einsatz.

    gruß root


  • Du werkelst da mit 3,3V und 54V rum... ein Schaltplan wäre hilfreich.

    Habe selbst 8 Sensoren an ca 20m Kabel seit Monaten im 24/7 Modus problemlos im Einsatz.
    gruß root


    Hallo Root und alle anderen,

    leider bestehen meine Probleme immer noch :(
    Heute Nacht sind die Temepraturen wieder ausgestiegen, ich gebe aber nicht auf und hoffe auf Eure Hilfe.
    Anbei habe ich (endlich) ein Shaltplan angefügt, womit Ihr Euch ein Bild machen könnt.
    Auf anraten meines Bekannten habe ich z.T. Kondensatoren am DS1820 installiert, die zw. GRD und VDD gehängt wird (siehe Bild). Vielleicht sorgt das für Probleme?
    Ich weiß es nicht.
    Das Bild habe ich richtig herum upgeloadet, wenn man es hier vergrößert müsst Ihr es leider drehen.

  • Hallo.
    ...geiler "Schaltplan" :D , aber immerhin sieht man was.
    Was mir sofort auffällt: Du betreibst die Sensoren mit 2 Spannungen.5V Versorgung und 3,3V über R an DQ.
    Ob das ok so ist ...keine Ahnung, aber das würde ich mal ausmerzen.

    Ich hatte selbst am Anfang tagelang damit zu kämpfen.Das ging soweit dass der Raspi ab und an resettet wurde.
    Hab kommplett neu verdrahtet (siehe Anhang), seitdem ist Ruhe.
    Abgeschirmte Leitung (nur eine Seite auf GND legen), und R liegt bei ~3kOhm.
    Der abgehende DQ geht auf nen Levelshifter und dann zum Raspi.

    Vlt. bringt es Dir was.
    Der 4K7 ist bei der Anzahl auf jeden Fall zu hoch.
    Als 2. Anhang ne kurze Tabelle zum 1-wire bus

    gruß root


  • Was mir sofort auffällt: Du betreibst die Sensoren mit 2 Spannungen.5V Versorgung und 3,3V über R an DQ.
    Ob das ok so ist ...keine Ahnung, aber das würde ich mal ausmerzen.


    Und wie soll ich die 3V ausmerzen? Ich verwende es nur als Brücke zum DQ über die die beiden Widerstände dran sind.


    Der 4K7 ist bei der Anzahl auf jeden Fall zu hoch.


    Aber bei 2x 4,7KOhm Widerständen liegt der Gesamtwiderstand bei 2,35 KOhm.
    OK, die Zeichnungist nicht ganz schön. Der eine Widerstand hängt direkt hinter Raspi, danach gibt es Y Verzweigung eine geht nach oben ins Haus eine nach unten und dort hängt noch ein Widerstand. Spannung an DS1820 liegt überall bei 5V.


  • Der eine Widerstand hängt direkt hinter Raspi, danach gibt es Y Verzweigung eine geht nach oben ins Haus eine nach unten und dort hängt noch ein Widerstand.


    Wenn dass so ist, ist es falsch. Es ist nicht egal, wo der Pullup hängt. Der Pullup muss zwischen 3,3V des RasPi und Data liegen. Wenn 2 Widerstände, dann beide parallel vor der Aufgabelung. Ich nutze für sowas einen 5k trimmer mit einem 1k Widerstand in Reihe. Wo holst Du die 5V her?

Jetzt mitmachen!

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