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.
Betriebsspannung | 3,3V bis 5V |
---|---|
Max. Stromaufnahme | 90mA (je nach Farbe) |
Betriebstemperatur | -10°C bis +80°C |
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 |
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);
}
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;
}
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);
}
zurück