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 lassendas 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...
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.
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
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?
Ok danke schon mal
Ich bin kein Programmierer, deswegen wundert euch nicht wenn ich totalen Mist baue.. 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
so, ich hab mir jetzt deinen Link angeschaut
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)
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)?
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
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...
nur noch eine Sache ^^
kann ich dem Wemos d1 mini die 5V Versorgung direkt auf den 5V Ausgang legen?
hab das zwar hier gelesen:Wemos D1 Mini Vin? - Mikrocontroller.net
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.
hmm gut, das mit dem Micro-USB Kabel wäre auch eine Idee... Ist aber doch irgendwie recht... naja
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.