ESP-01 Supla - włączanie komputera

xxpwnage23
Posts: 6
Joined: Tue Sep 03, 2019 4:12 pm

Tue Sep 03, 2019 5:12 pm

Włączanie komputera poprzez esp-01 i suple

Cześć,
Zrobiłem mały projekt i postanowiłem wrzucić go na forum, może komuś się przyda :)

Miałem problemy z zdalnym uruchamianiem komputera, kiedy byłem poza domem aby się do niego połączyć (wiem mógłbym go zostawić włączonego 24/7, ale prąd też kosztuje), więc postanowiłem zrobić prosty włącznik sterowany przez suple.

Chciałbym jeszcze znaczyć, że nie jestem żadnym elektronikiem a tylko interesuje się elektroniką, więc proszę nie krzyczeć jeżeli jest coś źle ;)

Do rzeczy co będziemy potrzebować:
  • ESP-01
  • Stabilizator na 3,3V
  • Płytka prototypowa
  • Gniazdo micro usb
  • Gold pin męskie
  • Gold pin żeńskie (dzielimy na 2x po 4 piny i wlutujemy do płytki jako gniazdo pod esp-01)
  • Przewód (mały kawałek do połączenia ścieżki)
  • Programator UART do ESP8266
  • Lutownica
  • Odsysacz do cyny (przydaje się gdy damy za dużo cyny i zlepią nam się ścieżki)

Schemat jak podłączyć:
Włączanie komputera supla.png
Schemat podłączenia
Włączanie komputera supla.png (59.64 KiB) Viewed 336 times
Serwer supla:

Konfigurujemy jako automat schodowy i ustawiamy włącznik na 1s
suplacloud.png
Konfiguracja na supla cloud
suplacloud.png (9.57 KiB) Viewed 336 times
Programowanie

Jeżeli pierwszy raz używacie programatora UART do ESP8266, musicie dolutować zworkę na pin GPIO0 i masę (wtedy esp przegodzi w tryb flash)
Dodajecie płytkę esp-01 do Arduino IDE (jest tego dużo w internecie więc możecie sobie to łatwo znaleźć).
Trzeba też dodać bibliotekę supli do arduino, którą znajdziecie tuta, prawie na samym dole opisaną ARDUINO https://www.supla.org/pl/download

Wykorzystamy gotowy kod i edytujemy w nim:
  • GUID - generujemy i wklejamy w kod https://www.supla.org/arduino/get-guid
  • SSID sieci wifi
  • Hasło sieci wifi
  • Adres serwera - dostajemy go po zalogowaniu na supla-cloud
  • Identyfikator lokalizacji - dostajemy go po zalogowaniu na supla-cloud
  • Hasło - dostajemy go po zalogowaniu na supla-cloud
  • Pin z którego będziemy włączać nasz komputer czyli SuplaDevice.addRelay(2, true); (już jest ustawiony na GPIO 2 z parametrem TRUE)

Code: Select all

/**
 * Supla.org NodeMCU WiFi minimal example
 * Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>
 * 
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

WiFiClient client;

// Setup Supla connection
const char* ssid     = "MyWiFiNetwork";
const char* password = "MyWiFiPassword";

void setup() {
  Serial.begin(115200);
  delay(10);

  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(2, true);           // 44 - Pin number where the relay is connected      
                                      // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                      // to enable "port value inversion"
                                      // where HIGH == LOW, and LOW == HIGH   

  // CHANNEL1 - RELAY
 // SuplaDevice.addRelay(45, true);           // 45 - Pin number where the relay is connected   

  // CHANNEL3 - TWO RELAYS (Roller shutter operation)
  //SuplaDevice.addRollerShutterRelays(46,     // 46 - Pin number where the 1st relay is connected   
//                                     47, true);    // 47 - Pin number where the 2nd relay is connected  

  // CHANNEL4 - Opening sensor (Normal Open)
  //SuplaDevice.addSensorNO(A0); // A0 - Pin number where the sensor is connected
                               // Call SuplaDevice.addSensorNO(A0, true) with an extra "true" parameter
                               // to enable the internal pull-up resistor


  // CHANNEL5 - Opening sensor (Normal Open)
  //SuplaDevice.addSensorNO(A1); // A1 - Pin number where the sensor is connected


  // CHANNEL6 - DHT22 Sensor
  // SuplaDevice.addDHT11();
  // SuplaDevice.addAM2302();
  // SuplaDevice.addDHT22();

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr1.supla.org",  // SUPLA server address
                    0,                 // Location ID 
                    "");               // Location Password

}

void loop() {
  SuplaDevice.iterate();
}

// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = NULL;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}
Efekt końcowy:
IMG_20190903_181001.jpg
Godowy projekt
IMG_20190903_181001.jpg (4.46 MiB) Viewed 336 times
Jeszcze dodam na koniec

Można zasilić z kabla micro usb lub wpiąć się w płytę główną komputera pod porty usb tam znajduje się zasilanie 5V i podłączyć do pinów na naszej płytce (nie pomylcie plusa z minusem).
Do czterech gold pinów wyprowadzonych obok stabilizatora wpinamy naszą płytę główną(zwróćcie uwagę na plus i minus ) Power BTN (plus), pin obok GND oraz przełącznik z frontu obudowy .

Powodzenia :)
Yepestis
Posts: 141
Joined: Mon Sep 24, 2018 6:08 pm
Location: Wrocław

Tue Sep 03, 2019 5:34 pm

Fajny projekt, jest to jakaś alternatywa dla Wake on LAN.
xxpwnage23
Posts: 6
Joined: Tue Sep 03, 2019 4:12 pm

Tue Sep 03, 2019 5:40 pm

Yepestis wrote:
Tue Sep 03, 2019 5:34 pm
Fajny projekt, jest to jakaś alternatywa dla Wake on LAN.
Dzięki :)
Wake on LAN jest bardzo fajne kiedy korzysta się w sieci lokalnej, niestety poza domem i brakiem dostępu do sieci lokalnej już jest kiepsko, dlatego też zrobiłem taki projekcik.
Yepestis
Posts: 141
Joined: Mon Sep 24, 2018 6:08 pm
Location: Wrocław

Tue Sep 03, 2019 7:15 pm

Tak sobie pomyślałem że można by wykorzystać Wake on LAN za pomocą ESP podpiętego pod Suplę.
xxpwnage23
Posts: 6
Joined: Tue Sep 03, 2019 4:12 pm

Wed Sep 04, 2019 5:18 pm

Yepestis wrote:
Tue Sep 03, 2019 7:15 pm
Tak sobie pomyślałem że można by wykorzystać Wake on LAN za pomocą ESP podpiętego pod Suplę.
W sumie fajny pomysł, jeżeli masz na myśli to co ja czyli w supli naciskach włącz i w esp, które jest w sieci lokalnej wywołuje się funkcja wake on lan i wysyła pakiet do komputera żeby się uruchomił.
Zrobił bym takie coś, ale nie wiem jak zrobić taki "wirtualny przycisk", który zamiast zmieniać stan na pinie to uruchamia funkcję.
Yepestis
Posts: 141
Joined: Mon Sep 24, 2018 6:08 pm
Location: Wrocław

Wed Sep 04, 2019 5:35 pm

Zawsze można zmieniać stan pinu, a następnie odczytywać jego stan :D
xxpwnage23
Posts: 6
Joined: Tue Sep 03, 2019 4:12 pm

Wed Sep 04, 2019 6:08 pm

Też jakieś wyjście, jak będę miał chwile i uda mi się zrobić coś takiego to wrzucę na forum ;)
Yepestis
Posts: 141
Joined: Mon Sep 24, 2018 6:08 pm
Location: Wrocław

Wed Sep 04, 2019 7:48 pm

Jak byś potrzebował sprawdzonej biblioteki do WOL dla ESP8266
https://github.com/a7md0/WakeOnLan

Przed chwilą przetestowałem na laptopie po WiFi i działa.
Jest tylko jeden problem, funkcja wysyłająca "magiczne pakiety" używa delay(), co może powodować problemy z działaniem reszty kodu.
Ale można to łatwo przerobić.
User avatar
shimano73
Posts: 855
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Wed Sep 04, 2019 8:17 pm

Zainteresowałem się i również znaleźnemu cos podobnego
https://github.com/koenieee/WakeOnLan-ESP8266
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
xxpwnage23
Posts: 6
Joined: Tue Sep 03, 2019 4:12 pm

Thu Sep 05, 2019 12:16 pm

A więc zrobiłem, z tym że chciałbym to zrobić inaczej ale się nie da lub nie wiem że się da. Chodzi mi o to aby dodać np pin 55 (którego fizycznie nie ma) i nim sterować, co pozwoliło by mi dodać większą ilość komputerów do uruchamiania.

Jeszcze mam pytanie trochę z innej beczki gdzie znajdę dokumentację biblioteki supla na arduino, jest polecenie np "SuplaDevice.addRelay" skąd mam wiedzieć jakie są parametry dodatkowe itd... nie chcę abyście mnie odsyłali do kodu źródłowego bo nie jestem programistą a gdybym był nie chciało by mi się szukać odwołań i rozszyfrowywania całej biblioteki bo mi tylko zależy znaleźć jedno polecenie. Chodzi mi o coś takiego https://www.geeksforgeeks.org/loops-in-c-and-cpp/ otwieram czytam i wszystko wiem


Poniżej kod, należy zainstalować bibliotekę https://github.com/koenieee/WakeOnLan-ESP8266
Kod uruchamianie komputera przez pakiet WOL przy użyciu supli:

Code: Select all

/**
 * Supla.org NodeMCU WiFi minimal example
 * Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>
 * 
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>
#include <WakeOnLan.h> // biblioteka WOL

int PinKomputer;  // definiowane zmiennej pinu z którego będziemy odczytywać stan
IPAddress computer_ip(255,255,255,255); // tego nie ruszamy
byte macKomputera[] = { 0x50, 0xE5, 0x49, 0x23, 0x92, 0x82 }; // tutaj wpisujemy nasz mac komputera (jeżeli adress mac to: 50-E5-49-23-92-82 zmieniamy go w taka formę jak po lewej stronie)

WiFiClient client;
WiFiUDP UDP;

// Setup Supla connection
const char* ssid     = "SSID";
const char* password = "HASLOWIFI";

void setup() {
  Serial.begin(115200);
  delay(10);
  UDP.begin(9); //start UDP client, not sure if really necessary.

  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Ethernet MAC address
  uint8_t mac[6] = {0x2E, 0x30, 0x10, 0x02, 0x00, 0x00};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(2, true);           // nasz pin, na którym będziemy zmieniac stan     


  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr1.supla.org",  // SUPLA server address
                    0,                 // Location ID 
                    "");               // Location Password

}

void loop() {
  SuplaDevice.iterate();

  TSD_SuplaChannelNewValue value1; 
  value1.SenderID = 0; 
  value1.ChannelNumber = 0; // Kanał naszego pinu
  value1.DurationMS = 0; 
  
  
  if(digitalRead(2)==LOW){ //jeśli stan na pinie 2 jest niski
    delay(200);
    value1.value[0] = !value1.value[0]; //sprawdzenie stanu
    SuplaDevice.channelSetValue(&value1); //zmiana stanu
    Serial.println("Wysylanie pakietu WOL ...");
    WakeOnLan::sendWOL(computer_ip, UDP, macKomputera, sizeof macKomputera);
    
  }
}

// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = NULL;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}
Post Reply