Mit wenn und aber....

Prinzipiell wird die Programmiersprache JavaScript durch die Blöcke bildlich abgebildet. Dadurch lassen sich auch Abfragen und Abhängigkeiten, die du vielleicht bereits kennengelernt hast, verwenden. So kannst du beispielsweise prüfen, ob eine bestimmte Bedingung erfüllt ist. Eine solche Abhängigkeit ist im folgenden Beispiel der wenn-Block.

Hier wird, ähnlich wie bei den Schleifen, zunächst die wenn-Bedingung geprüft. Trifft diese zu, so wird der dazugehörige Anweisungsblock einmal ausgeführt. Danach wird direkt mit dem Rest des Programms fortgefahren. Trifft die Bedingung nicht zu, so wird der Anweisungsblock einfach übersprungen.

TIPP: Während Schleifen die restliche Ausführung so lange "blockieren", bis die Bedingung nicht mehr erfüllt ist, kann der Rest des Programms bei wenn-Bedingungen weiterhin ausgeführt werden.

Wenn ... dann

Im folgenden Beispiel prüfen wir den linken Hindernis-Sensor und schalten das Licht ein, wenn der Sensor ein Hindernis erkennt, und schalten das Licht ohne Pause danach wieder aus.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    if (JoyCar.obstacleavoidance(SensorLRSelection.Left)) {
        JoyCar.light(ToggleSwitch.On)
    }
    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

# Abblendlicht abschalten
lights(on = False)

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

    # Linken Hindernissensor prüfen
    if not sensor_data[5]:
        # Abblendlicht anschalten
        lights()

	# Abblendlicht abschalten
    lights(on = False)

Wenn dann ..., ansonsten

Wenn-Bedingungen lassen sich optional noch durch einen Ansonsten-Block erweitern. Hierbei wird entweder die Programmanweisung aus dem ersten Block ausgeführt, insofern denn die Bedingung zutrifft, oder ansonsten ein alternativer Block. Dieses Prinzip kann man sich wie eine Abzweigung einer Straße vorstellen, an der es entweder nach links oder nach rechts geht. Je nachdem, ob die Bedingung zutrifft, wird entschieden, welcher Weg eingeschlagen wird.

Im folgenden Code wird dauerhaft durch den wenn-Block geprüft, ob der linke Hindernissensor ein Hindernis erkannt hat oder nicht. Nur, wenn der Sensor ein Hindernis erkennt, wird das Licht eingeschaltet. In allen anderen Fällen wird der ansonsten-Block ausgeführt, also das Licht ausgeschaltet.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    if (JoyCar.obstacleavoidance(SensorLRSelection.Left)) {
        JoyCar.light(ToggleSwitch.On)
    } else {
        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

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

    # Linken Hindernissensor prüfen
    if not sensor_data[5]:
        # Abblendlicht anschalten
        lights()
    else:
        # Abblendlicht abschalten
        lights(on = False)

2x Wenn dann ..., ansonsten

Selbstverständlich lässt es sich in einem Programm auch auf mehrere verschiedene Bedingungen hintereinander prüfen. Im nächsten Schritt prüfen wir zuerst den linken Hindernissensor, um die Scheinwerfer einzuschalten, und dann den rechten Hindernissensor, um das Rückfahrlicht einzuschalten.

In diesem Fall setzen wir insgesamt zwei wenn-Bedingungen ein. Dies bedeutet, dass beide Bedingungen zur gleichen Zeit zutreffen können und somit sowohl die Scheinwerfer als auch das Rückfahrlicht gleichzeitig leuchten kann.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    if (JoyCar.obstacleavoidance(SensorLRSelection.Left)) {
        JoyCar.light(ToggleSwitch.On)
    } else {
        JoyCar.light(ToggleSwitch.Off)
    }
    if (JoyCar.obstacleavoidance(SensorLRSelection.Right)) {
        JoyCar.reversinglight(ToggleSwitch.On)
    } else {
        JoyCar.reversinglight(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()

# Aktivieren/Deaktivieren des Lichts für das Rückwärtsfahren
def lightsBack(on = True):
    if on:
        # Linke Rückleuchte auf weiß setzen
        np[backlights[0]] = led_white
        np.show()
    else:
        # Linke Rückleuchte auf schwarz setzen
        np[backlights[0]] = 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

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

    # Linken Hindernissensor prüfen
    if not sensor_data[5]:
        # Abblendlicht anschalten
        lights()
    else:
        # Abblendlicht abschalten
        lights(on = False)

    # Rechten Hindernissensor prüfen
    if not sensor_data[6]:
        # Rückfahrlicht aktivieren
        lightsBack()
    else:
        # Rückfahrlicht deaktivieren
        lightsBack(on = False)

sonst wenn

Doch das ist so nicht immer gewollt. Manchmal reicht ein entweder-oder einfach nicht. Für diesen Fall lässt sich die wenn-Bedingung um beliebig viele Zusatzblöcke erweitern. Hierbei werden mehrere wenn-Abfragen hintereinander gesetzt. Der große Unterschied hierbei ist jedoch, dass egal, wie viele Abfragen hintereinander gesetzt werden, nur eine einzige Bedingung zutreffen kann. Sobald eine Bedingung erfüllt wird, wird der zugehörige Anweisungsblock ausgeführt und alle anderen Bedingungen werden übersprungen.

Im folgenden Beispiel prüfen wir erneut die beiden Hindernissensoren. Doch hierbei wird die Abfrage über eine zusammenhängende wenn-Bedingung und nicht über zwei einzelne realisiert. Dies bedeutet, dass nur entweder die Scheinwerfer oder das Rückfahrlicht leuchten können, jedoch niemals beides gleichzeitig.

Sollten beide Bedingung erfüllt sein, also in diesem Fall ein Hindernis mit dem linken und dem rechten Sensor erkannt worden sein, wird bei einer wenn - sonst wenn - ansonsten-Abfrage immer die erste zutreffende Abfrage ausgeführt. In diesen Fällen ist das immer die Funktion, die der Abfrage des linken Hindernissensors zugeordnet ist.

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    if (JoyCar.obstacleavoidance(SensorLRSelection.Left)) {
        JoyCar.light(ToggleSwitch.On)
    } else if (JoyCar.obstacleavoidance(SensorLRSelection.Right)) {
        JoyCar.reversinglight(ToggleSwitch.On)
    } else {
        JoyCar.light(ToggleSwitch.Off)
        JoyCar.reversinglight(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()

# Aktivieren/Deaktivieren des Lichts für das Rückwärtsfahren
def lightsBack(on = True):
    if on:
        # Linke Rückleuchte auf weiß setzen
        np[backlights[0]] = led_white
        np.show()
    else:
        # Linke Rückleuchte auf schwarz setzen
        np[backlights[0]] = 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

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

    # Linken Hindernissensor prüfen
    if not sensor_data[5]:
        # Abblendlicht anschalten
        lights()
    # Rechten Hindernissensor prüfen
    elif not sensor_data[6]:
        # Rückfahrlicht aktivieren
        lightsBack()
    else:
        # Abblendlicht & Rückfahrlicht abschalten
        lights(on = False)
        lightsBack(on = False)