UDP Daten empfangen

Hallo zusammen, ich möchte mit zwei wemos d1 minis etwas (relativ) einfaches realisieren.

an Controller 1 wird ein Schalter gedrückt, er sendet per UDP eine 1. das funktioniert schon super!

Controller 2 soll das Signal empfangen und eine LED leuchten lassen*das funktioniert schon! Aber nur, wenn beide in meinem Haus-WLAN hängen!*

ich hätte diese Übertragung aber gerne, ohne auf ein WLAN-Netzwerk angewiesen zu sein.

Es soll wohl gehen, indem man Controller 2 (also den Empfänger) als Access Point konfiguiert. Aber wie funktioniert das? Das geht leider weit über meine C-Grundkenntnisse hinaus...

Dani

zockerlein: Es soll wohl gehen, indem man Controller 2 (also den Empfänger) als Access Point konfiguiert. Aber wie funktioniert das? Das geht leider weit über meine C-Grundkenntnisse hinaus...

Dann sieh dir doch einfach mal die zahlreichen Beispiele in der IDE zum Board an. Da findest du auch einen AccessPoint.

Hi :) ja da hab ich natürlich schon geschaut, er richtet dann auch den AP ein und startet die UDP Verbindung. nur empfängt er da nichts?

zockerlein: Hi :) ja da hab ich natürlich schon geschaut, er richtet dann auch den AP ein und startet die UDP Verbindung. nur empfängt er da nichts?

Ok....dann machst du einen Fehler. Aber den sehen wir nicht.

Wie auch ? Wenn du alles geheim hälst.

Poste Sketch, Schaltung und Bilder des Aufbaus.

entschuldigung :)

https://pastebin.com/FJPmR7BR das ist die Empfängerseite

die Schaltung ist recht simpel. Auf der Senderseite ein Taster und 2 LEDs. Led 1: zum AP verbunden Led 2: sende Taster ist quasi der Trigger zum Senden

Auf der Empfängerseite nur 2 LEDs Led 1: AP erfolgreich eingerichtet Led 2: Empfange Daten

und noch schaltplan und steckplatine:

Stelle Deinen Sketch bitte hier im Forum direkt ein. Benutze dazu Codetags (</> oben links).

Gruß Tommy

Achso klar :slight_smile:

EmpfangenUDP

/* Create a WiFi access point and provide a web server on it. */
 
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WiFiUDP.h>
 
/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";
 
// UDP variables
unsigned int localPort = 8888;
WiFiUDP UDP;
boolean udpConnected = false;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back
 
ESP8266WebServer server(80);
 
/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void handleRoot() {
    server.send(200, "text/html", "<h1>You are connected</h1>");
}
 
void setup() {
    delay(1000);
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");
    /* You can remove the password parameter if you want the AP to be open. */
    WiFi.softAP(ssid, password);
 
    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    server.on("/", handleRoot);
    server.begin();
    Serial.println("HTTP server started");
 
  udpConnected = connectUDP();
  if (udpConnected)
  {
    // initialise pins
    pinMode(D5,OUTPUT);
    pinMode(D0,OUTPUT);
    digitalWrite(D0,HIGH);
  }
 
}
 
void loop()
{
  server.handleClient();
  if(udpConnected)
    {
     
      // if there’s data available, read a packet
      int packetSize = UDP.parsePacket();
      if(packetSize)
        {
          // turn LED on
          digitalWrite(D5,HIGH);
          delay(50);
          digitalWrite(D5,LOW);
        }
     delay(10);
    }
}
 
boolean connectUDP()
{
  boolean state = false;
 
  Serial.println("");
  Serial.println("Connecting to UDP");
 
  if(UDP.begin(localPort) == 1)
  {
    Serial.println("Connection successful");
    state = true;
  }
  else
  {
     Serial.println("Connection failed");
  }
  return state;
}

Die Werbebotschaft von Pastebin gehört mit Sicherheit nicht zum Sketch.

Hast Du Dir mal UDP-Beispiele der Lib WiFiUdp angeschaut? Da siehst Du, dass der Grundaufbau ein anderer ist.

z.B. gehört UDP.begin ins setup, das connectUDP() ist in meinen Augen weitgehend sinnfrei. Initialisierungen von Pins sollten auch ohne Bedingungen erfolgen.

