Heute zeigen wir Ihnen wie man unsere 7-Segment Anzeige auch über den Raspberry Pi in betrieb nehmen kann.
Ich starte mit einem frisch installierten Raspberry Pi 3 Model B, der vierstelligen 7-Segment Anzeige und einer handvoll Jumper-Kabel.
Je nach Modell untercheiden sich die GPIO Pins vom Raspberry Pi. Ich verbinde die Anzeige wie folgt:
Nach einem ersten start begrüsst uns der leere Raspbian Desktop.
Wir wollen die weit verbreitete Bibliothek WiringPi benutzen um die GPIO Pins anzusteuern.
Die Bibliothek erlaubt es uns u.A.
- Pins zu definieren
- Pins als Eingang oder Ausgang zu setzen
- Auf Pins zu schreiben, oder von ihnen zu lesen
Dazu öffnen wir ein Terminal und geben folgenden Befehl ein:
sudo pip3 install wiringpi
Es erscheint folgende Ausgabe:
Zur Ansteuerung der 7-Segment anzeige nutzen wir eine leicht modifizierte Version von https://github.com/johnlr/raspberrypi-tm1637
Wir starten unsere Python3 IDLE, gehen auf "File" -> "New File" und fügen folgenden Code ein:
#!/usr/bin/env python3 import subprocess from time import time, sleep, localtime from wiringpi import wiringPiSetupGpio, pinMode, digitalRead, digitalWrite, GPIO wiringPiSetupGpio() CLK = 21 DIO = 20 """ A --- F | | B -G- E | | C --- D """ class TM1637: I2C_COMM1 = 0x40 I2C_COMM2 = 0xC0 I2C_COMM3 = 0x80 digit_to_segment = [ 0b0111111, # 0 0b0000110, # 1 0b1011011, # 2 0b1001111, # 3 0b1100110, # 4 0b1101101, # 5 0b1111101, # 6 0b0000111, # 7 0b1111111, # 8 0b1101111, # 9 0b1110111, # A 0b1111100, # b 0b0111001, # C 0b1011110, # d 0b1111001, # E 0b1110001 # F ] def __init__(self, clk, dio): self.clk = clk self.dio = dio self.brightness = 0x0f pinMode(self.clk, GPIO.INPUT) pinMode(self.dio, GPIO.INPUT) digitalWrite(self.clk, GPIO.LOW) digitalWrite(self.dio, GPIO.LOW) def bit_delay(self): sleep(0.001) return def set_segments(self, segments, pos=0): # Write COMM1 self.start() self.write_byte(self.I2C_COMM1) self.stop() # Write COMM2 + first digit address self.start() self.write_byte(self.I2C_COMM2 + pos) for seg in segments: self.write_byte(seg) self.stop() # Write COMM3 + brightness self.start() self.write_byte(self.I2C_COMM3 + self.brightness) self.stop() def start(self): pinMode(self.dio, GPIO.OUTPUT) self.bit_delay() def stop(self): pinMode(self.dio, GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() pinMode(self.dio, GPIO.INPUT) self.bit_delay() def write_byte(self, b): # 8 Data Bits for i in range(8): # CLK low pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() pinMode(self.dio, GPIO.INPUT if b & 1 else GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() b >>= 1 pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() pinMode(self.clk, GPIO.INPUT) self.bit_delay() pinMode(self.clk, GPIO.OUTPUT) self.bit_delay() return def show_ip_address(tm): ipaddr = subprocess.check_output("hostname -I", shell=True, timeout=1).strip().split(b".") for octet in ipaddr: tm.set_segments([0, 0, 0, 0]) sleep(0.1) tm.set_segments([tm.digit_to_segment[int(x) & 0xf] for x in octet]) sleep(0.9) def show_clock(tm): t = localtime() sleep(1 - time() % 1) d0 = tm.digit_to_segment[t.tm_hour // 10] if t.tm_hour // 10 else 0 d1 = tm.digit_to_segment[t.tm_hour % 10] d2 = tm.digit_to_segment[t.tm_min // 10] d3 = tm.digit_to_segment[t.tm_min % 10] tm.set_segments([d0, 0x80 + d1, d2, d3]) sleep(.5) tm.set_segments([d0, d1, d2, d3]) if __name__ == "__main__": tm = TM1637(CLK, DIO) show_ip_address(tm) while True: show_clock(tm)
Nun gehen wir auf "Run" -> "Run module", geben einen Namen an um unseren Quelltext zu speichern, und warten kurz.
Die 7-Segment-Anzeige zeigt nun zuerst die lokale IP-Adresse an, und dann die aktuelle Uhrzeit:
Ab sofort können Sie also auf einfache Weise mit dem Raspberry Pi Informationen auf unsere 7-Segment Anzeige ausgeben.
1 comment
Erich Zwiefelhofer
Danke für das Beispielprogramm. Funktioniert mit der Darstellung der Systemzeit bestens.
Für die Darstellung der Temperatur möchte ich aber anstelle des Doppelpunktes in der Mitte nur den Kommapunkt verwenden. Wie wird der dargestellt? Kann mir da jemand helfen?