PICO W Datenlogger Oled Display über Taster EinAusschalten

  • Erst mal Hallo,

    bin Neu hier und aucf dem Gebiet Rasp und co absoluter Neuling....

    Weiss auch nicht ob ,eine Frage hier passt... hoffe schon.

    Hab zu Weihnachten einen Pico und Zubehör bekommen und binmjetzt am Basteln...

    Bin auch,schon fast fertig mit meinem Projekt. Jetzt das Finale Problem...

    Baue einen Bienenstockdatenlogger mit Gewicht, Temperatur, Lux usw mit Sh1106 Display und einbindung in Thinkspeak.....

    Jetzt möcht ich in oder neben den Loop der alle 10 Minuten Daten erfasst und schickt eine Funktion einbauen die das Display auf Taster einschaltet für x sekunden. Oled.poweron() kenn ich funktioniert auch jedoch nicht AUSSERHALB des Loops.....

    Bin mit meinem Latein am Ende. Auchn SUFU IN dr. GOOGLE HAT NIX ergeben, zumindest nichts für mich einsetztbares...

    Bitte um Hilfe

    Ps meine Programmierkenntnissemsind rudimentär.. bin eigentlich Krankenpfleger und Imker ;)

  • PICO W Datenlogger Oled Display über Taster EinAusschalten? Schau mal ob du hier fündig wirst!

  • Zur hilfreichsten Antwort springen
  • Guten Tag,

    und herzlich Willkommen im Forum :bravo2:

    Loops ? Was heißt das nun ? Ich frage jetzt mal sehr direkt nach der von dir verwendeten Programmiersprache ?

    In µPython kann man die Funktion machine.Pin.irq() verwenden, um in Kombination auf "Falling" des GPIO-Pegels reagiert, und damit das Display aktiviert. Über diesen Interrupt-Handler ruft man das entsprechende Funktionsmodul auf, in diesem wird dann zum Abschluss ein machine.Timer() gestartet der nur einmal durchlaufen wird, um anschließend wieder das Display abzuschalten.
    Normal braucht man für diese periodischen Abläufe die du mit loop() einschließt auch keinen solchen Aufbau.
    Du kannst zu diesem Zweck auch wieder einen machine.Timer() benutzen, welcher in der Handler-Funktion das einsammeln und übertragen der Daten übernimmt. Damit kann man entweder über eine Taktreduzierung machine.freq() oder andere Mechanismen für einen Stromeinsparung sorgen. Zur bessern und zügigeren Verarbeitung schalten man dann innerhalb, falls du auf die Taktreduzierung setzt, dieser Funktion die Taktrate wieder nach oben.

    Vielleicht könntest du deinen bisherigen Code hier mal einstellen. Bitte verwende dazu Code-Funktion über die Menüleiste "</>".

    es grüßt euer
    Willy

  • Hallo; Danke für die Antwort; Sprache ist µpython; Loop ist meine Bezeichnung für die Endlosschleife des Datenerfassens - und sendens....

    also quasi while true....

    so NUn der Quelltext, ohne export Thinkspeak... hab zum Testen das herauskopiert -

    DIe Optik - Ordnung des Scripts ist sehr chaotisch - ich weiss... ist grösstenteils aus bestehenden Codes zusammenkopiert...es geht mir primär nur um die Funktion - wie gesagt. mein erster RaspPico Kontakt....

    wollte aus diesem Codes welche ich in diesem Forum Gefunden hab die screensaver Funktion implementieren - keine Chance.... Leider....

    Code
    def Screen_saver(saver):
        if saver == 1:
            # turn display off
            disp.command(Adafruit_SSD1306.SSD1306_DISPLAYOFF)
        elif saver == 0:
            #turn display on
            disp.command(Adafruit_SSD1306.SSD1306_DISPLAYON)

    und

    hab natürlich auch versucht zu adapieren auf µpython und die Funktion disp.command auf oled.poweroff()... usw...

    bin mit meinem Latein am Ende...

    Lg und Danke Philipp

  • Hallo,

    wichtig wäre zuerst mal, dass außerhalb einer Funktion kein ausführbarer Code steht.

    Du brauchst für jede Tätigkeit eine eigene Funktion. Das ist recht einfach aufzuteilen, den Funktionen werden immer nach ihrer Tätigkeit benannt. Wenn deine Funktion heiß "Lese Gewichtssensor aus, schicke die Daten an XY, schalte das Display an und zeige xyz an", dann ist da etwas nicht richtig.

    Dann hast du nämlich die Chance die Betätigung eines Tasters abzufragen und die Funktion, die das Display ansteuert, aufzurufen.

    Ich würde an deiner Stelle erst mal so anfangen, dass der Code so abläuft, wie man es sich auf ein Papier schreiben würde. Es wird gemessen, die Daten werden gesendet und es wird der Zustand des Tasters abgefragt. Dann wird geschaut ob zwischen der letzten Messung und dem aktuellen Zeitpunkt 10 Minuten vergangen sind, wenn nicht wird nur der Taster abgefragt, wenn doch dann wird erst wieder gemessen.

    Dabei kann es zwar vorkommen, dass Tastendrücke nicht gleich erkannt oder verschluckt werden, aber für das Verständnis sollte so ein Code erst ein mal selbst geschrieben werden. Dann kann man den Stück für Stück optimieren und versteht dann auch was da optimiert wird und was plötzlich im Hintergrund abläuft.

    Um dich in die Sprache einzuarbeiten Hilft das offizielle Tutorial:

    https://docs.python.org/3/tutorial/

    Wenn es dir egal ist wie es geht, hauptsache es geht, dann schreibt dir jemand den Code vielleicht um.

    Grüße

    Dennis

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

  • Guten Tag,

    der erste Teil deines Codes ist wirklich nicht besonders schön ;)

    Theoretisch, wenn ich keinen Tippfehler eingebaut habe, müsste das bis auf die Datenübermittlung soweit funktionieren. Der TIMER steuert die Abfrage der Sensoren, und der Buutton-Interrupt schaltet für 30 Sek. das Display an, welches dann wieder von alleine aus geht.

    es grüßt euer
    Willy

    Einmal editiert, zuletzt von WillyR_aus_C (28. Januar 2023 um 16:33) aus folgendem Grund: Zahlendreher

  • Hallo Dennis, Danke für die Antwort,

    Ich sehe das problem darin das die abfrage der messdaten durchgehend erfolgt, die 10 min sind exemplarisch, könnte auch 1stunde sein, die tasterabfrage aber jederzeit stattfinden soll..

    D.h. ich geh um 1200 zum bienenstock, letzte datenabfrage und sendung um 11.45... möchte jetzt um 12.10. Die daten per knopfdruck am display anzeigen lassen... für sagen wir mal 20sec.

    Dabei hänge ich....

    Grüsse Philipp

  • Hallo Willy

    ein herzliches VergeltsGott für Diene Bemühungen; sensationell,,

    Genau der Ablauf den ich mir wünschte; eine Fehlermeldung mit der ich jedoch nicht weiterkomme

    Traceback (most recent call last):

    File "<stdin>", line 74, in <module>

    TypeError: function takes 5 positional arguments but 2 were given

    in der ZEile

    button.irq(trigger=Pin.IRQ_FALLING, handler = display.write(readsensor.get()))

    Lg. Philipp

  • Guten Tag,

    Dennis89 würde es etwas bringen den Return in get() bei messure_sensor in Klammer zu setzen und diesen in eine Tuple zu wandeln, dann aber nur eine Variable bei write() in Display() nur eine Variable zu übernehmen und diese dann erst in der Funktion aufzulösen ?

    Phira78 leider habe ich diese Hardware nicht verfügbar, so das ich keinen LIVE Test machen konnte.

    es grüßt euer
    Willy

  • Guten Tag,

    ich hätte jetzt nur noch diesen Lösungsvorschlag anzubieten

    es grüßt euer
    Willy

  • Vielen Dank für eure Bemühungen;

    um mein Projekt zu vervollständigen noch eine Frage: das Senden Der Daten an THinkspeak läuft dann genau so ab mit

    def send... oder wo kann ich das senden mit einbauen dass es immer geschieht, quasi im hintergrund alle Sagen wir alle x minuten?

    So sieht jetzt mein Senden aus....

    Liebe Grüsse Phlipp

  • Ja das passt schon mit den Anforderungen, ändert an meiner Antwort nichts.

    Bin gerade auf dem Sprung, aber ich vermute die Fehlermeldung wird durch den Funktionsaufruf den du an 'handler' bindest ausgelöst. Da soll definiert werden, was passieren soll wenn die Flanke fällt, da soll nicht gleich beim ersten ausführen eine Funktion aufgerufen werden.

    Für weitere Anmerkungen fehlt mir gerade die Zeit.

    Grüße

    Dennis

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

  • Guten Tag,

    Ich würde vorschlagen, wenn du mit messure_sensor.get() die letzten Werte auslesen und zugeliefert bekommst, kannst du auch eine zweiten Timer starten, wieder mit einer Periode. Und dort rufst du dann diese def send() auf.

    Python
    def send(timer, values):
        # dann wie oben die values in die einzelnen Werte zerlegen und den Sende-Code hie reintragen
    
    timer1 = Timer(.... callback=lambda t: send(readsensor.get())

    es grüßt euer
    Willy

  • Guten Tag,

    wenn der Code keinen Fehler bringt nimm mal die Raute aus Zeile 53 raus.

    EDIT PIN geändert / Falling - Rising geänndert

    es grüßt euer
    Willy

    2 Mal editiert, zuletzt von WillyR_aus_C (28. Januar 2023 um 17:26)

  • Hallo, leider immer die Fehlermeldung

    Traceback (most recent call last):

    File "<stdin>", line 78, in <module>

    TypeError: function takes 1 positional arguments but 0 were given

    auch ohne #

  • ok, das() hat was bewirkt; dann jedoch:

    >>> Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    Traceback (most recent call last):

    File "<stdin>", line 54, in dis_write

    File "<stdin>", line 38, in write

    File "/lib/sh1106.py", line 185, in text

    TypeError: can't convert 'NoneType' object to str implicitly

    ????

    • Hilfreichste Antwort

    Guten Abend,

    ist ja normal weil noch keine Meßwert erfasst wurde.

    Wenn ich jetzt keinen Denkfehler mehr drin habe :angel:

    damit müsste mit jeder Werterfassung auch das Wert-Versenden ablaufen :shy:

    es grüßt euer
    Willy

  • ps915 30. Januar 2024 um 19:42

    Hat das Label Pico W hinzugefügt.

Jetzt mitmachen!

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