DS18B20 mit w1thermsensor fehlerfrei lesen

  • dass die verkabelte (Stern-)Topology für den 1-wire Bus vom Hersteller nicht empfohlen wird.

    ist aber nicht immer zu vermeiden.

    7 Sensoren mit 3,3 V aus dem Pi zu versorgen wird auch beim Pi bald grenzwertig. Am 3,3 V Ausgang des Pi steht nur begrenzter Strom z.V.

    da hilft die Versorgung mit einem Treiber extern aus einem GPIO zu "enablen"

    Der Treiber liefert den Strom für 5V und kann per GPIO an und aus gesteuert werden.

    Einen LDO mit enable muss man halt suchen, ggffs. braucht man halt eine bessere höhere Versorgungsspannung, aber wir reden hier über 30mA nicht über 30A, also 30mA aus 5V boosten auf 6V für den LDO mit enable ist machbar.

    https://www.onsemi.com/products/power…ors-ldo/ncv4276

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Freunde und Entwarnung.

    Unser Jüngster, ein programmierender Physiker wie ich, hatte vor einiger Zeit das Heizungsprogramm per systemctl in die Boot-Folge eingeschleust und sagte mir, ich könne das mit "systemctl start/stop heizung" anhalten und wieder starten. Heute habe ich bemerkt, daß trotz Stop-Befehl das Programm mit der 1wire-Abfrage weiterläuft.

    Wenn ich dann mit "nohup python3 ww_heizung.py&" parallel gestartet bin, kam das w1thermsensor nicht mehr zu Recht. Jetzt läuft das Programm wieder als Single fehlerfrei und der zusätzliche 2 kOhm Widerstand zwischen 3,3V und Datenleitung hat der Stabilität gut getan.

    Aber jetzt muß ich systemD/systemctl besser kennenlernen, damit ich weis, was da passieren kann.

  • ach ja, ein Nachtrag. Was noch nicht funktioniert, ist die Eingrenzung der Meßwerte auf [-25°,+60°].

    Das soll ja in T1W.py mit einer IF-Zeile eingegrenzt werden.

    Trotzdem finde ich im heizlog261.txt heute wieder einige Werte mit -20xx.xx

    Ist der logische Ausdruck python-mäßig nicht korrekt?

  • Unser Jüngster, ein programmierender Physiker wie ich

    mach dir nichts daraus, auch Physiker wissen nicht alles und die Ausbildung wird immer schmaler!

    Fragte mich doch ein promovierter Physiker warum es so viele Sorten von Kondensatoren gibt;

    Tantal, Keramik (dazu MLCC), Folie, Elko (dazu bipolarer Elko), Plattenkondensator.

    Ich meinte nur eigentlich muss mir das der Physiker beantworten, alles Physikgrundlagen :lol: aber ich erklärte es ihm!

    ach ja

    übrigens man muss hier nicht im Minutentakt neue Beiträge erstellen, verschleisst nur unsere Scrollräder, man kann und darf und soll solange noch keiner geantwortet hat den vorigen Beitrag editieren!

    Geht auch jetzt immer noch aus 2 Beiträge hintereinander EINEN Beitrag zu machen! ;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Optimist, wozu sollten denn Fragen beantwortet werden?

    Internet heisst Frage abkippen und wech!

    Maximal kommt noch selten: "läuft wieder" :lol:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • was ist ein Pessimist? :conf:

    Ein Optimist mit Erfahrung :lol:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Das IF-Statement in T1W soll die Meßwerte auf kleiner als 60 und größer als -30 zwingen,

    weil bei uns in 76351 Temperaturen über 60° und unter -30° nicht vorkommen. Das Problem ist, daß solche hohen oder sehr tiefen Werte die Berechnung der Außen_Temperatur_Mittel (atm) völlig unrealistisch werden lassen, was zu kurzen oder zu länger als nötigen Heizzyklen führt. Auch heute spielt dieser Größenwahnsinnsteufel wieder sein Werk und ich weiß nicht, wie ich ihn aussperren kann. Das mit dem farbigen Code-Bildchen posten, muß ich noch lernen. Bis jetzt kann ich nur aus dem nano-Editor kopieren.

  • Das mit dem farbigen Code-Bildchen posten, muß ich noch lernen. Bis jetzt kann ich nur aus dem nano-Editor kopieren.

    Meinst Du im Foereneditor auf den Button für mehrzeiligen Code (</>) klicken, Deinen Code in das Fensterchen kopieren, dann auf das Wort "Quellcode" klicken und Python auswählen? :)

  • Das heißt meiner Meinung nach immer noch: Du hast unsaubere Messergebnisse!

    Daraus Mittelwerte zu bilden, reißt das Ergebnis halt trotzdem nach oben oder unten.

    Bei gewissen Problemen liefern die Sensoren nicht den tatsächlichen Temperaturwert, sondern eben solche Zahlen.

    Natürlich kann man die softwaremäßig herausfiltern, besser ist es aber, wenn sie gar nicht erst vorkommen :P

    Bei mir laufen 8 Sensoren an einem katastrophal verkabelten Netz, trotzdem habe Ich mittlerweile extrem selten diese Fehler.

    Wenn, dann lag es meistens an einem Wackelkontakt/oxydierten Kontakt/Feuchtigkeit im Außensensor/ Sensor, dessen Fehler häufiger wurden und der sich dann verabschiedet hat.

    Meine feste Überzeugung:

    1.: VCC-Versorgung mit 5V (kommen bei mir sogar ebenfalls vom Raspi)

    2.: Abgeschirmte Kabel verwenden (Bei mir Lan-Kabel)

    3.: Abfragesystem, bei dem Ich steuern kann, dass die Sensoren einzeln zuerst abgefragt werden, nur bei cec-Meldung "yes" den Wert akzeptieren, ansonsten Fehler in's Log schreiben.

    (Soviel zum Schlaumeiern, Ich habe daaaaamals einen Code kopiert, der das macht. Und Ich habe keine Ahnung, wie diese Abfrage bei deinem Python-Import läuft.)

    Mein Vorschlag: Die zusätzliche 5V-Leitung zum Füttern der Sensoren ziehen, Logs anzeigen lassen (Welcher Sensor wird wann gar nicht gefunden/liefert ein irrationales Ergebnis.

    Ist ja eigentlich kein großer Umbau:

    Einmal editiert, zuletzt von rasray (19. September 2022 um 19:48)

  • Danke rasray. Dann werde ich morgen die Datenleitungen über einen 4,7 kOhm Widerstand direkt an die +5 Volt legen. So wie es auch bei Timo Furrer steht? Vorher werde ich aber mal einen Programmdump machen, falls der raspi den Geist aufgibt.

    Selbst wenn die Datenausreiser mit -1053.35 ankommen, müßten die doch mit der Abfrage in T1W.py auf das relevante Intervall [-30,+60] gestutzt werden?

  • NEIN!!!

    NICHT die Datenleitung an 5V!!!

    1.: Die Datenleitung (= mittlerer Pin des Sensors) bleibt an GPIO4.

    2.: Der Widerstand (eher kleiner als 4,7 kOhm, da bleibt Ausprobieren) liegt zwischen der DATEN-Leitung und den 3,3V des Pi

    (Ist ein nur ein Pull-Up-Widerstand, im "Leerlauf" soll das Signal am GPIO4 high sein- (DARF maximal 3,3 V erhalten!!!)

    3.: Die 5 V kommen an den VCC-PIN der Sensoren; KEINERLEI Verbindung zu den DATA-Pins!!!


    Deinen Code werden wir erst beurteilen können, wenn er ordentlich und komplett IN CODE-TAGS gepostet wird...

    3 Mal editiert, zuletzt von rasray (19. September 2022 um 21:08) aus folgendem Grund: Panik!!! -Pi in Lebensgefahr

  • Hallo,

    Selbst wenn die Datenausreiser mit -1053.35 ankommen, müßten die doch mit der Abfrage in T1W.py auf das relevante Intervall [-30,+60] gestutzt werden?

    das hast du jetzt schon öfters gefragt und es wurde doch schon gesagt, dass die Abfrage in deinem gezeigten Code funktioniert. Und das kannst du ja auch testen:

    Code
    ti = float(format(-1053.35, ".2f"))
    if (ti > 60) or (ti < -30):
        print('Wert ist nicht in Ordnung')
    else:
        print('Wert ist in Ordnung')

    Das müsste ziemlich deinem Code gleichen?

    Du hast da in der Funktion schon viele Indexzugriffe drin und schiebst Daten in den Listen hin und her, gut möglich das in deinem restlichen Code vielleicht etwas nicht stimmt.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Meine feste Überzeugung:

    1.: VCC-Versorgung mit 5V (kommen bei mir sogar ebenfalls vom Raspi)

    Dann werde ich morgen die Datenleitungen über einen 4,7 kOhm Widerstand direkt an die +5 Volt legen

    merkt ihr nicht wie ihr getrollt werdet?

    Unser Jüngster, ein programmierender Physiker wie ich

    und er kann nicht mal lesen und Fragen beantworten?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • ibex44: Der Code zum Vergleich auf den Temperaturbereich funktioniert, aber `ti` und `talt` enthalten immer die selben Werte, also ``ti[i] = talt[i]`` ist sinnlos weil das letztendlich keinen Effekt hat ausser ein ganz kleines bisschen Prozessorzeit zu verbrauchen.

    Bei einfachen Zuweisungen (und Parameterübergaben bei Aufrufen) kopiert Python niemals von sich aus Werte. Die erste Zeile in der Funktion ``ti = talt`` bedeuten das die *selbe* Liste ab dort unter beiden Namen erreichbar ist. Was letztlich auch bedeutet, dass der Rückgabewert sinnfrei ist, weil das immer die gleiche Liste ist, die auch übergeben wurde.

    Du solltest dringend an der Namensgebung arbeiten. Namen sollte keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Funktionsnamen beschreiben die Tätigkeit die von der Funkion durchgeführt wird.

    Man muss auch nicht jedes kleine Zwischenergebnis an irgendeinen Namen binden.

    Wenn Du was mit Indexzugriffen machst, ist das in den allermeisten Fällen „unpythonisch“. Zum Beispiel weil Du nicht über die Werte sondern über einen Index iterierst, über den dann auf Werte zugegriffen wird, oder weil Du Listen veränderst, statt einfach neue zu erstellen. Hier sollte einfach eine neue Liste aufgebaut werden. Das ist einfacher und weniger fehleranfällig, und auch leichter zu verstehen, weil man dann nicht erst schauen muss welche Werte `i` annehmen kann, und ob auch tatsächlich jeder Index in jeder Liste behandelt wird oder ob es Ausnahmen gibt.

    Apropos Ausnahmen: `Exception` ist nur sehr selten tatsächlich die Ausnahme die sinnvoll behandelt werden kann. Man behandelt nur Ausnahmen bei denen der Inhalt vom ``except``-Block eine *sinnvolle* Behandlung darstellt. `Exception` greift auch wenn man sich im ``try``-Block beispielsweise bei einem Namen vertippt hat.

    Statt ``not a == b`` würde man besser ``a != b`` schreiben.

    ``float(format(ti[i], ".2f"))`` ist ziemlich umständlich für ``round(ti[i], 2)`` — allerdings würde man an dieser Stelle im Code nicht runden. Runden nur wenn man tatsächlich mit dem gerundeten Wert weiterrechnen will. Und `round()` ist nicht für die Ausgabe von Werten — dafür verwendet man die diversen Werkzeuge zur Formatierung. Also zum Beispiel das was Du zum runden missbraucht hast.

    ``if (ti[i] > 60) or (ti[i] < -30):`` ist umständlich und weniger verständlich ausgedrückt als ``if not -30 <= ti[i] <= 60:``. ``ti[i]`` muss da dann auch nur einmal ausgewertet werden.

    Zwischenstand:

    Wenn ein Sensor nicht erkannt wird, werden gleiche alle Sensoren nicht abgefragt — das ist IMHO ein ziemlich heftiger Datenverlust. Ebenfalls verloren geht die Information welche Messung(en) nicht funktioniert haben, oder aus dem Bereich fallen. Letztere würde ich ja einfach 1:1 aufzeichnen und bei nicht erfolgreichen Messungen `math.nan` liefern. Diese Werte bei der Auswertung dann durch den vorherigen Messwert ersetzen kann man dann immer noch bei der Auswertung machen, aber man hätte die Informationen halt noch. Beispielsweise für Auswertungen speziell auf Fehler. Ob die sich zeitlich auffällig häufen oder so, das kann man ja alles gar nicht mehr auswerten wenn man diese Informationen weg wirft.

    Ist denn überhaupt garantiert, dass `get_available_sensors()` die Sensoren immer in der gleichen Reihenfolge liefert? Wo werden Sensoren einsortiert die dazu kommen, wo falle welche Weg?

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Ist denn überhaupt garantiert, dass `get_available_sensors()` die Sensoren immer in der gleichen Reihenfolge liefert? Wo werden Sensoren einsortiert die dazu kommen, wo falle welche Weg?

    eine sehr gute Frage!

    destawegen hatte ich in meinem AVR mit C Programm alle Seriennummern mal eingelesen,

    1 Testprogramm und die Seriennummern den Räumen zugeordnet

    kl.Zimmer, Wohnzimmer: Warmwand Kaltwand; Schlafzimmer

    Die Seriennummern im Source eingegeben und lese jeden Sensor einzeln oder im Paket aber ordne die Temperaturen jeweils den Zimmern zu, es kann schon mal sein das ein Sensor ausfällt, aber dann bekommt der Eintrag keine neue Temperatur, wenn der letzte Eintrag zu alt ist (Array mit Auslese Date/Time) gibt es einen Fehlertext statt Temperatur sonst innerhalb von wenigen Minuten wird der alte Wert gezeigt!

    Das nun in Python wäre euer Job!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

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