Strana 1 z 1

ESP8266 2 receivery

Napísané: 28 Nov 2023, 12:56
od používateľa ryty
Ahojte,

uz dlhsie sa trapim s komunikaciou medzi ESP8266 v AP mode. Konkretne pouzivam modul ESP01s a navrhol som si kod, kde je 1 receiver a 3 transmittery. V tejto konfiguracii (1+3) vsetko funguje. pustil som sa do upgradu a nijako sa mi nedari napisat kody pre 2 receivery (chcel by som dosiahnut 2 receivery + 1 transmitter). Vacsinou som mal problem, ze ked boli oba receivery online, tak reagoval iba jeden, no ked boli online separatne (jeden za druhym) tak reagoval kazdy z nich. Skusal som kazdemu zariadeniu nastavovat fixnu IP, davat kazde zariadenie na iny port ale bez uspechu. Naozaj som sa zasekol na jednom mieste a neviem sa pohnut. Preto by som vas poprosil, ci by ste mi s tym pomohli. Vopred dakujem

Transmitter:

Kód: Vybrať všetko

//::::::::::::::::::TRANSMITTER::::::::::::::::::
#include <ESP8266WiFi.h>

const char* receiverIP = "192.168.4.1";  // IP address of the receiver
const int pirSensorPin = 2;              // PIR sensor pin connected to GPIO2

WiFiClient client;         // Initialize WiFi client
bool messageSent = false;  // Flag to track message sent status

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

  // Connect to the Receiver's Access Point
  WiFi.begin("ESP-alarm", "123456789");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to Receiver's AP...");
  }

  Serial.println("Connected to Receiver's AP");

  pinMode(pirSensorPin, INPUT);
}

void loop() {
  int motionDetected = digitalRead(pirSensorPin);

  if (motionDetected == HIGH && !messageSent) {
    Serial.println("Motion detected from Transmitter 1!");

    // Send a message to the receiver
    if (client.connect(receiverIP, 80)) {
      Serial.println("Connected to Receiver");
      client.println("MotionDetected1");
      client.stop();
      messageSent = true;  // Set the flag to indicate message sent
    }
  } else if (motionDetected == LOW && messageSent) {
    // Reset the flag when the PIR sensor is not detecting motion
    messageSent = false;
  }

  delay(100);
}
Receiver 1

Kód: Vybrať všetko

//:::::::::::::::::::RECEIVER 1:::::::::::::::::::::::
#include <ESP8266WiFi.h>

const char* receiverSSID = "ESP-alarm";      // Receiver's SSID
const char* receiverPassword = "123456789";  // Receiver's Wi-Fi Password
const int ledPin1 = 0;                       // GPIO0 pin for LED
const int ledPin2 = 2;                       // GPIO2 pin for LED

WiFiServer server(80);  // Create a server on port 80

bool isTriggered1 = false;
bool isTriggered2 = false;
bool isTriggered3 = false;

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

  // Set up the receiver as an Access Point
  WiFi.softAP(receiverSSID, receiverPassword);

  Serial.println("Receiver Access Point started");
  Serial.print("IP Address: ");
  Serial.println(WiFi.softAPIP());

  server.begin();           // Start the server
  server.setNoDelay(true);  // Set no delay for faster response
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  WiFiClient client = server.available();  // Check for client connection

  if (client) {
    String request = client.readStringUntil('\r\n');  // Read client data
    Serial.println(request);

    if (request.indexOf("MotionDetected1") != -1) {
      if (!isTriggered1) {
        Serial.println("PIR 1 Trigger received - Motion detected!");
        digitalWrite(ledPin1, HIGH);
        isTriggered1 = true;
        delay(2000);
        digitalWrite(ledPin1, LOW);
        isTriggered1 = false;
      }
    }
    delay(10);

    client.stop();  // Close the connection
  }
}


snazil som sa komentovat najviac kodu, ako to len slo, tak snad je to zrozumitelne. Mojim zamerom je, aby ked transmitter je triggernuty, tak odosle spravu do oboch receiverov a tie potom rozsvietia ledku. Kazde zariadenie ma svoju esp01s dosku a vyuzivaju svoju vlastnu wifi siet. nie je k dospozicii externa wifi.

Naozaj vopred dakujem za pomoc.

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 13:17
od používateľa maskrtnik01
Ak tomu rozumiem, každý receiver vysiela vlastnú wifi sieť, a transmitter sa snažíte pripojiť naraz na obe. To sa vám ani nepodarí.

Celkove nerozumiem, prečo na viacej zariadeniach súčasne aktivujete AP režim. Či to bude wifi router, malina, alebo nejaké ESPčko, stačí vám jedno zariadenie s AP, a na jeho sieť pripojiť všetko ostatné.

Alebo máte nejaký dôvod na to, aby boli oddelené siete? Potom by som im ale dával aj iné SSID.

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 15:33
od používateľa pocitujlasku
esp nevie byt sucasne na 2 AP, to standardne tusim ani nevie pocitac, ci mobil.
Bezne sa to riesi tak, ze sa vsetky zariadenia pripoja na jeden AP a v ramci siete potom komunikuju zariadenia medzi sebou. Cize vsetky su pripojene na wifi a prostrednictvom ci uz udp, alebo nejakej sluzby (mqtt) sa posielaju/prijimaju spravy.

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 21:32
od používateľa ryty
takze v praxi nie je mozne mat 2 zariadenia, ktore prijimaju spravy od transmitteru? alebo by bolo lepsie cestou, ze jeden z transmitterov nastavit ako dvojsmerny?

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 21:48
od používateľa maskrtnik01
To nikto nepovedal. V rámci jednej wifi siete s jedným AP môže komunikovať koľko zariadení chcete (ak sa každému ujde IP adresa a čas na vysielanie). Problém si spôsobujete tým, že sa snažíte na každom receiveri vysielať samostatnú sieť, a transmitter pripojiť na všetky naraz.

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 22:22
od používateľa ryty
trochu som kod ocesal, aby neboli zbytocne 2 AP. s tymito modulmi pracujem prvykrat, tak je to take kostrbate

Transmitter

Kód: Vybrať všetko

//::::::::::::::::TRANSMITTER:::::::::::::::
#include <ESP8266WiFi.h>

const char* receiverIP = "192.168.1.100";  // IP address of your receiver
const int pirSensorPin = 2;  // PIR sensor pin connected to GPIO2

WiFiClient client;

void setup() {
  Serial.begin(115200);
  pinMode(pirSensorPin, INPUT);

  WiFi.begin("Receiver_AP", "123456789");  // Connect to Receiver 1's access point
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  int motionDetected = digitalRead(pirSensorPin);

  if (motionDetected == HIGH) {

    Serial.println("Motion detected!");
    client.println("MotionDetected1");
    client.stop();
  }
  delay(100);  // Adjust delay as needed to prevent rapid sending of messages
}

Receiver 1

Kód: Vybrať všetko

//::::::::::::::::::::RECEIVER 1:::::::::::::::::
#include <ESP8266WiFi.h>

const char* apSSID = "Receiver_AP";    // Access Point SSID
const char* apPassword = "123456789";  // Access Point Password
const int ledPin = 2;                 // GPIO0 pin for LED (modify pin as needed)

WiFiServer server(80);  // Create a server on port 80

bool isTrigger = false;

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

  // Set up the device as an Access Point
  WiFi.softAP(apSSID, apPassword);

  Serial.println("Access Point started");
  Serial.print("IP Address: ");
  Serial.println(WiFi.softAPIP());

  server.begin();           // Start the server
  server.setNoDelay(true);  // Set no delay for faster response
  pinMode(ledPin, OUTPUT);
}

void loop() {
  WiFiClient client = server.available();  // Check for client connection

  if (client) {
    String request = client.readStringUntil('\r\n');  // Read client data
    Serial.println(request);

    if (request.indexOf("MotionDetected1") != -1) {
      if (!isTrigger) {
        Serial.println("Trigger received - Motion detected!");
        digitalWrite(ledPin, HIGH);
        isTrigger = true;
        delay(2000);
        digitalWrite(ledPin, LOW);
        isTrigger = false;
      }
    }
    delay(10);

    client.stop();  // Close the connection
  }
}


Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 22:23
od používateľa lucky62
neviem, či si je ryty vedomý toho, že WIFI umožňuje obojsmernú komunikáciu, teda pojmy ako transmitter a receiver sú mierne zavádzajúce.

WiFi AP - Access Point je zariadenie, ktoré čaká na pripojenie WiFi klientov.
WiFi klient je za riadenie, ktoré sa na AP pripojí (obvykle potrebuje názov WiFi = SSID a heslo, pokiaľ je WiFi chránená).

Po nadviazaní spojenia už je jedno, kto vysiela a kto prijíma pakety.

AP môže (ale aj nemusí) pracovať ako router - pakety prijaté od jedného zariadenia, preposiela inému zariadeniu (podľa IP adries).

Re: ESP8266 2 receivery

Napísané: 28 Nov 2023, 22:25
od používateľa pocitujlasku
Problem je, ze ty sa na to pozeras pravdepodobne z pohladu klasickej bus komunikacie, resp. obycajnej rf, kde posles do eteru signal, a ten si zachyti xx dalsich zariadeni - nieco ako tv, alebo radio.
Ale esp su wifi moduly, tam musis rozlisovat wifi spojenie a potom samotnu komunikaciu modulov.
Takze ako prve musis urobit fyzicku cestu pre data. To urobis najjednoduchsie tak, ze tie esp das ako klient a niekde si das AP (nemusi byt nikde pripojene, podstatne je, aby sa nan pripojili vsetky ESP, aj tie "vysielacie" aj "prijimacie". schvalne davam uvodzovky, lebo to nie je presne oznacenie.
tie ESP budu vsetky ako klient, kde im das ssid/heslo toho AP.
Takto mas vybudovane spojenia.
A teraz, uz mozes komunikovat s modulmi, ako chces. V tvojom pripade by bolo idealne bud pouzit nejaky hotovy protokol, napr. mqtt (ktory ma dobru podporu aj v arduine), alebo ist vlastnou cestou a posielat napr. udp broadcast, ktory si vie odchytit kazdy.