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ó.
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
Ha nem szeretnél barkácsolni és egyszerű megoldást keresel ezt ajánlom: Shelly és az ioBroker
A legkisebb WiFi-csatlakozóval bárhonnan vezérelhető számos háztartási és irodai eszköz.
Hirdetés
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.
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.
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.
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:
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: