LED&KEY Module - TM1638
Die LED&KEY TM1638 Modul Dokumentation ist noch in Bearbeitung. In nächster Zeit erweitert sich noch die Dokumentation.
Overview
LED&KEY
Das LED&KEY Modul ist ein tolles Modul zum Beispiel für das testen seines Programmcodes. Gerade bevor man seinen Code in einer echten Umgebung testet, also zum Beispiel am Einsatzort, ist es möglich mit dem LED&KEY Modul viele Möglichkeiten und Szenarien vorher schon durchspielen und debuggen. Das Modul besitzt ein kleines “Pad” mit acht kleinen Tastern. Als Ausgabe Möglichkeit bieten sich die acht LEDs an, wie auch die acht 7-Segment Anzeigen.
Blog
Anschluss
Verbindung eines WEMOS D1 Mini mit dem LED&KEY Modul
Wemos D1 Mini PIN | LED&KEY Board PIN | Anmerkungen |
---|---|---|
3v3 | VCC | +3.3V |
G | GND | Ground (Masse) |
D5 | DIO | Data I/O |
D6 | CLK | Clock (Takt Eingang) |
D7 | STB | Standby |
Benutzung
Die Benutzung ist selbsterklärend. Tasten drücken, Display ablesen.
Code
Libraries
Ich habe die Library: https://github.com/rjbatista/tm1638-library geforked, da leider in
der Original Library ein kleiner Bug nicht ausgebessert wurde und Merge-Requests
nicht angenommen werden. Im Prinzip habe ich eigentlich alles so gelassen nur
die min
-Funktionen abgeändert.
Die oben genannte Library funktioniert auch mit einem ESP8266.
Einbinden der Library:
#include <TM1638.h>
Library mit deiner PIN Belegung initialisieren.
/// ledkey_module(DIO, CLK, STB);
TM1638 ledkey_module(D5, D6, D7);
Beispiele
Eine LED leuchten lassen.
Mit der tm1638-library, siehe oben, ist folgendes möglich:
ledkey_module.setLEDs(led_state);
led_state
repräsentiert ein Byte in dem jedes Bit den Status einer LED angibt.
Zum Beispiel:
Bit# | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
2^8 | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | |
Wert: | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Dies wäre der Wert: 0x06
in Hexadezimal Schreibweise. Um es zu vereinfachen kann man
folgendes enum
benutzen:
enum {
LED1 = 0u,
LED2 = 1u,
LED3 = 2u,
LED4 = 4u,
LED5 = 8u,
LED6 = 16u,
LED7 = 32u,
LED8 = 64u
};
Mit der obigen enumeration
ist nun folgendes möglich:
ledkey_module.setLEDs(LED1 | LED5 | LED7);
Man verodert einfach die einzelnen Zustände auf die man kommen möchte und erhält somit seinen Wert. Allerdings zerstört man den Wertm welcher davor in dem Byte lag. Um dies zu verhindern habe ich mir ein kleines Makro geschrieben:
#define SET_BIT(A, i, val) \
do{ A &= ~(1u << i); A |= (val << i); } while(false)
Das Makro zu benutzen ist einfach:
SET_BIT(led_state, number, val);
ledkey_module.setLEDs(led_state);
number
steht für die LED beginnend von links mit 0 und als value
einfach den Wert
binär übergeben, also 0
oder 1
.
Auf das Display schreiben
Eine Zeichenkette auf das 7-Segment Display zu schreiben ist Kinderleicht. Dazu einfach folgendes tun:
String str = "0123ABCD";
module.setDisplayToString(str);
Tasten drücke lesen
Um Tasten drücke zu lesen, überprüft man den Status des Tasters in einer Schleife immer und immer wieder. Falls man oft genug prüft bekommt man diesen Tastendruck mit. Zum Beispiel dauert ein Tastendruck ungefähr 100ms, falls man jetzt alle 50ms den Tastendruck überprüft würde man keinen Tastendruck verpassen.
Diese Methode wird Polling genannt. Mehr dazu auf der Wikipedia:
Die Buttons lassen sich mithilfe der Library-Funktion getButtons()
auslesen. Der aufruf gibt einem ein Byte zurück
in dem jedes Bit mit einem Wert 1
einen Knopfdruck repräsentiert. Ich empfehle mindestens mit 100ms zu pollen
andernfalls könnte man Knopfdrücke verpassen.
Man sollte also so oft und so wenig wie möglich pollen. Zum Beispiel so:
buttons = module.getButtons();
Obiger Funktionsaufruf gibt einem ein byte
zurück mit demensprechend den 8 Buttons. Wenn zum Beispiel
Button 0 gedrückt worden ist, dann lieftert die Funktion: 0x01
. Manchmal möchte man aber nur auf einen
spezifischen Tastendruck reagieren. Folgender Code bietet sich an:
typedef enum {
BTN1 = 1,
BTN2 = 2u,
BTN3 = 4u,
BTN4 = 8u,
BTN5 = 16u,
BTN6 = 32u,
BTN7 = 64u,
BTN8 = 128u
} BTN;
bool get_pressed(const byte &state, const BTN check, ) {
byte btn_state = (state & check);
return btn_state / check;
}
So könnte man dann Beispielsweise den Status von Button 2 bekommen:
if(get_pressed(act_reading, BTN2)) {
//Button 2 was pressed
}
Für ein mehr ins Detail gehendes Beispiel: GitHub Example
Example on Github
Ein Beispiel findet sich auf Github. Github: turais
Blynk Example
https://github.com/turais/ledandkey_example
Buy
Die folgenden Links sind sogenannte Affiliate-Links. Bei einem kauf bekomme ich eine kleine Provision. Es entstehen bei dem Kauf keinerlei Mehrkosten.
comments powered by Disqus