Verarbeitung von Umwelteingaben

Programmvergleich

Beschreibe, was die folgenden Programme bewirken und vergleiche sie. Probiere es ggf. mit deinem Calliope aus.

# Imports go at the top
from calliopemini import *

if button_a.is_pressed():
    display.show(Image.HEART)
else:
    display.clear()    

Programm A.

# Imports go at the top
from calliopemini import *

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():
        display.show(Image.HEART)
    else:
        display.clear()

Programm B.

Zusammenfassung: Verzweigungen

Verzweigungen

Mit Verzweigungen kann man den Calliope je nach Situation anders reagieren lassen. Dazu wird die Ausführung der Anweisungen an eine oder mehrere Bedingungen gekoppelt. Diese Bedingung muss entweder "wahr" oder "falsch" ergeben, um eindeutig zu entscheiden, ob die Anweisungen ausgeführt werden sollen oder nicht.

mc-verzweigungen
Verschiedene Verzweigungen.

Als Bedingung eignen sich sechseckige Blöcke. Manche Sensoreingaben, wie zum Beispiel das Drücken einer Taste, kann man direkt als Bedingung verwenden (erkennbar an der sechseckigen Form). Bei anderen Sensorblöcken, die z. B. eine Zahl bereitstellen, erhält man die Bedingung erst durch den Vergleich mit einer anderen Zahl, sodass aus dem Vergleich ein Wahrheitswert (wahr/falsch) entsteht. Die Zahl, die zum Vergleich herangezogen wird, nennt man auch "Schwellwert".

mc-bedingung-taste-A
Der Sensorblock <knopf a ist geklickt> liefert <wahr> oder <falsch> (sechseckige Form) und kann als Bedingung für Verzweigungen verwendet werden.
mc-bedingung-mit-schwellwert
Der Vergleich der Lautstärke mit einem Schwellwert liefert <wahr> oder <falsch> und kann als Bedingung für Verzweigungen genutzt werden.

Wichtig: Die folgenden Blöcke sind keine Verzweigungen, sondern sogenannte Ereignisse.
mc-ereignis
Ereignisse unterbrechen das eigentlich ablaufende Programm in der Endlosschleife, wenn das angegebene Ereignis eintritt. Diese Unterbrechung sollte immer möglichst kurz sein, weil das Programm sonst bei mehreren Ereignissen zu viel hin- und herspringt und man den Überblick verliert. Insbesondere sind (Endlos-)Schleifen innerhalb eines Ereignisses ein No-Go.

verzweigungen
Verschiedene Verzweigungen.

Als Bedingung eignen sich hellblaue Blöcke. Manche Sensoreingaben, wie zum Beispiel das Drücken einer Taste, kann man auch direkt als Bedingung verwenden (erkennbar an der hellblauen Nase). Bei anderen Sensorblöcken erhält man erst durch den Vergleich mit einer Zahl einen Wahrheitswert (wahr oder falsch). Die Zahl, die zum Vergleich herangezogen wird, nennt man auch Schwellwert.

bedingung-taste-A
Der Sensorblock <taste a gedrueckt> liefert <wahr> oder <falsch> (hellblaue Nase) und kann als Bedingung für Verzweigungen verwendet werden.
bedingung-mit-schwellwert
Der Vergleich der Lautstärke mit einem Schwellwert liefert <wahr> oder <falsch> und kann als Bedingung für Verzweigungen genutzt werden.
# Imports go at the top
from calliopemini import *

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():      # die Funktion "is_pressed()" liefert einen Wahrheitswert (wahr/falsch)
        display.scroll('Fall 1')   # wird ausgeführt, falls Knopf A gedrückt wurde

Programm A: Einfache Verzweigung

# Imports go at the top
from calliopemini import *

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():      # die Funktion "is_pressed()" liefert einen Wahrheitswert (wahr/falsch)
        display.scroll('Fall 1')   # wird ausgeführt, falls Knopf A gedrückt wurde
    else:
        display.clear()            # wird ausgeführt, falls Kopf A *nicht* gedrückt wurde

Programm B: Verzweigung mit sonst-Fall


# Imports go at the top
from calliopemini import *

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():      # die Funktion "is_pressed()" liefert einen Wahrheitswert (wahr/falsch)
        display.scroll('Fall 1')   # wird ausgeführt, falls Knopf A gedrückt wurde
    elif (microphone.sound_level() > 125):  # die Funktion "sound_level()" liefert eine Zahl von 0 bis 255
                                            # erst durch den Vergleich dieser Zahl mit 125 wird daraus ein Wahrheitswert (wahr/falsch)
        display.scroll('Fall 2')            # wird ausgeführt, falls Knopf A NICHT gedrückt wurde, aber Knopf B gedrückt wurde
    else:                          
        display.clear()            # wird ausgeführt, falls Knopf A NICHT gedrückt wurde und Knopf B NICHT gedrückt wurde

Programm C: Verschachtelte Verzweigung

