TM1637-Module mit 7-Segmentanzeigen

Als "TM1637" wird meist ein ganzes Modul mit 7-fach-LED-Segmentanzeigen (4 oder 6 Ziffern) und einem speziellen Treiberchip (TM1637) bezeichnet. Diese günstigen und recht einfach anzusteuernden Module können sehr vielseitig eingesetzt werden, z.B. als Anzeige für Sensoren, Spannung, Strom, Uhren etc. Sie können sowohl Ziffern, Striche, Punkte, sowie etliche Buchstaben in verschiedenen Helligkeiten darstellen. Beim Kauf der Module sollte darauf geachtet werden, welche Stellen bzw. Ziffern auf dem Modul verbaut wurden, denn manche Module haben z.B. einen Doppelpunkt zwischen der 2ten und 3ten Ziffer, andere wiederum nicht.

Spezifikationen des TM1637-Moduls

Betriebsspannung 3,3V bis 5V
Max. Stromaufnahme 90mA (je nach Farbe)
Betriebstemperatur -10°C bis +80°C
TM1637 Display-Modul mit 4 Ziffern
Abb.: TM1637 Display-Modul mit 4 Ziffern

Verwendete Bauteile

Anschlüsse

Das TM1637-Modul benötigt nur zwei Anschlüsse und kann mit dem Arduino auf beliebige digitale Ausgänge gelegt werden (hier werden D2 und D3 verwendet)

TM1637 Arduino
CLK D2
DIO D3
GND GND
5V (VCC) 5V

Demo der Anzeigemöglichkeiten

Die Arduino-Library avishorp/TM1637 bietet komfortable Möglichkeiten, das TM1637-Modul anzusteuern und der folgende Sketch (vom Original-Beispiel entnommen) zeigt die verschiedenen Anzeigeoptionen. Gleichzeitig dient er als Test des Moduls; so können fehlerhafte Segmente o.ä. schnell ermittelt werden.

#include <TM1637Display.h>

#define PIN_CLK 2
#define PIN_DIO 3

#define TEST_DELAY 1000 // delay between tests in ms

const uint8_t SEG_DONE[] = {
    SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
    SEG_C | SEG_E | SEG_G,                           // n
    SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
};

TM1637Display display(PIN_CLK, PIN_DIO);

void setup() {}

void loop()
{
    int k;
    uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
    uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };

    display.setBrightness(0x0f);

    // All segments on
    display.setSegments(data);
    delay(TEST_DELAY);

    // Selectively set different digits
    data[0] = display.encodeDigit(0);
    data[1] = display.encodeDigit(1);
    data[2] = display.encodeDigit(2);
    data[3] = display.encodeDigit(3);
    display.setSegments(data);
    delay(TEST_DELAY);

    display.clear();
    display.setSegments(data + 2, 2, 2);
    delay(TEST_DELAY);

    display.clear();
    display.setSegments(data + 2, 2, 1);
    delay(TEST_DELAY);

    display.clear();
    display.setSegments(data + 1, 3, 1);
    delay(TEST_DELAY);

    // Show decimal numbers with/without leading zeros
    display.showNumberDec(0, false); // Expect: ___0
    delay(TEST_DELAY);
    display.showNumberDec(0, true);  // Expect: 0000
    delay(TEST_DELAY);
    display.showNumberDec(1, false); // Expect: ___1
    delay(TEST_DELAY);
    display.showNumberDec(1, true);  // Expect: 0001
    delay(TEST_DELAY);
    display.showNumberDec(301, false); // Expect: _301
    delay(TEST_DELAY);
    display.showNumberDec(301, true); // Expect: 0301
    delay(TEST_DELAY);
    display.clear();
    display.showNumberDec(14, false, 2, 1); // Expect: _14_
    delay(TEST_DELAY);
    display.clear();
    display.showNumberDec(4, true, 2, 2);  // Expect: __04
    delay(TEST_DELAY);
    display.showNumberDec(-1, false);  // Expect: __-1
    delay(TEST_DELAY);
    display.showNumberDec(-12);        // Expect: _-12
    delay(TEST_DELAY);
    display.showNumberDec(-999);       // Expect: -999
    delay(TEST_DELAY);
    display.clear();
    display.showNumberDec(-5, false, 3, 0); // Expect: _-5_
    delay(TEST_DELAY);
    display.showNumberHexEx(0xf1af);        // Expect: f1Af
    delay(TEST_DELAY);
    display.showNumberHexEx(0x2c);          // Expect: __2C
    delay(TEST_DELAY);
    display.showNumberHexEx(0xd1, 0, true); // Expect: 00d1
    delay(TEST_DELAY);
    display.clear();
    display.showNumberHexEx(0xd1, 0, true, 2); // Expect: d1__
    delay(TEST_DELAY);

    // Run through all the dots
    for (k=0; k<=4; k++) {
        display.showNumberDecEx(0, (0x80 >> k), true);
        delay(TEST_DELAY);
    }

    // Brightness Test
    for (k=0; k<4; k++) {
        data[k] = 0xff;
    }
    for (k=0; k<7; k++) {
        display.setBrightness(k);
        display.setSegments(data);
        delay(TEST_DELAY);
    }

    // On/Off test
    for (k=0; k<4; k++) {
        display.setBrightness(7, false);  // Turn off
        display.setSegments(data);
        delay(TEST_DELAY);
        display.setBrightness(7, true); // Turn on
        display.setSegments(data);
        delay(TEST_DELAY);
    }

    // Done!
    display.setSegments(SEG_DONE);

    while (true);
}
Video: Demo des TM1637-Display Moduls mit 4 Ziffern

Segmente ansteuern

Segmente des Displays

Der folgende Sketch steuert alle Segmente der Ziffern hintereinander einzeln an.

#include <TM1637Display.h>

#define PIN_CLK 2
#define PIN_DIO 3

TM1637Display display(PIN_CLK, PIN_DIO);
const uint8_t segs[] = {0, SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G, SEG_DP};

void setup()
{
    display.clear();
    display.setBrightness(0xff);
}

void loop()
{
    static uint8_t data[] = {0, 0, 0, 0};
    static byte i = 0;

    for (byte d = 0; d < 4; d++) {
        data[d] = segs[i];
        display.setSegments(data);
        delay(300);
    }

    i++;
    i %= 9;
}

6-Ziffern-Display ansteuern

TM1637 Display-Modul mit 6 Ziffern
Abb.: TM1637 Display-Modul mit 6 Ziffern
TM1637 Display-Modul mit 6 Ziffern (Unterseite)
Abb.: TM1637 Display-Modul mit 6 Ziffern (Unterseite)

Der folgende Sketch soll ein TM1637-Display mit 6 Ziffern testen. Leider hat bei mir die bisher verwendete Library nicht richtig funktioniert, daher habe ich die Arduino-Library TinyTronics/TM1637_6D für die folgenden Sketches verwendet.

#include <TM1637_6D.h>

#define PIN_CLK 3
#define PIN_DIO 2

TM1637_6D display(PIN_CLK, PIN_DIO);

void setup()
{
    display.init();
    display.set(4); // brightness values: [0..7]
}
void loop()
{
    display.displayInteger(millis(), false); // "true" for leading zeros
    delay(50);
}
Test eines 6 Ziffern TM1637-Displays
Abb.: Ansteuerung des TM1637-Displays mit 6 Ziffern
zurück