1 Neopixel
In diesem Programm lernst du, wie du die farbige LED auf dem Board ansteuern kannst. Es handelt sich dabei um eine sogenannte Neopixel-LED. Du kannst sie, genau wie die RGB-LED in allen Farben leuchten lassen. Sie wird allerdings etwas anders angesteuert. Dazu werden wir uns in diesem Kurs mit Listen und Tupeln beschäftigen.
Um etwas Platz auf dem Steckbrett zu schaffen, entferne die RGB-LED und deren drei Vorwiderstände. Den Taster kannst du zunächst einmal auf dem Board belassen.
Lege eine neue Datei mit dem Namen neo.py an und kopiere den folgenden Code.
1import time
2import board
3import neopixel
4
5pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.3)
6
7RED = (255, 0 , 0 )
8YELLOW = (255, 150, 0 )
9GREEN = (0 , 255, 0 )
10CYAN = (0 , 255, 255)
11BLUE = (0 , 0 , 255)
12PURPLE = (180, 0 , 255)
13CLEAR = (0 , 0 , 0 ) # alle aus
14
15DELAY = 0.25 # blink rate in seconds
16
17while True:
18 pixel[0] = RED
19 time.sleep(DELAY)
20 pixel[0] = YELLOW
21 time.sleep(DELAY)
22 pixel[0] = GREEN
23 time.sleep(DELAY)
24 pixel[0] = CYAN
25 time.sleep(DELAY)
26 pixel[0] = BLUE
27 time.sleep(DELAY)
28 pixel[0] = PURPLE
29 time.sleep(DELAY)
ToDo: Erklärung
1import time
2import board
3from rainbowio import colorwheel
4import neopixel
5
6pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.3)
7
8DELAY = 0.01 # blink rate in seconds
9
10while True:
11 for j in range(255):
12 pixel[0] = colorwheel(j)
13 time.sleep(DELAY)
2 Krach machen
Damit deine Alarmanlage Alarm schlagen kann, brauchst du einen Tonerzeuger. Für den Anfang reicht dazu ein Piezo-Schallgeber (oder einfach Summer). Es gibt sie in vielen Größen und Formen. Meistens sind es kleine runde schwarze Teile mit zwei Beinchen oder zwei Kabeln. Welche du verwendest, ist im Prinzip egal.
Baue die folgende Schaltung auf und stecke den Piezo-Summer an eine freie Stelle des Steckbretts, falls dein Summer Beinchen statt Kabel hat. Verbinde in diesem Fall den analogen Ausgang A3
mit dem Pluspol des Summers und stecke das andere Beinchen an eine beliebige Stelle in die blaue Minusleitung.

