from machine import Pin, PWM, SoftI2C
import neopixel
from time import sleep
from ssd1306 import SSD1306_I2C
from music import *
import time
#-----------neopixel-------------------
NUM_LEDS = 16
PIN_NR = 4
np = neopixel.NeoPixel(Pin(4), 16)
def wheel(pos):
"""Generiert Farben für den Regenbogen-Effekt"""
pos = pos % 255
if pos < 85:
return (pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return (255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return (0, pos * 3, 255 - pos * 3)
def kreis_lauflicht(speed):
color_step = 0
for _ in range(1):
for i in range(NUM_LEDS):
np.fill((0, 0, 0)) # Erstmal alle aus
# Farbe berechnen (ändert sich bei jedem Schritt)
farbe = wheel(color_step)
np[i] = farbe # Nur die aktuelle LED an
np.write()
color_step = (color_step + 10) % 256 # Farbe für den nächsten Schritt ändern
time.sleep(speed)
# Start: Ein Punkt kreist, 0.05s pro LED
try:
# 1. Das Lauflicht kurz zeigen
kreis_lauflicht(0.1)
# Zeigt kurz den kreisenden Punkt
except KeyboardInterrupt:
pass
np.fill((0, 50, 0)) # Tannenbaum grün einschalten
np.write()
# 2. LEDs für die Tannenbaum-Show einschalten (damit sie an bleiben!)
np.fill((0, 50, 0)) # Alle LEDs leuchten grün
np.write()
lied = [('C4',1/8),('F4',1/8),('F4',1/16),('F4',1/4),('G4',1/8),('A4',1/8),('A4',1/16),('A4',1/16),('A4',1/4),('A4',1/8),('G4',1/8),('A4',1/8),('B4',1/4),('E4',1/4),('G4',1/4),('F4',1/4),('C5',1/8),('C5',1/8),('A4',1/8),('D5',1/4),('C5',1/8),('C5',1/8),('B4',1/8),('B4',1/4),('B4',1/8),('B4',1/8),('G4',1/8),('C5',1/4),('B4',1/8),('B4',1/8),('A4',1/8),('A4',1/4)]
ls = Music(15,25) # Nutze nur einen Pin, falls 15,25 Probleme macht
# 3. Bildschirm-Text (LEDs bleiben an!)
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq = 400000)
oled = SSD1306_I2C(128, 64, i2c)
oled.text("oh Tannenbaum", 0, 0)
oled.show()
sleep(2.5)
oled.text("oh Tannenbaum ", 0, 10)
oled.show()
sleep(2.5)
oled.text("wie schoen sind ", 0, 20)
oled.show()
sleep(1.5)
oled.text("deine Blaetter ", 0, 30)
oled.show()
sleep(2)
sleep(1)
oled.fill(0)
oled.show()
oled.text("du gruenst nicht nur", 0, 0)
oled.show()
sleep(2)
oled.text("zur sommerzeit ", 0, 10)
oled.show()
sleep(7.5)
oled.text("nein, auch im ", 0, 20)
oled.show()
sleep(2)
oled.text("Winter wenn es ", 0, 30)
oled.text(" schneit ", 0, 40)
oled.show()
sleep(7.5)
for i in range(20 ):
oled.scroll(1,0)
oled.show()
sleep(0.01)
sleep(1)
oled.fill(0)
oled.show()
# Text scrollen
# erste Zahl: Schrittweite x
# zweite Zahl: Schrittweite y
oled.text("Gustav&Ferdi",0,32)
oled.show()
for i in range(100):
oled.scroll(1,0)
oled.show()
sleep(0.01)
sleep(1)
oled.fill(0)
oled.show()
# Lied abspielen
for i in range(len(lied)):
ls.tone(lied[i])
ls.noTone()
# 5. AM ENDE: Alles aus
np.fill((0, 0, 0))
np.write()
oled.fill(0)
oled.show()
#---------------Bildschirm---------------
#-----------------Hauptschleife-------------------
# Pins und Intervalle
taster = Pin(0, Pin.IN, Pin.PULL_UP) # Interner Pull-Up: Taster schaltet gegen GND
intervall_blink = 500
entprell_zeit = 200
letzte_zeit_blink = time.ticks_ms()
letzte_zeit_taster = 0
while True:
jetzt = time.ticks_ms()
# Modul 1 (Aufgabe alle 500ms)
if time.ticks_diff(now, last_run1) > interval1:
buzzer.freq(melody[note_step])
buzzer.duty_u16(32768)
note_step = (note_step + 1) % len(melody)
last_run1 = now
# Modul 2: Taster-Abfrage (nicht-blockierend)
# Taster ist bei PULL_UP '0', wenn gedrückt
if taster.value() == 0:
# Modul 2 (Aufgabe alle 1000ms)
if time.ticks_diff(now, last_run2) > interval2:
if time.ticks_diff(now, last_oled_update) > 500:
last_run2 = now