7 Segmentanzeige HT16K33 mit Raspberry Pi im I2C ansteuern

7 Segmentanzeige HT16K33 mit Raspberry Pi im I2C ansteuern - Control-LED

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 habe zwar im Moment noch keine Ahnung wozu ich die 7 Segmentanzeigen einsetzen soll, aber eine Uhr lässt sich doch gut mit den 4 Ziffern darstellen. Kannst du mir erklären, wie ich die Uhrzeit auf den 7 Segmentanzeigen anzeigen lassen kann?

 

 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.

 

1. Installation der Python library

 

►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

 

2. Verkabelung des Moduls

 

Für das Modul sind 4 Kabel notwendig. Das nachfolgende Bild zeigt die Verbindung.

7SegmentVerkabelung

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.
 

I2C aktivieren
 

►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.
 

I2C Devices auflisten


So, das wars. Jetzt kann die 7 Segmentanzeige mit der library programmiert werden. Falls das Modul nicht gefunden wurde, überprüfe nochmals die Verkabelung.

 

3. Testen der 7 Segmentanzeige

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.

Ok, es funktioniert. Wie importiere ich die Library in mein Python Skript und mit welchen Befehlen kann ich das Modul ansprechen.

 

4. Beispielcode zur Anwendung des HT16K33 Modul

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.

7 Segment Bitmasken

 

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.

 

 

5. Datetime Python Modul auf 7 Segmentanzeige

 

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. 

wink