Treppenstufenbeleuchtung mit dem Raspberry / Schritt zum Arduino

  • Ich bastel derzeit an einer kaskadierenden Treppenstufenbeleuchtung.
    WS2801, Raspberry 3 und Bewegungsmelder.
    Das ist natürlich völlig übertrieben, dafür einen Rasp zu nehmen. Aber sonst lerne ich nie was in Python.

    An sich funktioniert es auch, aber irgendwas in dem Code läßt das Script grobe 30 Sekunden warten, nach dem ein Event ausgelöst wurde.
    Vielleicht hat hier ja ein Pythonkenner eine Idee:


    Die Funktion ist gegeben. Schalter 1 wird ausgelöst und das Licht geht von unten nach oben an und danach (3 Sekunden) von oben nach unten aus.
    Aber der nächste Schaltvorgang kann dann erst nach etwa 30 Sekunden starten. Egal was ich ausgeben lassen will.
    Der 2. Schaltvorgang funktioniert dann auch. Aber eben immer mit der Wartezeit dazwischen.
    Vielleicht hat ja @BJ1 eine Idee :)

    Bilder vom Testaufbau kommen noch. (Ich schreibe das hier alles direkt am Rasp.)

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

    Verwendete Hardware:

    Das Netzteil pfeift ganz leicht, wenn es keine Last hat. Das kann man umgehen, in dem man den Rasp einfach mit anschließt.

    Da sind 5 in einer Tüte. Lieferung aus China.

    Auch für Ambilight geeignet.

    Dazu dann ein Raspberry nach Wahl und Verkabelung.
    Für den fliegenden Aufbau sind ein Steckbrett [Anzeige] und Jumper-Kabel [Anzeige] hilfreich.
    Bei den Kabeln in alle Richtungen denken. Also Male-Female und Male-Male.
    Läßt sich aber auch alles ohne bewerkstelligen.

    Für den Netzanschluss habe ich ein altes Kaltgerätekabel (PC-Stromkabel) verwendet. Das hat alle drei Adern und meist liegt sowas ja noch in einer Kiste.
    Blau=N (wie "neutral" und blau wie "kalt"), Braun=L (wie "lebensgefährlich) und Grün=Erde.
    Das Netzteil ist feinjustierbar. Sollte man auch mit einem Voltmeter machen. Bei mir war es auf 5,5V eingestellt. Das dürfte zwar noch in der Toleranz liegen, aber sicher ist sicher.
    Die Bewegungsmelder sind auch 5V. Die habe ich auch mit angeschlossen. Also alle vier Verbraucher mit an der 5V10A Leitung des Netzteils.

    Wenn es irgendwann mal verbaut wird, dann wird der Raspberry3 gegen eine Zero getauscht.

  • Wenn ich das richtig sehe, sind mein_callback und mein_callback2 eventgetrieben, d.h. es müsste eine sofortige Reaktion (und Ausgabe von 'es gab eine Bewegung! cb1/cb2') erfolgen oder?

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • So ist es gedacht: simple Abfolge ... und dann wieder AUSgehend/verfolgend.
    Kommt man von der anderen Seite der Treppe, dann genau umgekehrt.

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

    Die werden dann später alle noch zerschnitten und unter den Stufen angebracht.
    Aktuell weiß ich aber noch nicht, wie ich Strom zur Treppe bekomme.

    Eine alternative ist diese Methode:

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

    Erst wie gehabt ANgehend ... dann im zweiten Schritt die Farbe etwas ändern, um jeder LED einen leicht geänderten Lichtwert HUE zu geben.
    Dann alle ausblenden. Durch die unterschiedlichen Farbwerte entsteht ein Ausblendeffekt von oben nach unten.
    Aber eben farbig - was ich nicht wirklich will.

    Ich hab gerade viel Spaß an den Dingern. Und mehr Versuch macht Kluch als irgendwas anderes.
    Zum Großteil weiß ich nicht mal genau, warum es so läuft. Aber man bekommt es hin :)

    Hier noch zwei Bilder:

  • schick, was ist das den für ein LED Strip?

    Mediacenter:
    LibreELEC 9.2.3 - Raspberry Pi 4 (4GB)
    Steam Game-Server:
    BitFenix Phenom M - ASRock B250M Pro4 Intel B250 - 16GB Crucial DDR4 - Intel Core i5 7400 - ZOTAC GTX 1050 Ti
    NAS:
    Synology DS218+ - 10GB RAM - TvH Server

  • Danke :)
    Oben habe ich jetzt die Hardwareliste ergänzt.

    Jetzt weiß ich endlich was ich mit den 10m mache die mir ein Kollege aus China mitgebracht hat.

    Meine Hardware

    NAS-->: G4560, 8GB, Gigabyte DS3H- WD Red OMV 4.x (latest)| TVHeadend 4.x.x (latest) | DD CineS2 V6. (+Oscam)
    Raspi 4 --> LibreElec (latest)
    Nvidia Shield 2017

  • Daran liegt es dann auch nicht. Zumindest nicht nur daran.
    Ich habe die PIR-Sensoren mit Ultraschallsensoren getauscht, um jegliche Verzögerung auszuschließen.
    Das läuft auch. Die Sprechen im zehntelsekunden-Takt an.
    Durch Löschen und probieren habe ich dann herausfinden können, dass es dieser Teil des Code ist:


    Code
    def appear_from_back(pixels, color=(0, 0, 0), wait=0.1):
        pos = 0
        for i in range(pixels.count()):
            for j in reversed(range(i, pixels.count())):
                for k in range(i):
                    pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
                    pixels.set_pixel(j, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
                pixels.show()
                time.sleep(0.05)

    Die Werte wait=0.1 und auch der time.sleep(0.05) sind es aber nicht. Die könnte ich eh nicht ändern, weil ich damit die Geschwindigkeit des Verlaufs bestimme.
    Es hat irgendwas mit den pixels.set Befehlen zu tun. Nehme ich einen davon weg, geht es - sieht aber nicht mehr gerade schön aus.
    Da ich da nie hinterkommen werde, probiere ich etwas anderes.
    Ich kann ja auch jede LED separat ansteuern mit 0, 0, 0.
    Sind ja nur 32 Stück. Nicht gerade elegant, aber vermutlich wird das die Lösung werden.

    Die Ultraschallsensoren sind schon cool. Ob ich jetzt in meinem Projekt diese oder doch die PIR verwende, kann ich noch nicht sagen.
    Ausschlaggebend ist halt auch die Versteckbarkeit. Sehen will ich die später ja nicht.

  • Das wait kommt in der Funktion überhaupt nicht zum Einsatz (oder Du unterschlägst es evtl. weiter unten). Allerdings hast Du 3 ineinander geschachtelte Schleifen und damit pixels.count^3 Durchläufe. Je nach pixels.count kann das schon 'ne Weile dauern.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Was ist den das pixels für ein Objekt (eine LED?) und was passiert genau bei set_pixel(x, par2)? Ich nehme mal an, das x (bei dir i,j,k) die LED-Nummer und par2 (bei dir Adafruit_WS2801.RGB_to_color) die zu setzende Farbe/Helligkeit ist? Dann ginge


    Code
    for i in range(0,31):
        pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color(0, 0, 0))
        pixels.show()
        time.sleep(0.2)

    EDIT: Fehlte noch ein pixels.show(). In welchem Wertebereich werden die Farb-/Helligkeitswerte bei der Methode RGB_to_color() angegeben (0-255)?

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

    Einmal editiert, zuletzt von PvD (6. Februar 2017 um 10:12)

  • Kannst Du elegant in eine Funktion verpacken. Der übergibst Du nur die Richtung und an oder aus. Nehmen wir mal an, pixels[0] ist unten und Pixels[31] oben, sieht das dann so aus:

    order ist die Richtung, mode ist LED an (on) bzw. LED aus (off):


    Aufgerufen wird das dann mit

    Code
    lights()                           # von unten nach oben Licht an
    lights(mode='off')                 # von unten nach oben Licht aus
    lights(order='down')               # von oben nach unten Licht an
    lights(order='down', mode='off')   # von oben nach unten Licht aus

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

    Einmal editiert, zuletzt von PvD (6. Februar 2017 um 19:55)

  • @BJ1
    Das will nicht durchlaufen.
    Der erste count geht (Lampen von 0 nach 32 nacheinander AN).
    Dann aber:

    Python
    Traceback (most recent call last):
      File "/home/pi/finalform mit us bj1B.py", line 71, in <module>
        lights()
      File "/home/pi/finalform mit us bj1B.py", line 30, in lights
        pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color(hue, hue, hue))
      File "/usr/local/lib/python2.7/dist-packages/Adafruit_WS2801/WS2801.py", line 88, in set_pixel
        self.set_pixel_rgb(n, r, g, b)
      File "/usr/local/lib/python2.7/dist-packages/Adafruit_WS2801/WS2801.py", line 95, in set_pixel_rgb
        assert n >= 0 and n < self._count, 'Pixel n outside the count of pixels!'
    AssertionError: Pixel n outside the count of pixels!


    Ich hatte mit deinem ersten Codeblock von vorgestern den Befehl über reversed ausgeführt:

    ... um von oben nach unten zu zählen. Funktionierte so weit.
    In Unwissenheit hatte ich zuvor ohne reversed einfach range(32,0) probiert. Klappt nicht. Out of Range.


    Mein aktueller, kompletter Codeblock (1 Ultraschallsensor) mit Fehler in der Ausgabe:

  • Spiele einfach mal mit den Start-Werten für den Pixels.count, z.B.

    Zeile 23: start = stop - 1

    Ein Assertion-Error ist ein Zuweisungsfehler (Zugriff auf eine nichtexistente LED), weil wahrscheinlich ausserhalb des Bereichs.

    In Unwissenheit hatte ich zuvor ohne reversed einfach range(32,0) probiert. Klappt nicht. Out of Range.

    Wenn Du runterzählen willst, musst Du die Zählrichtung mit angeben: range(32,0,-1) zählt runter. Die Anweisung reversed ist insofern gefährlich, da die eine reversierende (umgedrehte) Liste zurückgibt. Besser ist es, die Richtung innerhalb der Range-Anweisung anzugeben. Finde ich übersichtlicher.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

Jetzt mitmachen!

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