zurück

TM1638 Button/LED-Modul

11.04.2020

Das hier verwendete Arduino-Modul kann sowohl für schnelle Tests im Bereich der Arduino-Programmierung verwendet werden, als auch als Anzeige-Modul für verschiedenste Projekte, z.B. Anzeige von Sensor-Daten.

TM1638 Button/LED-Modul für Arduino

Features laut Hersteller

Verwendete Bauteile

Anschlüsse und Aufbau

Das TM1638-Modul wird über eine SPI-Schnittstelle angesprochen, so dass die Anzahl an PINs für den Arduino minimal ist. (Die Pins am Arduino kann man auch variieren und sind hier nur beispielhaft angegeben)

TM1638 Beschreibung Arduino
VCC Spannungsversorgung 5V 5V
GND Ground (Masse) GND
STB Strobe Pin Pin 8
CLK Clock Pin Pin 9
DIO Data Pin Pin 10

Sketches

Die folgenden Programm-Beispiele sollen die Funktionalität des TM1638-Moduls zeigen und verwenden alle die Library tm1638-library.

Tests der Mikrotaster

Dieser Sketch liest die Mikrotaster des TM1638-Moduls aus und stellt deren Bit-Position auf den 7-Segment-Anzeigen dar. Werden mehrere Taster gleichzeitig gerückt, so werden die entsprechenden Werte zusammengerechnet dargestellt.

#include <TM1638.h>

#define PIN_DIO 10
#define PIN_CLK 9
#define PIN_STB 8

TM1638 modul(PIN_DIO, PIN_CLK, PIN_STB);

void setup() {}

void loop()
{
    byte button = modul.getButtons();
    modul.setDisplayToDecNumber(button, 0b00000000, false);
}

Tests der LEDs

In diesem Sketch werden zunächst nacheinander jede der 3mm-LEDs beleuchtet. Dann wird ein schneller über dieses LEDs berechnet. Im loop()-Teil werden je nach Druck auf einen der Mikrotaster die entsprechende LED beleuchtet.

#include <TM1638.h>

#define PIN_DIO 10
#define PIN_CLK 9
#define PIN_STB 8

TM1638 modul(PIN_DIO, PIN_CLK, PIN_STB);

void setup()
{
    // show every single LED
    byte leds[] = {1, 2, 4, 8, 16, 32, 64, 128};
    for (byte i = 0; i < 8; i++) {
        modul.setLEDs(leds[i]);
        delay(250);
    }

    // binary counter
    for (byte i = 0; i < 255; i++) {
        modul.setLEDs(i);
        delay(50);
    }

    delay(1000);
    modul.setLEDs(0);
}

void loop()
{
    // show LED corresponding to pressed button
    byte button = modul.getButtons();
    modul.setLEDs(button);
}

Text-Scrolling

Dieser Sketch lässt einen beliebigen Text über die acht 7-Segment-Anzeigen durchrollen.

#include <TM1638.h>

#define PIN_DATA 10
#define PIN_CLOCK 9
#define PIN_STROBE 8

TM1638 module = TM1638(PIN_DATA, PIN_CLOCK, PIN_STROBE);

const char string[] = "       PROJEKTE UND EXPERIMENTE UNTER - ELEKTRO.TURANIS.DE       ";
int base = 0;

void setup() {}

void loop()
{
    const char* pos = string + base + 8;

    if (pos >= string && pos + 8 < string + sizeof(string)) {
        module.setDisplayToString(pos);
    } else {
        module.clearDisplay();
    }

    base++;
    if (base == sizeof(string) - 8) {
        base = -8;
    }

    delay(200);
}

Funktionstest

Der letzte Sketch ist von einem der vorgegebenen Beispielen der TM1638-Library abgewandelt und testet etliche verschiedene Funktionen des Moduls.

#include <TM1638.h>

#define PIN_DATA 10
#define PIN_CLOCK 9
#define PIN_STROBE 8

TM1638 module = TM1638(PIN_DATA, PIN_CLOCK, PIN_STROBE);
byte mode = 0;
unsigned long startTime;

void setup()
{
    startTime = millis();
    module.setupDisplay(true, 7);
}

void loop()
{
    byte buttons = module.getButtons();
    unsigned long runningSecs = (millis() - startTime) / 100;

    // button pressed - change mode
    if (buttons != 0) {
        mode++;
        mode%=8;
        module.clearDisplay();
        module.setLEDs(0);
    }

    switch (mode) {
        case 0:
            module.setDisplayToDecNumber(runningSecs, 1 << 7);
            break;
        case 1:
            module.setDisplayToDecNumber(runningSecs, 1 << 6, false);
            break;
        case 2:
            module.setDisplayToHexNumber(runningSecs, 1 << 5);
            break;
        case 3:
            module.setDisplayToHexNumber(runningSecs, 1 << 4, false);
            break;
        case 4:
            module.setDisplayToBinNumber(runningSecs, 1 << 3);
            break;
        case 5:
            module.clearDisplayDigit((runningSecs - 1) % 8, 0);
            module.setDisplayDigit(runningSecs % 8, runningSecs % 8, 0);
            break;
        case 6:
            char s[8];
            sprintf(s, "Secs %03d", runningSecs % 999);
            module.setDisplayToString(s);
            break;
        case 7:
            if (runningSecs % 2 == 0) {
                module.setDisplayToString("TM1638  ");
            } else {
                module.setDisplayToString("LIBRARY ");
            }
            module.setLED(0, (runningSecs - 1) % 8);
            module.setLED(1 + runningSecs % 3, runningSecs % 8);
            break;
        case 8:
        default:
            module.setDisplayToError();
            break;
    }
}