ESP-01 und Arduino MEGA kommunizieren lassen

Hallo Leute,

vermutlich eher eine banale Frage. Mein Grundgedanke ist, dass der Arduino MEGA die Nachricht "HELLO FROM MEGA" an den ESP-01 sendet. Dieser soll anschließend auf die Nachricht mit "HELLO BACK FROM ESP" reagieren und dann läuft das in einer Endlosschleife (Sinnhaftigkeit muss hierbei erstmal nicht hinterfragt werden, ist eher als Testzweck gedacht). Die Kommunikation soll entsprechend im seriellen Monitor ausgegeben werden (einfach zur Überprüfung).

Leider wird im seriellen Monitor nur "HELLO BACK FROM ESP" ausgegeben und nicht die Antwort vom MEGA. Ich habe die Vermutung, dass der ESP-01 mittels "Serial.println()" nicht in den seriellen Monitor schreiben kann, denn den entsprechenden Befehl tut er bearbeiten (sonst würde nämlich "HELLO BACK FROM ESP" nicht ausgegeben werden können).

Finde den Fehler nicht bzw. ist das so überhaut möglich oder muss ich noch etwas anderes einfügen?

Die Quellcodes für MEGA und ESP-01 sind entsprechend angefügt. Danke schonmal.

ARDUINO MEGA
Mega2560.ino (717 Bytes)

// BIBLIOTHEKEN
#include <SoftwareSerial.h>

// SOFTWARESERIAL
SoftwareSerial esp(50, 51);

// GLOBALE VARIABLEN
boolean StringMEGA = true;

// VOID SETUP
void setup()
{
  Serial.begin(9600);
  esp.begin(9600);
  delay(3000);
}

// VOID LOOP
void loop()
{
  String MessageESP = "";
  boolean StringReadyESP = false;
  
  if (StringMEGA == true)
  { 
    delay(2000);
    esp.write("HELLO FROM MEGA");
    StringMEGA = false;  
  }

  while (esp.available())
  {
    MessageESP = esp.readString();
    StringReadyESP = true;
  }

  if (StringReadyESP == true && MessageESP == "HELLO BACK FROM ESP")
  {
    Serial.println("ESP: " + MessageESP);
    StringMEGA = true;
  }  
}

ESP-01
ESP_01.ino (430 Bytes)

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  String MessageMEGA = "";
  boolean StringReadyMEGA = false;
  
  while (Serial.available())
  {
      MessageMEGA = Serial.readString();
      StringReadyMEGA = true;
  }

  if (StringReadyMEGA == true && MessageMEGA == "HELLO FROM MEGA")
  {
    Serial.println("MEGA: " + MessageMEGA);
    delay(2000);
    Serial.write("HELLO BACK FROM ESP");
  }
}
  • grundsätzliches zum Bedienen der Seriellen Schnittstelle: Tutorial Serial Input Basics durcharbeiten, lernen und anwenden.

  • Am MEGA macht es wenig Sinn Softserial zu verwenden, verwende dafür besser die 3 weiteren Hardware Serials (Serial1, Serial2, Serial3).

  • am MEGA eher String-Objekte vermeiden und wenn es gar nicht anders geht, evtl. über dein Einsatz von String.reservere nachlesen (und nachdenken).

  • am MEGA würde ich die Pins 50-52 immer für SPI reseriveren und nicht für sonstige Pins verwenden wenns nicht unbedingt notwendig ist (nur weils sie am Ende vom Header sind). Irgendwann kommt ein Sketch der SPI braucht und dann kannst deine ganzen Beispiel anpassen.

  • wenn irgendwann mal der Einsatz von WIFI geplant ist, das Konzept generell überdenken. Eher danach trachten das ganze Programm auf den ESP zu bringen, wenn zu wenig PINs, dann besser einen NodeMCU oder WEMOS D1 verwenden und mit I2C Portexpandern mehr "Ausgänge/Eingänge" schaffen.

Setze die einzelnen Sketche bitte wie üblich in Code-Tags.
Sketche markieren und die Schaltfläche </> klicken.

Wie hast du alles verkabelt ?
Bitte Schaltbild posten.

Bei der Verdrahtung habe ich mich an einem vorangegangenen Post bedient. Da sollte somit stimmen. Hab für die Datenleitungen einen Logic-Level-Shifter genommen.

Ja die Sketche hatte ich dann danach noch entsprechend in Code-Tags gepackt.

Alles klar, danke für die Infos!!

Ja grundsätzlich soll die ganze Steuerung mittels TFT LCD Shield gesteuert werden. Quasi per Tastendruck soll dann z.B.: im Heimnetzwerk eine Steckdose ausgeschaltet werden. Also wie eine WLAN-Fernbedienung. Da das LCD Shield natürlich einfach auf einen UNO und MEGA zu stecken geht, wollte ich das so probieren.

Hallo,
wie hast Du das denn angeschlossen . Der ESP läuft ja mit 3,3V und der Mega mit 5V .

Mega TX über einen Widerstand 1K auf RX vom ESP
Mega RX an TX vom ESP.

Fang doch erst mal nur mit einer Richtung an der Mega sendet zyklisch , jede Sekunde, den Text und dann schaust Du ob das beim ESP ankommt. Wenn der empfangene Text stimmt last Du eine LED kurz angehen.
Dann sendest Du zyklisch vom ESP an den Mega und schaust am Monitor ob der Text ankommt.
Eventuell sollltest Du beim Empfangen auch auf ein festes Endzeichen abfragen.

Heinz

Die Verdrahtung ist wie gesagt korrekt bzw. funktioniert soweit! Die Stromversorgung habe ich vom MEGA genommen. Später soll dann eine externe Stromversorgung dienen, dass der Strombedarf auch gedeckt werden kann... aber soweit bin ich ja noch nicht.

