Raspberry mit 7-Segment Anzeige - AZ-Delivery

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:

Verkabelung 7-Segment an RasPi  

 

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.

 

 

 

 

 

DisplaysProjekte für anfängerRaspberry pi

1 comment

Erich Zwiefelhofer

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?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery