modulare, drahtlose kommunikation

ich sehe keinen klickbaren link geschweige denn eine URL

Kauf am besten die Nodemcu mit dem CP2102 USB Chip.
Die sind schmaler und passen daher besser auf das Breadboard.

Gruß Fips

Genau. Normalerweise ist die V2 die schmale und V3 die breite. Manche Anbieter schreiben V2 und die Fotos sehen aber nach V3 aus. Bei der breiten Version musst du 2 Breadboards nebeneinander legen, sonst kannst du keine Jumperkabel mehr einstecken

hier der Link:
https://shop.diy-dreams.de/collections/wifi-module/products/nodemcu

USB zu Seriel Adapter habe ich

Danke für den Tip mit dem Board
sieht dann so aus

:wink:

@:ElEspanol
sorry habe gerade erst gesehen was du meinst
laut bild sollte hier solch ein chip verbaut sein
was währe jetzt bei einem CH340 problematischer?

Gar nichts.

Fakt ist, dass schmalere Boards einfacher auf einem Steckbrett nutzbar sind.
Sonst nichts....

Welcher Seriell-USB Wandler genutzt wird ist eigentlich egal.

Siehe:
http://img.gunook.com/upload/f/23/f23dc742f1cd0b7e20c7fca57607256a.jpg
Da kommt man nicht mehr an die Pins....

habe gestern Abend die NodeMCU LUA Amica V2 Modul mit ESP8266 12E geholt. zusätzlich noch ein Oled 0,96" Display.
Habe mir auch die Beispiele zu ESP8266Wifi angeschaut und werde aber nicht so richtig schlau daraus.
Fürs erste möchte ich versuchen auf die Taste des einen zu drücken und am anderen die Displaymeldung zu ändern oder die LED zu schalten.
Dazu habe ich mir erst mal als Basis folgenden Sketch gebastellt:

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const char* ssid = "Adler";
const char* password = "1234567890111213";

#define OLED_RESET LED_BUILTIN  //4
Adafruit_SSD1306 display(OLED_RESET);
/*
Anschluss des Display's
GND = > GND
Vcc = 3,3V
SCL => D2
SDA => D1
 */

 String Text_1 = "IP Adresse:";
 String Text_2 = " ";
 String Text_3 = "verbunden mit:";
 String Text_4 = " ";

 int Taster_1 = D5;
 int Status_Taster_1 = 0;

 int LED_1 = D0;


void setup() 
{
  Serial.begin(115200);
  // Connect to WiFi network 
  WiFi.begin(ssid, password);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  pinMode(Taster_1, INPUT);

  pinMode(LED_1, OUTPUT);
}

void loop() 
{
Zeilen();
Tasten();
}

void Tasten()
{
  Status_Taster_1 = digitalRead(Taster_1);
  if(Status_Taster_1 == HIGH)
  {
    digitalWrite(LED_1, HIGH);
  }
  else
  {
    digitalWrite(LED_1, LOW);
  }
}

void Zeilen()
{
  Text_2 = WiFi.localIP().toString();
  Text_4 = ssid;
    // Clear the buffer.
  display.clearDisplay();
//  display.display();

  display.setTextSize(1);//1 = 8pix., 2= 16pix., 3 = 24pix., 4 = 32pix.
  display.setTextColor(WHITE);
  display.setCursor(0,0);//höhe, breite = 32x64
  display.println(Text_1);
  display.setCursor(0,8);
  display.println(Text_2);
  display.setCursor(0,16);
  display.println(Text_3);
  display.setCursor(0,24);
  display.println(Text_4);
  display.display();
}

hier dann schon mal meine ersten Fragen:
Wie kann ich eine fixe IP Adresse für das aktuelle Board festlegen?
Sollte der WiFi Modus verändert werden?
wird ein extra include für das UDP Protokoll benötigt?
Welchen Port nutze ich bzw. wie lege ich diesen fest?

Fragen über Fragen.
Bitte helft!

Feste IP:

// an aktuelles Netz anpassen
IPAddress myIP(192,168,1,121);
IPAddress gateway(192,168,1,1);
IPAddress dnsServer(192,168,1,1);
IPAddress subnet(255,255,255,0);

  WiFi.config(myIP, gateway, subnet, dnsServer);
  WiFi.begin(ssid, password);

Klar brauchst Du eine UDP-Lib: WiFiUdp.h
Das konntest Du aber auch in meinen verlinkten Beispielen erkennen.

Vorschlag: Lass das Display erst mal weg und schalte am 2. NodeMCU erst mal eine LED an und aus.
Nicht zuviel auf einmal angehen, wenn das Verständnis noch nicht da ist.

