Immer und Immer wieder...

Schleifen stehen für sich wiederholende Anweisungen. Dabei werden bestimmte Anweisungen so lange immer wieder ausgeführt, bis eine bestimmte Bedingung nicht mehr erfüllt ist. Schleifen sind ein wesentliches Konzept in der Programmierung, da sie es ermöglichen, Aufgaben effizient und mit weniger Code zu erledigen.

Es gibt zwei Haupttypen von Schleifen:

Eine während-Schleife wiederholt eine Anweisung oder einen Block von Anweisungen, solange eine bestimmte Bedingung wahr ist. Diese Schleife ist nützlich, wenn die Anzahl der Wiederholungen nicht im Voraus bekannt ist und von einer Bedingung abhängt, die während der Ausführung des Programms geändert werden kann.

Eine für-Schleife wiederholt eine Anweisung oder einen Block von Anweisungen eine bestimmte Anzahl von Malen. Sie wird oft verwendet, um eine Sequenz (wie eine Liste, ein Tupel oder einen Bereich) zu durchlaufen.

Schleifen sind besonders nützlich in Situationen, in denen Aufgaben mehrfach ausgeführt werden müssen, wie z.B. das Durchlaufen von Listen, das Verarbeiten von Daten in einer Tabelle oder das Wiederholen von Berechnungen bis zur Erfüllung einer bestimmten Bedingung. Indem du Schleifen in deinen Programmen verwendest, kannst du deinen Code effizienter und verständlicher machen.

während-Schleife

Es gibt eine sogenannte während-Schleife (auch while-Schleife oder while loop genannt).

Hierbei wird zunächst auf die Bedingung geprüft. In diesem Fall ist dies die Prüfung des linken und des rechten Hindernissensors. Solange also der Sensor etwas erkennt, werden alle Anweisungen ausgeführt, die sich darunter im mache-Bereich befinden.

Zusammengefasst wird hier also immer, solange die Hindernissensoren ein Hindernis erkennen, das Licht des Joy-Cars eingeschaltet.

Doch das Licht jedes Mal einzuschalten macht wenig Sinn, wenn es nicht auch irgendwann wieder ausgeht. Setzen wir nach unserer Schleife noch die Anweisung, das Licht auszuschalten, so lässt sich direkt beobachten, wie zwischen den beiden Zuständen gewechselt wird. Solange ein Hindernis erkannt wird, wird der Anweisungsblock innerhalb der Schleife immer wieder ausgeführt und nicht verlassen. Erst wenn die Bedingung nicht mehr zutrifft, wird die Schleife wieder verlassen, der dauerhaft-Block wieder von vorne ausgeführt und das Licht ausgeschaltet.

Am Anfang wird wieder im beim Start-Block die Revisionsnummer des Joy-Cars definiert.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    while (JoyCar.obstacleavoidance(SensorLRSelection.Left) || JoyCar.obstacleavoidance(SensorLRSelection.Right)) {
        JoyCar.light(ToggleSwitch.On)
        basic.pause(1000)
    }
    JoyCar.light(ToggleSwitch.Off)
})

Der Beispielcode in MicroPython ist da, weil es ihn auch in MakeCode gibt. Das ist super praktisch, denn wenn du schon mit MakeCode klar kommst, kannst du viel leichter mit MicroPython loslegen. Indem wir Beispielcodes in beiden Umgebungen haben, kannst du ohne große Unterbrechung weiterlernen. So verstehst du besser, wie Programmierung funktioniert und kannst sehen, wie man dieselben Sachen in verschiedenen Programmiersprachen macht.

# Notwendige Bibliotheken importieren
from microbit import *
import neopixel

# Definiere deine Joy Car Mainboard Revision
joycar_rev = 1.3

# Objekt für die LEDs definieren
np = neopixel.NeoPixel(pin0, 8)

# Initialisierung der I2C-Schnittstelle für das Joy Car Mainboard
i2c.init(freq=400000, sda=pin20, scl=pin19)

# Werte für die Lichter definieren
# welche LEDs aktiviert werden sollen
headlights = (0, 3)
backlights = (5, 6)
indicator_left = (1, 4)
indicator_right = (2, 7)
indicator_warning = (1, 2, 4, 7)

# welche Farbe auf den LEDs angezeigt werden soll
led_white = (60, 60, 60)
led_red = (60, 0, 0)
led_off = (0, 0, 0)
led_red_br = (255, 0, 0)
led_orange = (100, 35, 0)

# Methode zum Aktivieren/Deaktivieren von Lichtern
def lights(on = True):
    if on:
        for x, y in zip(headlights, backlights):
            # Weiß für die Scheinwerfer definieren
            np[x] = led_white
            # Dunkelrot für die Rücklichter definieren
            np[y] = led_red
    else:
        for x, y in zip(headlights, backlights):
            # Schwarz für die Scheinwerfer und Rücklichter definieren
            np[x] = led_off
            np[y] = led_off
    np.show()

