Die Joy-it SBC-Buttonmatrix ist sehr einfach aufgebaut: Sie besteht aus 16 Tastern. Wird zum Beispiel der Taster S10 (Spalte 1, Reihe/Zeile 2) gedrückt, dann wird eine leitende Verbindung zwischen den Pins 5 und 1 des Moduls hergestellt (vgl. Abb.1 und nachfolgende Tabelle).
Die Zuordnung der Spalten- und Reihen-Indizes zu den Pins ergibt sich aus der folgenden Tabelle:
Pin der Buttonmatix | Spaltenindex | Reihenenindex | ESP32-Pin |
0 | - | 3 | 27 |
1 | - | 2 | 26 |
2 | - | 1 | 25 |
3 | - | 0 | 33 |
4 | 0 | - | 12 |
5 | 1 | - | 13 |
6 | 2 | - | 15 |
7 | 3 | - | 2 |
In dieser Tabelle wurde in der letzten Spalte auch gleich angegeben, wie ich diese Pins an den TTGO (ESP32) angeschlossen habe.
2. Ein einfaches Programm
Mit dem folgenden Programm button_mtx_1.py werden die gedrückten Taster angezeigt; zwei Anzeige-Möglichkeiten gibt es:
- Angabe der Button-Bezeichnung gemäß der Platinenbeschriftung
- Angabe von Reihen- und Spaltenindex
Code: Alles auswählen
# button_mtx_1.py
# SBC_Button_Matrix
# Ein- und Ausgänge testen
# Weil reihe_2 (Pin26 des ESP32) an Pin 1 der Buttonmatrix angeschlossen ist und spalte_1 (Pin13 des ESP32) an Pin 5 (s. u.),
# werden beim Drücken der Taste S10 (Spalte 1, Reihe 2) die Anschlüsse 5 und 1 der Button-Matrix miteinander leitend verbunden
# dadurch wird der Eingang Pin13 des ESP32 auf Low gezogen.
from machine import Pin
from time import sleep_ms
reihe = [0 for i in range(4)]
spalte = [0 for i in range(4)]
# ESP-Pin -> Button_MTX-Pin:
reihe[3] = Pin(27, Pin.OUT) # -> 0
reihe[2] = Pin(26, Pin.OUT) # -> 1
reihe[1] = Pin(25, Pin.OUT) # -> 2
reihe[0] = Pin(33, Pin.OUT) # -> 3
spalte[0] = Pin(12, Pin.IN, Pin.PULL_UP) # -> 4
spalte[1] = Pin(13, Pin.IN, Pin.PULL_UP) # -> 5
spalte[2] = Pin(15, Pin.IN, Pin.PULL_UP) # -> 6
spalte[3] = Pin(2, Pin.IN, Pin.PULL_UP) # -> 7
def auswertung1(r, s): # Bezeichnung gemäß der Platinenbeschriftung
button = 'S' + str(r*4+s+1)
print('gedrückt:', button)
def auswertung2(r, s): # Reihen- und Spalten-Index
print('gedrückt: Reihe:', str(r), '; Spalte:', str(s))
while True:
for i in range(4):
for k in range(4):
reihe[k].value(i != k) # nur reihe[i] mit Wert 0 (Low) markieren, die restlichen mit 1 (High)
for j in range(4):
if not spalte[j].value() : # d. h. wenn aktueller Spaltenwert Low ist, dann liegt eine leitende Verbindung zwischen Reihe i und Spalte j vor
auswertung1(i, j)
auswertung2(i, j)
print()
# warten bis Button losgelassen wird, d. h. spalte[j].value() wieder High (1) ist:
while not spalte[j].value():
sleep_ms(10) # Taster-Prellen abwarten
3. Arbeiten mit dem Modul btn_mtx.py
Dieses Modul stellt die Klasse BTN_MTX zur Verfügung. Damit lässt sich unsere Buttonmatrix leicht und übersichtlich in andere Projekte einfügen. Mit der Anweisung
btn_mtx = BTN_MTX(btn_to_esp_liste)
erzeugen wir zunächst eine Instanz btn_mtx dieser Klasse; dabei gibt die Liste btn_to_esp_list an, wie die Pins der Buttonmatrix den GPIO-Pins des ESP32 zugeordnet werden sollen (Genaueres dazu im folgenden Programm-Code).
Die Klasse stellt drei Methoden und zwei Eigenschaften zur Verfügung:
- do_btn() wartet auf einen Tastendruck und gibt die Werte für den entsprechenden Spalten- bzw. Reihen-Index als Tupel zurück.
- auswertung1() und auswertung2() geben die Taster-Informationen des letzten Tasterdrucks wie in Abschnitt 2 dargestellt aus.
- Die Eigenschaften r und s geben den Reihen- bzw. Spalten-Index des zuletzt betätigten Tasters an.
Code: Alles auswählen
from btn_mtx import BTN_MTX
# Test für BTN_MTX-Klasse
# Btn-Pin <-> ESP32-Pin
# 0 <-> 27
# 1 <-> 26
# 2 <-> 25
# 3 <-> 33
# 4 <-> 12
# 5 <-> 13
# 6 <-> 15
# 7 <-> 2
btn_to_esp_list = [27, 26, 25, 33, 12, 13, 15, 2]
btn_mtx = BTN_MTX(btn_to_esp_list) # Instanziierung
while True:
# (r, s) = btn_mtx.do_btn() # Tasterbestimmung, liefert als Rückgabewert ein Tupel mit dem Reihen- und Spaltenwert
# print(r, s)
print(btn_mtx.r, btn_mtx.s)
btn_mtx.do_btn() # Tastenbestimmung
btn_mtx.auswertung1() # Ausgabe-Möglichkeit 1
btn_mtx.auswertung2() # Ausgabe-Möglichkeit 2
print(btn_mtx.r, btn_mtx.s)
print()
Code: Alles auswählen
None None
gedrückt: S8
gedrückt: Reihe: 1 ; Spalte: 3
1 3
1 3
gedrückt: S13
gedrückt: Reihe: 3 ; Spalte: 0
3 0
.