1 – Lauflicht mit Neopixeln programmieren

1

Lauflicht mit Neopixeln programmieren

Das lernst du hier

Programmiere ein einfaches Lauflicht auf einer Neopixel Matrix oder auf einem Stripe. Verwende dazu eine For-Schleife oder auf Deutsch: Eine zähle-von-bis Schleife.

1a

Neopixel Matrix anschliessen

Für das Anschliessen, gehe auch zur Seite: PGLU > Bau > Neopixel > Für Bauanleitung hier klicken

Anschlussschema Neopixel Matrix
1b

Eine Pixelgruppe in einer Farbe leuchten lassen

Wie geht das?

Egal, ob du mit einer Matrix oder einem Stripe arbeitest, bei Neopixeln sind die Pixel der Reihe nach nummeriert. In deinem Sketch kannst du diese Nummern nutzen, um jede einzelne LED in einer eigenen Farbe leuchten zu lassen. Bei der Matrix sind die Pixel in einer Schlangenlinie angeordnet.

Lasse vier Pixel ab Pixel Nr.5 in “aqua” leuchten und verwende die Farben in º aus diesem Farbkreis:

Challenge:

Challenge: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><block type="basic_comment" id="XjX.XnAUE($w%aeQ%=F3" x="-505" y="-85"><field name="COMMENT">Dieser Block muss nicht in den Hauptloop eingesetzt werden. &amp;#10;Hier kannst du die Anzahl Pixel einstellen, die deine Matrix oder dein Struipe hat.</field></block><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="12" y="-78"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="VNE?$S@C9E*CH9+A1P?}"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="10" y="10"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value></block><block type="basic_comment" id=":kgG`H2-%JCRVWHEgqy=" x="-271" y="133"><field name="COMMENT">Setze diese Blöcke in den Hauptloop ein</field></block><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_" x="11" y="129"><field name="MODE">MODE1</field><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value></block><block type="math_number" id="0gceFb|S!=DA)Egolg{s" x="8" y="218"><field name="NUM">1</field></block><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}" x="7" y="274"><field name="NUM">1</field></block><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV" x="7" y="332"><field name="NUM">1</field></block></xml>

Mögliche Lösung:

Lösung: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="12" y="-78"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="]`a=,^_pYB`G?r@@eT(V"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="10" y="10"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value><statement name="CODE"><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_"><field name="MODE">MODE1</field><value name="FROM"><block type="math_number" id="0gceFb|S!=DA)Egolg{s"><field name="NUM">5</field></block></value><value name="TO"><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}"><field name="NUM">4</field></block></value><value name="H"><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV"><field name="NUM">180</field></block></value><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value></block></statement></block></xml>
1c

Einfaches Lauflicht mit Schleife programmieren

Wie geht das?

Ein Lauflicht ist eine Abfolge leuchtender Pixel, die der Reihe nach kurz aufleuchten. Dafür setzest du anstelle einer fixen Pixel-Nummer eine Variable ein. Diese wird dann langsam von 1 bis 16 hochgezählt, damit die entsprechende LED leuchtet.

Was ist eine Variable? Stelle sie dir als Gefäss vor, in das du bei jedem Durchlauf eine andere Zahl legen kannst.

Challenge:

Challenge: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="eS}{?g:(Q8zcKD7tz;^h">Pixel</variable></variables><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="14" y="-76"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="da]KMv`?5()wDn[~`bi{"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="13" y="9"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value></block><block type="flow_for" id="C`:g9J~_4f8:G!N,,b~v" x="15" y="157"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field><value name="FROM"><block type="math_number" id="?v;%OwL1=+@!4)u;neeV"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="JK(r)N`W2m9lfmFq9`~5"><field name="NUM">16</field></block></value><value name="BY"><block type="math_number" id="*psy*PHx}?`NTk8{^)(:"><field name="NUM">1</field></block></value></block><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_" x="14" y="277"><field name="MODE">MODE1</field><value name="TO"><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}"><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV"><field name="NUM">180</field></block></value><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value></block><block type="basic_comment" id="#Mcf2pjukt%MCJSZn5n/" x="-457" y="375"><field name="COMMENT">Dies ist eine Variable, wie ein Gefäss, in das du eine Zahl legen kannst</field></block><block type="variables_get" id="5e)1Rnoy,)jXA!k^{SHe" x="9" y="372"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field></block><block type="basic_comment" id="D#%mV,H[FT{1kgaa)`}[" x="-257" y="461"><field name="COMMENT">Verlangsame damit dein Lauflicht &gt;</field></block><block type="flow_delay" id="KOS:*.dN7CtqtSSneb*^" x="15" y="455"><value name="DELAY"><block type="math_number" id="i)69haVI]].um(;@T~vS"><field name="NUM">50</field></block></value></block></xml>

Mögliche Lösung:

Lösung: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="eS}{?g:(Q8zcKD7tz;^h">Pixel</variable></variables><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="14" y="-76"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="p=zJE4axQ3MilowGiqp_"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="13" y="9"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value><statement name="CODE"><block type="flow_for" id="C`:g9J~_4f8:G!N,,b~v"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field><value name="FROM"><block type="math_number" id="?v;%OwL1=+@!4)u;neeV"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="JK(r)N`W2m9lfmFq9`~5"><field name="NUM">16</field></block></value><value name="BY"><block type="math_number" id="*psy*PHx}?`NTk8{^)(:"><field name="NUM">1</field></block></value><statement name="DO"><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_"><field name="MODE">MODE1</field><value name="FROM"><block type="variables_get" id="5e)1Rnoy,)jXA!k^{SHe"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field></block></value><value name="TO"><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}"><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV"><field name="NUM">180</field></block></value><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value><next><block type="flow_delay" id="KOS:*.dN7CtqtSSneb*^"><value name="DELAY"><block type="math_number" id="i)69haVI]].um(;@T~vS"><field name="NUM">50</field></block></value></block></next></block></statement></block></statement></block></xml>

Experimentiere mit eigenen Zeiten und Farben oder lasse mehr als einen Pixel laufen. Schaffst du es, die Pixel vor- und wieder zurücklaufen zu lassen?

Lösung: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="eS}{?g:(Q8zcKD7tz;^h">Pixel</variable></variables><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="14" y="-76"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="u1dc+oGaTTaM/5y~GQ?6"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="13" y="9"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value><statement name="CODE"><block type="flow_for" id="C`:g9J~_4f8:G!N,,b~v"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field><value name="FROM"><block type="math_number" id="?v;%OwL1=+@!4)u;neeV"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="JK(r)N`W2m9lfmFq9`~5"><field name="NUM">16</field></block></value><value name="BY"><block type="math_number" id="*psy*PHx}?`NTk8{^)(:"><field name="NUM">1</field></block></value><statement name="DO"><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_"><field name="MODE">MODE1</field><value name="FROM"><block type="variables_get" id="5e)1Rnoy,)jXA!k^{SHe"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field></block></value><value name="TO"><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}"><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV"><field name="NUM">180</field></block></value><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value><next><block type="flow_delay" id="KOS:*.dN7CtqtSSneb*^"><value name="DELAY"><block type="math_number" id="i)69haVI]].um(;@T~vS"><field name="NUM">50</field></block></value></block></next></block></statement><next><block type="flow_for" id="dTtV8yodx_oKCULNNWpw"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field><value name="FROM"><block type="math_number" id="D_jneI8d}[j7B+d`rL1h"><field name="NUM">16</field></block></value><value name="TO"><block type="math_number" id="K%`ggB/oc9$5f0gZ^)Ou"><field name="NUM">1</field></block></value><value name="BY"><block type="math_number" id="xENq+^2]rylSgL__iPi4"><field name="NUM">1</field></block></value><statement name="DO"><block type="set_pixel_color" id="e52RPHLK|Dk6BrfdF~$!"><field name="MODE">MODE1</field><value name="FROM"><block type="variables_get" id="dOGG]+}1s3dEam?rQAFl"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field></block></value><value name="TO"><block type="math_number" id="!8m?QA4gYM#]NA_Ly?)H"><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="#tTV0zw#4frp_td5^pkU"><field name="NUM">180</field></block></value><value name="S"><block type="math_number" id="[4pX#s;l(VXYfphVg)X="><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="faL)P3sS$#iFwb3,sLbs"><field name="NUM">100</field></block></value><next><block type="flow_delay" id="%OdQ?I/^#d==M^EH$029"><value name="DELAY"><block type="math_number" id="tJY0{k3}O6hc%H_g*2:{"><field name="NUM">50</field></block></value></block></next></block></statement></block></next></block></statement></block></xml>
1d

Lauflicht Dimmeffekt programmieren

Wie geht das?

Auf der Seite Coding Neopixel findest du in den Videos 6 (Matrix) und 12 (Stripe) ein weiteres Lauflicht, mit einem tollen Dimmeffekt. Kannst du dieses Programm verstehen und so anpassen, dass es zu deinem Projekt passt?

Erweitere den Sketch so, dass das Lauflicht vorwärts- und wieder zurückläuft!

Challenge:

Challenge: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="eS}{?g:(Q8zcKD7tz;^h">Pixel</variable><variable id="v)J6M+dOHkmkfEQYcH*e">zu dimmende Pixel</variable></variables><block type="set_neo_pixel" id="I`^biUhO1LmL1hH1oz-/" x="14" y="-76"><value name="NUM_LEDS"><block type="math_number" id=";w$YmxxVz2X7P-I}c08d"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id="QUQ`.VUj%Y]+XS@JxovV"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="G!2B[1b1*Q(Ei]r_.3;T"><field name="LED">LED1</field></block></value></block><block type="basic_main_loop" id="KlJsKVB#*Pt72$iMt?Kg" deletable="false" x="13" y="9"><value name="BLINK"><block type="basic_blinkcode" id="Fg`kPuq`MbnaEqeK*|rR"><field name="SHORT">1</field><field name="LONG">1</field></block></value><statement name="CODE"><block type="flow_for" id="C`:g9J~_4f8:G!N,,b~v"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field><value name="FROM"><block type="math_number" id="?v;%OwL1=+@!4)u;neeV"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="JK(r)N`W2m9lfmFq9`~5"><field name="NUM">16</field></block></value><value name="BY"><block type="math_number" id="*psy*PHx}?`NTk8{^)(:"><field name="NUM">0.05</field></block></value><statement name="DO"><block type="set_pixel_color" id="/:k]f~MIBX(Tz~ek(Jj_"><field name="MODE">MODE2</field><value name="FROM"><block type="variables_get" id="5e)1Rnoy,)jXA!k^{SHe"><field name="VAR" id="eS}{?g:(Q8zcKD7tz;^h">Pixel</field></block></value><value name="TO"><block type="math_number" id="yEi$yzF/lNg%VwxsY2F}"><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="Z/G9S::`^~:#[6k^.1wV"><field name="NUM">170</field></block></value><value name="S"><block type="math_number" id="jGE{4{@_uo-.A6V)5.|n"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="KfOet:4ZOIMWE*7cJu?;"><field name="NUM">100</field></block></value><next><block type="flow_for" id="{@G{.Dqtcy6^v$NmDG/o"><field name="VAR" id="v)J6M+dOHkmkfEQYcH*e">zu dimmende Pixel</field><value name="FROM"><block type="math_number" id="c*C^o}]fOxn=B4}KEyjj"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="MkT,Os)0O28yfq)uqqx)"><field name="NUM">16</field></block></value><value name="BY"><block type="math_number" id="ySs:_q7y?{`#nWi^?yRT"><field name="NUM">1</field></block></value><statement name="DO"><block type="set_dimming_pixels" id="Q5[}Q?T,np2NpY)2pu,4"><value name="PIXEL"><block type="variables_get" id="/)Q4#,0U7!fij#ck_DpM"><field name="VAR" id="v)J6M+dOHkmkfEQYcH*e">zu dimmende Pixel</field></block></value><value name="PERCENT"><block type="math_number" id="1~p$|QwJwGb.vFoK~VrD"><field name="NUM">2</field></block></value></block></statement><next><block type="fast_led" id="39yO4t2m%SJq/6|.8)RO"><next><block type="flow_delay" id="KOS:*.dN7CtqtSSneb*^"><value name="DELAY"><block type="math_number" id="i)69haVI]].um(;@T~vS"><field name="NUM">10</field></block></value></block></next></block></next></block></next></block></statement></block></statement></block><block type="basic_comment" id="I]01l~^hbZDTYz,XAeG~" x="-274" y="38"><field name="COMMENT">Weil die Schrittweite nur 0.05 ist, leuchtet&amp;#10;erst nach 20 Durchläufen der nächste Pixel</field></block><block type="basic_comment" id="ELn%?50j`,Vwas3bh4(l" x="-259" y="125"><field name="COMMENT">Jeder der 16 Pixel wird um 2% gedimmt.&amp;#10;Egal, wie hell er gerade ist!</field></block><block type="basic_comment" id="8)R?q$JJ)m#%N:DhMU8Z" x="-246" y="250"><field name="COMMENT">Diese Pause verlangsamt den Vorgang</field></block></xml>

Anforderung:
✓ Einfach bis Mittel
✓ Bauen ohne Werkstatt

Thema:
> Programm steuert Zahlen
> Programmablauf mit verschachtelten Bedingungen

Werkzeug:
> Lötstation

Material:
> Controller: pglu.ch/shop > Mikrocontroller KOMFORT oder PIXEL
> Neopixel: pglu.ch/shop > Elektronik > MATRIX

Anleitung Neopixel:
> Neopixel bauen: pglu.ch > BAU > NEOPIXEL
> Neopixel programmieren: pglu.ch > CODING > NEOPIXEL
> Matrix Designer: pglu.ch > CODING > MATRIX

3D-Modell:
> Hier anschauen

Videos:
> Neopixel: pglu.ch > CODING > NEOPIXEL

Basics:
> Lernumgebung aufbauen: pglu.ch > ANLEITUNG
> XML in Editor importieren: pglu.ch > ANLEITUNG > EDITOR

Editor:
> Online: mach.pglu.ch
> Teacher’s Box: mach.pglu.box

Erweiterungen:
> Matrix Designer: pglu.ch > CODING > MATRIX Designer
> Weiteres: pglu.ch > HILFREICHE DOKUMENTE

Arduino Uno:
> Diese Challenge mit dem Arduino Uno