Menü Schließen

Programmcode Binäruhr

# 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, ())