Du kannst Dir auch die Ehernet-UDP-Beispiele der IDE anschauen. Das Prinzip ist das Gleiche.
Wichtig ist, dass Du verstehst, was Du tust und nicht einfach blind Code zusammenkopierst.

Gruß Tommy

Und immer wieder lesen....die Beispiele lesen und verstehen.

habe schon viereckige Augen vom lesen
leider bin ich des englischen nicht mächtig (es hapert ja schon mit dem deutschen)
ich möchte auch kein fertige Lösung sondern im besten Fall ein funktionierendes Minimalbeispiel aus dem ich mir erschließen kann was gebraucht wird. Im einfachsten Fall ein tu dies dann tu das und versuche es mal mit diesem. Eine Punkt für Punkt Anleitung in deutsch sozusagen. Alles ohne den ganzen Serialprint und Fehlerroutinen.

das include für die WiFiUdp.h habe ich mittlerweile auch gefunden aber dennoch Danke

Gerade Serial.print() sollte eine der wichtigsten Funktionen für Dich sein. Mit dieser kannst Du Dir die Variablen in Deinem Programm, Deine IP-Adressen usw. auf dem seriellen Monitor ausgeben lassen.
Das kann Dir unheimlich helfen, die Abläufe zu verstehen.

Ganz ohne englisch wirst Du auf der Programmierungsschiene nicht sehr weit oder nur sehr mühsam vorwärts kommen. Da musst Du versuchen wenigstens ein Grundverständnis aufzubauen. Ich habe früher auch nie englisch gelernt aber mit der Zeit zumindest Texte im Bereich Elektronik und Programmierung grundlegend verstanden.

Schau Dir mal diese Dokumentation in deutsch an.

Gruß Tommy

habe deinen Rat befolgt und mir die genannten Beispiele angeschaut.
ich habe in der Deklaration die eingefügt:
unsigned int localPort = 9000;// localer UDP Port???
und in Setup das:
WiFiUdp.begin(localPort);
zusätlich noch zwei Funktionen:

IPAddress RecipientIP(192, 168, 2, 100);//hierhin senden IP???
unsigned int RecipientPort = 55056;//hierhin senden Port???
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];// sende mit Maximaler Paket grösse???

void Empfangen()
{  
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    WiFiUdp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    WiFiUdp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    WiFiUdp.write("ACK");
    WiFiUdp.endPacket();
  }
  delay(10);
}
 

void Senden(String sende_text)
{
    WiFiUdp.beginPacket(RecipientIP, RecipientPort);
    WiFiUdp.print(sende_text);
    WiFiUdp.endPacket();
    delay(10);
}

Fehlermeldungen wie folgt:
C:\Program Files\Arduino\Scetchbook\esp8266_anfang_2\esp8266_anfang_2.ino: In function 'void setup()':
esp8266_anfang_2:31: error: 'WiFiUdp' was not declared in this scope

  • WiFiUdp.begin(localPort);*
  • ^*
    esp8266_anfang_2:34: error: 'Taster_1' was not declared in this scope
  • pinMode(Taster_1, INPUT);*
  • ^*
    C:\Program Files\Arduino\Scetchbook\esp8266_anfang_2\Senden_Empfangen.ino: In function 'void Empfangen()':
    Senden_Empfangen:7: error: Die Klasse Udp wurde in EthernetUdp umbenannt.
    Seit Arduino 1.0 wurde die Klasse "Udp" in der Ethernet-Bibliothek in "EthernetUdp" umbenannt.
  • int packetSize = Udp.parsePacket();*
  • ^*
    Senden_Empfangen:10: error: 'WiFiUdp' was not declared in this scope
  • WiFiUdp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);*
  • ^*
    C:\Program Files\Arduino\Scetchbook\esp8266_anfang_2\Senden_Empfangen.ino: In function 'void Senden(String)':
    Senden_Empfangen:21: error: 'WiFiUdp' was not declared in this scope
  • WiFiUdp.beginPacket(RecipientIP, RecipientPort);*
  • ^*
    Mehrere Bibliotheken wurden für "ESP8266WiFi.h" gefunden
    Benutzt: C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi
    Nicht benutzt: C:\Program Files\Arduino\libraries\ESP8266WiFi
    exit status 1
    'WiFiUdp' was not declared in this scope

