Wi-Fi voor LoRa Switch
In de Elektor Magazine-editie maart-april 2020 werd een op afstand bediende schakelaar gepubliceerd [1]. Deze had statusterugkoppeling en communiceerde met behulp van LoRa. Omdat hij was ondergebracht in een waterdichte IP66-behuizing, was hij geschikt voor gebruik buitenshuis. Het was ook een modulair project met het relais en het voedingscircuit op één print en het LoRa-communicatiegedeelte op een andere.
Dit interesseerde me, omdat ik op zoek was naar een buitenschakelaar die gemakkelijk in mijn domoticasysteem kon worden geïntegreerd. Dit systeem is gebaseerd op Home Assistant en Wi-Fi, maar niet op LoRa. Ik ben er zeker van dat het mogelijk is om LoRa toe te voegen, maar ik wilde daar niet induiken. In plaats heb ik simpelweg de LoRa-module vervangen door een Wi-Fi-module, waardoor het ESPHome kon draaien, dat geweldig werkt met Home Assistant (figuur 1).
De interface definiëren
Het eerste wat je moet doen als je iets probeert aan te passen, is uitzoeken hoe je er verbinding mee maakt. Het schema is niet erg ingewikkeld (figuur 2). Bovenaan zien we de voeding op basis van AC/DC-converter MOD1 die 5 V levert met enkele beveiligings- en filtervoorzieningen.
In het midden bevindt zich een bi-stabiel relais, RE1, dat de belasting in- en uitschakelt. Een bi-stabiel relais heeft veel weg van een mechanische schakelaar, in die zin dat het zijn toestand behoudt, ook nadat de stroom is uitgeschakeld, precies zoals een mechanische schakelaar. Het heeft twee stuursignalen om de toestand om te schakelen: Set en Reset. Deze worden aangestuurd door twee MOSFET's T1 en T2, waarvoor actief-hoge stuursignalen zijn vereist.
Merk op dat het relais wordt beschermd door zekering F2 van 5 A, ook al kan het relais schakelen tot 16 A. De reden hiervoor is dat de printsporen zoveel stroom niet aankunnen. De schakelprint kan belastingen aan tot ongeveer 1 kW.
In de linker benedenhoek bevindt zich optocoupler IC1, die parallel staat met de belasting. Wanneer de belasting wordt ingeschakeld, wordt ook de optocoupler ingeschakeld. Zijn LED laat zijn transistor geleiden en de uitgang wordt laag. Als de belasting wordt uitgeschakeld, is de uitgang van de optocoupler hoog. C4 filtert samen met R4 het 50 of 60 Hz wisselspanningssignaal weg, zodat een mooi constant niveau ontstaat.
De connector rechtsonder maakt alle benodigde signalen beschikbaar. S1 is bedoeld voor een op het apparaat gemonteerde drukknop, zodat de schakelaar ook lokaal kan worden bediend.
Punt van aandacht is dat de optocoupler is aangesloten op een 3,3 V voeding, terwijl de print geen 3,3 V voeding heeft . Deze spanning moet door de besturingsprint worden geleverd.
De ESP-01 Wi-Fi Module
We kunnen nu de specificaties beschrijven voor de Wi-Fi-besturingsprint die de schakelprint moet aansturen:
* Hij heeft twee digitale ingangen nodig om de uitgang van de optocoupler en S1 in te lezen;
* Hij heeft twee digitale uitgangen nodig om T1 en T2 aan te sturen;
* Hij moet 3,3 V leveren voor de optocoupler.
Als je nu zegt "vier digitale I/O-poorten en Wi-Fi en 3,3 V", dan denk je natuurlijk meteen aan de ESP-01 module, want die heeft precies vier GPIO-poorten en Wi-Fi en werkt op 3,3 V. Deze populaire module op basis van de ESP8266EX is goedkoop en gemakkelijk te vinden (figuur 3).
Er is echter een maar. De vier GPIO-poorten van de ESP-01 moeten met zorg behandeld worden, want zij bepalen mede hoe de module na inschakeling zal werken. Voor normaal gebruik moeten GPIO0, GPIO1 en GPIO2 hoog zijn bij power-on. Dit staat vermeld in de opmerkingen onder de 'Pin Definitions'-tabel in de datasheet van de ESP8266EX. Veel ESP8266-gebruikers zijn op de hoogte van de vereisten voor GPIO0 en GPIO2, maar niet iedereen kent die voor GPIO1, beter bekend als TXD, de seriële uitgang.
GPIO-poorten afstemmen op besturingssignalen
Op het schakelboard zijn twee van de vier stuursignalen, 'Set' en 'Reset', als gevolg van de weerstanden R7 en R8 altijd laag bij het inschakelen. Als de belasting toevallig aan is op het moment dat de schakelkast wordt ingeschakeld, is het 'On'-signaal ook laag. Bedenk dat dit mogelijk is omdat het relais bi-stabiel is en zijn laatste toestand behoudt, ook als het niet wordt gevoed.
Ingang S1 is zwevend. De toestand bij het opstarten wordt bepaald door de Wi-Fi-controlprint, tenzij iemand toevallig op de drukknop drukt wanneer het systeem opstart...
Al met al hebben we dus te maken met vier signalen die allemaal laag kunnen zijn bij het inschakelen. Ze moeten worden aangesloten op vier poorten, waarvan er drie hoog moeten zijn bij inschakeling. Het gebruik van een ESP-01 module in deze situatie is dus een uitdaging.
De oplossing: Voeg Transistors toe
De oplossing die ik bedacht heb is als volgt (figuur 4):
* RXD (alias GPIO3) is de enige pen die vrij kan worden aangesloten. Ik heb hem daarom verbonden met de uitgang van de optocoupler omdat het niveau ervan bij het inschakelen onvoorspelbaar is. RXD wordt een ingang.
* Als GPIO0 laag is bij het opstarten, zal de module opstarten in Flash programmeermode. Dit kan handig zijn voor het updaten van de firmware, dus heb ik hem verbonden met S1. Daarom wordt GPIO0 ook een ingang.
* GPIO2 en TXD (ook bekend als GPIO1) zijn nu over en moeten dus de uitgangen worden. Om ze te ontkoppelen van de lage impedanties die door R7 en R8 op het schakelbord worden gecreëerd, heb ik P-MOSFET's geplaatst met een pull-up-weerstand op de gates. Dit zorgt ervoor dat bij het opstarten GPIO2 en TXD een hoog niveau te zien krijgen. Als de ESP-01 klaar is met booten, kunnen ze geconfigureerd worden als actief-laag uitgangen.
DeOutput Driver
De outputdriver wordt getoond in figuur 5. Wanneer het GPIO-signaal laag wordt, zal P-MOSFET BSS84 gaan geleiden. Hierdoor wordt de gate van N-MOSFET BS170 hoog getrokken, zodat deze ook gaat geleiden en de spoel van het relais van stroom wordt voorzien. Wanneer het GPIO-signaal hoog is, zal de P-MOSFET BSS84 blokkeren. De N-MOSFET BS170 zal nu ook blokkeren vanwege de 1 kΩ pull-down weerstand aan zijn gate, en de relaisspoel wordt niet van stroom voorzien. De weerstand van 10 kΩ aan de gate van de BSS84 zorgt ervoor dat de GPIO-pen hoog is bij het inschakelen.
Losse Eindjes
Voor de 3,3 V voeding is een low-dropout regulator verbonden met de 5 V voedingslijn (figuur 6). In de praktijk zijn R1, R6 en LED1 niet nodig omdat ze al op de ESP-01 module zitten, vandaar dat ze 'NC' (Not Connected) als waarde hebben. R5 is ook niet nodig, maar ik heb hem voor de zekerheid toegevoegd. Geschikte waarden voor R1 en R5 zouden 10 kΩ zijn, R6 zou iets van 470 Ω kunnen zijn.
Ik heb een klein printje ontworpen voor de interface tussen de Wi-Fi-module en de schakelprint (figuur 7). De bestanden zijn te vinden op [3].
ESPHome YAML bestand
Nu de in- en uitgangen zijn gedefinieerd, kunnen we het ESPHome configuratie YAML-bestand schrijven (zie inzet, beschikbaar op [3]). Dit is iets gecompliceerder dan gewoonlijk vanwege het bi-stabiele relais dat twee pinnen gebruikt in plaats van één. ESPHome en Home Assistant kennen wel een zogenaamde 'cover'-component die dergelijke randapparatuur kan aansturen, maar die is bedoeld voor garagedeuren en vensterjaloezieën en dergelijke die een open- en een dichtknop hebben. Ze hebben ook een speciaal pictogram. Onze schakelaar is gewoon een schakelaar en dus willen we dat hij zich gedraagt als een schakelaar en er ook zo uitziet. Dit kan worden gedaan met een schakelaar-sjabloon waarmee u het gedrag voor in- en uitschakelen afzonderlijk kunt specificeren.
Eerst definiëren we GPIO1, beter bekend als TXD, als een geïnverteerde uitgang met de naam relay_set. GPIO2 wordt gedefinieerd als een geïnverteerde uitgang met de naam relay_reset. We definiëren ook GPIO3 als een actief-laag binaire sensor voor de optocoupler-uitgang.
Dan geven we een korte puls van 100 ms op de relais_set uitgang als inschakelactie en doen hetzelfde op de relais_reset uitgang als uitschakelactie. Als schakeltoestand geven we de toestand van de optocoupler terug.
Om drukknop S1 naar verwachting te laten werken, d.w.z. dat door erop te drukken de belasting wordt in- en uitgeschakeld, definiëren we GPIO0 als een actief-laag binaire sensor. Als hij wordt ingedrukt, wordt eerst de toestand van de optocoupler gecontroleerd. Is de belasting actief, dan schakelen we het relais uit; was de belasting inactief, dan schakelen we het in. Een if-then-else is hier voldoende.
Klaar
Na het compileren van ESPHome met dit YAML-bestand en het flashen van de ESP-01 module, zou de Wi-Fi-switch in de Home Assistant moeten verschijnen en is hij klaar voor automatisering. Nu kan hij worden geïnstalleerd en een belasting schakelen.
YAML Configuratie voor de Wi-Fi Switch
name: wifiswitch
platform: ESP8266
board: esp01_1m
wifi:
ssid: "my_ssid"
password: "my_passphrase"
# Logging impossible as UART0 pins are
# used for switches & sensors.
logger:
baud_rate: 0 # Hardware UART off.
# Enable Home Assistant API
api:
# Enable Over-the-Air programming
ota:
output:
- platform: gpio
id: relay_set
pin: GPIO1 # TXD, may not be pulled low at startup.
inverted: true
- platform: gpio
id: relay_reset
pin: GPIO2 # Do not pull low at startup.
inverted: true
switch:
- platform: template
name: "Wi-Fi switch"
id: wifiswitch
turn_on_action:
# Pulse the Set pin.
- output.turn_on: relay_set
- delay: 0.1s
- output.turn_off: relay_set
turn_off_action:
# Pulse the Reset pin.
- output.turn_on: relay_reset
- delay: 0.1s
- output.turn_off: relay_reset
# Use optocoupler state as switch state.
lambda: return id(optocoupler).state;
# Pushbutton & optocoupler.
binary_sensor:
- platform: gpio
name: "Wi-Fi switch pushbutton"
id: pushbutton
pin:
number: GPIO0 # Do not pull low at startup.
inverted: true
on_press:
then:
- if:
condition:
binary_sensor.is_on: optocoupler
then:
switch.turn_off: wifiswitch
else:
switch.turn_on: wifiswitch
- platform: gpio
name: "Wi-Fi switch optocoupler"
id: optocoupler
pin:
number: GPIO3 # RXD, may be pulled low at startup.
inverted: true
Vragen of opmerkingen?
Heeft u vragen of opmerkingen over dit artikel?
E-mail de auteur op clemens.valens@elektor.com of neem contact op met Elektor via editor@elektor.com.