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 Programm richtig zusammen fassen sams2018 2 102 Gestern 10:51
Letzter Beitrag: sams2018
Question ESP32 Daten per Bluetooth auf AppInventor App anzeigen mamo1234 2 156 23.05.2019 14:10
Letzter Beitrag: mamo1234
  Esp8266 Arduino Core Version 2.5.1 Fips 1 186 12.05.2019 18:29
Letzter Beitrag: amithlon
  FTP client kann keine Daten empfangen I-Azubi 2 213 10.05.2019 08:53
Letzter Beitrag: Fips
  ESP8266 - SD-Kartenleser und FTP-Server ohne Funktion I-Azubi 6 301 09.05.2019 10:09
Letzter Beitrag: Fips
Question ESP8266 mit Stromsensor MisterE 2 260 06.05.2019 15:17
Letzter Beitrag: MisterE
  Problem mit Login bei ESP8266 mit ESP-Easy Koenig 2 256 05.05.2019 20:11
Letzter Beitrag: Tommy56
  Daten vom Sensor in einer Text-Datei auf meinem Web-Host speichern. Manny 45 2.922 27.04.2019 07:24
Letzter Beitrag: Fips
  WS2812 mit UNO WiFi R3 ATmega328P ESP8266 Modul exGeebot 17 1.575 13.04.2019 17:08
Letzter Beitrag: amithlon
  ESP8266 Zeitschaltung variabel 40 3.596 07.04.2019 20:18
Letzter Beitrag: Hilgi

Gehe zu:


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