Start › Anleitungen › BLE-Lautstärkeknopf für das Monitor-Handy
BLE-Lautstärkeknopf für das Monitor-Handy
Drehknopf auf ESP32-C3, der sich als Bluetooth-Tastatur meldet und Lautstärke und Stummschaltung steuert
esp32bluetoothselbstbau
An der Wand hängt ein altes Handy als Monitor, darauf läuft JaYTrX und gibt mit, was auf den Talkgroups los ist. Leiser stellen oder kurz stummschalten heißt dann: den richtigen Eintrag im Menü suchen. Die Lautstärkewippe am Rand ist in einer Wandhalterung meist schlecht erreichbar oder ganz verdeckt.
Ein Drehknopf löst das. Der ESP32-C3 meldet sich per Bluetooth LE als HID-Media-Tastatur an und schickt genau die Tastencodes, die Android ohnehin kennt. Es braucht keine App auf dem Handy und keine besonderen Rechte: Drehen ändert die Medienlautstärke, Drücken schaltet stumm.
Was du brauchst
- ESP32-C3 Super Mini (jedes C3-Board mit nativem USB-Serial/JTAG geht)
- Drehencoder KY-040 mit Taster
- fünf Adern und ein USB-C-Netzteil zur Versorgung
- optional 3 × 10 nF zum Entprellen und 1 × 100 nF zum Abblocken der Versorgung
Verdrahtung
| KY-040 | ESP32-C3 |
|---|---|
| CLK | GPIO1 |
| DT | GPIO3 |
| SW | GPIO4 |
| + | 3V3 |
| GND | GND |
Die Stiftleiste des KY-040 passt geometrisch genau auf die Pads GND, 3V3, GPIO4, GPIO3, GPIO2. Verlockend, denn nur in dieser Lage liegen GND und 3V3 nebeneinander und das Modul ließe sich direkt auflöten, aber CLK läge dann auf GPIO2. Das ist ein Strapping-Pin: steht der Knopf beim Einschalten zwischen zwei Rasten, zieht der Kontakt GPIO2 auf Masse und das Board bootet nicht. Ein Pullup, der GPIO2 beim Boot sicher oben hält, macht das Encoder-Signal im Betrieb unlesbar. Deshalb CLK per Draht auf GPIO1 und GPIO2 frei lassen. Ebenfalls frei bleiben GPIO8 (LED) und GPIO9 (BOOT).
Speisung an 3V3, nicht an 5V. Die Pullups des Moduls hängen am +-Pin, mit 5 V lägen
5 V auf den GPIOs des C3. Den 5V-Pin des Boards also gar nicht erst anschließen.
Und miss die Belegung deines Moduls nach, bevor du Spannung anlegst. Es gibt KY-040 mit
GND·+·SW·DT·CLK und weiteren Reihenfolgen, und mit 3,3 V direkt am Modul verzeiht eine
Verwechslung nichts.
Die Antenne des Super Mini sitzt an dem Ende, das dem USB-C-Anschluss gegenüberliegt. Leg die Encoderplatine nicht darüber, das kostet Reichweite.
Firmware
Quelltext, Schaltplan und Aufbauhinweise liegen unter github.com/DK5DEN/esp32-ble-volknob. Gebaut wird mit PlatformIO:
pio run -t upload
Die BLE-HID-Seite übernimmt T-vK/ESP32-BLE-Keyboard
in der NimBLE-Variante (h2zero/NimBLE-Arduino,
Schalter -DUSE_NIMBLE). Die Bluedroid-Fassung sprengt auf dem C3 den Flash. So bleibt es
bei rund 500 kB von 3,1 MB, Partitionsschema huge_app. Ein BOOT-Taster wird nicht
gebraucht, der C3 meldet sich über USB-Serial-JTAG von selbst als serieller Port.
Der KY-040 liefert vier Quadraturschritte je Raste, entsprechend steht DETENT_STEPS auf 4.
Zeigt dein Encoder zwei Sprünge pro Raste, setz den Wert auf 2. Dreht es andersherum als
erwartet, tausch PIN_CLK und PIN_DT.
Koppeln
Am Handy Bluetooth öffnen, „VolKnob“ auswählen, verbinden. Kein PIN. Danach taucht der Knopf als Tastatur auf und wirkt sofort.
Prüf einmal, auf welchen Stream deine Monitor-App ausgibt. Der Knopf bedient den Medienstream; liegt der Ton der App auf einem anderen Kanal, greifen die Tasten nicht. Am schnellsten sichtbar wird das, wenn beim Drehen der Lautstärkeregler für „Medien“ erscheint.
Nach dem Sperren des Handys dauert die neue Verbindung ein paar Sekunden, das ist bei BLE normal. Wer in dieser Zeit dreht, dreht ins Leere.
Wenn nichts passiert
Der häufigste Fehler ist eine +-Ader ohne Kontakt, und er sieht aus wie ein Softwarefehler:
der Encoder rastet sauber, es passiert trotzdem nichts. Grund sind die beiden
10-kΩ-Pullups auf der Modulplatine. Hängt ihr gemeinsamer +-Knoten in der Luft, verbinden
sie CLK und DT über 10 kΩ + 10 kΩ = 20 kΩ miteinander. Zieht ein Kontakt CLK auf Masse, wird
DT über diese 20 kΩ gegen den internen 45-kΩ-Pullup mitgezogen:
3,3 V × 20k / (20k + 45k) ≈ 1,0 V
Das liegt unter der Logikschwelle, also lesen beide Pins gleichzeitig „0“. Die Quadratur wird damit unbrauchbar, weil beide Kanäle im selben Moment kippen.
Ob die Versorgung am Modul ankommt, lässt sich ohne Messgerät feststellen: den Pin einmal mit internem Pullup und einmal mit internem Pulldown lesen.
| Pullup | Pulldown | Bedeutung |
|---|---|---|
| 1 | 1 | externer Pullup vorhanden, das Modul hat Spannung |
| 1 | 0 | Pin hängt in der Luft |
| 0 | 0 | Kontakt geschlossen, Pin liegt auf Masse |
Der interne Pulldown liegt bei rund 45 kΩ und verliert klar gegen die 10 kΩ des Moduls.
Die drei 10-nF-Kondensatoren sind Entprellung und zunächst überflüssig. Bau erst ohne, und rüste sie nur nach, wenn eine Raste zwei Schritte auslöst; mit dem 10-kΩ-Pullup ergibt sich τ ≈ 100 µs.
Stand
Erprobt mit einem Samsung Galaxy A16: fünf Rasten im Uhrzeigersinn heben die Medienlautstärke von 7 auf 12, fünf Rasten zurück wieder auf 7, ein Schritt je Raste, ohne verschluckte Klicks. Die Stummschaltung wirkt auf diesem Gerät direkt. Manche Android-Fassungen ignorieren den Mute-Code für den Medienstream; dann bleibt der Umweg, die Lautstärke in der Firmware mitzuzählen und auf Tastendruck auf null zu fahren.
Ein Gehäuse fehlt noch, aktuell sitzt der Aufbau offen neben der Halterung.