Erstelle eine neue Datei, die du summer.py nennst und kopiere den Code dort hinein.
1import time
2import board
3import simpleio
4
5
6while True:
7 simpleio.tone(board.A3, 262, 0.25)
8 simpleio.tone(board.A3, 294, 0.25)
9 simpleio.tone(board.A3, 330, 0.25)
10 simpleio.tone(board.A3, 349, 0.25)
11 simpleio.tone(board.A3, 392, 0.25)
12 simpleio.tone(board.A3, 440, 0.25)
13 simpleio.tone(board.A3, 494, 0.25)
14 simpleio.tone(board.A3, 523, 0.25)
15 time.sleep(1)
Vieles dürfte dir mittlerweile bekannt vorkommen. Manches ist aber neu.
Laden
Wenn du in der code.py die neue Datei importierst, sollte der Summer Töne von sich geben. Bevor du dich jetzt aber daran machst, deinen Lieblingssong zu programmieren, wirf einmal einen Blick auf den folgenden Code. Er macht genau das gleiche wie der vorherige Code und ist dabei viel eleganter und kürzer.
Ersetze das Programm mit dem folgenden Code:
1import time
2import board
3import simpleio
4
5
6while True:
7 for note in [262, 294, 330, 349, 392, 440, 494, 523]:
8 simpleio.tone(board.A3, note, 0.25)
9 time.sleep(1)
Was ist an dem Code anders, was ist gleich geblieben? Auf der nächsten Seite wirst du lernen, wie du in Python mit Listen arbeitest. Wir werden uns dazu die Neuerungen in diesem Code genauer anschauen.
Wenn du deinen eigenen Song programmieren möchtest, findest du hier die Frequenzen zu jeder Note. Die Nachkommastellen kannst du weglassen. Probiere es aus!
3 Listen
Die Liste ist die wichtigste Datenstruktur in Python. Eine Liste ist genau das, was man sich darunter vorstellt. Ein Wert, wie zum Beispiel eine Zahl, steht für sich alleine. Will man eine Reihe gleichartiger Werte speichern, benötigt man eine Liste. Auch Objekte lassen sich in einer Liste speichern. Zum Beispiel könnte man mehrere Objekte der Klasse DigitalInOut
auch in einer Liste speichern.
Um eine Liste zu deklarieren, verwendet man eckige Klammern. Die einzelnen Werte/Objekte werden durch Kommata voneinander getrennt.
Im vorherigen Beispiel haben wir die Frequenzen der einzelnen Noten in einer Liste gespeichert. Sie wurde aber keiner Variablen zugewiesen. Das kann man so machen, aber es ist üblich Werte, die man später vielleicht ändern möchte, einer Variablen zuzuweisen, sodass man sie am Anfang des Programms leichter wiederfindet.
Passe den Code wie folgt an.
mein_song = [262, 294, 330, 349, 392, 440, 494, 523]
while True:
for note in mein_song:
simpleio.tone(board.A3, note, 0.25)
time.sleep(1)
Wir haben der Liste den Namen mein_song
gegeben. Variablennamen werden immer kleingeschrieben. Außerdem dürfen sie nicht mit einer Ziffer beginnen und kein Leerzeichen enthalten.
Die for
... in
Schleife
Vielleicht hast du schon eine Ahnung, was die beiden Schlüsselworte for
und in
bewirken. Es handelt sich dabei um eine spezielle Schleife für Listen. Betrachte dieses minimale Beispiel:
liste = [1,2,3,4,5]
for element in liste:
print (element)
Die Laufvariable element
nimmt bei jedem Schleifendurchlauf den Wert des jeweils nächsten Elements in der Liste liste
an und startet natürlich mit dem 0-ten Element.
0-tes Element? Müsste es nicht erstes Element heißen? Ja, eigentlich schon! Aber Programmierer fangen immer bei 0 an zu zählen! Das erste Element hat also den Index 0.
Wahlfreier Zugriff auf die Elemente
In Python hat man einen wahlfreien Zugriff auf jedes Element einer Liste. Wie das geht, kannst du hier sehen:
1liste = [1,2,3,14,6]
2
3print(liste[0]) # 1
4
5print(liste[1]) # 2
6
7drittes_element = liste[2]
8print(drittes_element) # 3
9
10print(liste[3] - 10) # 4
11
12liste[4] = 5
13print(liste[4]) # 5
14
15liste.append(6)
16print(liste[5]) # 6
In den Zeilen 3, 5, 7, 10, 13 und 16 wird lesend auf Liste zugegriffen und in Zeile 1, 12 und 15 schreibend. In Zeile 7 wird das dritte Element (Index 2) an eine Variable zugewiesen. In Zeile 10 wird eine Berechnung ausgeführt, bevor die Methode print aufgerufen. In Zeile 15 kannst du sehen, wie man einer Liste ein Element hinzufügen kann.
Listen können noch vieles mehr. Man kann Listen durchsuchen, sortieren, zerteilen, zusammenführen und vieles mehr. Hier findest du einen Überblick.
Es geht auch ohne for
... in
Ohne diese spezielle Schleife für Listen müsste man den Programmcode von oben so schreiben:
1mein_song = [262, 294, 330, 349, 392, 440, 494, 523]
2
3while True:
4 index = 0
5 while ( index < len(mein_song) ):
6 note = mein_song[index]
7 simpleio.tone(board.A3, note, 0.25)
8 index += 1
9 time.sleep(1)
Das geht natürlich auch aber sieht etwas komplizierter aus und hat vier Zeilen mehr. Gehen wir den Code Zeile für Zeile durch. In Zeile 4 weisen wir der Laufvariablen index
den Startwert 0 zu. Diese Variable merkt sich also welche Note als nächstes gespielt werden soll.
Länge einer Liste
Die Länge der Liste erfährt man mit der Funktion len(). Im Beispiel ist die Länge der Liste gleich 8.
while-Schleife
In den Zeilen 5 bis 8 sehen wir die bekannte while-Schleife wieder. Im Schleifenkopf (Zeile 5) wird die Schleifenbedingung index < len(mein_song)
geprüft. Ist der Wert von Index kleiner als die Länge der Liste? Falls ja, dann werden die drei nächsten Zeilen ausgeführt und es wird erneut die Schleifenbedingung geprüft. Solange bis die Schleifenbedingung False
ist. In Zeile 6 wird das Element mit der Nummer, die in index
gespeichert ist, in die Variable note
gespeichert und in Zeile 8 wird der Wert in index
um 1 hochgezählt.
4 Bewegungsmelder
Ein Bewegungssensor reagiert sehr sensibel auf Infrarotstrahlung - also der Wärmestrahlung, die jedes Lebewesen aussendet. Die beiden Anschlüsse, die auf der Rückseite mit + und - beschriftet sind, müssen mit der roten Leistung (+) und blauen Leitung (-) auf dem Steckbrett verbunden werden. Den mittleren Anschluss verbinden wir mit Pin A5
. Achtung: Keinesfalls die Pins vertauschen - Zerstörungsgefahr!