Wenn Du Mit dem ESP8266 ein eigenes WiFi-Netz aufbaust, dann muss es in diesem Netz auch jemanden geben, der Dir etwas über UDP sendet, wenn Du empfangen willst. Wo ist der?

Gruß Tommy

Ok danke schon mal :) Ich bin kein Programmierer, deswegen wundert euch nicht wenn ich totalen Mist baue.. :D Das ist aus mehreren Beispielen zusammengeschustert, anscheinend aus den falschen

Die PIN-Initialisierung kann natürlich auch wo anders hin, aber ich dachte es ist eigentlich egal... Es soll halt nur die LED leuchten, wenn die UDP-Verbindung steht.

Der Sender tut schon was er soll, deswegen dachte ich nicht dass er relevant ist. Ich kann den Code gerne heut Nachmittag hochladen :) Er sendet einfach eine "1" an 192.168.4.1 an den Port 8888 wenn der Taster gedrückt wird. Das habe ich auch überprüft

Die Werbung entferne ich gleich ^^

Einfach irgendwelchen Code zusammenkopiere, ohne ihn zu verstehen, funktioniert nur in den seltensten Fällen.

Am Besten gehst Du von den Beispielen Deiner Libs aus und verstehst, was diese tun.

Sieh Dir mal diesen Thread an. Dort wird zwar über das vorhandene WLAN gearbeitet aber das ist ja nur eine Zeile anders.

Gruß Tommy

Übers vorhandene Wlan funktionierts ja auch wunderbar! Und das versteh ich sogar :D

Nur was ist dann zum AP anders? Ich hab das Gefühl, dass ich auf dem komplett falschen Dampfer sitze...

Ich sitz grad in der Uni, werd mich heut Nachmittag mal mit deinem Link beschäftigen

so, ich hab mir jetzt deinen Link angeschaut :slight_smile:
Da ist der Code so wie bei meiner Schaltung per Wlan-Router, die auch funktioniert.

ich habe jetzt meine beiden Codes etwas eingedampft…

vielleicht werdet ihr schlau draus.

Sender:

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <OneButton.h>

//One Button
OneButton button = OneButton(D1, true);


// wifi connection variables
const char* ssid = "ESPap";
const char* password = "thereisnospoon";
boolean wifiConnected = false;

// UDP variables
unsigned int localPort = 8887;
const char* IP = "192.168.4.1";
unsigned int sendPort = 8888;
WiFiUDP UDP;



void setup() 
{
  button.attachClick(senden);
  button.setClickTicks(80);
// Initialise Serial connection
  Serial.begin(115200);

// Initialise wifi connection
  wifiConnected = connectWifi();
  
// initialise pins
  pinMode(D5,OUTPUT);
  pinMode(D0,OUTPUT);
// only proceed if wifi connection successful
  UDP.begin(localPort);
}

void loop() {
  button.tick();
  delay(10);
  digitalWrite(D0,HIGH);
  delay(10);
}

// connect to UDP – returns true if successful or false if not
/*boolean connectUDP()
{
  boolean state = false;

  Serial.println("");
  Serial.println("Connecting to UDP");

   if(UDP.begin(localPort) == 1)
   {
    Serial.println("Connection successful");
    state = true;
   }
   else
   {
    Serial.println("Connection failed");
   }

  return state;
}
*/
// connect to wifi – returns true if successful or false if not
boolean connectWifi()
{
  boolean state = true;
  int i = 0;
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

// Wait for connection
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
    if (i > 10){
    state = false;
    break;
  }
  i++;
  }
  if (state)
  {
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else 
  {
    Serial.println("");
    Serial.println("Connection failed.");
  }
  return state;
}

void senden()
{
  byte message[1];
message[0] = 1;
Serial.println("sende...");
UDP.beginPacket(IP,sendPort);
UDP.write(message,sizeof(message));
UDP.endPacket();
Serial.println("gesendet!");
digitalWrite(D5, HIGH);
delay(500);
digitalWrite(D5, LOW);

}

Empfänger:

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
#include <WiFiUDP.h>

/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";

// UDP variables
unsigned int localPort = 8888;
WiFiUDP UDP;
char packetBuffer[10]; //buffer to hold incoming packet,

ESP8266WebServer server(80);

void setup() {
  // initialise pins
  pinMode(D5,OUTPUT);
  pinMode(D0,OUTPUT);
	delay(1000);
	Serial.begin(115200);
	Serial.println();
	Serial.print("Configuring access point...");
	/* You can remove the password parameter if you want the AP to be open. */
	WiFi.softAP(ssid, password);

	IPAddress myIP = WiFi.softAPIP();
	Serial.print("AP IP address: ");
	Serial.println(myIP);
	server.on("/", handleRoot);
	server.begin();
	Serial.println("HTTP server started");
  UDP.begin(localPort);
  digitalWrite(D0,HIGH);
}

void loop() 
{
  server.handleClient(); 
  Serial.println("0");
  // if theres data available, read a packet
  int packetSize = UDP.parsePacket();
  if(packetSize)
   {
     Serial.println("1");
     // turn LED on 
     digitalWrite(D5,HIGH);
     delay(500);
     digitalWrite(D5,LOW);
    }
  delay(10); 
}

void handleRoot() 
{
  /* Just a little test message.  Go to http://192.168.4.1 in a web browser
  * connected to this access point to see it.
  */
  server.send(200, "text/html", "<h1>You are connected</h1>");
}

was ist eigentlich dieses “handle root” ?
Wofür brauche ich das? Irgendwie finde ich dazu nichts (oder suche an der falschen stelle)

Daniel

Das kommt halt raus, wenn man Sachen kopiert, die man nicht versteht. Für Deine reine UDP-Übertragung brauchst Du das überhaupt nicht, genau so wenig wie #include <ESP8266WebServer.h>.

Das kannst Du raus werfen, ebenso alles was mit server. beginnt. Das ist der Webserver.

Irgendwie werde ich aus Deinem Code für das eigene WiFi nicht schlau.
Der eine meldet sich an einem Netz an - ist das das Netz vom AP? Sind beide im gleichen Subnetz (IP-Bereich)?

Gruß Tommy

das war eben im Accespoint Beispiel des ESP8266 dabei... deswegen dachte ich halt ich brauchs... :-[

gut, ist raus geflogen.

der Sender erstellt über den AP ein Netzwerk in das sich der Sender einloggt. Dieses "ESPap". Das funktioniert anscheinend auch, da der Client nach einiger Zeit "WiFi connected" oder so ausgibt

oh mann ich geh mich vergraben...

ich habe einfach die Zeile "WiFi.mode(WIFI_STA);" vergessen. Also hat sowohl der Sender als auch der Empfänger gedacht, er wäre ein Access Point und hat jeweils ein eigenes Netzwerk aufgebaut...

jetzt funken beide wunderbar ^^

Danke dir :)

Hi

Wunderbar :) Genau durch so eine Rückmeldung wirst Du in Zukunft anderen Unglücklichen den Tag retten :)

MfG

hoffentlich :D

nur noch eine Sache ^^ kann ich dem Wemos d1 mini die 5V Versorgung direkt auf den 5V Ausgang legen?

hab das zwar hier gelesen:https://www.mikrocontroller.net/topic/435178 aber sicher ist sicher bevor der Chip abraucht... Mit der dort verlinkten Schematik kann ich leider nichts anfangen..

Das habe ich jetzt nicht ganz verstanden, was Du meinst. Ich löse es meistens so, dass ich in der Anwendung eine 5V-Versorgung für den Prozessor über einen Micro-USB-Stecker an den USB-Anschluss stecke. Da gibt es 50 Stück beim fC für kleines Geld.

In dem Stadium programmiere ich dann sowieso über OTA, wenn nix schief geht. Wenn ich doch mal an den USB muss, ziehe ich diesen Stecker ab und stecke einen USB vom HUB an. Zur Not geht auch ein Micro-USB-Kabel, bei dem die Datenadern durchtrennt sind.

Damit fahre ich ganz gut.

Gruß Tommy

hmm gut, das mit dem Micro-USB Kabel wäre auch eine Idee... Ist aber doch irgendwie recht... naja :D

Ich weiß dass z.B. mein Arduino Uno einen VInn port hat, über den ich ihn mit Strom versorgen kann. Beim Wemos D1 Mini soll das der 5V Output Pin sein. Daran könnte ich recht einfach einen Buckconverter mit einer Batterie hängen und den Chip so mit Strom versorgen.