Treppenstufenbeleuchtung mit dem Raspberry / Schritt zum Arduino

  • .

    Warum es bis -1 zählen muss bei Zählrichtung -1 ist mir nicht klar.
    Von 32 runter auf 0 erzeugt ein "out of range". Von 31 auf -1 geht hingegen.
    Aber läuft.
    Jetzt wird getestet, ob US-Sensor oder doch PIR besser läuft.
    Dank an @BJ1 für's an die Hand nehmen :thumbup:

  • Bei range(x,y) wird ab einschließlich x bis ausschließlich y gezählt. range(0,10) ergibt 0...9, negativen Werte range(31,-1,-1) ergeben 31...0. Frei nach Peter Lustig: 'Klingt komisch, ist aber so' ;)

    Schön, dass es funktioniert.

    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

  • @BJ1

    Wenn ich da mal nachhaken darf (gerade weil mich python grundlegend interessiert ;) )....


    Von 32 runter auf 0 erzeugt ein "out of range". Von 31 auf -1 geht hingegen.

    Für mich klingt es so, als würde:

    range(32,0,-1) bei @don ein "out of range" ergeben, ein range(31,-1,-1) funktioniert aber. Warum das erste einen out of range ergibt, würde mich aus Neugierde auch interessieren. Die Schritte sind doch gleichen (also zumindest die grundlegende Anzahl). Nur die Werte, diie rauskommen, sind unterschiedlich. Beim ersten wird von 32 bis 1 (einschließlich) gezählt. Beim zweiten von 31 bis 0 (einschließlich). Die Anzahl ist aber identisch.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Grundsätzlich funktioniert das eine wie das andere,
    die Frage ist, was wird mit dem Integer gemacht?
    Heisst wenn Du zum Beispiel versucht,
    das 32ste Elemenet einer Liste die bei 0 das zählen anfängt haben willst,
    musste Du tatsächlich 31 abfragen. 32 wäre da out of range.

  • Richtig, das wäre das einzige.

    Wenn ich es richtig verstehe meinst du, wenn ich 31 LEDs habe ich nicht mit range(32,0,-1) anfangen kann, da es keine 32. LED gibt?!

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Ich habe alle Varianten durch. 1x oder 2x Ultraschall oder Bewegungsmelder sowie gemischt.
    Das habe ich vor allem dafür gemacht, um durch Wiederholung und leichter Abwandlung etwas zu lernen.
    Hier die Scripte (ist nur für Anfänger interessant, die Unterschiede abzuarbeiten. Der Laufzeilencode "def lights" ist immer identisch.)

    2x Bewegungsmelder:

    2x Ultraschall:

    1x Ultraschall

    Und 1x Ultraschall mit 1x Bewegungsmelder kombiniert:

    In der ZIP sind zusätzlich Hinweise für die Verkabelung und noch mal ein paar Bilder zur Pinbeschreibung am Rasp. Nur als Gedankenstütze.
    Ich habe in meinen Verkabelungshinweisen die äußere Reihe als Reihe 1 und die innere Reihe als Reihe 2 bezeichnet. Gezählt wird von oben (kurze Seite ohne Anschlüsse).
    Das ist zwar alles wenig professionell, aber wenn man etwas an die PINs steckt, dann zählt man ja doch von oben nach unten 1, 2, 3 ...
    Es funktionieren alle.

  • Nur in der Theorie.
    Ich habe noch ein Projekt für eine Uhr, Ringförmig mit nach innen gerichteten LEDs, die dann die Zeiger ersetzen. Vielleicht 1m im Durchmesser, Stahl oder Lederoberfläche.
    Da wollte ich dann ein VU-Meter von mitte-unten in Stereo nach links und rechts den Kreis raufwandern lassen.
    Die Lichtorgel im Treppenbereich wollte ich ggf an das Telefon koppeln.
    Und, weil es mir in den Sinn kam, tiefe Frequenzen (also richtig tiefe Effekte im Film) dazu nutzen, dort das Licht aufblitzen zu lassen. Abschaltbar :)

  • OK, hab, denke ich, den "Übeltäter" identfiziert.

    Python
    pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))


    erstellt in der Klasse eine Liste mit n*3 Elementen.
    In Python ist startet der Listenindex mit 0, somit
    ist der letzte Index n*3 - 1

    Über

    Python
    pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color(hue, hue, hue))

    wird der Index angesprochen und wenn Du da dann 32 angibst => index out of range

  • Ohne Sleep rennen die direkt durch. Dann ist es kaum wahrnehmbar, dass die nacheinander schalten.
    Durch den Sleep bestimme ich die Schaltgeschwindigkeit. 0.05 sieht gleichmäßig animiert aus.
    Schöner wäre es nur, wenn die LEDs faden würden und nicht einfach AN/AUS schalten.
    Da bin ich aber noch nicht hintergestiegen. Generell kann ich schon ausblenden, aber nicht kaskadierend.

    So in der Art (von hier: https://tutorials-raspberrypi.de/raspberry-pi-w…iessen-steuern/)
    Das ist eine Zufallsreihenfolge für AN und danach gegen 0 ausblenden. Weihnachtsbeleuchtung.

    Idealvorstellung ist: Die einzelnen LEDs nacheinander gegen 0,0,0 ausblenden.

    -----
    Ist bei deinem oberem Vorschlag noch etwas anders, als die Zeileneinrückung?
    Langsam komme ich dahinter, was wo (und zum Teil auch warum) unterbrochen und eingerückt werden muss.

  • >Ohne Sleep rennen die direkt durch.
    Ok, dann ist der Sleep in der Library nicht ausreichend.

    >Ist bei deinem oberem Vorschlag noch etwas anders, als die Zeileneinrückung?
    Nein, das einrücken war meine einzige Anmerkung.
    Als ich anfing habe ich mir da so gemerkt,
    alles was eingerückt, in einer Ebene (weiß nicht ob dass das richtige deutsche Wort ist, Level?)steht,
    wird nur ausgeführt wenn das was darüber in der Ebene steht zur Ausführung kommt.

    Ich schaue mir mal das Beispiel und die Library bezgl. dem Fading nochmals genauer an und geb Dir Bescheid.

  • Fading, denke ich,wird über die brightness_decrease funktion erledigt.
    In diesem Szenario wird bei for j ... eine Liste von 0-255 erstellt
    und als nächstes for i ... eine Liste von 0-31
    Dann wird für jedes i der aktuelle Farbenwert ermittelt und die rot, grün, blaue Anteile zugwiesen.
    Nun, denke ich, kommt das fading in dem die aktuellen rot, grün, blaue Werte um 1 reduziert werden ( r - step (etc...))

    und gesetzt, sind alle 32 pixel gesetzt wird das angezeigt und die erste Schleife wieder durchlaufen.


    Edit: was ich vergessen habe, für dein Beispiel würdest Du den Aufruf der Function ohne den pixels Parameter machen,
    da Du den global definiert hast. Heisst also aus

    def brightness_decrease(pixels, wait=0.01, step=1):

    würde

    def brightness_decrease(wait=0.01, step=1):


    der Rest bleibt. Und Aufruf wäre dann brightness_decrease()

  • Also bei den Grundfarben brauch ich ja nur den einen Wert hoch, bzw. runter zählen. Wenn die Farbe zusammengesetzt ist, muss man doch auch proportional abziehen, sonst ändert sich ja die Farbe. Oder?
    Für ein Lauflicht würde ich dass dann so verschachteln, dass immer bei "der Hälfte" (oder je nachdem wieviele Leuchten sollen), der nächste Pixel anfängt und wieder rückwärts.

  • Also bei den Grundfarben brauch ich ja nur den einen Wert hoch, bzw. runter zählen. Wenn die Farbe zusammengesetzt ist, muss man doch auch proportional abziehen, sonst ändert sich ja die Farbe. Oder?

    Ob das mit den Farben so ist, weiß ich nicht aber das wird sich nicht vermeiden lassen, da einer der drei Werte als erstes 0 erreichen wird und dann
    ist es mit der Proportion vorbei. Es wird ja immer eine Ganzzahl abgezogen.

  • Angenommen wir haben die rgb werte r=90,g=60,b=30
    Dann würdest Du sagen, für jeden Durchlauf
    wird r um 3 veringert, g um 2 and b um 1.
    Verstehe ich Dich da richtig?

    Wenn ja, dann hast Du aber je nachdem welche Werte am Anfang gesetzt sind unterschiedliche Laufzeiten, oder?

Jetzt mitmachen!

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