INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 Daten übertragen
09.12.2018, 12:06
Beitrag #1
Smile ESP8266 Daten übertragen
Hallo Zusammen,

Ich möchte gerne zwei ESP8266 miteinander reden lassen. Im folgenden Programm habe ich einen Server ESP8266 und einen Client ESP8266.

Miteinander verbinden geht alles soweit nur bekomme ich es mit der Übertragung von Daten (also z.B. einem Byte) nicht gebacken.

Aktuell hat der eine ESP8266(Client) einen Taster und ich möchte diesen Zustand übertragen auf den zweiten. Später soll es mal ein ganzes Byte sein. Das wäre mein Wunschziel. Smile

1. Ich weiß nicht wie ich die Variable deklarieren soll die ich übergeben will.
(Würde nur drauf achten, dass Empfänger und Sender gleich deklariert sind.)

2. Ich weiß nicht welchen Befehl ich jetzt nehmen soll für das senden an den Server.
client.write // client.print?? Oder eine ganz andere Lib?? mit besseren Befehlen?

3. Das gleich dann auch beim empfangen. Welchen Befehl muss ich auf der Gegenseite verwenden?

Ich versuche ja jetzt erst einmal einen Tastendruck zu übermitteln. Auf lange Sicht soll es dann ein Byte sein.


Über eure Hilfe würde ich mich sehr freuen.
Einen schönen zweiten Advent wünsche ich euch. Smile



Accesspoint (Server)
Code:
//WEMOS Accesspoint mit LED


#include <ESP8266WiFi.h>

WiFiServer server(80);
IPAddress IP(192,168,4,15);
IPAddress mask = (255, 255, 255, 0);

byte ledPin = 2;

void setup() {
  Serial.begin(9600);
  WiFi.mode(WIFI_AP);
  WiFi.softAP("Wemos_AP", "Wemos_comm");
  WiFi.softAPConfig(IP, IP, mask);
  server.begin();
  pinMode(ledPin, OUTPUT);
  Serial.println();
  Serial.println("accesspoint_bare_01.ino");
  Serial.println("Server started.");
  Serial.print("IP: ");     Serial.println(WiFi.softAPIP());
  Serial.print("MAC:");     Serial.println(WiFi.softAPmacAddress());
}

void loop() {
  WiFiClient client = server.available();
  if (!client) {return;}
  byte request = client.read();
  Serial.println("********************************");
  Serial.print("From the station: ");
  Serial.println(request);
  client.flush();
  
}


Station (Client)
Code:
//WEMOS Client mit Taster

#include <ESP8266WiFi.h>


//Variablen deklarieren
//######################################
byte ledPin = 2;                    // Interne LED vom ESP 8266 Modul
byte Taster = 4;                    // GPIO 4 wird mit einem Taster beschaltet
byte temp, memo = 0;                // Merker für Tasterstatus & Hilfsmerker
char ssid[] = "Wemos_AP";           // SSID of your AP
char pass[] = "Wemos_comm";         // password of your AP

IPAddress server(192,168,4,15);     // IP address of the AP
WiFiClient client;


//Setup
//######################################
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(Taster, INPUT_PULLUP);

  //Inizialisiere WIFI
  //######################################
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);           // connects to the WiFi AP
  Serial.println();
  Serial.println("Connection to the AP");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.println("Connected");
  Serial.println("station_bare_01.ino");
  Serial.print("LocalIP:"); Serial.println(WiFi.localIP());
  Serial.println("MAC:" + WiFi.macAddress());
  Serial.print("Gateway:"); Serial.println(WiFi.gatewayIP());
  Serial.print("AP MAC:"); Serial.println(WiFi.BSSIDstr());
}


//Daten an AP senden
//######################################
void data_to_AP (byte temp){
  client.connect(server, 80);
  digitalWrite(ledPin, LOW);
  Serial.println("********************************");
  Serial.print("Byte sent to the AP: ");
  Serial.println(temp);
  Serial.println(client.write(temp));
  client.flush();
  digitalWrite(ledPin, HIGH);
  client.stop();
}


//HAUPTPROGRAMM
//######################################
void loop() {
  temp = digitalRead(Taster);


  if (temp == LOW & memo == LOW){
    Serial.print("TASTER: LOW   ");
    Serial.println(temp);
    memo = HIGH;
    data_to_AP(temp);
    Serial.println("********************************");
    Serial.println("********************************");
    Serial.println("");

    
  }else if(temp == HIGH & memo == HIGH){
    Serial.print("TASTER: HIGH   ");
    Serial.println(temp);
    memo = LOW;
    data_to_AP(temp);
    Serial.println("********************************");
    Serial.println("********************************");
    Serial.println("");

  }  
delay(500);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2018, 12:14
Beitrag #2
RE: ESP8266 Daten übertragen
Schau Dir mal das Beispiel #32 an. Da habe ich eine Übertragung beliebiger Daten per UDP beschrieben.
Das Beispiel geht von einem ESP als AP aus, es funktioniert aber genau so, wenn beide als STA im Netz arbeiten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2018, 15:32
Beitrag #3
RE: ESP8266 Daten übertragen
Hier mal was aus meinem Baukastensystem.
Auf die schnelle zusammengestückelt und eingekürzt.

Sender mit Taster
Code:
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>

ESP8266WebServer server(80);

const char* url = "http://192.168.178.32";        // trage hier die URL deines  anderen ESP8266 ein
const byte buttonPin = 4;

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

void Connect() {      // Funktionsaufruf "Connect();" muss im Setup eingebunden werden
  byte i = 0;
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    i++;
    Serial.printf(" %i sek\n", i);
    if (i > 9) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("Esp8266 IP: " + WiFi.localIP().toString());
}

void button() {                               // bei jedem Tastendruck wird einmal gesendet
  bool aktueller = 0;
  static bool vorheriger = 0;
  static unsigned long letzteMillis = 0;
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 100) {
    aktueller = !digitalRead(buttonPin);
    if (!aktueller && aktueller != vorheriger) {
      httpClient("/bled");
    }
    vorheriger = aktueller;
    letzteMillis = aktuelleMillis;
  }
}

void httpClient(const String &message) {
  static int16_t tempint = 0;
  HTTPClient http;
  Serial.printf("\nFunktion: %s meldet in Zeile: %d -> HttpClient Begin\n", __PRETTY_FUNCTION__, __LINE__);
  Serial.println(url + message);
  http.begin(url + message);
  int16_t httpCode = http.GET();
  if (httpCode > 0) {
    Serial.println("HTTP / 1.1 " + (String)httpCode);
    if (httpCode == HTTP_CODE_OK) {
      String payload = http.getString();
      Serial.println("Antwort: " + payload);
    }
  }
  else {
    Serial.println("Fehler: " + http.errorToString(httpCode));
  }
  http.end();
}

void setup() {
  Serial.begin(115200);
  delay(100);
  //Serial.printf("\nSketchname: %s\nBuild: %s\n\n", (__FILE__), (__TIMESTAMP__));  // Core Version 2.3.0
  Serial.printf("\nSketchname: %s\nBuild: %s\n%s\n\n", (__FILE__), (__TIMESTAMP__), ESP.getFullVersion().c_str()); // ab Core Version 2.4.0
  pinMode(buttonPin, INPUT_PULLUP);
  Connect();

  server.begin();
}

void loop() {
  server.handleClient();
  button();
}

Empfänger Onboard Led toggle
Code:
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

void Connect() {      // Funktionsaufruf "Connect();" muss im Setup eingebunden werden
  byte i = 0;
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    i++;
    Serial.printf(" %i sek\n", i);
    if (i > 9) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("Esp8266 IP: " + WiFi.localIP().toString());
}

void onboardLed() {
  server.on("/bled", []() {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));    // LED umschalten
    Serial.println(digitalRead(LED_BUILTIN) ? "LED ist aus" : "LED ist an");
    server.send(200, "text/plain", digitalRead(LED_BUILTIN) ? "Led aus" : "Led ein");
  });
}

void setup() {
  Serial.begin(115200);
  delay(100);
  //Serial.printf("\nSketchname: %s\nBuild: %s\n\n", (__FILE__), (__TIMESTAMP__));  // Core Version 2.3.0
  Serial.printf("\nSketchname: %s\nBuild: %s\n%s\n\n", (__FILE__), (__TIMESTAMP__), ESP.getFullVersion().c_str()); // ab Core Version 2.4.0

  Connect();
  onboardLed();

  server.begin();
}

void loop() {
  server.handleClient();
}

Ich habe im Sender bewußt den Webserver drin gelassen, damit man sieht das jeder als Server laufen kann, wenn gewollt. Kann natürlich auch als AP laufen.

So, Taster OK.

Doch was willst du wirklich machen(senden)?

Bevor ich es vergesse, ja Tommy ich weiß, UDP hat weniger Overhead.
Der httpclient ist eine zu selten erwähnte, von mehreren Möglichkeiten.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 11:55
Beitrag #4
RE: ESP8266 Daten übertragen
Guten Morgen Zusammen Smile

Danke für die schnellen Antworten und die Hilfe.
Ich schaue mir mal eure Beispiele in Ruhe an und ich denke da kann ich viel raus lernen. Hab bestimmt noch paar Fragen dazu. Wink

Schon nen klasse Teil der ESP8266 / ESP 32

Gruß Matze
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2018, 19:00
Beitrag #5
RE: ESP8266 Daten übertragen
(09.12.2018 15:32)Fips schrieb:  Hier mal was aus meinem Baukastensystem.
Auf die schnelle zusammengestückelt und eingekürzt.

Sender mit Taster
Code:
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>

ESP8266WebServer server(80);

const char* url = "http://192.168.178.32";        // trage hier die URL deines  anderen ESP8266 ein
const byte buttonPin = 4;

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

void Connect() {      // Funktionsaufruf "Connect();" muss im Setup eingebunden werden
  byte i = 0;
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    i++;
    Serial.printf(" %i sek\n", i);
    if (i > 9) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("Esp8266 IP: " + WiFi.localIP().toString());
}

void button() {                               // bei jedem Tastendruck wird einmal gesendet
  bool aktueller = 0;
  static bool vorheriger = 0;
  static unsigned long letzteMillis = 0;
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 100) {
    aktueller = !digitalRead(buttonPin);
    if (!aktueller && aktueller != vorheriger) {
      httpClient("/bled");
    }
    vorheriger = aktueller;
    letzteMillis = aktuelleMillis;
  }
}

void httpClient(const String &message) {
  static int16_t tempint = 0;
  HTTPClient http;
  Serial.printf("\nFunktion: %s meldet in Zeile: %d -> HttpClient Begin\n", __PRETTY_FUNCTION__, __LINE__);
  Serial.println(url + message);
  http.begin(url + message);
  int16_t httpCode = http.GET();
  if (httpCode > 0) {
    Serial.println("HTTP / 1.1 " + (String)httpCode);
    if (httpCode == HTTP_CODE_OK) {
      String payload = http.getString();
      Serial.println("Antwort: " + payload);
    }
  }
  else {
    Serial.println("Fehler: " + http.errorToString(httpCode));
  }
  http.end();
}

void setup() {
  Serial.begin(115200);
  delay(100);
  //Serial.printf("\nSketchname: %s\nBuild: %s\n\n", (__FILE__), (__TIMESTAMP__));  // Core Version 2.3.0
  Serial.printf("\nSketchname: %s\nBuild: %s\n%s\n\n", (__FILE__), (__TIMESTAMP__), ESP.getFullVersion().c_str()); // ab Core Version 2.4.0
  pinMode(buttonPin, INPUT_PULLUP);
  Connect();

  server.begin();
}

void loop() {
  server.handleClient();
  button();
}

Empfänger Onboard Led toggle
Code:
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

void Connect() {      // Funktionsaufruf "Connect();" muss im Setup eingebunden werden
  byte i = 0;
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    i++;
    Serial.printf(" %i sek\n", i);
    if (i > 9) {
      Serial.print("\nVerbindung zum AP fehlgeschlagen !\n\n");
      ESP.restart();
    }
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("Esp8266 IP: " + WiFi.localIP().toString());
}

void onboardLed() {
  server.on("/bled", []() {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));    // LED umschalten
    Serial.println(digitalRead(LED_BUILTIN) ? "LED ist aus" : "LED ist an");
    server.send(200, "text/plain", digitalRead(LED_BUILTIN) ? "Led aus" : "Led ein");
  });
}

void setup() {
  Serial.begin(115200);
  delay(100);
  //Serial.printf("\nSketchname: %s\nBuild: %s\n\n", (__FILE__), (__TIMESTAMP__));  // Core Version 2.3.0
  Serial.printf("\nSketchname: %s\nBuild: %s\n%s\n\n", (__FILE__), (__TIMESTAMP__), ESP.getFullVersion().c_str()); // ab Core Version 2.4.0

  Connect();
  onboardLed();

  server.begin();
}

void loop() {
  server.handleClient();
}

Ich habe im Sender bewußt den Webserver drin gelassen, damit man sieht das jeder als Server laufen kann, wenn gewollt. Kann natürlich auch als AP laufen.

So, Taster OK.

Doch was willst du wirklich machen(senden)?

Bevor ich es vergesse, ja Tommy ich weiß, UDP hat weniger Overhead.
Der httpclient ist eine zu selten erwähnte, von mehreren Möglichkeiten.

Gruß Fips

Ich möchte gerne eine Fernsteuerung mit einen WII Nunchuk bauen.
Der ESP8266 schien mir wie dafür gemacht und der Nunchuck kostet nur ein paar Euro. Hab ihn mit na Lib aus dem netz schon mal so getestet. Das Geht alles.

Möchte gerne diese Daten übertragen.


Gruß Matze
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2018, 12:18
Beitrag #6
RE: ESP8266 Daten übertragen
(10.12.2018 19:00)Matze8266 schrieb:  mit na Lib aus dem netz....

Möchte gerne diese Daten übertragen.

Gruß Matze

???

Was denkst, wieviel Information über dein Vorhaben jetzt bei uns angekommen sind?

Stand bei mir:
Kleiner grauer Plastekasten spuckt Nullen und Einsen aus.
Die kommen vermutlich irgendwie in den Eps8266.

Damit kann ich dir leider noch nicht weiterhelfen.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2018, 18:44
Beitrag #7
RE: ESP8266 Daten übertragen
(11.12.2018 12:18)Fips schrieb:  
(10.12.2018 19:00)Matze8266 schrieb:  mit na Lib aus dem netz....

Möchte gerne diese Daten übertragen.

Gruß Matze

???

Was denkst, wieviel Information über dein Vorhaben jetzt bei uns angekommen sind?

Stand bei mir:
Kleiner grauer Plastekasten spuckt Nullen und Einsen aus.
Die kommen vermutlich irgendwie in den Eps8266.

Damit kann ich dir leider noch nicht weiterhelfen.

Gruß Fips

Nabend Fips. Smile

Also die Übertragung von Daten von einen ESP8266 zum anderen die stand allone betrieben werden ist für mich noch völliges Neuland.

Ich habe keinen genauen Schaltungsaufbau für ein Beispiel. Mich würde interessieren wie z.b. eine Datenübertragung von einem Byte abläuft. Es kann auf dem ersten ESP8266 generriet werden (also z.B. byte i = 15) und soll vom zweiten empfangen werden und erst mal im Serial Monitor ausgegeben werden. Wenn ich den Wert erstmal in der Variable auf dem zweiten ESP8266 habe kann ich damit ja machen was ich will.

Vielleicht denke ich aber auch völlig falsch, da ich immer einen Befehl schreiben und auf der Gegenseite den Befehl für das lesen suche. In den Beispielen sieht es auch immer so aus als würde man Texte als Übergabe verwenden und diese überprüfen.

Am besten für mich wäre natürlich ein sehr schlanker Code um das Prinzip zu verstehen.

Ich habe mich ja auf die Bibliothek bezogen in meinem Beitrag. Ich denke mal es gibt ganz unterschiedliche Möglichkeiten um diese Daten zu übertragen und dazu unterschiedlichste Bibliotheken die Leute geschrieben haben. Oder gibt es den einen Richtigen Weg?


Hoffe ich konnte meine wirren Gedanken etwas in Text umwandeln.
Bin auf jeden Fall froh über jede Erkenntnis hier. Smile


Schönen Abend euch
Gruß Matze
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2018, 18:57
Beitrag #8
RE: ESP8266 Daten übertragen
Den richtigen Weg gibt es nicht, es gibt mehrere mögliche Wege.

Fips und ich haben Dir ja bereits Beispiele gegeben. Durcharbeiten und verstehen musst Du die aber selbst. Das können wir Dir nicht abnehmen.
Wenn Du sie noch nicht verstehst, dann stelle konkrete Fragen und lerne die notwendigen Grundlagen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 Datenaufzeichnung auf Client über WiFi nuon 24 1.061 13.09.2019 14:33
Letzter Beitrag: Fips
  Debug mit Telnet ESP8266 (und ESP32 ungetestet)) Tommy56 7 4.517 07.09.2019 14:11
Letzter Beitrag: ardu_arne
  Esp8266-->Wemos D1: Nicht funktionsfähige WiFi Chips KarlMarv 11 2.417 27.08.2019 18:01
Letzter Beitrag: Tommy56
  ESP8266 8 Kanal Relais keine Aktualisierung im WebIF magnum1795 10 1.065 23.08.2019 07:54
Letzter Beitrag: Fips
  ESP8266 im WLAN (FRITZ-Box und Repeater) uk1408 2 648 20.08.2019 19:38
Letzter Beitrag: MeisterQ
  Wemos ESP8266 UDP-Empfang verschiedener Daten HarryB 1 537 09.08.2019 15:42
Letzter Beitrag: Tommy56
  Ferngesteuertes Modellauto mit ESP8266: Auswahl der Motoren dilbert 10 2.191 06.08.2019 11:32
Letzter Beitrag: dilbert
  ESP8266 als reiner Access Point Verbindung nur sporadisch TobiH 5 878 04.08.2019 18:56
Letzter Beitrag: Tommy56
  WeMos D1 mini ESP8266 error: <bits/c++config.h> AnFi 14 1.897 31.07.2019 13:54
Letzter Beitrag: AnFi
  Daten mehrerer ESP's mit Raspberry Pi 3+ anzeigen und schalten. Manny 13 1.736 29.07.2019 14:32
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste