Home

Sterownik WiFi do oświetlenia

Od dłuższego czasu moje zainteresowania skierowane są w stronę tak zwanych inteligentnych domów.
Na świecie projektuje się mnóstwo przeróżnych urządzeń i gadżetów które umożliwiają realizacje takiego projektu.
Szczególnie spodobała mi się platforma „Arduino, w związku z tym że przede wszystkim podzespoły
są w miarę tanie, ogólnie dostępne w sieci internet.
W skład wspomnianej przeze mnie platformy wchodzi mnóstwo sterowników oraz modułów umożliwiających zastosowanie ich praktycznie w dowolnym pomyśle.
Dodatkowo wspierana jest przez ogromną ilość programów napisanych praktycznie w dowolnym języku maszynowym.
Po wielu testach stworzyłem pierwszy prototyp który doświadczalnie zamontowałem w swoim domu.
Jest to fragment systemu który zaprojektowałem, w przyszłości ma być rozbudowywany
o kolejne potrzebne elementy.

Założenia:

1. Włączanie i wyłączanie oświetlenia w pomieszczeniu za pomocą smartfona ewentualnie tabletu.
2. Energooszczędność i bezpieczeństwo
3. Stworzyć gotowy element który będzie integralny i dający możliwość wykorzystania
    w dalszej realizacji projektu.

Realizacja:

Projektując mój system sterowania natrafiłem na program napisany na system „Android o nazwie
„Virtuino który daje ogromne możliwości konfiguracji dowolnego projektu.
Poza tym jest on ciągle rozbudowywany przez autora o nowe funkcje które idealnie nadają się
do realizacji mojego projektu.
Biorąc pod uwagę jaki „Virtuino wspiera hardware do realizacji sterowania oświetleniem postanowiłem wykorzystać płytkę WeMos mini D1.
Poza tym że jest kompatybilna z softwarem to jest niewielka ale dająca ogromne możliwości zaprogramowania.

Schemat połączeń:

WeMos schemat

Jak widać na załączonym schemacie postawiłem na prostotę, możliwie małą ilość elementów.
Ważne też było wielkość, docelowo możliwość zamontowania w puszce instalacyjnej pod wyłącznikiem.
Ważne były również koszty realizacji modułu. Elementy przeze mnie wykorzystane można kupić za kilka złoty.
Oprócz wspomnianej płytki sterującej użyłem dwóch przekaźników wysterowywanych stanem niskim
oraz zasilacza 5 V który pozyskałem z niepotrzebnej ładowarki od telefonu których często w naszych domach zalega w ogromnych ilościach.

Program do WeMos:

/* Virtuino WeMos ESP8266 web server and WiFi access point example No1 
 * Created by Ilias Lamprou
 * Updated Feb 1 2016
 * Before  running this code config the settings below as the instructions on the right
 *
 *
 * Download latest Virtuino android app from the link: https://play.google.com/store/apps/details?id=com.virtuino_automations.virtuino&hl=el
 * Contact address for questions or comments: iliaslampr@gmail.com
 */

// 1.  On Arduino IDE software select the board WeMos. If the board isn't in boards list, open the boards manager, on the search line enter esp8266 and download all ESP8266 boards 
// 2.  Open the Virtuino library file: VirtuinoESP.h,  enable the line #define WEMOS_D1_MINI_PRO and disable the other boards
// 3.  Connect the WeMos ESP8266 module to usb and upload this code

#include <ESP8266WiFi.h>
#include "Virtuino_ESP_WifiServer.h"


const char* ssid = "Nazwa sieci";    // Nazwa sieci domowego routera
const char* password = "Hasło";    // Hasło do sieci
WiFiServer server(8000);              // Server port


Virtuino_ESP_WifiServer virtuino(&server);

void setup() {
   //----- Virtuino settings
  virtuino.DEBUG=true;                         // set this value TRUE to enable the serial monitor status
  virtuino.password="1234";                    // Hasło do modułu
                                              
  Serial.begin(9600);                          // Enable this line only if DEBUG=true
  delay(10);

  //----- WeMos module settings
  //----- prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);

  pinMode(D1, OUTPUT);           // Piny jakie wykorzystałem do sterowania przekaźnikami
  digitalWrite(D1, HIGH);

  pinMode(D3, OUTPUT);            // Piny jakie wykorzystałem do sterowania przekaźnikami  
  digitalWrite(D3, HIGH);
 
  //----  1. Settings as Station - Connect to a WiFi network
  Serial.println("Connecting to "+String(ssid));
 
   // If you don't want to config IP manually disable the next four lines
  IPAddress ip(localhost);            //IP Address jaki nadaliśmy modułowi  
  IPAddress gateway(192, 168, 0, 1);         // set gateway to match your network
  IPAddress subnet(255, 255, 255, 0);        // set subnet mask to match your network
  WiFi.config(ip, gateway, subnet);          // If you don't want to config IP manually disable this line
 
  WiFi.mode(WIFI_STA);                       // Config module as station only.
  WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
    }
   Serial.println("");
   Serial.println("WiFi connected");
   Serial.println(WiFi.localIP());
 
  //----   2. Settings as Access point - Create a private Wifi Network. Enable the next five lines to use module as Acces point
  // Serial.print("Setting soft-AP ... ");                   // Default IP: 192.168.4.1
  // WiFi.mode(WIFI_AP);                                     // Config module as Acces point only.  Set WiFi.mode(WIFI_AP_STA); to config module as Acces point and station
  // boolean result = WiFi.softAP("WeMos", "12345678");      // SSID: NodeMCU   Password:12345678
  // if(result == true)  Serial.println("Server Ready");
  // else Serial.println("Failed!");
 
  // ---- Start the server
  server.begin();
  Serial.println("Server started");

 //---- Enter your setup code below
 
  pinMode(D4,OUTPUT);             // On Virtuino panel add a switch to pin D4 to enable or disable the board led
 

void loop() {
  virtuino.run();

   // enter your loop code here.
   //------ avoid to use delay() function in your code

  
   //--- example 1  Enable or disable the board led using virtual pin
   //--- On Virtuino app panel add a Switch to Virtual Pin 0 to enable or disable the nodemcu board led
   int v=virtuino.vDigitalMemoryRead(0);              // Read virtual memory 0 from Virtuino app
   if (v!=storedValue) {                         
    Serial.println("-------Virtual pin DV0 is changed to="+String(v));
    if (v==1) digitalWrite(D4,0);
    else digitalWrite(D4,1);
    storedValue=v;
   }


    //----  Example 2
    //----  Write a random value to virtual pin 2. On virtuino panel add an indicator to V2
    virtuino.vMemoryWrite(2,random(1000));


    //---- Example 3
    //---- Create a counter every 5 seconds
    //---- Use this technique. Avoid to use the delay function
    long t= millis();       // read the time
    if (t>storedTime+5000){
      counter++;            // increase counter by 1
      if (counter>20) counter=0;    // limit = 20
      storedTime = t;
      virtuino.vMemoryWrite(12,counter);      // write counter to virtual pin V12
    }
  }
 



Powyższy listing jest programem jaki dołączył autor do aplikacji „Virtuino zmodyfikowany
przeze mnie do realizacji mojego projektu.
Program ten po uruchomieniu łączy się z domowym routerem dając możliwość sterowania
przy pomocy mobilnych urządzeń.
Z programu nie wykasowałem niepotrzebnych instrukcji które nie są potrzebne do realizacji działania sterownika ponieważ jak wcześniej wspomniałem jest to faza prototypu która na pewno ulegnie zmianie.
Czerwonym kolorem wyróżniłem dane które musimy wprowadzić w zależności od własnych
warunków połączeniowych.

Program do modułu Wemos został wgrany przy pomocy programu Arduino v.1.65

Link do Arduino
Link do aplikacji w wersji na Androida: Virtuino
Instrukcja instalacji oraz konfiguracji przedstawia autor programu na swoim kanale YouTube.

Montaż i uruchomienie.

Projektując moduł miałem na celu umieszczenia go w puszce wyłącznika światła.
W związku z tym przyłożyłem wszelkich starań aby był możliwie najmniejszy.
Podczas montażu wyszło kilka problemów.
Mianowicie podstawowa sprawa zapewnienie zasilania 230 V do zasilacza układu.
W klasycznych instalacjach elektrycznych tzw. starych w puszce wyłącznika są tylko przewody
fazowe tzw. „L, więc nie ma możliwości zapewnienia zasilania, chyba że doprowadzimy przewód
zerowy tzw. „N, ale to by się wiązało z kuciem ścian.
Puszka pod wyłącznik jest płytka, czyli raczej trudno by było upchać w niej wyłącznik oraz moduł.
Tych wszystkich problemów nie mają w większości przypadków posiadacze mieszkań z nowymi instalacjami gdzie elektrycy rezygnują z puszek łączeniowych a połączeń dokonują w puszkach wyłącznika.
Z oczywistych względów montuje się pod wyłączniki puszki tzw. głębokie.
Takie rozwiązanie zapewnia nam obecność fazy i zera co jest nam niezbędne do zasilenia modułu
a poza tym mamy do dyspozycji przewody które idą do oprawy oświetleniowej.
Więc co? Posiadacze starych instalacji muszą zrezygnować z możliwości wprowadzenia odrobiny
automatyki do swojego domu?
Na szczęście nie.
 Rozwiązaniem tego problemu jest wykorzystanie np. podwieszonego sufitu, lub obudowy lampy
oświetleniowej.
W przypadku podwieszonego sufitu odchodzi nam przy okazji potrzeba miniaturyzacji układu.
Ale jak to podłączyć do naszego projektu?
Ja to rozwiązałem w następujący sposób.
ModułJak widać na załączonym schemacie stosując
takie połączenie rozwiązałem dwie sprawy.
Pierwsza, możliwość załączenia jednego punktu oświetleniowego za pomocą wyłącznika.
W końcu nie zawsze mamy pod ręką smartfona.
Druga, możliwość załączania obu punktów oświetleniowych przez sieć WiFi.
Kolejny do przemyślenia był fakt czy do sterowania jedną lampą potrzebny jest tak rozbudowany program jak „Virtuino.
Doszedłem do wniosku że nie koniecznie.
Efektem tego było wpisanie nowego o wiele prostszego programu do modułu WiFi i stworzenie aplikacji na smartfona z androidem który zrealizuje to zadanie równie dobrze.








Program do WeMos:

W programie w miejsce o tytule „nazwa sieci podajemy nazwę swojej sieci WiFi jaka mamy w domu
a w miejsce „Hasło podajemy hasło do ej sieci.
Nr Ip jest to adres potrzebny do komunikacji z routerem.
Wspomniany numer musimy wpisać w program sterownika, (wyróżniłem czerwonym kolorem)
a także ustawić go w preferencjach programu „BULB w formie np. „ localhost .
Podczas zmiany modułu na drugą wersję okazało się że wykorzysta-łem przekaźniki sterowane
inną polaryzacją a co za tym idzie zmieniła się odwrotność działania sterownika.
Program został napisany pod kątem przekaźników sterowanych stanem niskim.
W innych przypadkach trzeba zmodyfikować stany portów na starcie programu a także reakcji modułu
na otrzymywane polecania ze smartfona.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char *ssid = "nazwa sieci";
const char *pass = "hasło";
String command;
ESP8266WebServer server(80);

void respond(){
  server.send(200,"text/html","<h1>Jesteś połączony</h1>");
}

void setup() {
 
Serial.begin(115200);
Serial.println(" Uruchomienie konfiguracji punktu dostępu");
WiFi.softAP(ssid,pass);
WiFi.mode(WIFI_STA);
WiFi.config (IPAddress(192, 168, 1, 100), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0)); //Adresy potrzebne do komunikacji z routerem

IPAddress IPserver = WiFi.softAPIP();
Serial.println(" IP address server : ");
Serial.println(IPserver);
server.on("/",respond);
server.begin();
server.onNotFound([](){
  //command=" ini data dari klien : ";
  command=server.uri();
  server.send(200,"text/plain",command);
});

pinMode(D1, OUTPUT);
digitalWrite(D1, LOW);
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW);
}

void loop() {
 
server.handleClient();
if(command.equals("/Led1On")){
  digitalWrite(D1, HIGH);
}
if(command.equals("/Led1Off")){
  digitalWrite(D1, LOW);
}
if(command.equals("/Led2On")){
  digitalWrite(D2, HIGH);
}
if(command.equals("/Led2Off")){
  digitalWrite(D2, LOW);
}
}



Aplikacja BULB na Androida: