Smart váltókapcsoló ESP8266 ioBroker és MQTT segítségével

Otthonunk világításának kapcsolóit felokosíthatjuk az ebben a cikkben bemutatott kapcsolással úgy, hogy ha valami elromlik(pl. nincs wifi vagy leáll a szerver) működik tovább mint egy hagyományos kapcsoló.

Smart Váltókapcsoló készítés ESP8266 iObroker és MQTT felhasználásával
Smart Váltókapcsoló készítés ESP8266 iObroker és MQTT felhasználásával

A projekthez felhasznált dolgok:

NodeMCU Lolin V3 Modul ESP8266 ESP-12F

Ellenállás készlet 0 Ohm -1M Ohm

AC DC 220V bis 5V Power Supply Modul

AC DC 220V bis 3,3V Power Supply Modul

Relé Modul 5V Optocsatolóval

PC817C Optocsatoló

Ha nem szeretnél barkácsolni és egyszerű megoldást keresel ezt ajánlom: Shelly és az ioBroker


Shelly Plug S

Shelly Plug S

A legkisebb WiFi-csatlakozóval bárhonnan vezérelhető számos háztartási és irodai eszköz.

Hirdetés

Shelly 1 PM WiFi kapcsoló

Shelly 1 PM WiFi kapcsoló

A háztartási és irodai eszközök vezérelhetők a legkisebb WiFi-kapcsolású kapcsolókapcsolóval. Az áramfogyasztást is mérhetjük vele.

Shelly 1 wifi relé

Shelly 1 wifi relé

A Shelly ESP8266-on alapszik, egyszerűen egy aljzat vagy egy kapcsoló mögé telepíthetnek, ez nagyon megkönnyíti az intelligens otthon utólagos kiépítését.


Figyelem!

Az alábbi áramkör egyes részei 230Voltos feszültséggel működnek. A hálózati feszültség nem játék, halálos áramütést, tüzet okozhat! Csak a saját felelőségedre és csak ha tudod, hogy mit csinálsz!

Az alábbi ábrán piros színnel jelölt terület 230 Voltos feszültség alatt van!


Lássuk a kapcsolást. Megpróbáltam érthetően lerajzolni, remélem sikerült.

Smart Váltókapcsoló - Sematikus ábra
Smart Váltókapcsoló – Sematikus ábra

A hagyományos váltókapcsoló mellé kell a relémodult beépíteni mintha egy másik váltókapcsoló lenne. Ez a relémodul rendelkezik optocsatolóval, igy optikailag teljesen le van választva az ESP8266 mikrokontroller.

Az ábrán a felső fekete kocka egy 230v-3,3v kapcsolóüzemű tápegység. Ennek a 230V-os bemenetét kapcsoljuk a lámpára, a kimenetét egy optocsatolón (pc817) keresztül vezetjük az ESP8266 D2 lábára. Ennek a segítségével figyeljük, hogy világít-e a lámpa. A D2 bemenetet felhúzóellenállással 3,3v-ra kell kapcsolni.

Az alsó fekete kocka egy 230v-5v kapcsolóüzemű tápegység, ez biztosítja az áramkör alacsony feszültségű részének a táplálását.

Váltókapcsoló működési elve
Váltókapcsoló működési elve

Hogy a kapcsolás müködjön, fel kell programozni az ESP8266 mikrokontrollert. Nyissd meg az Arduino programot és másold be ezt a vázlatot. Írd át a Wifi csatlakozáshoz szükséges SSID és Jelszó párost és az MQTT szerver IP címét. Ha kész töltsd fel a kódot az ESP8266-ra.

/**************************************/
//  https://myhomethings.eu           //
//  Váltókapcsoló - ESP8266           //
//  Alaplap: NodeMCU 1.0 ESP-12E      //
/**************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SSID";
const char* password = "Jelszo";
const char* mqtt_server = "192.168.x.xxx";
WiFiClient espClient;
PubSubClient client(espClient);
int relayPin = D5;
int lightControllPin = D2;
long previousMillis = 0;
int relayState = 1;
int switchState = 0;
int switchFlag = 0;
void setup_wifi() 
{
 delay(100);
 WiFi.begin(ssid, password);
 
 while (WiFi.status() != WL_CONNECTED) 
 {
   delay(500);
 }
 randomSeed(micros());
}
void reconnect() 
{
 while (!client.connected()) 
 {
   String clientId = "ESP8266-Valtokapcsolo";
   
   if (client.connect(clientId.c_str()))
   {
     client.subscribe("Lampa_topic");
   } 
   else 
   {
     delay(6000);
   }
 }
}
void callback(char* topic, byte* payload, unsigned int length) 
{
 payload[length] = '\0';
 String strTopic = String(topic);
 String strPayload = String((char * ) payload);
 
 if(strTopic == "Lampa_topic" && switchFlag == 0) 
 {
   if(strPayload == "false") 
   {
     if(digitalRead(lightControllPin) == LOW)
     {
       if(relayState == 1)
       {
         digitalWrite(relayPin, LOW);
         relayState = 0;
       }
       else
       {
         digitalWrite(relayPin, HIGH);
         relayState = 1;
       }
     }
   }
   
   if(strPayload == "true") 
   {
     if(digitalRead(lightControllPin) == HIGH)
     {
       if(relayState == 1)
       {
         digitalWrite(relayPin, LOW);
         relayState = 0;
       }
       else
       {
         digitalWrite(relayPin, HIGH);
         relayState = 1;
       }
     }
   }
 }
}
void setup() 
{
 setup_wifi();
 client.setServer(mqtt_server, 1883);
 client.setCallback(callback);
 
 pinMode(relayPin, OUTPUT);
 pinMode(lightControllPin, INPUT);
 digitalWrite(relayPin, HIGH);
}
void loop() 
{
 unsigned long Millis = millis();
 if (Millis - previousMillis >= 1000) 
 {
   previousMillis = Millis;
   switchFlag = 0;
 }
 
 if (!client.connected()) 
 {
   reconnect();
 }
 client.loop();
 if(digitalRead(lightControllPin) == LOW) 
 {
   if(switchState == 0)
   {
     client.publish("Lampa_topic", "true");
     switchState = 1;
     switchFlag = 1;
   } 
 }
 
 if(digitalRead(lightControllPin) == HIGH) 
 {
   if(switchState == 1)
   {
     client.publish("Lampa_topic", "false");
     switchState = 0;
     switchFlag = 1;
   }
 }
}

Magyarázat

A 41. sorban megadjuk az eszköz egyedi azonosítóját, ezt érdemes megváltoztatni, vagy készíthetünk kevésbé beszédesebb generált ID-t is ha az alábbi kódrészletre cseréljük.

String clientId = "ESP8266ClientID-";
clientId += String(random(0xffff), HEX);

A 45. sorban feliratkozunk az MQTT szerveren a „Lampa_topic”-ra. Ez egy adatpont, amely tartalmazza a lámpa állapotát. A callback függvény figyeli az állapotváltozásokat.

client.subscribe("Lampa_topic");

Ha a 60. sorban a „strTopic” változó értéke „Lampa_topic” és a „switchFlag” értéke „0”, akkor az MQTT szerveren változás történt. A „switchFlag” értéke akkor lesz „1”, ha a hagyományos kapcsolóval kapcsoljuk a lámpát. Erre azért van szükség a feltételben, mert ha kézzel kapcsolunk az MQTT szerveren megváltozik a lámpa értéke és a feliratkozás miatt újra igaz lenne a feltétel és újra kapcsolna a relé, ezt a „prellegést” szeretnénk elkerülni.

if(strTopic == "Lampa_topic" && switchFlag == 0)

62.sor. A „strPayload”(Ezt ez értéket hívjuk hasznos tehernek) értéke a „false”. Ez azt jelenti, hogy a szevertől kapott parancs szerint le kell kapcsolni a lámpát.

if(strPayload == "false")

A 64. sorban megvizsgáljuk, hogy a lámpa világít-e. Ha nem világít, nem tesz semmit a program. Nem lenne jó ha a parancs ellenére bekapcsolódna a lámpa.

if(digitalRead(lightControllPin) == LOW) // bekapcsolva

A „LOW” érték azért jelenti, hogy a lámpa be van kapcsolva, mert alapesetben a D2 láb fel van húzva 3,3v-ra, tehát „HIGH”. A pc817 optocsatoló lehúzza GND-re ha be van kapcsolva a lámpa.

Ha eddig minden feltétel igaz, meg kell vizsgálni a relé állapotát és ennek megfelelően kell kapcsolni.

if(relayState == 1)
{
digitalWrite(relayPin, LOW);
relayState = 0;
}
else
{
digitalWrite(relayPin, HIGH);
relayState = 1;
}

A 124. sorban vizsgáljuk, hogy világít-e a lámpa. Ha igen a következő feltételben a hagyományos kapcsoló állapota „0” tehát kikapcsolt volt akkor kapcsolás történt és ezt közölni kell az MQTT szerverrel a „client.publish()” függvény segítségével „true”-ra állítjuk a „Lampa_topic”-nevű adatpontot.

if(digitalRead(lightControllPin) == LOW) 
{
if(switchState == 0)
{
client.publish("Lampa_topic", "true");
switchState = 1;
switchFlag = 1;
} 
}

Ennyi volt a kód magyarázata, remélem érthető voltam.

Üzembehelyezés után megjelenik az új eszköz az iobrokerben az MQTT alatt, mint új adatpont.

Ha telepítve van az IoT adapter összekapcsolhatod a Google Home vagy az Amazon Alexa aszisztensekkel és hangparancsokkal is vezérelheted a lámpát. Például vele:

Echo Dot 5. generációs intelligens Bluetooth hangszóró Alexával
Echo Studio A valaha kínált legjobb hangzású Echo hangszórók – Dolby Atmos-szal és Alexával

hirdetés

További ESP8266 – ESP32 – Arduino példákat találsz itt.


Ha szeretnéd elolvasni az ioBroker és az MQTT adapterről írt cikket kattints.

Remélem tetszett a cikk, és hasznos információ volt a számodra.


Talán érdekes lehet: