Skocz do zawartości

Komunikacja między dwoma ESP8266


Runner321

Pomocna odpowiedź

Cześć. 
Na układzie NodeMCU v3 za pomocą poniższego kodu mogę sterować przekaźnikiem (po podaniu stanu niskiego). Mogę tym sterować także z poziomu aplikacji na androida (proste dwa przyciski) stworzonej w mit app inventor. Wszystko działa tak jak trzeba.

Wszystko też działa za pośrednictwem domowego routera. 

Chciałbym teraz mieć możliwość wysterowania tego przekaźnika z "bezprzewodowego czujnika ruchu" czyli czujnik PIR HC-SR501 połączony z ESP8266. Teraz to ESP8266 chcę aby łączyło się z moim NodeMCU i wysterowało ten przekaźnik. 

Z tego co wiem, to aby włączyć przekaźnik trzeba wpisać w przeglądarce http://192.168.1.7/gpio/0 , więc możecie mi podpowiedzieć jak zrobić, żeby to ESP8266+PIR połączyło się z tą samą siecią co NodeMCU i wpisało ten adres http://192.168.1.7/gpio/0 np. po wykryciu ruchu ?

Dodatkowo czy mogę zastąpić domowy router access pointem stworzonym na kolejnym ESP8266?

 

#include <ESP8266WiFi.h>
 
const char* ssid = "nazwasieci";
const char* password = "haslo";
 
WiFiServer server(80);
 
void setup() {
  Serial.begin(9600); //domyślna prędkość transmisji
  delay(10);
 
 
  pinMode(2, OUTPUT);  // definiowanie pinu 2=GPIO2 (na płytce jes to pin D4) jako wyjście
  digitalWrite(2, 0);
  
  // połączenie z siecią WiFi, informacje wyświetlane są na Monitorze portu szeregowego
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);

//ustawienie statycznego adresu IP
IPAddress ip(192,168,1,7);   
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0);   
WiFi.config(ip, gateway, subnet);
delay(5000);
//-------------------------------
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Połączono z WiFi");
  
  // Start the server
  server.begin();
  Serial.println("Uruchomiono serwer");
 
  // Wyświetlenie IP modułu ESP
  Serial.println(WiFi.localIP());
}
 
void loop() {
  // sprawdź czy klient nawiązał połączenie
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Poczekaj, aż klient wyśle jakieś dane
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  

  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }
 
  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();
 
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>";
}

 

Link do komentarza
Share on other sites

16 minut temu, Runner321 napisał:

możecie mi podpowiedzieć jak zrobić, żeby to ESP8266+PIR połączyło się z tą samą siecią co NodeMCU i wpisało ten adres http://192.168.1.7/gpio/0 np. po wykryciu ruchu ?

Masz na swoim dysku bibliotekę ESP8266HTTPClient i przykłady - wystarczą?

17 minut temu, Runner321 napisał:

czy mogę zastąpić domowy router access pointem stworzonym na kolejnym ESP8266?

I tak i nie. ESP8266 w trybie AP nie działa jako switch (tzn. nie przekazuje pakietów między podłączonymi urządzeniami) - czyli nie. Ale jeśli masz jeden czy kilka ESP komunikujące się wyłącznie z głównym (w tym przypadku przekaźnikiem) - to tak, powinien on pracować w trybie AP.

Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, ethanak napisał:

Masz na swoim dysku bibliotekę ESP8266HTTPClient i przykłady - wystarczą?

Mam i coś tam zadziałało 😊 ESP8266 (dokładnie mam tutaj Wemos d1 mini) łączy mi się z NodeMCU i ustawia stan niski na D4, ponawia to ustawienie co 10s.

Wystarczyło uzupełnić tą linijkę o ten mój link i którym mówiłem. Tylko niestety nie za bardzo wiem co dalej dzieje się w kodzie. Z tego co widzę to program próbuje napisać "Hello World" na stronie NodeMCU, ale to jest mi nie potrzebne, jednak nie potrafię tego tak usunąć, żeby dalej działało to co chcę. 

 

http.begin(client, "http://" SERVER_IP "/gpio/0");

 

/**
   PostHTTPClient.ino

    Created on: 21.11.2016

*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

/* this can be run with an emulated server on host:
        cd esp8266-core-root-dir
        cd tests/host
        make ../../libraries/ESP8266WebServer/examples/PostServer/PostServer
        bin/PostServer/PostServer
   then put your PC's IP address in SERVER_IP below, port 9080 (instead of default 80):
*/
//#define SERVER_IP "10.0.1.7:9080" // PC address with emulation on host
#define SERVER_IP "192.168.1.7"

#ifndef STASSID
#define STASSID "nazwasieci"
#define STAPSK  "haslo"
#endif

void setup() {

  USE_SERIAL.begin(115200);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  WiFi.begin(STASSID, STAPSK);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    USE_SERIAL.print(".");
  }
  USE_SERIAL.println("");
  USE_SERIAL.print("Connected! IP address: ");
  USE_SERIAL.println(WiFi.localIP());

}

void loop() {
  // wait for WiFi connection
  if ((WiFi.status() == WL_CONNECTED)) {

    WiFiClient client;
    HTTPClient http;

    USE_SERIAL.print("[HTTP] begin...\n");
    // configure traged server and url
    http.begin(client, "http://" SERVER_IP "/gpio/0"); //HTTP
    http.addHeader("Content-Type", "application/json");

    USE_SERIAL.print("[HTTP] POST...\n");
    // start connection and send HTTP header and body
    int httpCode = http.POST("{\"hello\":\"world\"}");

    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      USE_SERIAL.printf("[HTTP] POST... code: %d\n", httpCode);

      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        const String& payload = http.getString();
        USE_SERIAL.println("received payload:\n<<");
        USE_SERIAL.println(payload);
        USE_SERIAL.println(">>");
      }
    } else {
      USE_SERIAL.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();
  }

  delay(10000);
}

 

Edytowano przez Runner321
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.