Skocz do zawartości

Komunikacja między dwoma ESP8266


Pomocna odpowiedź

Napisano

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>";
}

 

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.

(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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...