# alle Sensordaten abrufen
def fetchSensorData():
    # Da die zfill-Funktion nicht in micro:bit Micropython enthalten ist, 
    # muss sie als Funktion eingefügt werden
    def zfill(s, width):
        return '{:0>{w}}'.format(s, w=width)

    # Hexadezimale Daten lesen und in binäre Daten umwandeln
    data = "{0:b}".format(ord(i2c.read(0x38, 1)))
    # Füllen Sie die Daten bei Bedarf auf 8 Stellen auf.
    data = zfill(data, 8)
    # bol_data_dict as dictionary deklarieren
    bol_data_dict = {}
    # Zähler für die Schleife, die die Daten aus data in bol_data_dict einträgt
    bit_count = 7
    # Übertragen Sie die Daten von data nach bol_data_dict
    for i in data:
        if i == "0":
            bol_data_dict[bit_count] = False
            bit_count -= 1
        else:
            bol_data_dict[bit_count] = True
            bit_count -= 1

    # Ab Mainboard-Revision 1.3 sind die Geschwindigkeitssensoren auf separaten Pins
    if joycar_rev >= 1.3:
        bol_data_dict[8], bol_data_dict[9] = bol_data_dict[0], bol_data_dict[1]
        bol_data_dict[0] = bool(pin14.read_digital())
        bol_data_dict[1] = bool(pin15.read_digital())

    # Bit 0 = GeschwindigkeitLinks, Bit 1 = GeschwindigkeitRechts, Bit 2 = LineTrackerLinks,
    # bit 3 = LineTrackerMitte, bit 4 = LineTrackerRechts,
    # bit 5 = HindernisLinks, bit 6 = HindernisRechts, bit 7 = freier Pin(7)
    # (bit 8 = frei (pin0) bit 9 = frei (pin1)) - nur mit Revision 1.3 oder neuer
    return bol_data_dict

# eine Endlosschleife
while True:
    # Sensordaten vom Mainboard lesen
    sensor_data = fetchSensorData()

    # Eintritt in die Schleife, wenn kein Hindernis mit den Hindernissensoren erkannt wird
    while not sensor_data[5] or not sensor_data[6]:
        # Abblendlicht anschalten
        lights()

        # 1 Sekunde lang warten
        sleep(1000)

        # Sensordaten vom Mainboard lesen
        sensor_data = fetchSensorData()

    lights(on = False)

für-Schleife

Es gibt jedoch nicht nur während-Schleifen, sondern auch die sogenannten für-Schleifen (auch for-Schleife oder for-loop genannt). Bei den für-Schleifen werden die Anweisungen für eine bestimmte Anzahl an Durchläufen ausgeführt.

Hier werden zwei für-Schleifen mit jeweils 8 Durchläufen durchlaufen, um alle LEDs des Joy-Cars nacheinander anzusteuern. Hierzu wird direkt auf die Index-Variable der Schleife zugegriffen, um den aktuellen Durchlaufwert zu erhalten und verwenden zu können.

Im folgenden Programm wird im beim Start-Block, nachdem die Revisionsnummer des Joy-Cars definiert wurde, ein LED-Strip unter dem Namen strip mit 8 LEDs an Pin 0 initialisiert. Im Block dauerhaft werden dann in der ersten für-Schleife nach einander die LEDs 0-7 (die Adressierung der LEDs beginnt bei 0) in der Farbe Rot eingeschaltet. Nach jedem Schleifendurchlauf wird eine Pause von 100 ms (0,1 Sekunden) gemacht. Ist die Schleife mit der Zahl 7 durchgelaufen, startet die zweite Schleife. In dieser werden die LEDs der Reihe nach auf die Farbe Schwarz geschaltet. Schwarz heißt im Fall von LEDs aus. Ist auch diese Schleife mit der Zahl 7 durchgelaufen, beginnt der dauerhaft-Block wieder von vorne.

Weitere Informationen zum Thema Nutzung der LEDs findet ihr im Kapitel Scheinwerfer.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
let strip = neopixel.create(DigitalPin.P0, 8, NeoPixelMode.RGB)
basic.forever(function () {
    for (let Index = 0; Index <= 7; Index++) {
        strip.setPixelColor(Index, neopixel.colors(NeoPixelColors.Red))
        strip.show()
        basic.pause(100)
    }
    for (let Index = 0; Index <= 7; Index++) {
        strip.setPixelColor(Index, neopixel.colors(NeoPixelColors.Black))
        strip.show()
        basic.pause(100)
    }
})

Der Beispielcode in MicroPython ist da, weil es ihn auch in MakeCode gibt. Das ist super praktisch, denn wenn du schon mit MakeCode klar kommst, kannst du viel leichter mit MicroPython loslegen. Indem wir Beispielcodes in beiden Umgebungen haben, kannst du ohne große Unterbrechung weiterlernen. So verstehst du besser, wie Programmierung funktioniert und kannst sehen, wie man dieselben Sachen in verschiedenen Programmiersprachen macht.

# Notwendige Bibliotheken importieren
from microbit import *
import neopixel

# Definiere deine Joy Car Mainboard Revision
joycar_rev = 1.3

# Objekt für die LEDs definieren
np = neopixel.NeoPixel(pin0, 8)

# eine Endlosschleife definieren
while True:
    # Schleife mit Index 1 bis 7 (8 nicht eingeschlossen)
    for index in range(0,8):
        # LED mit Index rot setzen
        np[index] = (255, 0, 0)
        # Farbe auf der LED anzeigen
        np.show()
        # 100 ms warten
        sleep(100)

    # Schleife mit Index 1 bis 7 (8 nicht eingeschlossen)
    for index in range(0,8):
        # LED mit Index schwarz setzen
        np[index] = (0, 0, 0)
        # Farbe auf der LED anzeigen
        np.show()
        # 100 ms warten
        sleep(100)