Sehr geringe Reichweite bei Nutzung von ESP NOW

Hey ihr,

ich versuche aktuell ein paar Messwerte zusammen zutragen und weiter zu verarbeiten. Allerdings scheitert es bei mir schon an dem Zusammentragen der Daten.

Ich nutze dafür 4 ESP32 mit DHT11 Sensor, welche auf einen ESP32 senden sollen.
Die Geräte sind alle mit den internen Antennen und die zu überbrückende Distanz sind etwa 7-8 Meter.
Allerdings kriege ich nur Reichweiten von etwa 1Meter hin.
Das reicht natürlich nicht, um die Sensoren in der Wohnung zu verteilen.

Hier mein Code vom Master:

#include <esp_now.h>
#include <WiFi.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  int id;
  int t;
  int h;
}struct_message;

// Create a struct_message called myData
struct_message myData;

// Create a structure to hold the readings from each board
struct_message board1;
struct_message board2;
struct_message board3;
struct_message board4;

// Create an array with all the structures
struct_message boardsStruct[4] = {board1, board2, board3, board4};

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) {
  char macStr[18];
  Serial.print("Packet received from: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
  // Update the structures with the new incoming data
  boardsStruct[myData.id-1].t = myData.t;
  boardsStruct[myData.id-1].h = myData.h;
  Serial.printf("Temperatur: %d \n", myData.t);
  Serial.printf("Luftfeuchtigkeit: %d \n", myData.h,"%");
  Serial.println("ping");
}
 
void setup() {
  //Initialize Serial Monitor
  Serial.begin(115200);
  
  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.channel(7);
  

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
  // Acess the variables for each board
  /*int board1X = boardsStruct[0].x;
  int board1Y = boardsStruct[0].y;
  int board2X = boardsStruct[1].x;
  int board2Y = boardsStruct[1].y;
  int board3X = boardsStruct[2].x;
  int board3Y = boardsStruct[2].y;*/
  delay(10000);  
}

hier der Code meiner Slaves mit geänderten IDs natürlich.

#include <esp_now.h>
#include <WiFi.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  int id;
  int t;
  int h;
}struct_message;

// Create a struct_message called myData
struct_message myData;

// Create a structure to hold the readings from each board
struct_message board1;
struct_message board2;
struct_message board3;
struct_message board4;

// Create an array with all the structures
struct_message boardsStruct[4] = {board1, board2, board3, board4};

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) {
  char macStr[18];
  Serial.print("Packet received from: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
  // Update the structures with the new incoming data
  boardsStruct[myData.id-1].t = myData.t;
  boardsStruct[myData.id-1].h = myData.h;
  Serial.printf("Temperatur: %d \n", myData.t);
  Serial.printf("Luftfeuchtigkeit: %d \n", myData.h,"%");
  Serial.println("ping");
}
 
void setup() {
  //Initialize Serial Monitor
  Serial.begin(115200);
  
  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.channel(7);
  

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
  // Acess the variables for each board
  /*int board1X = boardsStruct[0].x;
  int board1Y = boardsStruct[0].y;
  int board2X = boardsStruct[1].x;
  int board2Y = boardsStruct[1].y;
  int board3X = boardsStruct[2].x;
  int board3Y = boardsStruct[2].y;*/
  delay(10000);  
}

Auf meinem Schreibtisch funktioniert alles, aber sobald ich die ESP von einander entferne geht nichts mehr über das ESP NOW.

Ich habe die alle schon extra auf Kanal 7 gelegt und mein WLAN auf die 11, im Umkreis sind keine anderen WLAN-Netze.

Ich habe auch gerade mal auf die ESP einen WLAN AP aufgespielt und mal die Signalstärken gemessen, diese sind sehr gering auf ~50cm.(YourAP1)

Immer her mit euren Ideen, mir fällt nichts mehr ein.

Dann mal die Frage, wie hast du denn die ESP32 montiert ?
Hat die Antenne genügend Freiraum zu anderen metallischen Flächen ?
Bedenke auch dabei, dass du eine Verbindung direkt von ESP32 zu ESP32 hast.

Hey,

Ich habe eines in einem 3D-Druck Gehäuse, und die anderen sind noch komplett frei.
ich bin gerade an dem Gehäuse noch einige Messungen am machen.

habe mir einen Access-Point Sketch auf die Boards geladen und messe es gerade mit dem Handy nach in unterschiedlichen Aufbauten.

scheinbar liegt es zumindest an dem verbauten Board an der Leitungsführung des Sensors, das war wohl keine kluge Idee den direkt hinter der Antenne herzuführen. Der macht nen guten Eindruck.

Bei den anderen Boards ist das Problem damit aber nicht behoben.

Und auch kein Metall in der Nähe ?
Selbst die metallischen Steckkontakte in den Steckboards bringen einige dB Verluste, wenn die Antenne darüber liegt.


Der liegt gerade so auf dem schreibtisch und mein Handy zum messen 20cm daneben. Habe eine signalstärke von -75dBm

Ok, das ist nicht sehr viel.
Warum muss es ESP-Now sein?
Geht nicht auch Wlan ?

Oder ESP mit außen Antenne, ewentuel im Router anderen Kanal einstellen, wenn das Netz voll ist hatman auch so was

Ich habe einen ESP8266 D1 mini "Handsender" auf dem Schreibtisch liegen den ich als Türöffner benutze.

Entfernung zum zweiten ESP8266 D1 mini ca 5m. Das Signal muss durch eine Decke hindurch. Das funktioniert.

Einerseits wollte ich das ESP NOW mal ausprobieren und die Werte dann von dem letzten ESP auf eine SPS Schicken.
An sich könnte ich mir die Geschichte über den letzten ESP sparen, allerdings komme ich dann nicht wirklich sinnvoll auf die SPS da die ESP32 kein Modbus TCP als Slave unterstützen, oder ich bin zu doof da was zu finden, bin aber auch schon paar Tage am suchen.

Ich mache ja auch gerade die Messungen mit dem WiFi Accesspoint und habe die schwachen Signale auf schon ein paar wenige Meter mit Sicht, also da ist kein ESP NOW im Spiel.

Gerade geht es von Couch zum Schreibtisch ~3meter und ich hab eine Signalstärke von -87dBm...

Ich vermute langsam ein Hardwareproblem, entweder in der Verdrahtung oder vom ESP selbst.

Im Garten ist ein ESP 8266 in einem Schupen aus blech sogar das stört nicht wen die Tür offen ist, auch um die 5m umang

das hab ich leider schon ausprobiert.
Sende und Empfange auf Kanal 7.
Mein Wlan liegt auf 11 und kein anderes WLAN ist in der nähe.

Weißt du aus dem Kopf ob der ESP8266 Sendestärker ist?

Kannst du auch etwas über die Feldstärke der einzelnen ESP8266 sagen ?

Was genau meinst du damit ?

Aber mit externer Antenne muss das deutlich besser gehen.

image
ja gut, das kann ich nochmal ausprobieren, ich habe allerdings gerade nichts hier.
Das ist das ESP das ist nutze.
Der Sensor ist aufgelegt auf:
V5(Unten Rechts) - Spannung +
GND(oben Links) - Spannung -
G27 - als Datenpin

Sollte ich da eventuell etwas ändern?
Weil selbst ohne Antenne sollte doch der Messwert bei direkter Nähe ~20cm gut sein, oder?

Naja ob der WLAN Chipsatz mehr Leistung ausstrahlt, also quasi höhere Feldstärke

Soweit ich das erinnere, ist die Sendeleistung der beiden identisch.
Bin grad nicht in der Werkstatt, du kannst das aber in den Datenblättern nachsehen.

Wenn ich die Dokumente richtig lese sind die gleich.

Ja, stimmt, die unterscheiden sich nur sehr geringfügig.