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)