4 digits-7 segmenten LED display met TM1637 controller aansturen

Voor slechts enkele euro’s kun je op het internet een LED display kopen. Een populaire LED display is de 4 digits met 7 segmenten aansturing, deze is vooral bekend van de wekkerradio’s. Deze LED displays worden vaak verkocht inclusief een TM1637 controller, die je heel eenvoudig kunt aansturen met een Raspberry Pi.

In dit stappenplan sluiten we een LED display met TM1637 controller aan op een Raspberry Pi en laten we als demo de actuele tijd weergeven. Je kunt het display natuurlijk ook gebruiken voor andere doeleinden zoals bijvoorbeeld de temperatuur of processor belasting weer te geven.

Componenten voor dit project

De gebruikte componenten voor dit stappenplan, klik op een component voor meer informatie.

4 Digit 7 segment LED display met TM1637 backpack
4 xDupont verbindingskabel (female/female)

Aansluitschema Raspberry Pi

Sluit de LED aan op je Raspberry Pi volgens onderstaand schema:

TM1637 Board Pin Functie RPI Pin Raspberry Functie
GND Ground 14 GND
VCC +5V Power 4 5V
DI0 Data In 18 GPIO 24
CLK Clock 16 GPIO 23

Raspberry Pi GPIO Layout

TM1637 script

Om de LED aan te kunnen sturen maken we gebruik van een speciaal script met voorgedefinieerde functies. In het script zijn verschillende functies aanwezig, zo kun je onder andere getallen weergeven en de intensiteit van de LEDS aanpassen. Download het script met het commando:

wget https://raspberrytips.nl/files/tm1637.py

Origineel van het script kun je ook hier terugvinden op Github.

Demo klok script

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# https://raspberrytips.nl

import sys
import time
import datetime
import RPi.GPIO as GPIO
import tm1637

#CLK -> GPIO23 (Pin 16)
#Di0 -> GPIO24 (Pin 18)

Display = tm1637.TM1637(23,24,tm1637.BRIGHT_TYPICAL)

Display.Clear()
Display.SetBrightnes(1)

while(True):
   now = datetime.datetime.now()
   hour = now.hour
   minute = now.minute
   second = now.second
   currenttime = [ int(hour / 10), hour % 10, int(minute / 10), minute % 10 ]

   Display.Show(currenttime)
   Display.ShowDoublepoint(second % 2)

   time.sleep(1)

Als demo heb ik een script gemaakt die de huidige tijd weergeeft, kopieer het bovenstaande script of download het direct naar je Raspberry Pi met:

wget https://raspberrytips.nl/files/47digitclock.py

Het klok script heeft het tm1637.py script nodig om te kunnen werken, plaats dus beide bestanden in dezelfde map. Start het klok script met het commando:

python 47digitclock.py

De tijd verschijnt op het LED display en je zult zien dat de ‘:’ per seconde aan/uit gaat.

FullSizeRender

Script functies

Het klok script maakt gebruik van de onderstaande functies, gedefinieerd in tm1637.py:

Display.Clear() – Maakt het display legen mochten er nog individuele LEDS actief zijn.

Display.SetBrightnes(x) – Hierna kun je de helderheid van het display aanpassen, minimaal 0 en maximaal 7.

Display.Show(x,x,x,x) – Laat de daadwerkelijke 4 cijfers (digits) zien, x kan 0 t/m 9 zijn.

Display.ShowDoublepoint(status) – Aansturing voor de ‘:’ tussen de tweede en derde digit, true(1) = aan / false(0) = uit.

15 gedachten over “4 digits-7 segmenten LED display met TM1637 controller aansturen”

  1. Hoe kun je dit programma zelfstandig automatisch opstarten bij aanzetten raspberry zonder monitor en keyboard?

    Verder werkt het heel erg mooi, synchroom met een zendergestuurde klok.

    Beantwoorden
  2. Pingback: TM1637 | Isnochys
  3. Veel dank voor het tm1637 script. Ik ben bezig met een wakeuplight te bouwen en daar hoort ook een LED display bij 🙂

    Soms echter krijg ik een runtime error in regel 124 van tm1637.py:
    Unhandled exception in thread started by
    Traceback (most recent call last):
    File “./threadtest.py”, line 62, in setBrightness
    Display.SetBrightnes(brightnes)
    File “/home/pi/scripts/tm1637.py”, line 82, in SetBrightnes
    self.Show(self.__currentData);
    File “/home/pi/scripts/tm1637.py”, line 61, in Show
    self.start();
    File “/home/pi/scripts/tm1637.py”, line 124, in start
    IO.output( self.__Datapin, HIGH)
    RuntimeError: The GPIO channel has not been set up as an OUTPUT

    Het gevolg is dat het display niet meer wordt aangestuurd en ‘bevriest’. Ik heb een brute poging gedaan door boven de betreffende regel dit commando te plaatsen:
    IO.setup(self.__Datapin,OUTPUT)

    k blijf echter dezelfde foutmelding krijgen. Het lijkt op een race condition, maar mijn programmeerkennis is niet heel erg ontwikkeld mo.et ik toegeven. Als iemand enig idee heb hoor ik het graag.

    Beantwoorden
  4. Hoi de klok werkt prima, nu de volgende uitdaging. De helderheid voluit en een vergrootglas ervoor en projecteren op het plafond. En toen stond het in spiegelschrift… nu de aanpassing in de software om de digits in mirror image te krijgen.
    Een spiegel geeft teveel verlies.

    Beantwoorden
    • Bedankt voor deze waardevolle tip!

      Ik heb voor mij zelf de onderstaande comments in mijn klok/temperatuur-script gezet om mij zelf er aan te herinneren hoe ik een graden-symbool op mijn display krijg.
      Misschien dat anderen iets aan mijn uitleg hebben. Bij mij werkt het in ieder geval allemaal. 🙂

      # Aanpassen beschikbare karakters:
      # Er zijn 16 hexadecimale posities gedefinieerd in driverscript tm1637.py bij de variabele “HexDigits”. Elke positie bevat een hexadeximale waarde voor welke digits worden aangestuurd.
      # Op https://en.wikipedia.org/wiki/Seven-segment_display is een overzicht van de indeling segmenten A t/m G te vinden. Het berekenen begint binair bij G en eindigt met A.
      # Voor een gradensymbool heb je dus elementen A, B, F en G nodig en daar voor noteer je een 1. Voor de elementen C, D en E noteer je een 0.
      # Op volgorde heb je dus: G = 1, F = 1, E = 0, D = 0, C = 0, B = 1, A = 1 Compleet binair: 1100011
      # Met een omrekentool van binair naar hexadecimaal (Windows 10 calculator kan het bijvoorbeeld) krijg je dan 63.
      # Voor de notatie in tm1637.py schrijf je 0x63 op de positie in de array waar je dit karakter wilt gebruiken. Ik wil hem op de plek van de “b” gebruiken en dus vervang ik 0x7C door 0x63.
      # Om het voor mij zelf makkelijker te maken heb ik het hexadecimale indexnummer toegewezen aan een variabele CHAR_DEG in mijn eigen script (dus niet het driverscript tm1637.py!) zodat ik die later kan gebruiken om hem op te roepen met Display.Show1(2,CHAR_DEG).
      # Daarmee wordt op positie 2 het graden-symbool getoond.

      Beantwoorden
    • Ik ben ook benieuwd of je 6 bits kunt aansturen. Volgens de datasheet zou het moeten kunnen, het klok script heb ik al aangepast, de grid aansluiting 5 en 6 aangesloten, maar er gebeurt niet zoveel in de display, je verwacht dan je seconden, maar nee. Ik heb al in de driver gekeken, maar kom ik niet zo uit.

      Beantwoorden
  5. Het werkt niet helemaal zoals het hoort, ik zie dan wel geen errors in de Python Shell maar het display doet heel raar en de eerste digit klopt gewoon niks van en elke paar seconden dan verandert zeg maar de hele weergave van het display en dan een paar seconden later verandert de eerste digit weer in wat anders wat niet zo hoort te zijn, ik heb ook al verschillende drivers uitgeprobeerd van GitHub maar er is niet één die gewoon werkt zoals het zou moeten of gewoon helemaal niet.

    Ik vind het maar vreemd en ik kom er geen wijs uit omdat ik niet bekend ben met Python.

    Best irritant eigenlijk dat werkelijk alles zo omslachtig moet zijn en dat niks meteen de eerste keer doet wat je ervan verwacht vind ik… En het is niet anders voor Arduino en anderen want die hebben meestal nog minder support en minder community members en dan word het al helemaal moeilijk.

    Vriendelijke groeten,
    Ricardo Penders CEO
    _SoHarD_dB_w@®Ez_

    Beantwoorden

Plaats een reactie