# Import der notwendigen Bibliotheken
from machine import Timer, RTC, Pin
from neopixel import Neopixel
import utime
import _thread
# # -----------------------------------------------------------------
# # GRUNDEINSTELLUNGEN
# # -----------------------------------------------------------------
timer = Timer()
rtc = RTC()
rtc.datetime((2024, 1, 14, 6, 12, 48, 0, 0))
# bei den nachfolgenden Konstanten handelt es sich um Millisekunden
ENTPRELLVERZOEGERUNG = 80
SCHWELLWERT = 800
i_min = 0
i_min_alt = 1000
# # -----------------------------------------------------------------
# # EINSTELLUNGEN FÜR DIE LED-STREIFEN
# # -----------------------------------------------------------------
# Anzahl der LEDs
NUMPIX = 22
# Initialisierung des LED-Streifens; Data-IN an GPIO 1
strip = Neopixel(NUMPIX, 0, 1, "GRB")
# Einstellung der Helligkeit (1..255)
strip.brightness(25)
# Definition der Farben mit Namen
weiss = (155, 255, 255)
rot = (255, 0, 0)
blau = (0, 0, 255)
aus = (0, 0, 0)
std_einer = (12, 14, 16, 18)
std_zehner = (19, 21)
min_einer = (0, 2, 4, 6)
min_zehner = (7, 9, 11)
# # -----------------------------------------------------------------
# # EINSTELLUNGEN FÜR DIE TASTER ZUM STELLEN DER UHRZEIT
# # -----------------------------------------------------------------
global btn_stunde
btn_stunde = Pin(22, Pin.IN, Pin.PULL_DOWN)
global btn_minute
btn_minute = Pin(28, Pin.IN, Pin.PULL_DOWN)
# # -----------------------------------------------------------------
# # FUNKTIONEN
# # -----------------------------------------------------------------
def mach_leds(wert, stelle):
# Konvertieren des Wertes in eine Binärzahl, lesen von hinten nach vorne,
# einschalten der jeweiligen LED, wenn die Binärstelle 1 ist
reversed_wert = ''
wert_bin = bin(wert)
for i in range(len(str(wert_bin))-1, 1, -1):
reversed_wert += wert_bin[i]
for i in range(len(reversed_wert)):
if reversed_wert[i] == '1':
strip.set_pixel(stelle[i], weiss)
def mach_anzeige(zeit):
# zunächst alle LEDs ausschalten
for i in range(0, NUMPIX):
strip.set_pixel(int(i), aus)
# aufteilen des übergebenen Zeitwertes in die einzelnen Zehner-
# und Einerstellen
std_z = int(zeit[0])
std_e = int(zeit[1])
min_z = int(zeit[3])
min_e = int(zeit[4])
# aufrufen der Funktion zum Schalten der LEDS mit Übergabe des Dezimalwertes und der Stelle
mach_leds(std_z, std_zehner)
mach_leds(std_e, std_einer)
mach_leds(min_z, min_zehner)
mach_leds(min_e, min_einer)
strip.show()
def zeig_zeit(timer):
# diese Funktion wird vom Timer aufgerufen und ermittelt den
# Stunden- und Minutenwert der aktuellen Uhrzeit.
# Wenn der Minutenwert sich geändert hat, wird die Funktion
# mach_anzeige aufgerufen, welche ihrerseits die Funktion mach_leds aufruft.
global i_std
global i_min
global i_min_alt
datetime = rtc.datetime()
i_std = datetime[4]
i_min = datetime[5]
if i_min != i_min_alt:
std_zweistellig = f"{i_std:02}"
min_zweistellig = f"{i_min:02}"
zeit = std_zweistellig + ":" + min_zweistellig
mach_anzeige(zeit)
i_min_alt = i_min
timer.init(freq=1, mode=Timer.PERIODIC, callback=zeig_zeit)
# # -----------------------------------------------------------------
# # FUNKTIONEN FÜR DIE TASTER ZUM STELLEN DER UHRZEIT
# # -----------------------------------------------------------------
def stell_stunde_vor():
global i_std
global i_min_alt
i_min_alt = 1000
stunde_neu = i_std + 1
if stunde_neu > 23:
stunde_neu = stunde_neu - 24
datetime = rtc.datetime()
rtc.datetime((datetime[0], datetime[1], datetime[2], datetime[3], int(stunde_neu), datetime[5], datetime[6], 0))
def stell_stunde_zurueck():
global i_std
global i_min_alt
i_min_alt = 1000
stunde_neu = i_std - 1
if stunde_neu < 0:
stunde_neu = stunde_neu + 12
datetime = rtc.datetime()
rtc.datetime((datetime[0], datetime[1], datetime[2], datetime[3], int(stunde_neu), datetime[5], datetime[6], 0))
def stell_minute_vor():
global i_std
global i_min
stunde_neu = i_std
minute_neu = i_min + 1
if minute_neu > 59:
minute_neu = minute_neu - 60
stunde_neu = stunde_neu + 1
if stunde_neu > 23:
stunde_neu = stunde_neu - 24
datetime = rtc.datetime()
rtc.datetime((datetime[0], datetime[1], datetime[2], datetime[3], int(stunde_neu), int(minute_neu), 0, 0))
def stell_minute_zurueck():
global i_std
global i_min
minute_neu = i_min - 1
stunde_neu = i_std
if minute_neu < 0:
minute_neu = minute_neu + 60
stunde_neu = stunde_neu - 1
if stunde_neu < 0:
stunde_neu = stunde_neu + 12
datetime = rtc.datetime()
rtc.datetime((datetime[0], datetime[1], datetime[2], datetime[3], int(stunde_neu), int(minute_neu), 0, 0))
# # -----------------------------------------------------------------
# # ÜBERWACHUNG DER TASTER, BEI TASTENDRUCK FESTSTELLUNG DER DAUER DES DRUCKS
# # UND AUFRUF DER ENTSPRECHENDEN FUNKTION
# # -----------------------------------------------------------------
def lies_btn_thread():
global ENTPRELLVERZOEGERUNG
global SCHWELLWERT
global KONFIGWECHSEL
global btn_stunde
global btn_minute
global btn_farbe
letzter_btn_stunde_status = 0
letzter_btn_minute_status = 0
letzter_btn_farbe_status = 0
while True:
akt_millis = utime.ticks_ms()
btn_stunde_status = btn_stunde.value()
btn_minute_status = btn_minute.value()
if btn_stunde_status != letzter_btn_stunde_status:
if btn_stunde_status == 1:
start_druck = akt_millis
else:
ende_druck = akt_millis
dauer_druck = ende_druck - start_druck
if dauer_druck > ENTPRELLVERZOEGERUNG and dauer_druck < SCHWELLWERT:
stell_stunde_vor()
elif dauer_druck >= SCHWELLWERT:
stell_stunde_zurueck()
letzter_btn_stunde_status = btn_stunde_status
if btn_minute_status != letzter_btn_minute_status:
if btn_minute_status == 1:
start_druck = akt_millis
else:
ende_druck = akt_millis
dauer_druck = ende_druck - start_druck
if dauer_druck > ENTPRELLVERZOEGERUNG and dauer_druck < SCHWELLWERT:
stell_minute_vor()
elif dauer_druck >= SCHWELLWERT:
stell_minute_zurueck()
letzter_btn_minute_status = btn_minute_status
_thread.start_new_thread(lies_btn_thread, ())