modulare, drahtlose kommunikation

Hallo alle zusammen,
in den letzten Wochen habe ich ein wenig mit dem ESP8266 und seinen "Geschwistern" gespielt. Leider nur mit geringen Erfolg.
Ich bastle seit einiger Zeit an einem Ampelprojekt mit einer Steuereinheit und diversen Endgeräten (Ampeln, Zeittafeln, Schrifttafeln und Soundmodulen). Das Ganze ist soweit Funktionsfähig nur die Verkabelung mit RJ45 Kabeln(30m-50m) ist nicht nur sehr umständlich sondern nimmt auch mehr als die hälfte der Materialkosten ein.
So kostet mich eine Anlage rund 400€ an Kabeln im EK. Was dann ungefähr 300m währen.
Meine Vorstellung währe jetzt die Endgeräte mit WiFi nach- oder umzurüsten.
In diesen Zusammenhang hätte ich mir das so vorgestellt:
-einen Zentralen "Server" mit Display und Tasten zum steuern
-bis zu 16 "Client" mit bis zu 12 digitalen Ein- und Ausgängen

  • der Server soll an alle, mehr oder weniger, zeitgleich senden und dann empfangen oder aber an vier "Hauptclient" senden welche dann an jeweils drei "Unterclient" weiterleiten.
    -die Client sollen sich, sofern eingeschalten und in Reichweite, automatisch mit dem Sever verbinden
    -ideal währe es wenn dies ohne Router und Internet möglich währe
    -optional mit einer WEB oder APP basierten unterstützung

meine Vorstellung war nun NodeMCU oder ein NanoESP Board als eigenständigen Server zu benutzen und für die Clienteventuell auf einen ESP8266 mit MCP23017 oder aber ebenfalls einen der og. zu verwenden. Leider ist die deutschsprachige für diese Zwecke mehr als dürftig weshalb ich mir nicht sicher bin ob dieser Weg realisierbar ist oder es vielleicht einen Einfacheren Weg gibt.

Gundelputz:
-ideal währe es wenn dies ohne Router und Internet möglich währe
-optional mit einer WEB oder APP basierten unterstützung

Das widerspricht sich teilweise. Wenn Du per WEB ran willst wäre ein Router schon ganz brauchbar.

Ich kann Dir jetzt nicht direkt aus eigener Erfahrung sagen, dass ich 12 Module verbunden habe (nur 2) aber über UDP sollte das funktionieren.
Der "zentrale" ESP8266 läuft dann als AP und baut das WLAN auf. An diesen könnte dann evtl. auch der Browser andocken (ungetestet).
Wie man sowas pirinzipiell aufbauen könnte habe ich mit 2 NodeMCU hier vorgestellt ab #32.
Wenn Du an den Einsatzstellen schon Arduino hat, kannst Du sie per I2C (Levelshifter nicht vergessen) an den ESP koppeln. Ein Beispiel dazu ist hier

Die jeweiligen Übertragungsprotokolle musst Du Dir selbst, emtsprechend Deinen Anforderungen, erarbeiten.

Gruß Tommy

vielen Dank erst mal
Webseitig ist für mich erst mal absolut nebensächlich
also ist die Wahl der dinge UDP
gibt es da eine gute deutschsprachige Dokumentation (auch gerne als Hardcopy zum kaufen)?

Schau in die Beispiele der Esp8266 nach udp. Wird gemacht im Prinzip wie seriell. Geht einfach. Und um alle gleichzeitig anzusprechen, sende an die Broadcast Adresse xxx.xxx.xxx.255

UDP ist ein sehr einfaches Protokoll. Schau Dir in den ESP8266-Libs die WiFiUdp.h an, was sie unterstützt.
Ohne Multicast brauchst Du fürs reine UDP nicht mehr als die Zeilen aus den von mir verlinkten Beispielen. Der etwas größere Aufwand ist die Protokollbearbeitung.
Je genauer Du das vorher planst, umso einfacher wird es.

Gruß Tommy

OK
Danke noch mal
werde mich erst mal in die Thematik einlesen
melde mich dann wieder
für einen Buchtipp bin ich immer noch offen

Bücher gibt es viele zum ESP8266 mit der Arduino-IDE. Ich kenne aber keins, da mir die Fundstellen im Netz immer als Anregung genügt haben. Der Rest sind Grundlagen, die Du sowieso lernen musst bzw. schon weißt.

Es sind ja immer die gleichen Abläufe:

char incomingPacket[10];

// Senden:
   Udp.beginPacket(remoteIP, port);
   Udp.write(was, wieviel);
   Udp.endPacket();

// Empfangen
  packetSize = Udp.parsePacket();
  // Da ist was da
  if (packetSize) {
    Serial.print("Empfangen "); Serial.print(packetSize);
    Serial.print(" von IP "); Serial.print(Udp.remoteIP());
    Serial.print(" Port "); Serial.println(Udp.remotePort());
    len = Udp.read(incomingPacket, sizeof(incommingPacket));
    // auswerten
  }

Gruß Tommy