Soll das ein TFT mit Touch werden ?
Wenn nein, reicht für deine Funktionen ein ESP8266-01 plus I2C-Portexpander, der für eine Tastenerweiterung geeignet ist. Auch ein I2C-Display kann daran laufen.

Ja ist ein TFT mit Touch. Somit weiß ich leider nicht, ob ein Portexpander hier Sinn macht.

Dann mach es mit einem NodeMCU auf Basis des ESP8266.

hallo,
Ahh ok, ich denke aber das wird alles viel zu kompliziert. Nimm ein ESP Node Modul und setze alles auf einem Webserver auf . Bediene kannst Du dann alles z.B mit dem Handy. Spart die zusätzliche Schnittstelle. Beispiele für fast alles findest Du bei Fips

Heinz

An sich stimmt das :smiley:

Hintergedanke ist hier meine Bachelorarbeit. Soll eine WLAN-Fernbedienung entwickeln, die Endgeräte, welche mit Tasmota geflasht wurden, im eigenen Heimnetzwerk ansteuert und schaltet. Wenn ich das mittels Handy mache, ist ja wieder ein extern Server mit drin bzw. ist dann wieder nicht nachvollziehbar wo die Datenkommunikation stattfindet.... Deswegen alles etwas komplizierter :smiley:

ich glaube auch der Versuch einer Bachelorarbeit rechtfertigt nicht eine Komponente die es eigentlich nicht braucht in deinem System einzuführen. Wenn dir das dein Betreuer durchgehen lässt, dann geh davon aus, dass die letzten 4 Jahre umsonst waren.

Eine NodeMCU und ein WEMOS D1 haben nur leider halt zu wenig analoge Eingänge. Das Touch Display benötigt wohl schon alleine 5... eine WEMOS hat doch nur einen oder liege ich da falsch?

es gibt auch i2c Analog Digital-Wandler.
Ich würde aber ein Display suchen, das keine Analog-Eingänge braucht.

Kenne ich nicht.

Basierend auf den Tabs von Fips habe ich einen ESP32 als Access Point, von dem sich Läppi oder Händi eine HTML-Seite anzeigen lassen können. Über Slider, Radiobutton und dergleichen kann ich damit eine Animation für LEDs auswählen oder konfigurieren. Router oder Server sind da nicht beteiligt. Das ist eine autarke WLAN-Fernbedienung für meine LEDs.

Wenn Du sowas anstrebst, könntest Du über diesen Weg nachdenken, denn der ist etwas weniger kompliziert.

Diese Aussage möchte ich in Zweifel ziehen. Wozu sollen fünf analoge Eingänge für ein Display gut sein?

Der ESP32 hat acht analoge Eingänge an ADC1, solltest Du tatsächlich fünf benötigen.

Du solltest Dein Konzept überdenken!

Einen ESP-01 habe ich nicht. Mit einem Mega2560 und einem ESP32 funktioniert es so:

// Mega2560

boolean StringMEGA = true;

void setup()
{
  Serial.begin(115200);
  Serial3.begin(9600);
  delay(1000);
  Serial.println("\nStart Mega2560");
}

void loop()
{
  String MessageESP = "";
  boolean StringReadyESP = false;

  if (StringMEGA == true)
  {
    delay(2000);
    Serial3.write("HELLO FROM MEGA");
    Serial.println("sende Nachricht");
    StringMEGA = false;
  }

  while (Serial3.available())
  {
    MessageESP = Serial3.readString();
    StringReadyESP = true;
  }

  //if (StringReadyESP == true && MessageESP == "HELLO BACK FROM ESP")
  if (StringReadyESP == true)
  {
    Serial.println("ESP: " + MessageESP);
    StringMEGA = true;
  }
}
// ESP32
void setup()
{
  Serial.begin(115200);
  Serial2.begin(9600);
  delay(1000);
  Serial.println("\nStart ESP32");
}

void loop()
{
  String MessageMEGA = "";
  boolean StringReadyMEGA = false;
  
  while (Serial2.available())
  {
      MessageMEGA = Serial2.readString();
      StringReadyMEGA = true;
  }

  //if (StringReadyMEGA == true && MessageMEGA == "HELLO FROM MEGA")
  if (StringReadyMEGA == true)
  {
    Serial.println("MEGA: " + MessageMEGA);
    //delay(2000);
    Serial2.write("HELLO BACK FROM ESP");
  }
}

Ausgaben:

Start Mega2560
sende Nachricht
ESP: HELLO BACK FROM ESP
sende Nachricht
ESP: HELLO BACK FROM ESP

Start ESP32
MEGA: HELLO FROM MEGA
MEGA: HELLO FROM MEGA

Ich hoffe, es hilft Dir in irgendeiner Weise :slightly_smiling_face:

Der Irrtum mit den analogen Pins am Display kommt vermutlich daher, weil auf Grund der Konstruktion die analogen Pins des Uno/Mega verwendet wurden.
Das sind sicher nur digitale Pins.
Dann hast du sicher das falsche Display, da gibt es bessere. Z.B. mit SPI.
Nochmal nimm einen NodeMCU und ein anderes Display.

Ich habe ein resistives Display, wo zwei analoge Eingänge für die Berührposition in X- und Y-Richtung verwendet werden. Weitere Ax-Pins werden digital verwendet.

Ah...Ok. Wusste ich tatsächlich nicht, das auch analoge Pins nötig sind.

Jaa, denke ich werde jetzt auch nach einem Touchscreen mit SPI gucken.

Habt ihr da irgendwelche Anregungen, welche gut sind?! Ebenso bei der NodeMCU.. Scheint ja auch welche zu geben, wo teils 5 Pins gar nicht angeschlossen sind..

Danke euch für die Anregungen!