Wearable-WLAN Gadget - ESPHome wieder im Einsatz!
at the topLABS PROJECT
By Clemens Valens (Elektor)
Vor einigen Jahren bat mich ein Kollege, ein tragbares Mikrocontroller-Board mit einem ESP8266-basierten WLAN-Modul zu entwickeln. Die Firmware des Projekts würde er übernehmen, da er große Pläne für ein solches Gerät hatte. Als der Prototyp fertig war, probierte er das Board aus und verließ dann die Firma. Hatte ihn mein Design so sehr enttäuscht oder entmutigt? Das habe ich nie herausgefunden.
Das Projekt wurde aufgegeben und wäre in Vergessenheit geraten, wenn ich nicht vor ein paar Monaten dringend ein ESP8266-Modul für meine Experimente zur Heimautomatisierung benötigt hätte. Beim Durchstöbern von Kisten mit Dingen, die „mal eines Tages nützlich sein“ könnten, fiel mir der Wearable-ESP8266-Prototyp in die Hände. Und da ich zu dieser Zeit besessen von ESPHome [1] war, wusste ich sofort, dass ich nun die Werkzeuge hatte, um endlich die Software für dieses Board zu entwickeln.
Eine NodeMCU-ähnliche Schaltung
Der Schaltplan des Boards (Bild 1) ist im Grunde ein NodeMCU-Entwicklungsboard, bei dem die USB-zu-Seriell-Brücke CP2101 von Silicon Laboratories (Silabs) durch den wesentlich günstigeren FT231XS von FTDI ersetzt wurde. Außerdem wurde ein Port für eine adressierbare WS2812-basierte LED-Kette (a.k.a. NeoPixels) hinzugefügt.
Da das Wearable-Gadget quasi ein NodeMCU-Board ist, gilt alles im Folgenden gesagte auch für ein normales NodeMCU-Modul. Auch die vorgestellte Software funktioniert genauso gut.
Die verfügbaren GPIO-Ports und die Stromversorgung sind auf spezielle Pads mit großen Löchern herausgeführt, die kreisförmig am Rand der runden Platine angeordnet sind. Diese Pads sind für die Verwendung von leitfähigem Garn (conductive thread) vorgesehen, aber man kann natürlich auch dünnen Schaltdraht anlöten oder gar Krokodilklemmen verwenden.
Die Stromversorgung der Schaltung erfolgt entweder über den Micro-USB-Anschluss oder durch ein externes 5-V-Netzteil an einem der 5-V-Pins. Letzteres ist bei langen LED-Strings sinnvoll, die mehr Strom benötigen, als ein normaler USB-Anschluss liefern kann. Eine USB-Powerbank mit hoher Kapazität ist ebenfalls eine Option. Beachten Sie, dass a) die LED-Schnittstelle für 5-V-Strings ausgelegt ist und b) der 5-V-Eingang keinen Verpolungsschutz bereitstellt.
Software-Entwicklung mit ESPHome
Für meine Experimente habe ich eine ringförmige Kette von zwölf WS2812-LEDs an den Port K2 angeschlossen, siehe Bild 2. Natürlich können Sie die Software für dieses Board von Grund auf neu schreiben, wie es mein ehemaliger Kollege vorhatte und wahrscheinlich auch tun musste, da damals nicht so viel ESP8266-Code im Netz verfügbar war wie heutzutage. Die Übernahme eines Open-Source-Projekts wie ESPHome erspart Ihnen aber eine Menge Arbeit.
Ich habe es schon einmal gesagt, und ich will es gerne noch einmal wiederholen: Mit ESPHome können Sie eine vernetzte Anwendung für den ESP8266 oder ESP32 erstellen, die Over-the-Air-Programmierung (OTA), Fallback-Hotspot, Webserver-Benutzeroberfläche und Schnittstellen für über 200 Geräte bietet, und das in kürzester Zeit. Wirklich. Siehe [1] für weitere Details.
ESPHome verwendet einen modularen Ansatz, bei dem vorgefertigte Codeblöcke zu einer Anwendung kombiniert werden. Die von der Anwendung benötigten Blöcke werden in einer Konfigurationsdatei, der sogenannten YAML-Datei, aufgelistet (YAML kommt von „Yet another markup language“ und ist keine Programmiersprache, sondern ein Satz von Formatierungsregeln für Textdateien zur Angabe von Parametern und Werten [1]). Jeder Baustein wird individuell konfiguriert, um zum Beispiel den oder die zu verwendenden GPIO-Pin(s), deren Typ oder ihr Kommunikationsprotokoll festzulegen.
Die Konfigurationsdatei wird von ESPHome gelesen und in C++-Code umgewandelt, der dann wiederum in eine ausführbare Datei kompiliert und in den Flash-Speicher des Moduls programmiert werden kann. Wenn Sie einmal verstanden haben, wie man eine Konfigurationsdatei zusammenstellt, sind Sie im Geschäft. Bitte lesen Sie [1] für weitere Details.
Die Konfigurationsdatei genau betrachtet
Die YAML-Konfigurationsdatei (Listing 1) beginnt mit dem obligatorischen Abschnitt esphome:, in dem der Projektname, die verwendete MCU (ESP8266) und der Boardtyp (NodeMCU) angegeben werden.
Listing 1. Die YAML-Konfigurationsdatei [2].
[Beware of indentation, every space counts]
# Elektor 160112 Wearable ESP8266
# Configuration file for ESPHome
esphome:
name: wearable
platform: ESP8266
board: nodemcu
wifi:
ssid: "my_ssid"
password: "my_passphrase"
ap:
ssid: "Wearable Fallback Hotspot"
password: "12345678"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
# Enable Over-the-Air updates.
ota:
output:
- platform: gpio
id: "blue_led"
pin:
number: GPIO16
inverted: True
light:
- platform: binary
name: "Blue LED"
output: "blue_led"
- platform: neopixelbus
name: "Light Ring"
num_leds: 12
type: GRB
pin: GPIO2
method: ESP8266_UART1
effects:
- addressable_color_wipe:
name: "Color Wipe"
- addressable_fireworks:
name: "Fireworks"
- flicker:
name: "Flicker All"
- addressable_flicker: # Doesn't work?
name: "Flicker Individually"
- addressable_rainbow:
name: "Rainbow"
- random:
name: "Random All"
- addressable_scan:
name: "Scan"
- strobe:
name: "Strobe All"
- addressable_twinkle:
name: "Twinkle"
- addressable_random_twinkle:
name: "Twinkle Random"
# GPIO11 is somehow related to flash and should not be used.
switch:
- platform: gpio
name: "GPIO4"
pin: GPIO4
- platform: gpio
name: "GPIO5"
pin: GPIO5
- platform: gpio
name: "GPIO12"
pin: GPIO12
- platform: gpio
name: "GPIO14"
pin: GPIO14
- platform: gpio
name: "GPIO15"
pin: GPIO15
# Pushbutton on GPIO0.
binary_sensor:
- platform: gpio
name: "Flash"
pin:
number: GPIO0
inverted: True
sensor:
- platform: adc
name: "Analog Input"
pin: A0
update_interval: 60s
filters:
- multiply: 3.2 # voltage divider is 100k/(220k+100k)
Als nächstes folgt der WLAN-Abschnitt wifi:, um das Netzwerk, mit dem eine Verbindung hergestellt werden soll, zu definieren und um Rettungsoptionen im Falle von Netzwerkproblemen anzugeben. Die Reihenfolge der Sektionen spielt keine Rolle.
Durch die Angabe der Option logger: wird die Statusausgabe auf der seriellen Schnittstelle aktiviert. Die Option api: ermöglicht die einfache Integration mit der freien und quelloffenen Heimautomatisierungs-Controller-Software Home Assistant (siehe [1]). Und ota: ist für die Over-the-Air-Programmierung (durch zum Beispiel den Home Assistant) zuständig. OTA ist sehr praktisch, da dadurch keine physische Verbindung zum Gerät erforderlich ist.
Dann wird es ernst! Es beginnt mit der Spezifikation, dass GPIO16 ein Ausgang sein muss. Dies ist erforderlich, will man die daran angeschlossene LED als light: verwenden. Das ist interessant, denn lights haben ganz andere Möglichkeiten als beispielsweise Schalter (Bild 3).
Lights
Als Lights habe ich die blaue LED an GPIO16 und den LED-String definiert. Letzterer wird von der platform: neopixelbus verwaltet, die ein paar Optionen hat, die angegeben werden müssen, etwa die Länge des Strings und der Port, an den er angeschlossen wird. In diesem Fall ist der Port GPIO2, was die Verwendung der ESP8266_UART1-Methode ermöglicht. Eigentlich müssen Sie bei dieser Methode den GPIO2 gar nicht angeben, da es impliziert ist.
Lights können Effekte haben, und ESPHome hat ein paar eingebaut, die Sie verwenden können (wenn Ihr light: unterstützt wird, natürlich). Selbstverständlich können Sie auch Ihre eigenen Lichteffekte programmieren. Ich habe die meisten der eingebauten Effekte für den LED-Ring genutzt. Auch die Effekte können Parameter haben, aber wenn Sie keine explizit angeben, werden Standardwerte verwendet. Im Home Assistant können Sie wählen, welcher Effekt aktiv ist (Bild 4). Ich mag besonders den Effekt random twinkle.
Mehr Ein- und Ausgänge
Die unbenutzten GPIO-Ports sind als Schalter deklariert, so dass Sie sie im Home Assistant ein- und ausschalten können. In der Hausautomatisierung ist ein Schalter ein Gerät, das vom System gesteuert wird (zum Beispiel ein Relais). Ein Schalter, der durch den Benutzer (oder Bewohner) betätigt wird, ist ein binärer Sensor. An GPIO0 ist ein „richtiger“ Taster angeschlossen, daher ist er als binärer Sensor spezifiziert.
Schließlich besitzt das Board einen analogen Eingang an Pin A0 mit einem Spannungsteiler davor (R15 und R16), der für eine Abschwächung von 3,2 sorgt. Wenn die maximale Eingangsspannung von 3,3 V an AIN anliegt, bleibt davon am Analogeingang des ESP12 etwa 1 V übrig.
Abstandsalarm
ESPHome verfügt über Automatisierungsfunktionen. Sie könnten der Platine zum Beispiel einen Näherungssensor hinzufügen, um die Farbe des LED-Rings zu ändern, je nachdem, was der Sensor so sieht. Auf diese Weise könnte das Board zum Beispiel als „Social-Distancing-Alarm“ fungieren (wenn so etwas noch nötig sein sollte, wenn Sie dieses Heft im Sommer in den Händen halten). Es kann aber auch einfach ein dekorativer elektronischer Anstecker oder eine Brosche sein; lassen Sie Ihrer Fantasie freien Lauf!
Eine interessante Möglichkeit bietet hier die Nutzung des Home Assistant. Mit ein paar dieser tragbaren ESP8266-Boards, die in den Home Assistant integriert sind, lassen sich ausgefallene Lichteffekte erzeugen. Auch wenn der Home Assistant für eine Heimautomatisierung optimiert ist, kann er auch ganz andere Dinge tun, beispielsweise ein Spiel auf der Geburtstagsparty Ihres Kleinkindes steuern. Hängen Sie jedem Kind ein Board um und nutzen Sie den Home Assistant, um Teams zu bilden und zu steuern oder zu entscheiden, welcher Kandidat eine Frage beantworten darf oder wer beim Fangen spielen dran ist. Ich bin sicher, dass Sie mit ein bisschen Kreativität viele lustige Anwendungen finden können.
Alle Dateien zu diesem Projekt können unter [2] heruntergeladen werden.
(210146)
Weblinks
[1] C. Valens, „Hausautomation leicht gemacht“, Elektor Sep/Okt 2020: https://www.elektormagazine.de/magazine/elektor-154/58936
[2] Wearable Wi-Fi Gadget bei Elektor Labs: https://www.elektormagazine.com/labs/4382
Ein Beitrag von
Idea, Design, Text and Photographs: Clemens Valens
Schematic: Patrick Wielders
Editor: Jens Nickel and C. J. Abate
Layout: Giel Dols
Haben Sie Fragen oder Kommentare?
Haben Sie technische Fragen oder Kommentare zu diesem Artikel? Schicken Sie eine E-Mail an den Autor unter clemens.valens@elektor.com oder kontaktieren Sie Elektor unter editor@elektor.com.
Stückliste
Widerstände:
All 5%, 50 V, 0.1 W, 0603
R20 = 0 Ω
R1,R2 = 27 Ω
R11,R13,R21,R22 = 470 Ω
R3,R4,R5,R6 = 1 kΩ
R7,R8,R9,R10,R17,R18,R19 = 10 kΩ
R16 = 100 kΩ
R15 = 220 kΩ
Kondensatoren:
C1,C2 = 47 pF, 0603
C3,C4 = 100 nF, 0603
C6 = 1 µF, 0603
C5,C7,C9 = 10 µF, 16 V, Case-A
Halbleiter:
D1 = MBRS540
IC4 = 74LVC1T45GW
IC1 = FT231XS
IC2 = LD1117AS33
LED1 = LED, blau, 0603
LED2 = LED, gelb, 0603
LED3 = LED, rot, 0603
T1,T2 = BC847C
Außerdem:
K1 = Micro-USB-Buchse Typ B, gewinkelt, Platinenmontage
K2 = 1x3-polige Stiftleiste, 0,1"-Raster
S1,S2 = SMD-Taster, 5,1 mm x 5,1 mm
MOD1 = ESP-12F
Platine 160112-1