Plaziere jetzt den PIR-Sensor neben den Summer und kopiere anschließend den Programmcode.
1import board
2import digitalio
3from adafruit_debouncer import Debouncer
4import neopixel
5import adafruit_rtttl
6
7korobeyniki = "korobeyniki:d=4,o=5,b=160:e6,8b,8c6,8d6,16e6,16d6,8c6,8b,a,8a,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,2a,8p,d6,8f6,a6,8g6,8f6,e6,8e6,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,a"
8
9pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.3)
10
11BLUE = (0 , 0 , 255)
12CLEAR = (0 , 0 , 0 ) # alle aus
13
14pir = digitalio.DigitalInOut(board.A5)
15pir.switch_to_input()
16pir_d = Debouncer(pir)
17
18while True:
19 pir_d.update()
20
21 if pir_d.rose:
22 pixel[0] = BLUE
23 adafruit_rtttl.play(board.A3, korobeyniki)
24 pixel[0] = CLEAR
Wenn du keinen Fehler gemacht hast, kannst du das Tetrix-Lied hören, falls du dich in Reichweite des Sensors bewegst. Die Neopixel-LED leuchtet so lange blau.

5 Logische Verknüpfungen
Im Kapitel bedingte Verzweigung hast du gelernt, dass eine Aussage stets wahr oder falsch sein kann und dass ein Programm in jedem Fall verschiedene Wege einschlagen kann. Im aktuellen Programm benutzen wir die Aussage:
wenn der mittlere Anschluss des PIR-Sensors von 0V auf 3.3V ansteigt und damit eine Bewegung signalisiert. In Circuitpython schreiben wir pir_d.rose
.
Möchte man eine Aussage aus Teilaussagen zusammensetzen, benötigt man logische Verknüpfungen.
Es gibt drei logische Verknüpfungen: UND, ODER, NICHT
if «Bedingung1» and «Bedingung2»
if «Bedingung1» or «Bedingung2»
if not «Bedingung»
Betrachte den folgenden Programmausschnitt, der den vorangegangenen verändert und übernehme die Änderungen in deinen Code.
pir = digitalio.DigitalInOut(board.A5)
pir.switch_to_input()
pir_d = Debouncer(pir)
door = digitalio.DigitalInOut(board.D9)
door.switch_to_input(pull=digitalio.Pull.UP)
while True:
pir_d.update()
if pir_d.rose and door.value:
pixel[0] = BLUE
adafruit_rtttl.play(board.A3, korobeyniki)
pixel[0] = CLEAR
Die Nicht-Verknüpfung
Die logische nicht-Verknüpfung kehrt den Wahrheitswert einer Aussage um. Sie verneint also eine Aussage, man spricht daher auch von einer Negation. Aus:
wird:
In Circuitpython schreibst du ein not
direkt vor die Aussage, wenn du sie negieren möchtest.
Die UND-Verknüpfung
Die logische und-Verknüpfung wird auch Konjunktion genannt. Eine mit and
zusammengesetzte Aussage ist also nur dann wahr, wenn beide Teilaussagen - die erste und die zweite - wahr sind. Beispiel:
Die ODER-Verknüpfung
Die logische oder-Verknüpfung wird auch Disjunktion genannt. Eine mit or
zusammengesetzte Aussage ist also dann wahr, wenn mindestens eine der beiden Teilaussagen - die erste oder die zweite oder auch beide - wahr ist. Beispiel:
Beachte, dass die logische oder-Verknüpfung nicht dem Entweder-Oder aus dem Alltag entspricht.
Welche logische Verknüpfung wurde in dem Programm oben verwendet und wie verhält sich das Programm wenn du die Konjunktion durch eine Disjunktion ersetzt?
Aufgabe
Verändere das Programm so dass nur dann das Lied gespielt wird, wenn der Magnetschalter geschlossen ist und eine Bewegung erkannt wurde.
6 Analoge Eingabe
_