@:Tommy
Die Dokumentation welche hier veröffentlicht wurde ist in der Tat eines der Hilfsmitte die ich zu Rate ziehe wenn ich nicht weiter komme. Erst dann wende ich mich hier im Forum an Euch die ihr um so vieles besser seit als ich. Leider lässt sich dort kein Schlüsselwort wie UDP, WiFi, Netzwerk, ESP8266 oder ähnliches finden.
Ich bin mir auch nicht sicher warum ich nicht jetzt schon ein Display einsetzen sollte. Ob ich jetzt die Meldung über den Seriellen Monitor oder über das Display ausgebe ist eigentlich egal. Zudem finde ich es recht unübersichtlich wenn am Monitor gleich vier Programmfenster gleichzeitig offen sind. Aber natürlich nehme ich zum Testen auch sehr oft den SM her. Macht aber ebenfalls den Progammcode unübersichtlich. Dann doch lieber ein paar mehr Kommentare eingefügt.
Da du offensichtlich einer der erfahrenen Teilnehmer hier im Forum bist(so wie Hotsystem oder Uwe) sollte es für dich doch ein leichtes sein die nicht vorhandenen oder falschen Zeilen in meinem Code zu finden.
Danke

Ingolf

Fehler gefunden

habe das vergessen:

WiFiUDP wifiUdp;

Der Fehler war zum Beispiel in dem Fragment, dass Du veröffentlicht hast überhaupt nicht findbar.
Der Rückgriff auf ältere veröffentlichte Sketchversionen ist auch nicht sicher, da Du ja nicht klar gemacht hast, was Du alles noch verändert hast.
Wie Du dadurch hoffentlich merkst, ist es nicht so einfach, Fehler zu suchen, wenn man nicht den vollständigen Sketch bekommt.
Wir leisten die Hilfe in unserer Freizeit und ich persönlich mag dazu nicht erst Codestücke puzzeln. Da mache ich dann lieber nichts.

Du kannst Deinen TFT einbauen, es ist ja Dein Projekt. Ich hatte den Vorschlag nur gemacht, da TFT für Anfänger oft zusätzliche Probleme bringen und ich es für besser halte, erst mal ein Problem zu lösen.
Das hast Du ja jetzt.

Gruß Tommy

Kein Grund sich gleich angegriffen zu fühlen.
Mir ist durchaus bewusst das die meisten hier in ihrer Freizeit agieren. Und wie wertvoll Zeit ist muss man mir nicht erst erklären. Also wenn sich jemand durch meine Kommentare angegriffen fühlt so möchte ich mich in aller Form dafür entschuldigen.
Zu deiner Aussage ich hätte nicht den kompletten Sketch veröffentlicht möchte ich richtig stellen das dem doch so wahr. Da mir diese Thematik (ESP) ja noch nicht vertraut ist fehlt wahrscheinlich noch was. Vielleicht kann mir dann ja jemand sagen was ich noch wissen muss.
Der Form halber stelle ich meinen aktuellen Code hier noch mal ein:

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFiUdp.h>;

WiFiUDP wifiUdp;

const char* ssid = "Adler";
const char* password = "1234567890111213";

#define OLED_RESET LED_BUILTIN  //4
Adafruit_SSD1306 display(OLED_RESET);
/*
Anschluss des Display's
GND = > GND
Vcc = 3,3V
SCL => D2
SDA => D1
 */
 int LED_1 = D0;
 int LED_2 = D3;
 int Taster_1 = D5;
 int Status_Taster_1 = 0;
 char T_1 = 0;

 String sende_text;
 String Text_1 = "IP Adresse:";
 String Text_2 = " ";
 String Text_3 = "verbunden mit:";
 String Text_4 = " ";
 
IPAddress RecipientIP(192, 168, 2, 129);//hierhin senden IP???
unsigned int RecipientPort = 55056;//hierhin senden Port???
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];// sende mit Maximaler Paket grösse??? 
unsigned int localPort = 9000;// localer UDP Port???

void setup() 
{
  Serial.begin(115200);
  // Connect to WiFi network 
  WiFi.begin(ssid, password);
  wifiUdp.begin(localPort);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  pinMode(Taster_1, INPUT);

  pinMode(LED_1, OUTPUT);
}

void loop() 
{
Zeilen();
Tasten();
Empfangen();
}

void Zeilen()
{
  Text_2 = WiFi.localIP().toString();
  Text_4 = ssid;
    // Clear the buffer.
  display.clearDisplay();
//  display.display();

  display.setTextSize(1);//1 = 8pix., 2= 16pix., 3 = 24pix., 4 = 32pix.
  display.setTextColor(WHITE);
  display.setCursor(0,0);//höhe, breite = 32x64
  display.println(Text_1);
  display.setCursor(0,8);
  display.println(Text_2);
  display.setCursor(0,16);
  display.println(Text_3);
  display.setCursor(0,24);
  display.println(Text_4);
  display.display();
}

