ESP8266 – 4×4 Tastatur an analogen Pin verwenden
In diesem Artikel zeige ich Dir, wie Du eine 4×4 Tastatur an einem analogen Port des ESP8266 verwenden kannst.
Für ein Hardware-Projekt suchte ich nach einer Lösung, wir eine Tastatur mit maximal 16 Tasten Port-sparend an einem Arduino Mikrocontroller angeschlossen werden kann. Im Artikel zeige ich Dir die dabei entstandene Platine, welche mit drei Pins (VIN, GND, A0) an einen Arduino Mikrocontroller angeschlossen werden kann.
Verwende Bauteile
Schaltbild und Platine
Im folgenden Schaltbild zeige ich Dir den Aufbau der Schaltung. Bei der Schaltung handelt es sich um ein Spannungsteilernetz. Mit 7 verschiedenen Widerständen (4,7K und 1K) können hier die Tasten identifiziert werden.
Die Platine kann hier im Shop erworben werden.
Der Aufbau der Schaltung ist hierbei mit der Platine denkbar einfach. Hierzu werden die Pins A0, VIN und GND mit dem Arduino Mikrocontroller verbunden. In meinem Fall verwende ich einen ESP8266 Mikrocontroller.
Sketch und Erklärung
Im Sketch wird mittels der analogRead() Funktion der Wert des analogen Pins A0 gelesen. Der Wert liegt zwischen 0 und 1024. Im nächsten Schritt wird der Wert abgefragt und dadurch die gedrückte Taste der Tastatur identifiziert. Die Werte im Sketch basieren auf einem Versuch mit 3V und können daher bei einer Spannung von 5V abweichen.
String lastKey;
void setup() {
Serial.begin(9600);
lastKey = "";
}
void loop() {
int temp = analogRead(A0);
if ( temp > 0 ) {
String statusNr = "";
if ( temp > 900 ) {
statusNr = "1";
} else if (temp > 500 && temp < 520) {
statusNr = "2";
} else if (temp > 320 && temp < 355) {
statusNr = "3";
} else if (temp > 175 && temp < 195) {
statusNr = "4";
} else if (temp > 160 && temp < 170) {
statusNr = "5";
} else if (temp > 135 && temp < 150) {
statusNr = "6";
} else if (temp > 100 && temp < 110) {
statusNr = "7";
} else if (temp > 95 && temp < 100) {
statusNr = "8";
} else if (temp > 85 && temp < 94) {
statusNr = "9";
} else if (temp > 65 && temp < 70) {
statusNr = "0";
} else if (temp > 260 && temp < 270) {
statusNr = "A";
} else if (temp > 110 && temp < 130) {
statusNr = "B";
} else if (temp > 80 && temp < 90) {
statusNr = "C";
} else if (temp > 60 && temp < 65) {
statusNr = "D";
} else if (temp > 70 && temp < 80) {
statusNr = "*";
} else if (temp > 65 && temp < 70) {
statusNr = "#";
}
if ( statusNr != "" ) {
if ( lastKey != statusNr ) {
Serial.print("A0:");
Serial.println(temp);
Serial.print("Key pressed: ");
Serial.println(statusNr);
lastKey = statusNr;
}
}
}
}
Ich hoffe euch gefällt dieser Artikel. Über Kommentare unterhalb des Artikels oder per E-Mail freue ich mich wie immer 🙂
Hallo,
wäre es denn möglich mit der Platin dann den Analog Eingang in Verbindung mit der Tasmota Software auf einem ESP als Template zu definieren. Man könnte doch dann über MQTT und einer Regel den Analogwert weiter schicken und an einer anderen Stelle eine Entwicklungsumgebung auswerten und verarbeiten.
Das wäre doch möglich oder ?
Gruß
Thomas
Hallo Thomas,
ja, grundsätzlich ist das bestimmt möglich. Ich habe das so in der Form aber noch nicht ausprobiert. Was hast Du denn genau vor, wenn es nur um viele Pins geht, dann könntest Du auch einen MCP23017 Port-Expander verwenden. Der funktioniert meines Wissens nach auch mit Tasmota.
https://tasmota.github.io/docs/MCP230xx/
LG Matthias
Hi,
heute habe ich die Platinen bekommen, danke für das schnelle liefern.
Ich habe mit der Tasmota Firmware, mit dem generischen Generic18 Profil, auf dem A0 GPIO den ADC Input gelegt und bekomme damit die Analogwerte als Eingang geliefert.
Sprich, genau auch deine Sketchauswertung kommen die Analogwerte in der Tasmota Firmware an.
Von daher ist vom Prinzip alles gleich, hätte mich fast gewundert wenn das anders gewesen wäre.
Im Sketch kann man zwar auch einen MQTT Client mit einbinden, da ich aber schon so viele Geräte als Tasmota einsetze, nutze ich für den Fall auch die Tasmota Firmware. Die anderen speziellen Arduino Projekte laufen trotzdem weiterhin.
Gruß
Hallo Thomas,
super, vielen Dank für Dein Feedback 🙂
LG Matthias