So jetzt gehts in die heisse Phase.
Habe jetzt zum Testen den Conrad NanoESP und einen “selbst gebauten” NanoESP (ESP8266 + Levelschifter + Nano + erterne Spannungsquelle) aufgebaut. Als erstes Programm habe ich den Tag 4 des Conrad Weinachtscalender 2016 hergenommen.

/*
UDP-Send.
No change necessary.
*/

#define DEBUG true

#include <SoftwareSerial.h>

SoftwareSerial esp8266(11, 12); // RX, TX

void setup() 
{
  Serial.begin(19200);
  esp8266.begin(19200);

  esp8266.setTimeout(5000);
  if (sendCom("AT+RST", "ready")) 
  {
    debug("RESET OK");
  }

  if (configAP()) 
  {
    debug("AP ready");
  }
  if (configUDP()) 
  {
    debug("UDP ready");
  }
}

void loop() 
{
  if (esp8266.available())
    Serial.write(esp8266.read());
  if (Serial.available())
    esp8266.write(Serial.read());
}
/* von Tommy
void senden_empfangen()
{
  
char incomingPacket[10];

// Senden:
   Udp.beginPacket(remoteIP, port);
   Udp.write(was, wieviel);
   Udp.endPacket();

// Empfangen
  packetSize = Udp.parsePacket();
  // Da ist was da
  if (packetSize) {
    Serial.print("Empfangen "); Serial.print(packetSize);
    Serial.print(" von IP "); Serial.print(Udp.remoteIP());
    Serial.print(" Port "); Serial.println(Udp.remotePort());
    len = Udp.read(incomingPacket, sizeof(incommingPacket));
    // auswerten
  }
}
*/

//-----------------------------------------Config ESP8266------------------------------------

boolean configAP()
{
  boolean success = true;

  success &= (sendCom("AT+CWMODE=2", "OK"));
  success &= (sendCom("AT+CWSAP=\"NanoESP01\",\"\",5,0", "OK"));

  return success;
}

boolean configUDP()
{
  boolean success = true;

  success &= (sendCom("AT+CIPMODE=0", "OK"));
  success &= (sendCom("AT+CIPMUX=0", "OK"));
  success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2\",90", "OK"); //UDP-Server
  return success;
}

//-----------------------------------------------Controll ESP-----------------------------------------------------

boolean sendCom(String command, char respond[])
{
  esp8266.println(command);
  if (esp8266.findUntil(respond, "ERROR"))
  {
    return true;
  }
  else
  {
    debug("ESP SEND ERROR: " + command);
    return false;
  }
}

String sendCom(String command)
{
  esp8266.println(command);
  return esp8266.readString();
}

//-------------------------------------------------Debug Functions------------------------------------------------------
void serialDebug() {
  while (true)
  {
    if (esp8266.available())
      Serial.write(esp8266.read());
    if (Serial.available())
      esp8266.write(Serial.read());
  }
}

void debug(String Msg)
{
  if (DEBUG)
  {
    Serial.println(Msg);
  }
}

läuft auf beiden.
habe in Zeile 71
success &= (sendCom(“AT+CWSAP=“NanoESP01”,”",5,0", “OK”));
den Namen von NanoESP auf NanoESP01 bzw. NanoESP02 angepasst.
in Zeile 82
success &= sendCom(“AT+CIPSTART=“UDP”,“192.168.4.2”,90”, “OK”); //UDP-Server
habe ich die IP-Adresse beim 01 auf 192.168.4.2 und beim 02 auf 192.168.4.3 gesetzt
bei beiden bekomme ich bei der Anfrage der IPAdresse folgende antwort
+CIFSR:APIP,“192.168.4.1”
wo liegt hier mein denkfehler
Ich glaube das ich den einen zum Server und den anderen zum Client machen muss bin mir aber nicht sicher wie.
Das Beispiel von Tommy ist mir ein wenig zu umfangreich als das ich es 100% verstehen würde.

Mit den AT-Befehlen habe ich mich nie beschäftigt und habe auch nicht vor, das zu tun.
Da kann ich Dir leider nicht mehr helfen.

senden_empfangen() halte ich für keine gute Lösung. Du solltest in Deinem Ablauf schon entscheiden, ob Du gerade senden oder empfangen willst/musst.
Ich habe nicht geglaubt, dass man die paar Zeilen so gründlich missverstehen kann.

Gruß Tommy

ich bin schier am Verzweifeln.
So schwer kann das doch nicht sein.
mir raucht mitlerweile der Kopf.
Habe jetz so viel im Netz gelesen und doch nichts gefunden.
Ich würde gerne, um die Thematik zu verstehen, an den ersten NanoESP eine Taste drücken und am zweiten soll dann eine LED aufleuchten.
So schwer kann das doch nicht sein.
Also erst mal alten Router rausgeholt und minimalkonfiguriert.
Dann NanoESP mit folgendem Sketch bespielt:

/*
   Erstellt ein AccesPoint und öffnet eine UDP-Verbindung
*/

#include <NanoESP.h>
#include <SoftwareSerial.h>

#define SSID "Adler"
#define PASSWORD "1234567890111213"

#define LED_WLAN 13

NanoESP nanoesp = NanoESP();

