ESP8266 Relay

Auf Basis der ESP8266-Serie gibt es eine Unmenge an fertiger Module. Manchmal fragt man sich aber schon, was sich die Designer überlegt haben. So habe ich ein paar sehr günstige ESP01-basierte Module mit Relay und Spannungsversorgung im Fundus, mit denen man auch größere Ströme schalten kann. Schade nur, dass die Ansteuerung so gar nicht "kompatibel" ist. Zudem habe ich einiges über den ESP01 und die Einschränkungen der GPIO-Pins 0,1,2 und 3 gelernt.

Board

Das Boards ist schön kompakt, hat einen Spannungsregler und Anschlussklemmen und je nach Quelle ist es für 2-8€ erhältlich.

Der 2er Klemmblock dient der Versorgung mit 5V und der 3er Block wird über das Relay mit Öffner und Schließer gesteuert, z.B. Common, NormalOpen (NO) und NormalConnect (NC). Die 4er Stiftleiste dient der Programmierung mit GND, +5V, TxD und RxD. Allerdings bin ich nicht sicher, ob der Abstand zwischen der Steuerleitung am Relay ausreichend groß zu der Lastseite ist.

Ein Relay ist zwar eine galvanische Trennung aber eine Überspannung könnte vielleicht durch die Platine den Weg in die Niederspannung finden. Das Relay kann nämlich auch 250V/10A AC schalten. Bei DC sind es "nur" 30V mit 10A. Über Einschaltdauer (ED) habe ich keine Daten.

Bezugsquellen finden Sie an jeder Ecke zwischen 2-10 € aber achten Sie darauf, dass auch der ESP01 dabei ist.

Die Steuerung von 230V ist mit Gefahren verbunden. Ich nutzt das Modul nur im Niederspannungsbereich zum Schalten von 5V/12V/24V Verbrauchern oder Signalleitungen, bei denen mir eine galvanische Kopplung aufgrund möglicher Einstreuungen wichtig ist. Wenn Sie mit dem ESP8266 und 230V arbeiten wollen, dann sollten Sie sich eher fertige Module mit Gehäuse, Stromversorgung und CE-Zeichen umschauen. Die Tasmota Device-Liste auf https://templates.blakadder.com/ ist ein guter Startpunkt.

Schaltplan

Ich habe nun erwartet, dass nun ein GPIO des ESP01 einfach über eine Ansteuerung mit dem ESP01 verbunden ist und man z.B. diese dann einfach ansteuern kann oder der Einsatz von Tasmota direkt möglich ist. Die mitgelieferte "China-Firmware", die einen AccessPoint aufspannt und seriell Befehle annimmt, wollte ich nicht nutzen. Eine Steuerung von GPIO0 oder GPIO2 des ESP01 hat aber keine Reaktion gezeigt. Zum Glück habe ich dann einen Schaltplan im Internet gefunden und der zeigt neben der aufwändigen Spannungsversorgung einen ein interessantes Detail: Die Relay-Ansteuerung ist wie erwartet ein Transistor als Verstärkung aber die Basis geht nicht an den ESP01 sondern einen STC15F104-Chip, der seinerseits seriell an den ESP01 angebunden ist.


Quelle: https://pan.baidu.com/s/1mhDfjTm mit eigenen Anpassungen

Ich bin nicht sicher, dass die Verbindungen genau so sind. Ich erwarte eher, dass die serielle Verbindung zwischen dem STC15F104 und dem ESP01 "gekreuzt" sind.

Achtung:
Auf meinen drei Boards war der Widerstand R4 nicht bestückt. Anscheinend "überlebt" der Transistor Q1 das aber

Aus meiner Sicht ist es erst einmal "ungewöhnlich", dass jemand einen 8051-compatiblen Mikroprozessor einsetzt, um auf bestimmte serielle Signale zu warten und zu reagieren, wenn auf dem ESP01 noch zwei GPIO-Pins frei sind. Dies dokumentiert der Hersteller auf seiner Webseite:

Open the first relay:   A0 01 01 A2
Close the first Relay:  A0 01 00 A1
Quelle: http://www.chinalctech.com/xwzx/24.html

Der Grund dürfte sein, dass der gleiche Hersteller auch Module mit zwei oder mehr Relays herstellt und spätestens dann die ESP01-Ausgänge nicht mehr reichen. Anstatt dann aber auf das ESP01-Modul zu verzichten und den ESP8266 mit den weiteren GPIO-Pins einzulöten, wird eben ein weiterer Chip zur Ansteuerung eingebaut. Vielleicht kann er die engeren Abstände des ESP8266 auf seinen Maschinen nicht ätzen, bestücken und löten.

