LED&KEY Module - TM1638

Das LED&KEY Module findet man des öfteren auf Aliexpress oder Ebay. Das Modul basiert auf einem TM1638 Chip.

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.

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:

Wikipedia: Polling

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
Zuletzt geändert 05.01.2017