Eine einfache Methode zur Darstellung von Informationen sind 7 Segmentanzeigen. Sie werden in vielen Geräten (Backofen, DVD Player...) genutzt, um Werte anzuzeigen.
Für Elektronikprojekte sind die Anzeigen sehr praktisch, weshalb es diverse 7 Segmentanzeigen im Internet zu kaufen gibt. Sie können direkt über die I/O Pins angesteuert werden, wobei mehrere Leitungen benötigt werden. Dafür sind jedoch mehrere Kabel nötig, weshalb es zudem fertige 7 Segmentmodule mit I2C Treiber zum bestellen gibt.
Die Möglichkeit das Modul in das I2C Interface zu integrieren ist für mein Projekt sinnvoller, weshalb ich mir 7 Segmentanzeigen mit den HT16K33 Treiber bestellt habe.
Zudem kann über die Verbindung der Stellen A0-A2 mit Lötbrücken die I2C Adresse zwischen 0x70 und 0x77 eingestellt werden. Damit lassen sich Adressüberschneidungen mit anderen I2C Geräten verhindern.
Die Ansteuerung ist dank der bereits veröffentlichen Library von Adafruit sehr simpel.
Angeschlossen habe ich die 7 Segmentanzeige an einen Rasperry Pi. Für den Arduino gibt es ebenfalls eine library. Dieses Tutorial erklärt die Ansteuerung mit dem Raspberry Pi.
Na gut, ich erkläre dir in diesem Tutorial, mit welchen Funktionen du die 7 Segmentanzeige ansprechen kannst. Als Anwendungsbeispiel füge ich den Code zur Uhranzeige hinzu. Danach weisst du, wie die 7 Segmentanzeigen funktionieren.
►Als ersten lädst du dir die Library von github auf den Pi:
git clone https://github.com/adafruit/
Adafruit_Python_LED_Backpack.git
►Wechsel in den gedownloadeten Ordner:
cd /home/pi/Adafruit_Python_LED_Backpack
►Installiere die library:
sudo python setup.py install (Installation für Python2)
oder
sudo python3 setup.py install (Installation für Python3)
Da die library direkt aus Github eingefügt wurde, empfiehlt es sich den Ordner in den library Ordner deiner angewendeten Python Version kopieren. Der Vorteil dabei ist, dass du von jedem Ort im Linuxdateisystem die library in deine Python Skripte importieren kannst. Ich benutze die libray für Python3, weshalb ich den Ordner nach usr/local/lib/pythob3.5/dist-packages kopiere.
sudo cp -R /home/pi/Adafruit_Python_LED_Backpack /usr/local/lib/python3.5/dist-packages
Für das Modul sind 4 Kabel notwendig. Das nachfolgende Bild zeigt die Verbindung.
Die Pinouttabelle des Raspberry Pi findest du auf google.
Die Verbindung zum I2C Bus kannst du testen. Solltest du den I2C Bus noch nicht aktiviert haben, aktiviere zuerst den I2C Interface des Raspberry Pi.
►Gehe dafür in das Raspberry Pi Software Configuration Tool:
►Wechsel in das Menü "Interfacing Options" und aktivier den I2C interface unter Punkt 5.
►Reboote den Rasperry Pi und suche nach verbunden I2C Geräten:
sudo i2cdetect -y 1
♦Dort müsste jetzt das Modul unter der Adresse "0x70" gefunden werden.
So, das wars. Jetzt kann die 7 Segmentanzeige mit der library programmiert werden. Falls das Modul nicht gefunden wurde, überprüfe nochmals die Verkabelung.
Im nächsten Schritt programmiere ich die 7 Segmentanzeige. Da per default in der library bereits die Adresse "0x70" eingestellt ist, kann das Modul direkt getestet werden.
►Wechsel dafür in den Ordner home/pi/examples:
cd home/pi/Adafruit_Python_LED_Backpack/examples
und starte das Testskript:
sudo python3 sevensegment_test.py
Es müssten einige Ziffern und Zeichen ausgeben werden.
Die Funktionen der library sind einfach. Schau dir das nächste Codebeispiel an.
from Adafruit_LED_Backpack import SevenSegment as ss import time sv1 = ss.SevenSegment() #Instanziert Klasse SevenSegment als sv1 um mit sv1.[Funktionsname ] auf Funktionen zuzugreifen sv1.begin() #Beginnt Übertragung numbers = [1,2,3,4,5,6,7,8,9] bitmask = [0x64, 0x1B, 0x7F] def show_numbers(numbers): for i in numbers: sv1.clear() #Löschen der aktuellen Displayausgabe sv1.set_colon(True) #Doppelpunkt in der Mitte setzen sv1.set_digit(3, i) #Setzt Nummern (i) an Stelle 3 (recht) sv1.write_display() #Schreibt Werte auf Display time.sleep(1) #Warten 1 Sekunde def show_bitmask(bitmask): for i in bitmask: sv1.clear() sv1.set_brightness(15) #Helligkeit zwischen 1 und 15 sv1.set_colon(False) #Doppelpunkt nicht setzen sv1.set_digit_raw(0, i) #Setzt die Segmente aus Bitmaske sv1.write_display() #Schreibt Werte auf Display time.sleep(1) #Warten 1 Sekunde show_numbers(numbers) show_bitmask(bitmask)
Um das mit Python anzusteuern muss es am Anfang des Skripts importiert werden:
from Adafruit_LED_Backpack import SevenSegment as ss
Als nächstes wird in der Datei SevenSegment.py die Klasse Sevensegment als sv1 instanziiert.
Durch die Instanz sv1 wird auf die Funktionen zugegriffen werden. Mit dem Befehl sv1.begin() wird die Kommunikation zwischen dem Raspberry Pi und dem Modul gestartet.
Die 7 Segmentanzeige hat 4 Ziffern. Um eine Ziffer anzuwählen wird die Funktion sv1.set_digit(ziffer, wert) verwendet. Mit den Werten (0-3) kann die Ziffer ausgewählt werden. Welches Zeichen angezeigt werden soll, wird in die Variable Wert eingetragen. Die Werte können vom Zahlen (integer als Datentyp) oder Buchstaben (string als Datentyp) sein.
Um den gesetzten Wert auf die gewählte Ziffer zu übertragen wird die Funktion sv1.write_display() verwendet.
Über die Funktion sv1.set_colon(boolean) kann der Doppelpunkt in der Mitte mit False oder True an bzw. ausgeschalten werden.
Eine einfache Möglichkeit mehrere Werte auf der Anzeige auszugeben, ist in der Funktion def show_chars(chars): zu finden.
In der Funktion def show_bitmask(bitmask) wird die 7 Segmentanzeige mit nicht mit Zeichen beschrieben sondern direkt mit binären Daten. Jedes Segment benötigt die Information (an oder aus), welche in einer Bitfolge an das Segment gesendet werden. Wie die Bitreihenfolge mit der Segmentanordnung zusammenhängt, siehst du auf der nachfolgenden Grafik.
Mit dem Befehl sv1.set_digit_raw(ziffer, wert) können direkt binär oder hex Werte gesetzt. Die Ziffern in der Funktion sv1.set_digit(ziffer, wert) werden in der library bereits zu HEX Werten für die 7 Segmentanzeige umgewandelt, da der Treiber in bytes arbeitet und nicht mit integer oder strings.
Mit dem Befehl sv1.set_brightness(int) können Helligkeitswerte zwischen 1 und 15 eingestellt werden.
Zum Schluss habe ich noch einen Code erstellt, mit dem die die aktuelle Uhrzeit auf der 7 Segmentanzeige darstellen kannst. Dafür wird zusätzlich die datetime library benötigt, mit der die aktuelle Uhrzeit in Python Programme importiert wird.
from Adafruit_LED_Backpack import SevenSegment as ss import time,datetime sv1 = ss.SevenSegment() #Instanziert Klasse SevenSegment als sv1 um mit sv1.[Funktionsname] auf Funktionen zuzugreifen sv1.begin() #Beginnt Übertragung global switch_colon switch_colon = 0 def show_clock(): global switch_colon switch_colon = 1 - switch_colon #Switch Variable 0->1(True); 1->0(False) für blinkenden Doppelpunkt now = datetime.datetime.now() #Aktuelle Uhrzeit aus datetime modul laden hour = str(now.hour).zfill(2) #Stunden zweistellig darstellen 4 Uhr-> 04; zfill(2) stellt 0 voran. minute =str(now.minute).zfill(2) #Minuten zweistellig darstellen 3 Minuten-> 03; zfill(2) stellt 0 voran. time_now = "".join((hour, minute)) #Minuten und Stunden als String umkonvertieren sv1.clear() #Siebensegement Ausgabe löschen sv1.set_colon(switch_colon) #Doppelpunkt setzen for index, digit in enumerate(time_now, 0): #Anzahl Elemente in time_now durchgehen und nummererien in variable 'digit' 1. Zahl ->0 2.Zahl-1 sv1.set_digit(index, int(digit)) #Setzt Wert aus time_now und an die Stelle auf der 7 Segmentanzeige sv1.write_display() #Schreibt werte auf Display time.sleep(1) #1 Sekunde warten while True: show_clock() #Endlosschleife für Uhrzeitanzeige
Die Uhrzeit wird auf der 7 Segmentanzeige angezeigt. Ich hoffe ich konnte dir mit dem Tutorial helfen. Die Codebeispiele kannst du im Anhang downloaden.