""" Claude V5 Verdrahtung: Piano: Tasten (12 Toene): GP3, GP4, GP5, GP8, GP9, GP10, GP11, GP17, GP18, GP19, GP20, GP21 (jeweils mit Pull-Down-Widerstand). Oktaven-Umschalter: GP22 (Taster mit Pull-Down). LED-Signalisierung: GP26 (normale Oktave = leuchtet, langsam blinken = mittlere Oktave, schnell blinken = hohe Oktave). Fotowiderstand: Analoger Eingang: GP28 (ADC2). Fotowiderstand: Zwischen 3.3V und GP28, mit 10kOhm-Widerstand nach GND. ### **Erklaerungen:** 1. **Piano:** - 12 Tasten fuer die Toene **C bis B**. - **GP22** als Umschalter fuer Oktaven (3 Stufen: niedrig, mittel, hoch). - **GP26** signalisiert die aktuelle Oktave (leuchten/blinken). 2. **Fotowiderstand:** - Misst die Lichtintensitaet an **GP28**. - Bei einer Aenderung um 10% ertoent ein Alarmton (1000 Hz). 3. **Hauptschleife:** - Kombiniert alle Funktionen (Ultraschall, Motoren, Piano, Lichtalarm). _____________ Hier ist ein kombiniertes Python-Programm fuer den Raspberry Pi Pico, das alle Funktionen aus diesem Chat vereint: Ultraschallsensor (HC-SR04) zur Entfernungsmessung. Motorsteuerung ueber Transistoren (BC547), die bei ≤ 10 cm stoppen. Abstandsabhaengige Tonausgabe (Oktave von C bis C) ueber einen Lautsprecher. RGB-LED, die die Entfernung farblich anzeigt (Rot = nah, Gruen = weit). Zwei abwechselnd blinkende LEDs als Statusanzeige. Komponente,Pin (Raspberry Pi Pico),Beschreibung HC-SR04 (Trigger),GP13,Ultraschall-Trigger HC-SR04 (Echo),GP14,Ultraschall-Echo Motor 1 (BC547),GP15,Steuerpin fuer Motor 1 Motor 2 (BC547),GP16,Steuerpin fuer Motor 2 Lautsprecher,GP12,PWM-Pin fuer Tonausgabe RGB-LED (Rot),GP0,PWM-Pin fuer rote LED RGB-LED (Gruen),GP1,PWM-Pin fuer gruene LED RGB-LED (Blau),GP2,PWM-Pin fuer blaue LED Status-LED 1,GP6,Blinkt abwechselnd mit Status-LED 2 Status-LED 2,GP7,Blinkt abwechselnd mit Status-LED 1 Hier ist ein kombiniertes Python-Programm fuer den Raspberry Pi Pico, das alle Funktionen aus diesem Chat vereint: Ultraschallsensor (HC-SR04) zur Entfernungsmessung. Motorsteuerung ueber Transistoren (BC547), die bei 10 cm stoppen. Abstandsabhaengige Tonausgabe (Oktave von C bis C) ueber einen Lautsprecher. RGB-LED, die die Entfernung farblich anzeigt (Rot = nah, Gruen = weit). Zwei abwechselnd blinkende LEDs als Statusanzeige. Verdrahtung: HC-SR04 (Trigger)GP13Ultraschall-TriggerHC-SR04 (Echo)GP14Ultraschall-EchoMotor 1 (BC547)GP15Steuerpin fuer Motor 1Motor 2 (BC547)GP16Steuerpin fuer Motor 2LautsprecherGP12PWM-Pin fuer TonausgabeRGB-LED (Rot)GP0PWM-Pin fuer rote LEDRGB-LED (Gruen)GP1PWM-Pin fuer gruene LEDRGB-LED (Blau)GP2PWM-Pin fuer blaue LEDStatus-LED 1GP6Blinkt abwechselnd mit Status-LED 2Status-LED 2GP7Blinkt abwechselnd mit Status-LED 1 Erklaerungen im Code: Initialisierung: Alle Pins fuer Sensoren, Motoren, Lautsprecher, RGB-LED und Status-LEDs werden konfiguriert. Entfernungsmessung (get_distance): Der HC-SR04 sendet einen Trigger-Impuls und misst die Echo-Zeit, um die Entfernung zu berechnen. Tonausgabe (play_tone): Spielt einen Ton basierend auf der Entfernung (Oktave von C bis C). RGB-LED (set_rgb_color): Zeigt die Entfernung farblich an (Rot = nah, Gruen = weit). Motorsteuerung (stop_motors, start_motors): Stoppt die Motoren bei 10 cm Entfernung. Status-LEDs (blink_status_leds): Zwei LEDs blinken abwechselnd als Statusanzeige. Hauptschleife: Misst kontinuierlich die Entfernung und steuert alle Komponenten entsprechend. Anpassungen: Entfernungsschwelle: Aendere distance <= 10.0 fuer eine andere Stoppendistanz. Pins: Passe die Pin-Nummern an, falls andere Pins verwendet werden. Tondauer/Farben: Aendere die Werte in play_tone oder set_rgb_color fuer andere Effekte. ______________ +-------------------------+----------+------------------------+------------------------------------------+ | Komponente | GPIO | Physikalischer Pin | Beschreibung | +-------------------------+----------+------------------------+------------------------------------------+ |HC-SR04 (Trigger) | GP13 | 18 | Ultraschall-Trigger | | HC-SR04 (Echo) | GP14 | 19 | Ultraschall-Echo | | Motor 1 (BC547) | GP15 | 20 | Steuerpin fuer Motor 1 | | Motor 2 (BC547) | GP16 | 21 | Steuerpin fuer Motor 2 | | Lautsprecher (PWM) | GP12 | 16 | Tonausgabe (PWM) | | RGB-LED (Rot) | GP0 | 1 | PWM fuer rote LED | | RGB-LED (Gruen) | GP1 | 2 | PWM fuer gruene LED | | RGB-LED (Blau) | GP2 | 4 | PWM fuer blaue LED | | Status-LED 1 | GP6 | 9 | Blinkt abwechselnd mit Status-LED 2 | | Status-LED 2 | GP7 | 10 | Blinkt abwechselnd mit Status-LED 1 | | Piano-Taste C | GP3 | 5 | Taste fuer Ton C (Pull-Down) | | Piano-Taste C# | GP4 | 6 | Taste fuer Ton C# (Pull-Down) | | Piano-Taste D | GP5 | 7 | Taste fuer Ton D (Pull-Down) | | Piano-Taste D# | GP8 | 11 | Taste fuer Ton D# (Pull-Down) | | Piano-Taste E | GP9 | 12 | Taste fuer Ton E (Pull-Down) | | Piano-Taste F | GP10 | 14 | Taste fuer Ton F (Pull-Down) | | Piano-Taste F# | GP11 | 15 | Taste fuer Ton F# (Pull-Down) | | Piano-Taste G | GP17 | 22 | Taste fuer Ton G (Pull-Down) | | Piano-Taste G# | GP18 | 24 | Taste fuer Ton G# (Pull-Down) | | Piano-Taste A | GP19 | 25 | Taste fuer Ton A (Pull-Down) | | Piano-Taste A# | GP20 | 26 | Taste fuer Ton A# (Pull-Down) | | Piano-Taste B | GP21 | 27 | Taste fuer Ton B (Pull-Down) | | Oktaven-Umschalter | GP22 | 28 | Taster zum Wechseln der Oktave | | Oktaven-LED | GP26 | 31 | Signalisiert aktuelle Oktave | | Fotowiderstand | GP28 | 34 | ADC-Eingang fuer Lichtmessung | Modi GP27 32n. Komponente,Pin (Raspberry Pi Pico),Beschreibung HC-SR04 (Trigger),GP13,Ultraschall-Trigger HC-SR04 (Echo),GP14,Ultraschall-Echo Motor 1 (BC547),GP15,Steuerpin fuer Motor 1 Motor 2 (BC547),GP16,Steuerpin fuer Motor 2 Lautsprecher,GP12,PWM-Pin fuer Tonausgabe RGB-LED (Rot),GP0,PWM-Pin fuer rote LED RGB-LED (Gruen),GP1,PWM-Pin fuer gruene LED RGB-LED (Blau),GP2,PWM-Pin fuer blaue LED Status-LED 1,GP6,Blinkt abwechselnd mit Status-LED 2 Status-LED 2,GP7,Blinkt abwechselnd mit Status-LED 1 Nimm bitte den GP27 als Mode-Schalter Mode 1 bis 10 und aendere Beiliegendes Programm dementsprechend ab. Bei jedem Druck auf den schalter wird der noechste Punkt ausgewaehlt. 1.HC-SR04 mißt die Entfernung: Ab 1 Meter bis 5 cm wird gemessen und der Bereich in vom mittleren C bis zum naechst hoeheren C mit Halbtoenen unterteilt. Abhaengig von der Entfernung spielt der Entsprechende Ton und die RGB leuchter in Regenbogenfarbe abhaengig von der Entfernung, jedem Abschitt wird eine Farbe zugeordnet. 2.Motor: Ab 10 cm Entfernung bleibt er stehen und die RGB-LED leuchtet ab 1 Meter Entfernung je naeher um so heller und schneller. 3.LDR-Alarm 10% Hellikeitsunterschied pus oder minus.Es ertoent ein Sirenenton, 30 Sekunden Lang und die RGB-LED Leuchtet wild. Danach wird der Alarm wieder scharf geschaltet. mit dem ursprünglichen Starwert 4.LDR-Daemmerungsfade: Je dunkler das Umgebungslicht um so heller dir RGB-LED. 5.LDR-Daemmerungsschwellwert: Wird es um 30% dunkler als die Starthelligkeit, dann schaltet die RGB-LED voll ein. 6.Piano: Immer wenn der Entsprechende Pin mit dem Draht berührt wird ertoent der zugeordnete Ton. Von C bis C hoch. Oktaven-Umschalte und Oktaven-LED bleibt so wie im Programm. Die RGB-LED leuchtet entsprechend des Tons. 7.Selbst spielen: Der Pico spielt selbt Alle meine Entchen und Haenschenklein. 8.Regenbogen: RGB-LED leuchtet in Regenbogenfarbe. 9.Wechsellicht: Die Status-LED 1 und 2 leuchten abwechselnd im Sekundentakt. 10.Wechsellicht2 :Wird die Entfernung beim HV-SR04 kleiner als 1 Meter blinken sie schneller. Bis auf das Wechsellicht zeigt die Status-LED immer den Mode an. Bei 1. HC-SR04 blinkt die Status1-LED immerwieder 1 mal usw. Verwende bitte viele Komentare. Schreib aber die Umlaute als ü=ue usw. _________________ Wichtige Hinweise zum Programm: Modus-Auswahl: Der GP27-Mode-Schalter wechselt zwischen den 10 Modi. Die Status-LEDs zeigen den aktuellen Modus an (z. B. 1x Blinken für Modus 1). Modus 1 (HC-SR04): Misst die Entfernung von 1 Meter bis 5 cm. Spielt Toene von mittlerem C bis zum naechsten C mit Halbtoenen. Die RGB-LED leuchtet in Regenbogenfarben, abhaengig von der Entfernung. Modus 2 (Motor): Stoppt die Motoren bei ≤ 10 cm. Die RGB-LED leuchtet umso heller, je naeher das Hindernis ist. Modus 3 (LDR-Alarm): Loest einen 30-Sekunden-Sirenenton aus, wenn sich die Helligkeit um ≥ 10% aendert. Die RGB-LED blinkt wild waehrend des Alarms. Modus 4 (LDR-Daemmerungsfade): Die RGB-LED leuchtet umso heller, je dunkler es wird. Modus 5 (LDR-Daemmerungsschwellwert): Schaltet die RGB-LED voll ein, wenn es 30% dunkler als der Startwert wird. Modus 6 (Piano): Spielt Toene, wenn die Piano-Tasten berührt werden. Die RGB-LED leuchtet in der Farbe des gespielten Tons. Modus 7 (Selbst spielen): Spielt die Lieder "Alle meine Entchen" und "Haenschen klein". Modus 8 (Regenbogen): Die RGB-LED leuchtet in Regenbogenfarben. Modus 9 (Wechsellicht): Die Status-LEDs blinken im Sekundentakt. Modus 10 (Wechsellicht2): Die Status-LEDs blinken schneller, wenn die Entfernung < 1 Meter ist. Hinweise zur Nutzung: Oktaven-Umschalter (GP22) funktioniert in allen Modi. Status-LEDs zeigen immer den aktuellen Modus an. RGB-LED und Lautsprecher werden je nach Modus unterschiedlich genutzt. Funktionsweise: • Modus 1: Misst die Entfernung und spielt Toene. • Modus 2: Steuert die Motoren und die Helligkeit der RGB-LED. • Modus 3: Loest einen Alarm bei Lichtaenderung aus. • Modus 4: Passt die Helligkeit der RGB-LED an die Umgebungshelligkeit an. • Modus 5: Schaltet die RGB-LED bei Daemmerung ein. • Modus 6: Spielt Toene auf dem Piano. • Modus 7: Spielt die Lieder "Alle meine Entchen" und "Haenschen klein". • Modus 8: Zeigt einen Regenbogen auf der RGB-LED. • Modus 9: Laesst die Status-LEDs abwechselnd blinken. • Modus 10: Laesst die Status-LEDs schneller blinken, wenn die Entfernung < 1m ist. """ from machine import Pin, PWM, ADC import time import math import random # --- Initialisierung der Pins --- # Ultraschallsensor (HC-SR04) trigger = Pin(13, Pin.OUT) echo = Pin(14, Pin.IN) # Motoren (über BC547-Transistoren) motor1 = Pin(15, Pin.OUT) motor2 = Pin(16, Pin.OUT) # Lautsprecher (PWM für Tonausgabe) buzzer = PWM(Pin(12)) buzzer.duty_u16(0) # RGB-LED (PWM für Farbsteuerung) red_led = PWM(Pin(0)) green_led = PWM(Pin(1)) blue_led = PWM(Pin(2)) for led in [red_led, green_led, blue_led]: led.freq(1000) # Status-LEDs (für Modus-Anzeige) status_led1 = Pin(6, Pin.OUT) status_led2 = Pin(7, Pin.OUT) # Mode-Schalter (GP27) mode_switch = Pin(27, Pin.IN, Pin.PULL_DOWN) last_mode_switch_state = False # Piano-Tasten (12 Töne) piano_keys = [ Pin(3, Pin.IN, Pin.PULL_DOWN), # C Pin(4, Pin.IN, Pin.PULL_DOWN), # C# Pin(5, Pin.IN, Pin.PULL_DOWN), # D Pin(8, Pin.IN, Pin.PULL_DOWN), # D# Pin(9, Pin.IN, Pin.PULL_DOWN), # E Pin(10, Pin.IN, Pin.PULL_DOWN), # F Pin(11, Pin.IN, Pin.PULL_DOWN), # F# Pin(17, Pin.IN, Pin.PULL_DOWN), # G Pin(18, Pin.IN, Pin.PULL_DOWN), # G# Pin(19, Pin.IN, Pin.PULL_DOWN), # A Pin(20, Pin.IN, Pin.PULL_DOWN), # A# Pin(21, Pin.IN, Pin.PULL_DOWN) # B ] # Oktaven-Umschalter octave_switch = Pin(22, Pin.IN, Pin.PULL_DOWN) last_octave_switch_state = False # LED für Oktaven-Signalisierung octave_led = Pin(26, Pin.OUT) # Fotowiderstand (ADC) photo_resistor = ADC(Pin(28)) # --- Frequenzen der Oktaven --- # Untere Oktave (C4 bis B4) frequencies_low = [ 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88 ] # Mittlere Oktave (C5 bis B5) frequencies_mid = [freq * 2 for freq in frequencies_low] # Hohe Oktave (C6 bis B6) frequencies_high = [freq * 2 for freq in frequencies_mid] # Aktuelle Oktave (0 = niedrig, 1 = mittel, 2 = hoch) current_octave = 0 # Aktueller Modus (1 bis 10) current_mode = 1 # Letzter Lichtwert (für Alarm) last_light = 0 # Startlichtwert (für Dämmerungsschwellwert) start_light = 0 # Zeitstempel für Oktaven-LED-Blinken octave_led_last_toggle = 0 octave_led_state = False # --- Funktionen --- def get_distance(): """Misst die Entfernung mit Timeout-Schutz""" trigger.low() time.sleep_us(2) trigger.high() time.sleep_us(10) trigger.low() # Warten auf Echo-Start mit Timeout timeout = 30000 # 30ms Timeout pulse_start = 0 pulse_end = 0 start_wait = time.ticks_us() while echo.value() == 0: pulse_start = time.ticks_us() if time.ticks_diff(pulse_start, start_wait) > timeout: return 400 # Keine Messung möglich # Warten auf Echo-Ende mit Timeout start_wait = time.ticks_us() while echo.value() == 1: pulse_end = time.ticks_us() if time.ticks_diff(pulse_end, start_wait) > timeout: return 400 # Keine Messung möglich pulse_duration = time.ticks_diff(pulse_end, pulse_start) distance = (pulse_duration * 0.0343) / 2 return min(max(distance, 0), 400) def play_tone(frequency, duration=200): """Spielt einen Ton mit der angegebenen Frequenz""" if frequency > 0: buzzer.freq(int(frequency)) buzzer.duty_u16(32767) time.sleep_ms(duration) buzzer.duty_u16(0) def set_rgb_color(r, g, b): """Setzt die RGB-LED-Farbe""" red_led.duty_u16(int(r * 65535 / 255)) green_led.duty_u16(int(g * 65535 / 255)) blue_led.duty_u16(int(b * 65535 / 255)) def stop_motors(): """Stoppt beide Motoren""" motor1.low() motor2.low() def start_motors(): """Startet beide Motoren""" motor1.high() motor2.high() def show_mode_indication(): """Zeigt den aktuellen Modus durch Blinken an""" for _ in range(current_mode): status_led1.value(1) status_led2.value(0) time.sleep(0.2) status_led1.value(0) status_led2.value(1) time.sleep(0.2) status_led1.value(0) status_led2.value(0) time.sleep(0.5) def update_octave_led(): """Aktualisiert die Oktaven-LED ohne Blockierung""" global octave_led_last_toggle, octave_led_state if current_octave == 0: # Dauerhaft an octave_led.value(1) octave_led_state = True elif current_octave == 1: # Langsam blinken (500ms) if time.ticks_diff(time.ticks_ms(), octave_led_last_toggle) > 500: octave_led_state = not octave_led_state octave_led.value(octave_led_state) octave_led_last_toggle = time.ticks_ms() else: # Schnell blinken (200ms) if time.ticks_diff(time.ticks_ms(), octave_led_last_toggle) > 200: octave_led_state = not octave_led_state octave_led.value(octave_led_state) octave_led_last_toggle = time.ticks_ms() def check_light_change(): """Prüft ob sich die Helligkeit um mindestens 10% geändert hat""" global last_light light = photo_resistor.read_u16() if last_light == 0 or last_light < 100: # Schutz vor Division durch Null last_light = light return False change = abs(light - last_light) / last_light * 100 if change >= 10: print(f"Lichtänderung: {change:.1f}%! Alarm!") return True last_light = light return False def play_siren(): """Spielt einen Sirenen-Ton""" for _ in range(30): for freq in [800, 1200]: buzzer.freq(freq) buzzer.duty_u16(32767) time.sleep_ms(250) buzzer.duty_u16(0) time.sleep_ms(50) def play_song(): """Spielt 'Alle meine Entchen' und 'Hänschen klein'""" notes = [ # Alle meine Entchen (392, 500), (392, 500), (440, 500), (440, 500), (392, 500), (392, 500), (349, 1000), (0, 200), (330, 500), (330, 500), (349, 500), (349, 500), (294, 1000), (0, 200), (392, 500), (392, 500), (440, 500), (440, 500), (392, 500), (392, 500), (349, 1000), (0, 200), (330, 500), (349, 500), (294, 500), (330, 500), (262, 1000), (0, 500), # Hänschen klein (392, 250), (349, 250), (349, 250), (294, 250), (330, 250), (330, 250), (262, 500), (0, 250), (330, 250), (294, 250), (294, 250), (220, 250), (262, 500), (0, 500), (392, 250), (349, 250), (349, 250), (294, 250), (330, 250), (330, 250), (262, 500), (0, 250), (330, 250), (294, 250), (294, 250), (330, 250), (262, 500), (0, 500) ] for freq, duration in notes: if freq > 0: buzzer.freq(freq) buzzer.duty_u16(32767) else: buzzer.duty_u16(0) time.sleep_ms(duration) buzzer.duty_u16(0) def rainbow_led(): """Zeigt einen Regenbogen auf der RGB-LED""" colors = [ (255, 0, 0), (255, 127, 0), (255, 255, 0), (0, 255, 0), (0, 255, 127), (0, 255, 255), (0, 0, 255), (75, 0, 130), (148, 0, 211) ] for color in colors: set_rgb_color(*color) time.sleep(0.5) # --- Hauptprogramm --- try: # Startlichtwert speichern start_light = photo_resistor.read_u16() last_light = start_light print(f"Startlichtwert: {start_light}") # === MODUSAUSWAHL BEIM START (15 Sekunden) === print("=== MODUSAUSWAHL ===") print("Drücke den Mode-Schalter um den gewünschten Modus zu wählen") print("Du hast 15 Sekunden Zeit...") selection_start = time.ticks_ms() selection_duration = 15000 # 15 Sekunden current_mode = 0 # Startet bei 0 # Countdown-Anzeige mit blinkender LED while time.ticks_diff(time.ticks_ms(), selection_start) < selection_duration: # Verbleibende Zeit berechnen elapsed = time.ticks_diff(time.ticks_ms(), selection_start) remaining = (selection_duration - elapsed) // 1000 # Mode-Schalter prüfen current_switch_state = mode_switch.value() if current_switch_state and not last_mode_switch_state: current_mode = current_mode + 1 if current_mode > 10: current_mode = 1 print(f"Modus gewählt: {current_mode}") # Kurzes Feedback durch Status-LED status_led1.value(1) time.sleep(0.1) status_led1.value(0) time.sleep(0.2) # Entprellen last_mode_switch_state = current_switch_state # Status-LED2 blinkt als Countdown if remaining > 0 and (elapsed % 1000) < 500: status_led2.value(1) else: status_led2.value(0) time.sleep(0.05) # Wenn kein Modus gewählt wurde, auf Modus 1 setzen if current_mode == 0: current_mode = 1 print("Kein Modus gewählt - Standard: Modus 1") # Status-LEDs ausschalten status_led1.value(0) status_led2.value(0) time.sleep(0.5) # Gewählten Modus anzeigen print(f"\n=== START: Modus {current_mode} ===\n") show_mode_indication() while True: # Mode-Schalter abfragen (Flankenerkennung) current_switch_state = mode_switch.value() if current_switch_state and not last_mode_switch_state: current_mode = current_mode + 1 if current_mode > 10: current_mode = 1 print(f"Wechsel zu Modus {current_mode}") show_mode_indication() time.sleep(0.3) # Entprellen last_mode_switch_state = current_switch_state # Oktaven-Umschalter (Flankenerkennung) current_octave_switch_state = octave_switch.value() if current_octave_switch_state and not last_octave_switch_state: current_octave = (current_octave + 1) % 3 print(f"Oktave gewechselt zu: {current_octave}") time.sleep(0.3) # Entprellen last_octave_switch_state = current_octave_switch_state # Oktaven-LED aktualisieren (nicht-blockierend) update_octave_led() # Modus-spezifische Funktionen if current_mode == 1: # Modus 1: HC-SR04 misst Entfernung und spielt Töne distance = get_distance() if distance <= 100 and distance >= 5: print(f"Modus 1 - Entfernung: {distance:.1f} cm") # Farbverlauf basierend auf Entfernung section = int((100 - distance) / (100 / 19)) section = max(0, min(section, 18)) # Sicherstellen dass Index gültig ist colors = [ (255, 0, 0), (255, 63, 0), (255, 127, 0), (255, 191, 0), (255, 255, 0), (191, 255, 0), (127, 255, 0), (63, 255, 0), (0, 255, 0), (0, 255, 63), (0, 255, 127), (0, 255, 191), (0, 255, 255), (0, 191, 255), (0, 127, 255), (0, 63, 255), (0, 0, 255), (127, 0, 255), (255, 0, 255) ] set_rgb_color(*colors[section]) # Ton basierend auf Entfernung (umgekehrt: nah = hoch, weit = tief) index = int((distance - 5) / (100 - 5) * 11.99) index = max(0, min(index, 11)) # Index 0-11 index = 11 - index # Umkehren: nahe Entfernung = hoher Index = hoher Ton if current_octave == 0: play_tone(frequencies_low[index], 200) elif current_octave == 1: play_tone(frequencies_mid[index], 200) else: play_tone(frequencies_high[index], 200) # Motorsteuerung if distance <= 10.0: stop_motors() else: start_motors() elif current_mode == 2: # Modus 2: Motorsteuerung und RGB-LED-Helligkeit distance = get_distance() print(f"Modus 2 - Entfernung: {distance:.1f} cm") if distance <= 100: brightness = int(255 * (distance / 100)) blink_speed = max(0.1, 1.0 - (distance / 100)) set_rgb_color(brightness, brightness, brightness) time.sleep(blink_speed / 2) set_rgb_color(0, 0, 0) time.sleep(blink_speed / 2) if distance <= 10.0: stop_motors() else: start_motors() elif current_mode == 3: # Modus 3: LDR-Alarm if check_light_change(): play_siren() for _ in range(30): set_rgb_color(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) time.sleep(0.1) set_rgb_color(0, 0, 0) last_light = photo_resistor.read_u16() time.sleep(0.1) elif current_mode == 4: # Modus 4: LDR-Dämmerungsfade light = photo_resistor.read_u16() brightness = int(255 * (1 - (light / 65535))) brightness = max(0, min(brightness, 255)) set_rgb_color(brightness, brightness, brightness) time.sleep(0.1) elif current_mode == 5: # Modus 5: LDR-Dämmerungsschwellwert light = photo_resistor.read_u16() threshold = start_light * 0.7 if light <= threshold: set_rgb_color(255, 255, 255) else: set_rgb_color(0, 0, 0) time.sleep(0.1) elif current_mode == 6: # Modus 6: Piano key_pressed = False for i, key in enumerate(piano_keys): if key.value(): key_pressed = True # Ton kontinuierlich spielen solange Taste gedrückt if current_octave == 0: buzzer.freq(int(frequencies_low[i])) elif current_octave == 1: buzzer.freq(int(frequencies_mid[i])) else: buzzer.freq(int(frequencies_high[i])) buzzer.duty_u16(32767) # Ton einschalten colors = [ (255, 0, 0), (255, 127, 0), (255, 255, 0), (127, 255, 0), (0, 255, 0), (0, 255, 127), (0, 255, 255), (0, 127, 255), (0, 0, 255), (127, 0, 255), (255, 0, 255), (255, 0, 127) ] set_rgb_color(*colors[i]) break if not key_pressed: buzzer.duty_u16(0) # Ton ausschalten set_rgb_color(0, 0, 0) time.sleep(0.01) # Kürzere Pause für bessere Reaktionszeit elif current_mode == 7: # Modus 7: Selbst spielen (Alle meine Entchen und Hänschen klein) print("Modus 7 - Spiele Lieder...") play_song() set_rgb_color(0, 255, 0) time.sleep(2) set_rgb_color(0, 0, 0) elif current_mode == 8: # Modus 8: Regenbogen rainbow_led() elif current_mode == 9: # Modus 9: Wechsellicht (Status-LEDs) status_led1.value(1) status_led2.value(0) time.sleep(1) status_led1.value(0) status_led2.value(1) time.sleep(1) elif current_mode == 10: # Modus 10: Wechsellicht2 (schneller bei Entfernung < 1m) distance = get_distance() if distance < 100: blink_speed = max(0.1, 1.0 - (distance / 100)) else: blink_speed = 1.0 status_led1.value(1) status_led2.value(0) time.sleep(blink_speed / 2) status_led1.value(0) status_led2.value(1) time.sleep(blink_speed / 2) except KeyboardInterrupt: print("\nProgramm beendet") stop_motors() buzzer.duty_u16(0) set_rgb_color(0, 0, 0) octave_led.value(0) status_led1.value(0) status_led2.value(0)