Die Bedingung muss immer wahr oder falsch ergeben. Manche Sensoreingaben, wie zum Beispiel das Drücken einer Taste, kann man über eine Funktion direkt als Bedingung verwenden (z. B. is_pressed()). Bei anderen Sensoreingaben, die z. B. eine Zahl bereitstellen (z. B. sound_level()), erhält man die Bedingung erst durch den Vergleich mit einer anderen Zahl, sodass aus dem Vergleich ein Wahrheitswert (wahr/falsch) entsteht. Die Zahl, die zum Vergleich herangezogen wird, nennt man auch "Schwellwert".

Simulation von Informatiksystemen im Alltag

  1. Simuliere mit dem Calliope verschiedene Informatiksysteme aus deinem Alltag. Wähle selbst.
  2. Notiere jeweils, welche Bauteile auf dem Calliope benötigt werden und sichere das Programm als Screenshot und ggf. als Datei.
  3. Diskutiere die Grenzen deiner Programme: Wo bzw. wann treten Probleme auf? Wo ist die Simulation unvollständig oder stößt an Grenzen?

Fußgängerampel

Eine Fußgängerampel wechselt auf Knopfdruck von rot auf grün und nach einiger Zeit zurück auf rot.

Straßenlaterne

Eine Straßenlaterne geht automatisch an, wenn es dunkel ist, und aus, wenn es hell ist.

Alarmanlage für das Etui

Die Alarmanlage gibt ein lautes Piepsen von sich, wenn das Etui geöffnet oder angehoben wird.

Temperaturampel

Die Temperaturampel zeigt an, ob die Temperatur zu kalt, angenehm oder zu warm ist.

Lärmampel

Die Lärmampel zeigt an, ob die Lautstärke angenehm, noch erträglich oder zu laut ist.

Tasterprobleme

Die folgenden Programme funktionieren nicht richtig, obwohl sie auf den ersten Blick richtig aussehen.

  1. Beschreibe das tatsächliche Verhalten des Calliope. Erkläre, wieso er sich so verhält.
  2. Mache einen Vorschlag zur Verbesserung des Programms.
# Imports go at the top
from calliopemini import *
import neopixel

n = 3
np = neopixel.NeoPixel(pin_RGB, n)

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():      
        np.fill((255,0,0)) # füllt alle Pixel mit der Farbe rot
        np.show()
    np.fill((0,255,0)) # füllt alle Pixel mit der Farbe grün
    np.show()

Programm A: Die RGB-LED soll im Normalfall rot anzeigen, aber wenn Taste A gedrückt wird, soll sie grün anzeigen.

# Imports go at the top
from calliopemini import *
import neopixel

n = 3
np = neopixel.NeoPixel(pin_RGB, n)

np.fill((255,0,0)) # füllt alle Pixel mit der Farbe rot
np.show()

# Code in a 'while True:' loop repeats forever
while True:
    if button_a.is_pressed():      
        np.fill((255,0,0)) # füllt alle Pixel mit der Farbe rot
        np.show()

        while button_a.is_pressed() == False:  # solange Knopf A nicht noch mal gedrückt wurde
            pass           # mache nichts

        # Knopf A wurde gedrückt, sonst landet man nicht hier
        np.fill((0,255,0)) # füllt alle Pixel mit der Farbe grün
        np.show()

Programm B: Die RGB-LED soll zunächst rot anzeigen. Wenn Taste A gedrückt wird, soll sie grün anzeigen. Wenn Taste A noch mal gedrückt wird, soll sie wieder rot anzeigen.

Probleme mit der Ampel

Max hat eine Lautstärkeampel gebaut und beschwert sich: "Meine Ampel wird nie rot! Der Mikrofon-Sensor funktioniert nicht!"
Erkläre, worin das Problem wiklich liegt und wie es sich beheben lässt.


# Imports go at the top
from calliopemini import *
import neopixel
n = 3
np = neopixel.NeoPixel(pin_RGB, n)

# Code in a 'while True:' loop repeats forever
while True:
    if microphone.sound_level() < 50:
        np.fill((0,255,0)) # füllt alle Pixel mit der Farbe grün
        np.show()
    elif microphone.sound_level() > 50:
        np.fill((255,255,0)) # füllt alle Pixel mit der Farbe gelb
        np.show()
    elif microphone.sound_level() > 100:
        np.fill((255,0,0)) # füllt alle Pixel mit der Farbe rot
        np.show()

Probleme mit dem Nachtlicht

Das folgende Programm soll ein Nachtlicht im Flur dazu bringen, im Dunkeln zu leuchten, während es tagsüber aus ist.


# Imports go at the top
from calliopemini import *
import neopixel
n = 3
np = neopixel.NeoPixel(pin_RGB, n)

# Code in a 'while True:' loop repeats forever
while True:
    if microphone.sound_level() < 77:
        np.fill((200,200,0)) # füllt alle Pixel mit der Farbe gelb
        np.show()
    else:
        np.clear()

Leo beobachtet, dass das Nachtlicht in der Dämmerung, wenn es noch nicht richtig dunkel, aber auch nicht mehr hell ist, immer anfängt zu flackern. Es geht also ständig an und wieder aus (siehe Video).

  1. Erkläre das Flackern des Nachtlichts.
  2. Mache einen Vorschlag zur Verbesserung des Programms.