from machine import Pin
# ------------------------------------------------
# GPIO Pins
# DIP-Schalter
in_1 = Pin(19, Pin.IN, Pin.PULL_UP)
in_2 = Pin(18, Pin.IN, Pin.PULL_UP)
in_3 = Pin(5, Pin.IN, Pin.PULL_UP)
in_4 = Pin(17, Pin.IN, Pin.PULL_UP)
in_5 = Pin(16, Pin.IN, Pin.PULL_UP)
in_6 = Pin(4, Pin.IN, Pin.PULL_UP)
in_7 = Pin(0, Pin.IN, Pin.PULL_UP)
in_8 = Pin(2, Pin.IN, Pin.PULL_UP)
# 74HC595
serial_output = Pin(25, Pin.OUT) # Daten
output_copy = Pin(26, Pin.OUT) # Latch (Daten in Ausgang schreiben)
takt_output = Pin(27, Pin.OUT) # Takt
# ------------------------------------------------
# Bitmuster für die 7-Segment-Anzeige
anzeige = [
# B, A, F, G, E, D, C, DP
[1, 1, 1, 0, 1, 1, 1, 0], # 0
[1, 0, 0, 0, 0, 0, 1, 0], # 1
[1, 1, 0, 1, 1, 1, 0, 0], # 2
[1, 1, 0, 1, 0, 1, 1, 0], # 3
[1, 0, 1, 1, 0, 0, 1, 0], # 4
[0, 1, 1, 1, 0, 1, 1, 0], # 5
[0, 1, 1, 1, 1, 1, 1, 0], # 6
[1, 1, 0, 0, 0, 0, 1, 0], # 7
[1, 1, 1, 1, 1, 1, 1, 0], # 8
[1, 1, 1, 1, 0, 1, 1, 0] # 9
]
# ------------------------------------------------
def zahl_einlesen():
# Die zu anzeigende Zahl anhand der Stellung der DIP-Schalter berechnen.
zahl = (
# Die Rechnung (1 - x) ist notwendig weil durch die PULL-UP-Eingänge
# ein HIGH bedeutet das der Schalter Aus ist bzw. umgekehrt.
(1 - in_1.value()) * 1
+ (1 - in_2.value()) * 2
+ (1 - in_3.value()) * 3
+ (1 - in_4.value()) * 4
+ (1 - in_5.value()) * 5
+ (1 - in_6.value()) * 6
+ (1 - in_7.value()) * 7
+ (1 - in_8.value()) * 8
)
return zahl
# ------------------------------------------------
def schieberegister_schreiben(muster):
# Latch auf LOW setzen.
# Dadurch können neue Daten in das Schieberegister geschrieben werden,
# ohne das sich die Ausgänge der 7-Segment-Anzeige sofort verändern.
output_copy.value(0)
# Alle 8 Bits des Bitmusters nacheinander in das Schieberegister schreiben.
for i in range(8):
# Das aktuell zu übertragende Bit auf den Daten-Pin schreiben.
serial_output.value(muster[i])
# Mit einer steigenden Flanke am Takt-Pin wird das Bit
# in das Schieberegister übernommen.
takt_output.value(1)
takt_output.value(0)
# Latch auf HIGH setzen.
# Damit werden die zuvor eingeschobenen Daten auf die Ausgänge übernommen.
output_copy.value(1)
# ------------------------------------------------
def zahl_anzeigen(zahl):
# Standardmäßig bleibt der Dezimalpunkt ausgeschaltet.
punkt = 0
# Ist die berechnete Zahl größer als 9, kann sie nicht vollständig
# auf einer einzelnen 7-Segment-Anzeige dargestellt werden.
if zahl > 9:
# In diesem Fall wird der Dezimalpunkt eingeschaltet.
# Dieser zeigt an das die eigentliche Zahl größer als 9 ist.
punkt = 1
# Nur die letzte Stelle der Zahl anzeigen.
# Beispiel: 17 % 10 ergibt 7.
zahl = zahl % 10
# Das passende Bitmuster für die Zahl aus der Liste holen.
# Durch copy() wird eine Kopie erstellt, damit das ursprüngliche
# Bitmuster in der Liste anzeige nicht verändert wird.
muster = anzeige[zahl].copy()
# Den Dezimalpunkt passend setzen.
muster[7] = punkt
# Das fertige Bitmuster an das Schieberegister übergeben.
schieberegister_schreiben(muster)
# ------------------------------------------------
# Speichert die zuletzt angezeigte Zahl.
# Dadurch wird das Schieberegister nur neu beschrieben,
# wenn sich die Zahl tatsächlich geändert hat.
letzte_zahl = None
# ------------------------------------------------
while True:
# Aktuelle Zahl aus den DIP-Schaltern einlesen.
zahl = zahl_einlesen()
# Nur reagieren wenn sich die Zahl seit dem letzten Durchlauf geändert hat.
if zahl != letzte_zahl:
# Zahl zur Kontrolle in der Konsole ausgeben.
print(zahl)
# Zahl auf der 7-Segment-Anzeige ausgeben.
zahl_anzeigen(zahl)
# Aktuelle Zahl als zuletzt angezeigte Zahl speichern.
letzte_zahl = zahlLoading
esp32-devkit-c-v4
esp32-devkit-c-v4