void setup() {
  Serial.begin(19200);
  nanoesp.init();

  //Create AccessPoint
  if (nanoesp.configWifi(ACCESSPOINT, SSID, PASSWORD)) {  //AP Mode: Module creates WiFi
    Serial.println("Wifi ready");
    digitalWrite(LED_WLAN, HIGH);
  }
  else {
    Serial.println("Wifi not ready");
  }

  //Print IP in Terminal
  Serial.println(nanoesp.getIp());

  //Start UDP-Connection with id=0, IP=Broadcast IP, Send Port & Recieve Port = 55056
  if (nanoesp.startUdpServer(0, "192.168.4.255", 55056, 55056)) {
    Serial.println("UDP Connection OK");
  }
  else {
    Serial.println("UDP Connection not OK");
  }
}

void loop() {
  int client, len;

  //Recieve Data
  if (nanoesp.recvData(client, len)) {
    //Print Recieved Data in Serial Monitor
    Serial.println(nanoesp.readStringUntil('\r'));
    //Respond
    nanoesp.sendData(client, "Hello UDP Client");
  }
}

folgende Anwort erhalten:
Wifi ready
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:cf:b1:b5"
OK
UDP Connection OK
auch gut aber was habe ich da gemach.
offensichtlicht habe ich da eineAccespointin Zeile 20 erstellt. Will ich das? wenn ja wie gehts dann weiter.
In Zeile 32
if (nanoesp.startUdpServer(0, “192.168.4.255”, 55056, 55056))
erstelle ich dann einen UDP-Server. gleiche Frage.

Ich kenne mich gerade gar nicht mehr aus.

Hilfe!!!

Ich lese das hier schon eine Weile mit und befürchte, du willst das unbedingt mit der Brechstange erreichen.

Leider kann ich dir nicht helfen, da ich darin auch noch keine Erfahrungen habe.
Nur ein Tipp:
Besorge dir identische Module, am Besten Wemos D1 mini und arbeite genau nach den Beispielen.
Damit habe ich vor langer Zeit auch meine ersten ESP8266 Erfahrungen gesammelt und es hat alles funktioniert.
Immer Stück für Stück, dann klappt es auch.
Auch ohne Brechstange. :wink:

welche Beispiele meinst du genau?

Die, die in der IDE sind, wenn ESP8266 Boards installiert sind. Nach über 2 Jahren im Forum solltest du das wissen, oder solltrst du wissen, wie man mit Google umgeht

Gundelputz:
welche Beispiele meinst du genau?

Das verstehe ich jetzt nicht.

Da liegt wahrscheinlich eines meiner Probleme.
So sehr ich auch Suche ein Lib für den ESP8266 finde ich nicht. Das einzige was ich finde ist das: Adafruit_ESP8266.

Ich glaube auch das wir evtl. an einnander vorbei reden. Ich experimentiere z.Z. mit dem NanoESP vom Conrad rum(PretzelBoard). Ich werde das Gefühl nicht los das ich eurer Meinung nach den ESP8266 direkt programieren sollte und das Nanoboard als Portexpander drannhängen soll. Das möchte ich jetzt noch nicht(später auf jeden Fall).

aber ich mach für heute Feierabend.
Vielen Dank für eure Hilfe.
Scheut euch nicht zu schreiben wenn euch noch was einfällt.
Danke

Dieses ist gemeint: GitHub - esp8266/Arduino: ESP8266 core for Arduino

Mit der AT Firmware schlage ich mich auch nicht rum.
Die nervt nur.

Gundelputz:
Da liegt wahrscheinlich eines meiner Probleme.
......
Ich glaube auch das wir evtl. an einnander vorbei reden. Ich experimentiere z.Z. mit dem NanoESP vom Conrad rum(PretzelBoard). Ich werde das Gefühl nicht los das ich eurer Meinung nach den ESP8266 direkt programieren sollte und das Nanoboard als Portexpander drannhängen soll. Das möchte ich jetzt noch nicht(später auf jeden Fall).

Du machst dir das unnötig schwer.

Nimm wie ich schon schrieb, gleiche Module. Und am Besten die mit USB.

Damit hast du weniger Probleme. Wenn du alles in den Wind schlägst, wird es nicht leichter.

Vor allem wird er kaum jemanden mit genug Erfahrung in dem AT-Gedöns finden, der ihm helfen will/kann, da sich das heute keiner mehr antut.
Aber manche lernen halt nur durch Schmerzen, dass sie auf dem falschen Weg sind.

Wobei manche lernen es nie und andere noch später :wink:

Gruß Tommy

vielen Dank für die Antworten.
werde mir nachher die holen:
NodeMCU LUA Amica V2 Modul mit ESP8266 12E
sind das dann die Richtigen?
mit welchen Beispielen soll ich dann anfangen bzw. welche behandeln die Problematik der direkten komunikation zwischen zwei Geräten

sind das dann die Richtigen?

Sieht verwendbar aus!

mit welchen Beispielen soll ich dann anfangen bzw. welche behandeln die Problematik der direkten komunikation zwischen zwei Geräten

Arbeite alle Beispiel ab/durch.
Damit du sattelfest wirst.