Serielle Daten regelmäßig senden

Hallo liebe Community,

habe jetzt schon längers ein großes Problem und jetzt gehen mir die Ideen aus, was ich noch alles ausprobieren kann.
Es geht um ein fernsteuerbares Fahrzeug. Ein ESP8266 ist mit dem Smartphone verbunden und erhält über die App “Blynk” die Joystickdaten.
Der ESP8266 NodeMCU ist mit einem Arduino Uno über die Serielle Schnittstelle verbunden und soll die Daten regelmäßig senden. Also in etwa alle halbe Sekunden oder weniger. In meinem Code werden am ESP8266 die Daten zu einem String hinzugefügt und dann gesendet. Der Code am Uno liest die Daten ein und zerteilt sie wieder. Ist vl nicht die schönste Lösung, aber habs auch schon mit Arrays versucht, sprich .write(buf,len) und .readBytes(buf, len). Funktioniert auch nicht gut. Das Problem ist nun das ich oft überhaupt keine Daten rüberbekomm, oder es hängt extrem, oder die WLAN-verbindung bricht ab, also unbrauchbar. Kann es sein das der Uno einfach zu langsam ist? Er hat eine Zykluszeit von 4ms. Hat jemand eine Lösung oder Vorschlag. Bin für jede Hilfe Dankbar.

Die Bsp. Codes wurden extrem gekürzt.
Die Funktion getValue ist nicht von mir, habs im Web gefunden.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 1);

String daten;
int modus, batterie, button, x, y, zaehler;
bool senden;

//Funktion, welche String erstellt und sendet
bool sendeDaten(){
  daten = "";
  daten = modus;
  daten += ";";
  daten += batterie;
  daten += ";";
  daten += button;
  daten += ";";
  daten += x;
  daten += ";";
  daten += y;
  daten += "\n";
  mySerial.print(daten);
  //mySerial.flush();
  //delay(10);
  senden = false;
  return senden;
  
}

void setup() {
  mySerial.begin(19200);

}

void loop() {
  if(x != 0 || y != 0 || button != 0)senden = true; // es soll nur gesendet werden wenn einer der Werte != 0

zaehler ++;
if(senden == true && zaehler > 100){ // es soll trotzdem nur alle 100 loops gesendet werden
  senden = sendeDaten();
  zaehler = 0;
}

}
#include <SoftwareSerial.h>

SoftwareSerial mySerial(9, 10);

String dataString, a, b, c, d, e;
int modus, batterie, button, x, y;


//Funktion um empfangenen String zu teilen
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;

  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}



void setup() {
   mySerial.begin(19200);

}


void loop() {
  if(mySerial.available() > 0){
  dataString = mySerial.readStringUntil('\n');}
  
  a = getValue(dataString,';',0);
  b = getValue(dataString,';',1);
  c = getValue(dataString,';',2);
  d = getValue(dataString,';',3);
  e = getValue(dataString,';',4);

  modus = a.toInt();
  batterie = b.toInt();
  button = c.toInt();
  x = d.toInt();
  y = e.toInt();

}

ESP8266_sender.ino (842 Bytes)

Uno_empfaenger.ino (1.04 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Warum kommunizierst Du nicht über I2C? Hast Du Pegelwandler drin?

Gru0 Tommy

Was genau hat die WLan-Verbindung mit der seriellen Verbindung zu tun ?
Also wenn die Serielle ein Problem hat, darf WLan nicht abbrechen.
Und die serielle Verbindung sollte kein Problem machen, wenn die Hardware richtig aufgebaut ist.
Und natürlich muss auch der Sketch funktionieren, den ich leider aktuell nicht sehen kann.
Tommy hat das Problem schon geschrieben.

I2C hab ich schon versucht. Nach langem hin und her hab ich gelesen das der ESP8266 in Wire.h nicht zum schreiben vorgesehen ist.
Nein Pegelwandler hab ich keine. Könnte das der Grund sein?

Ja ich weiß hat nichts damit zu tun, bricht aber trotzdem ofter mal ab.
Ja sry, habs schon geändert :slight_smile:

Der ESP8266 ist nicht 5V-tolerant (der stirbt dann irgendwann).
I2C mit einem UNO/Nano funktioniert problemlos (mit Pegelwandler). Das habe ich hier gezeigt.

Der ESP8266 ist nicht als SLAVE-I2C-Device gedacht. Ansonsten hast Du da was falsch verstanden.

Das wäre ja auch wie einen Porsche (ESP8266) auf dem Anhänger eines Käfers (UNO/NANO) als Notfallfahrzeug mitzuführen.

Gruß Tommy

Oh gut zu wissen :confused: Das heißt mit einem Pegelwandler sollte die serielle Verbindung klappen?

Ja genau das meinte ich :slight_smile: Der Uno ist aber schon als Master deklariert, da er sich die Daten von einem MPU6050 holt.

philp_:
Oh gut zu wissen :confused: Das heißt mit einem Pegelwandler sollte die serielle Verbindung klappen?

Ja, sollte reichen.
da reicht auch ein Widerstand 1k vom Uno TX zum ESP RX, die Leitung Uno RX und ESP TX kannst du direkt verbinden.

Alles klar, Danke für die schnelle Hilfe, werd ich ausprobieren :slight_smile:

HotSystems:
da reicht auch ein Widerstand 1k vom Uno TX zum ESP RX, die Leitung Uno RX und ESP TX kannst du direkt verbinden.

Sowas wird zwar relativ oft empfohlen, aber dabei missbrauchst du die Schutzdioden der Eingänge. Es geht, aber es ist nicht sauber

Serenifly:
Sowas wird zwar relativ oft empfohlen, aber dabei missbrauchst du die Schutzdioden der Eingänge. Es geht, aber es ist nicht sauber

Ich gebe dir da Recht.
Da ich es in einem Projekt auch so gelöst habe, weiß ich das es auch über lange Zeit funktioniert.