void Empfangen()
{  
  int packetSize = wifiUdp.parsePacket();
//  if(packetSize)
  {
    wifiUdp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    wifiUdp.beginPacket(wifiUdp.remoteIP(), wifiUdp.remotePort());
    Text_4 = packetBuffer;
    wifiUdp.write("ACK");
    wifiUdp.endPacket();
  }
  delay(10);
  
}

void Senden()
{
   wifiUdp.beginPacket(RecipientIP, RecipientPort);
   wifiUdp.print(sende_text);
   wifiUdp.endPacket();
    delay(10);
}

void Tasten()
{
  Status_Taster_1 = digitalRead(Taster_1);
  if(Status_Taster_1 == HIGH && T_1 == 1)
  {
    sende_text = "alles i.O.";
    Senden();
    T_1 = 0;
    digitalWrite(LED_1, LOW);
  }

  if(Status_Taster_1 == LOW && T_1 == 0)
  {
    T_1 = 1;
    digitalWrite(LED_1, HIGH);
  }

}

Der Code lässt sich zwar auf die beiden Board aufspielen( mit geänderter IP-Adresse) aber beim drücken der Taste passiert nichts.
ich bin nach wie vor für jede Anregung dankbar

Achtung! Unbedingt den Code ohne SSID und Passwort veröffentlichen! Das kann böse enden....

Was Deine Taster angeht: ich sehe keine Entprellung? Funktioniert die Senden-Methode, wenn Du sie so ausführen lässt?

Danke für die Antwort
SSID und Passwort können in diesen Fall veröffentlicht werden da der Router autark arbeite und keine Verbindung zum Internet oder irgendwelchen Rechnern hat.
Is halt nur ne Testumgebung.

Das entprellen der Taster ist Hardwareseitig gelöst. Softwareseitig meine ich dies so gelöst zu haben

Status_Taster_1 = digitalRead(Taster_1);
  if(Status_Taster_1 == HIGH && T_1 == 1)
  {
    sende_text = "i.O.";
    Senden();
    T_1 = 0;
    digitalWrite(LED_1, LOW);
  }

oder meinst du etwas anderes?

Du brauchst erst mal auf beiden Seiten unterschiedlichen Code.
Du hast einen Master (oder Sender) und einen Slave (oder Empfänger).

Der Master bildet den Accesspoint, der Slave empfängt das Kommando.

Probiere mal, ob Du den Master als AP mit dem Code von mir als feste IP hochziehen kannst. Das habe ich noch nicht getestet, da es dazu bisher keinen Anlass gab.

Dann den Slave mit einer festen IP als STA hochziehen.

Dann eine Übertragung vom Master zur festen Adresse/Port des Slave versuchen. Im Seriellen Monitor schauen, ob was ankommt und wenn ja was. Auch wenn Du den seriellen Monitor nicht magst.

Ich habe nicht umsonst gesagt: Lass alles andere erst mal weg. Dazu hast Du noch zu wenige Kentnisse.

Oder bringe erst mal einen ESP8266 (den Slave) dazu, das Display zu bedienen. Dann kannst Du das zur Ausgabe nutzen.

Wenn ich nur für die Wand rede, werde ich aus Deinem Thema aussteigen. Das macht dann keinen Spaß mehr. Du ignorierst das ja konsequent.

Gruß Tommy

Hallo Tommy,
Danke das du dich nicht ausgeklinkt hast. Du schreibst:
Probiere mal, ob Du den Master als AP mit dem Code von mir als feste IP hochziehen kannst.
Und ich glaube das hier genau mein Problem liegt. Ich werde aus deinem Code nicht wirklich schlau.
Dies ist was ich zur Einstellung aus den Mastercode rauslesen kann:

char *ssid = "nodemcu_test";
 // >= 8 oder <= 63 Zeichen oder NULL
 char *password = "geheim123";

 IPAddress remoteIP(192,168,4,2);
 WiFiUDP Udp;
 unsigned int port = 4210;  // local and remote port to listen on
 char incomingPacket[10];  // buffer for incoming packets (255)

für mich steht da das der ESP sich im Netzwerk nodemcu_test anmelden soll mit dem Passwort geheim123
bei der Zeihle IPAddress remoteIP(192,168,4,2); bin ich mir schon nicht mehr Sicher aber ich vermute das dies die Feste IP Adresse sein soll die er bekommen soll.?
Anschliessend die Zuweisung die ich vorhin vergessen hatte
dann die Länge des ankommenden Packetes

wo findet jetzt die Zuordnung zwischen Server und Client statt?

Dann schreibst du:
Dann den Slave mit einer festen IP als STA hochziehen.
Was bedeutet STA?

keine Angst ich habe absolut nichts gegen den Seriellen Monitor.

Die Display funktionieren übrigen sehr gut. siehe Bild