Es gibt sogar Hinweise, dass andere Hersteller von Kopien, (das übliche China-Problem) baugleiche Bausätze ohne Programmierung des STC15F104 ausliefern und dann nur eine LED dauerblinkt.

For this wifi relay module,because there some counterfeit on other sales platform. So if the onboard LED(D2)  are blink constantly(I guess the reason is the STC15F104W haven't been programed),
Quelle http://www.chinalctech.com/cpzx/1/333.html

Selbst hier kann der ambitionierte Bastler nachhelfen, indem er den ESP01 abklemmt und über die TxD/RxD-Leitung den bereits eingebauten STC15F104 programmiert.

Umbau

Dennoch finde ich das alles unbefriedigend und für das "Single Relay"-Modul reicht mir komplett ein GPIO-Port, den ich dann auch mit Tasmota verwenden kann. Ich habe daher einfach den STC15F104 ausgelötet und den freien GPIO2-Pin mit der Basis des Transistors verbunden.

Technisch ist das einfach eine kleine Drahtbrücke vom ESP01-Header zum SMD-Widerstand oder dem passenden Lötpad des bereits entfernten STC15F104W den GPIO0 lasse sich frei da er für das Programmieren des ESP01 genutzt wird. Er kann aber durchaus weiter z.B. für einen 1-Wire Bus o.ä. genutzt werden, dem ein "Kurzschluss" mit GND nichts ausmacht.

Achtung:
Nachdem ich den Umbau vorgenommen habe, hat der ESP01 nicht mehr gestartet.

Ich habe einige Zeit gesucht und erst den Fehler in meinem elektrischen Aufbau vermutet. SMD-Löten ist ja nicht so einfach. Aber die Ursache ist liegt in der mehrfachen Nutzung von GPIO0 und GPIO2 zur Festlegung des Startup-Mode.

                                  | GPIO 0 | GPIO 2 | GPIO 15
----------------------------------|--------|--------|---------
Flash Startup (Normal)            |   1    |   1    |   0
UART Download Mode (Programming)  |   0    |   1    |   0
SD-Card Boot                      |   0    |   0    |   1

Der GPIO0 startet den Flash-Mode, wenn er auf Masse gezogen wird. Meine kleine Schaltung schließt den Pin mit 15kOhm gegen Masse und wenn der interne Pullup-Widerstand (ca. 12kOh) nicht klein genug ist, dann landet der ESP01 in einem FlashMode. Daher sollte der GPIO0 beim regulären Start immer auf HIGH liegen und ist als Ausgang nur bedingt geeignet, wenn die Last hier Strom zieht. Es ist aber als Eingang geeignet. Für GPIO2 gilt das insoweit, dass er auf HIGH, d.h. 3,3V bleiben muss. Das gilt wohl auch für die als serieller Port genutzten GPIO1 und GPIO3, wie die Tasmota-Beschreibung dokumentiert:

GPIO 1 and 3 are used as TX and RX of the hardware Serial port (UART), so in most cases, you can’t use them as normal I/O while sending/receiving serial data. GPIO 1, 2 and 3 will cause boot failure if LOW on boot - use with care.
Quelle: https://tasmota.github.io/docs/Peripherals/#usable-pins

Damit sind eigentlich alle am ESP01-Modul herausgeführten Pins nur mit Einschränkungen verwendbar. Angeblich gibt es intern ein 12kOhm Pullup-Widerstand, der aber durch meine externe Beschaltung den "High"-Pegel alleine nicht halten kann. Beim Pullup muss ein Entwickler immer zwischen Energieverbrauch/Abwärme und Stabilität abwägen aber hier muss ich darauf Rücksicht nehmen, z.B. durch:

  • Externer Pullup
    Ich mache den "HIGH"-Pegel robuster durch einen externen Pullup-Widerstand gegen Vcc, damit auch meine externe Beschaltung keinen negativen Einfluss hat. Allerdings ist der Ruhezustand dann ein HIGH, und der ESP8266 muss aktiv den Pin auf LOW ziehen. Mehr Stromverbrauch und Abwärme
  • Verbrauch reduzieren
    Ich könnte über einen Transistor mit sehr hoher Verstärkung den Basisstrom mit Vorwiederständen so stark reduzieren, dass der interne Pullup-Widerstand wieder ausreicht.
  • PNP statt NPN
    Durch den Wechsel des Transistors auf einen PNP-Typ wäre ein "High" an der Basis gar kein Problem. Er würde erst durchschalten, wenn die Basis auf "Low" gezogen wird. Leider hab ich keinen passenden PNP-SMD-Typ.
  • Verbraucher in der "Zuleitung"
    Zuletzt könnte ich von Vcc z.B. eine LED oder Optokoppler an GPIO2 anschließen, so dass diese Schaltung sogar den HIGH-Status unterstützt. der ESP8266 kann dann den PIN auf Low ziehen und damit die Steuerung kontrollieren.

Da das Modul sowieso nicht im Batteriebetrieb laufen muss, habe ich einen externen Pullup-Widerstand vorgesehen. Wenn der ESP maximal 12mA steuern kann dann sollten nicht mehr vielleicht 10mA fließen. Bei 3,3 Volt sind das nach U/I=R mindestens 330Ohm. Kleiner sollte der Pullup-Widerstand nicht sein. Der Transistor Y3B hat eine Stromverstärkung von hfe=150-350  = IC/IB.

Ich habe dann einfach bei 330Ohm gestartet und bin dann die E12-Reihe hochgelaufen. Erst bei 100kOhm startete der ESP01 nicht mehr. Das hat mich schon etwas überrascht, denn das wiederspricht ja der Aussage, dass der interne Pullup 12kOhm haben soll. Vielleicht ist er aber beim Booten nicht aktiviert. Ich habe dann folgendes gemacht:

  1. Einen 33kOhm Pullup-Widerstand angelötet, der 3,3V mit GPIO2 verbindet
  2. Den STC15F104 ausgelötet.
  3. Kabel vom Lötpad zum GPIO2 gezogen

Hinweis: Hier sehen Sie auch den fehlenden Widerstand R4, der im Schaltplan noch erwähnt wird.

Leider hat diese Lösung den einen kleinen Nachteil, dass beim Einschalten das Relais ganz kurz anzieht, bis der ESP8266 den GPIO2 auf "Low" geschaltet hat.

Anscheinend hat der Hersteller seinen Designnachteil erkannt und verkauft modifizierte Versionen, die wohl einen GPIO-Pin nutzt. Durch den Wegfall des STC15F104 ist das Board sogar kleiner.

Laut Schaltplan auf https://de.aliexpress.com/item/32845077134.html ist das Relay über einen Optokoppler an GPIO0 angeschlossen.

Da gibt es die Probleme dann nicht.

Flashen

Der Rest ist dann wieder einfach.

  • Tasmota Flashen
    Ich kann den ESP01 entweder herausnehmen und in einem entsprechenden Adapter flashen oder ich verbinde beim Einschalten der Stromversorgung den GPIO0-Pin mit GND und nutzen den 4-poligen Anschluss auf dem Board, um das Board mit Strom und RxD/TxD über einen 3,3V-Programmieradapter zu flashen.
  • Device ins WLAN bringen.
    Entweder verbinde ich mich mit dem aufgespannten Tasmota-WLAN oder nutze die serielle Verbindung zur Parametrisierung
  • Device von "Sonoff" auf "(0) Generic" umstellen
  • Device konfigurieren: GPIO2 = "Relais:1"
  • Device in die Heimsteuerung einbinden

Anleitungen zu Tasmota gibt es im Internet zuhauf, so dass ich diese nicht bebildert beschreibe.

Erkenntniss

Kurz gesagt: Dieses Relay-Modul war billig und konnte erst nach ein paar Anpassungen mit Tasmota genutzt werden. Selbst dann gibt es Einschränkungen, so dass ich besser das Nachfolgemodell ohne STC15F104 gezielt kaufen würde. Wenn ich 230V steuern will, würde ich die Finger von Modulen ohne Gehäuse lassen und besser gleich bei Sonoff, OBI und Co zugreifen, was auch nur minimal teurer ist.

Auf der anderen Seite habe ich auf die harte Tour einiges über die Funktion von GPIO0 und insbesondere GPIO2 beim ESP8266 erfahren. Es bringt mich aber auch dahin, generell die Finger von dem allzu kleinen ESP01-Board zu lassen und besser die klassischen Boards zu nutzen oder zumindest den ESP12, wenn es klein und energiesparend sein soll.

Weitere Links