Binäruhr in Python / Umstieg auf Arduino / Umstieg auf Wemos D1

  • Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    Raspberry Pi 2-----Libreelec------Kodi-----Standard Skin

  • Gestern kurz getestet. Ich mußte mir erst noch einen Raspberry einrichten, da der andere ja im Dauertest für die Treppenstufen belegt ist.

    Läuft - sieht zumindest so aus.
    Mehr als eine kurze Prüfung, ob etwas blinkt, habe ich gestern nicht mehr geschafft.
    Code, Bilder etc kommen noch.
    Das Endlighten-Acryl ist auch schon unterwegs. Ein Stück Holz werde ich noch irgendwo finden.
    Ob das ganze Schlussendlich mit einem Rasp umgesetzt wird, kann ich noch gar nicht sicher sagen.
    Zwei Arduinos sind auch auf dem Weg zu mir. Der würde (mit DCF-Uhr) diesem Projekt eher gerecht werden.

  • Ich habe die Farbwerte noch verändert, da man sonst gelb von weiß nicht wirklich unterscheiden kann.
    Jetzt probiere ich gerade, wie man mit einem Button die Sekundenanzeige auf 0 setzen kann.
    Und mit erneutem Klick eben wieder aktivieren kann.
    Es blinkt :)

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

  • So recht will auch das mit dem Button noch nicht laufen.
    Wenn ich den Button drücke, dann wird genau für das kurze Event das Script aktiviert.
    Also für den Bruchteil einer Sekunde während des Drückens.

    Ich probiere noch weiter, aber wenn jemand einen Tipp hat: immer raus damit.

  • Dem ist so,

    ich verstehe das so,
    mit GPIO.add_event_detect registrierst Du einen Event, welcher prüfen soll ob SENSOR_PIN2 von
    low nach high( GPIO.RISING ) wechselt und dann die Funktion osekunde (callback=osekunde) aufruft.
    Das tut diese und dann bleibst Du in der while True Schleife gefangen solange bis Du per KeyboardInterrupt
    beendest.

    Das heisst, entweder rufst Du innerhalb der while True Schleife die Funktion wieder auf oder
    Du hast eine Schleife innerhalb der osekunden Funktion.

    Dein eigentlicher Wunsch, Sekunden reset und erneuter Start ist damit aber nicht gelöst.

    2 Probleme die es zu lösen gilt.

    1) Wenn Du einen Sekunden reset machen willst, mußt du die Sekunden, welche von datetime.now() geliefert werden
    ignorieren in dem Du display_binary mit t.hour, t.minute und 0 aufrufst und dann selbst iterierst.

    2) Die Logik braucht einen boolschen Wert, welcher erkennt, dass der erste Druck der Reset und der 2te Druck der Start der Uhr ist
    also etwas wie

    reset_seconds = False if reset_seconds else True

    Code
    if reset_seconds:
        global_seconds = 0
    else:
        osekunde(None)
        global_seconds = -1


    Ist es das was Du willst?

    Oder soll jeder button druck einen second reset machen und den Loop neu starten?

  • Da habe ich mich etwas verwirrend ausgedrückt.
    Mit "Sekundenanzeige auf 0" meinte ich nur, dass man den b-Wert auf 0 setzt. Hier im Code also der zweite Part b = 0 if _b[i] == '1' else 0, damit man die Sekundenanzeige deaktivieren kann.

    Aber ich sehe schon, wo das Problem liegt.
    Durch den Buttonpress löse ich für den Moment etwas aus. Das hat aber keine vorherige Definition.
    Meine Vermutung:
    Erst muss der Zustand definiert sein, welcher dann durch einen ersten Druck geändert wird. (IST Zustand bei Start: def Button: off)
    Dieser Zustand muss dann neu geschrieben werden. Neuer IST Zustand für die vorherige Definition. (IST Zustand bei Druck def Button= on)
    Bei erneutem Druck muss der IST Zustand erneut abgefragt werden (der ist ja jetzt anders als zuvor) und wieder geändert werden. (Wenn bei Druck Zustand = on, dann ändern auf off)

    Und das Script selber reagiert dann auf die Abfrage des Zustands Button.
    Wenn Button off: callback:display_binary
    Wenn Button on: callbackk:display_binarys

    Wobei auch das schon wieder falsch klingt. Es soll ja der Zustand durch 1-maligen Druck geändert werden, und nicht, so lange der Button gedrückt wird.
    Vermutlich ist GPIO.RISING schon der falsche Ansatz. Button und Schalter sind ja zwei Dinge. Logisch, wenn man es als Problem vorliegen hat :)

  • Heisst das dann das Du beim Druck so etwas


    Code
    ___    ___    ___
    _|   |__|   |__|   |__
    
    
    anstelle von
      __________________
    _|


    bekommst? Beim Druck wird also immer wieder ein Interrupt gesendet?
    Kannst Du mir sagen, wann das sinnvoll ist, mir ist das nicht ganz klar.

  • Ok, aber je nachdem wie der Treiber bzw. die API für die Tastenabfrage geschrieben ist,
    kann nur ein Zeichen oder immer wieder das gleiche Zeichen angezeigt werden.

    Ich habe mal versucht dies per signal in Python darzustellen.


    Wenn Du das Skript in einer Shell ausführst bekommst Du als erstes die PID angezeigt.
    In einer anderen Shell führst Du dann

    kill -USR1 PID (das simuliert den Tastendruck)

    aus. PID natürlich durch den richtigen Wert ersetzen.

    Generell sollte das auch mit dem Taster und den LEDs funktionieren sofern der Tastendruck
    nur einmal die Funktion, welche aufgerufen werden soll, aufruft.

  • Mit der Uhr bin ich auch noch nicht weiter. Mir hängt auch der Gedanke im Kopf fest, dass das ganze mit einem Arduino umzusetzen irgendwie sinniger erscheint.
    Aber da bin ich noch bei 0.

    Kein Grund die Form nicht mal zu überdenken.
    Das ging mir gerade durch den Kopf:

    wesentlich schwerer zu fertigen und nicht gerade leichter zu lesen. Aber man könnte die dann auch hinlegen und als Moodlight verwenden.
    Dann den Code vielleicht nur alle 60 Sekunden in den Loop setzen. Wieder per Taster.

  • Welcher Arduino kommt den da in frage? Einige unterstützen RTCs
    Und wie sieht es mit dem setzen der Uhrzeit aus?
    Muß ja, jenachdem, jedesmal gemacht werden wenn der Arduino vom Strom genommen wird.

    Der Code ansich (nur die display binary funktion) könnte so aussehen.

    C
    void display_binary(uint8_t h, uint8_t m, uint8_t s=0) {
        for (int i = 5; i >= 0; --i)
        {
            uint8_t r = (((h >> i) & 0x1) == 1) ? 255 : 0;
            uint8_t g = (((m >> i) & 0x1) == 1) ? 255 : 0;
            uint8_t b = (((s >> i) & 0x1) == 1) ? 255 : 0;
            c = Color(r, g, b);
            strip.setPixelColor(5-i, c);
        }
    }

    Der Aufruf wäre dann in der Form

    C
    display_binary(12, 30, 0)


    Das andere (Color Struktur, strip Klasse etc...) kann vom Treppenstuffenprojekt übernommen und angepasst werden.

    Wenn ein Arduino mit RTC zum Einsatz kommt, könnt darüber ein Alarm gestzt werden welcher minütlich die
    Funktion aufruft und ansonst im sleep modus sich befindet.

    Gruß
    Claudia

  • Und wie sieht es mit dem setzen der Uhrzeit aus?

    Ich habe ein DCF77 Modul bestellt. Damit hatte ich schon bei dem qlock-Projekt Kontakt: qlock2 Nachbau
    Das halte ich noch immer für die beste Methode. Spart Tasten und ist immer genau genug.
    Der Zähler im Arduino ging am Tag ~30 Sekunden vor. Wenn man jetzt 1x am Tag die DCF-Zeit abfragt, sollte das passen.
    Ist noch auf dem Weg zu mir.

  • Ich probiere gerade ein wenig mit verschiedenen Materialien herum.
    Holz in grob sieht vielversprechend aus.

    .

    Bei 6 LEDs sind es in einem WS2801-Strang etwa 185mm Länge.
    Geplant hatte ich mal mit 100mm. Naja - dann wird es halt wesentlich größer.
    Ganz konkret weiß ich noch nicht, wohin das ganze führt. Größe, Material, Layout.
    Aber lesen kann ich es mit Sekunden nicht. Ohne geht es. Dann sind es ja auch nur 3 Farbvarianten und man hat 60 Sekunden Zeit.
    Aber ohne Sekunden sieht es nur halb so schön aus. Da muss ich noch eine Tasteroption einbauen, die zwischen den beiden Ansichten umschaltet.

    Umsetzung am Arduino habe ich noch nicht begonnen. Die jetzigen Tests sind noch alle am Rasp.

    Und ein kurzes Video:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

  • Dann noch mal ein Hi an @ClaudiaF ... ich komme wieder nicht weiter.
    Ich habe mir das hier zusammengedichtet:


    Die Time-Library ist installiert.
    Aber der Code compiliert nicht mal durch. Es endet mit:

    C
    core.a(main.cpp.o): In Funktion `main':
    /usr/share/arduino/hardware/arduino/cores/arduino/main.cpp:11: Nicht definierter Verweis auf `setup'
    /usr/share/arduino/hardware/arduino/cores/arduino/main.cpp:14: Nicht definierter Verweis auf `loop'
    collect2: error: ld returned 1 exit status

    Aus der Readme zur TimeLib geht das hervor:

    The functions available in the library include:


    Daher vermute ich, dass auch der Zeitaufruf anders sein muss. Wobei der Compilierungsfehler sicher nur etwas mit meinem Unwissen in c zu tun hat.

  • Hallo Don,

    meines Wissens muß jedes Arduino Projekt mindestens die Routinen setup und loop haben.
    Im setup wird alles initialisiert, wie strip.begin (siehe Lichterkette), und im loop werden
    dann die Funktionen aufgerufen.

    Gib mir mal kurz Zeit - poste gleich den Code wie ich denke das der funktionieren soll.

    Gruß
    Claudia

  • Ich habe die Library von Michael Margolis eingebunden und dieser Code kompiliert.

    Solltest Du keine Sekunden wollen, ersetze second(t) mit 0 innerhalb der loop Funktion (bzw rufe ohne second(t) auf).

    Edit: strip.show() vergessen und ein Color Object wäre auch schön.

    Cheers
    Claudia

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!