ESP32 & Arduino Mega 2560 R3 verbinden?

beides, eigentlich wäre UART praktisch da ich die schaltung quasi schon bestehen habe. wenn I2C einfacher wäre würde ich aber auch dazu wechseln.

ich hab ja jedes modul einzeln angeschlossen und ausprobiert mit leichtangepassten codes aus dem internet einfach um mal ein kleines gefühl dafür zu bekommen.
dadurch konnte ich jedes modul über den seriellen monitor schalten und auslesen.
wäre es nicht möglich diese codes quasi in einen code zu schreiben so das ich diese alle in einen code über den seriellen monitor schalten kann mit dem kleinen unterschied das das esp dann den part des PC´s übernimmt und dieser dann die aktoren schaltet und sensoren ausließt und weiter verarbeitet ?

Vielleicht suchst du den CmdMessenger?

Habe ich auf Anhieb nicht zum Kompilieren gebracht. ESP32 mit Fehler, Mega2560 mit Warnungen.

// ESP32 als UART-Sender

bool wert_1;
uint16_t wert_2;

void loop()
{
  uint32_t jetzt = millis();
  static uint32_t vorhin = jetzt;
  if (jetzt - vorhin >= 1000)
  {
    vorhin = jetzt;
    wert_1 = !wert_1;
    wert_2 = random(0, 1000);
    char buf[100] = {"\0"};
    snprintf(buf, sizeof(buf), "W1:%u;W2:%u\n", wert_1, wert_2);
    Serial2.print(buf);
    Serial.print(buf);
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\nStart"));
  Serial2.begin(9600);
}
// Mega2560 als UART-Empfänger

const byte relais_1 = 31;
const unsigned int READ_BUFFER_SIZE = 100;  // an die Bedürfnisse anpassen!

char * readLine(Stream& stream) {
  static byte index;
  static char buffer[READ_BUFFER_SIZE];
  while (stream.available()) {
    char c = stream.read();
    if (c == '\n') {         //wenn LF eingelesen
      buffer[index] = '\0';  //String terminieren
      index = 0;
      return buffer;         //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < READ_BUFFER_SIZE - 1) {  //solange noch Platz im Puffer ist
      buffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return nullptr;           //noch nicht fertig
}

void loop()
{
  int16_t wert_1 = 0;
  int16_t wert_2 = 0;
  char * eingabe = readLine(Serial2);
  if ( nullptr != eingabe )
  {
    Serial.println(eingabe);
    if ( 1 < sscanf ( eingabe, "W1:%u;W2:%u", &wert_1, &wert_2 ))
    {
      char buf[READ_BUFFER_SIZE] = {"\0"};
      snprintf( buf, sizeof(buf), "Wert 1: %u\tWert 2: %u", wert_1, wert_2 );
      Serial.println(buf);
      digitalWrite(relais_1, wert_1);
    }
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\nStart"));
  Serial2.begin(9600);
  pinMode(relais_1, OUTPUT);
}

Bei mir klackt das Relais bzw. blinkt ersatzweise die LED.

Ach das ist doch nur der Heizungssimulator.....
Eigentlich völlig uninteressant.

Der Haken ist:
Die max() Definitionen unterscheiden sich zwischen ESP und AVR.

In HeaterSim.cpp in

#ifdef max
   #undef max
#endif
unsigned long max(unsigned long a, unsigned long b)
{
  return a<b?b:a;
}

vor der max() Nutzung löst das Problem.

Selbst wenn die max() nicht funktioniert, solange man den Simulator nicht nutzt , ist das egal.

Ich widerspreche ja nur ungerne.

Beispiel Receive.ino:

F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'char* CmdMessenger::readStringArg()':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:492:9: error: invalid conversion from 'char' to 'char*' [-fpermissive]
  return '\0';
         ^~~~
exit status 1
Fehler beim Kompilieren für das Board ESP32 Dev Module.

Möchtest Du eine ausführliche Ausgabe?

Da steht bei mir:

	ArgOk = false;
//	return '\0';
	return nullptr;

Kann schon sein, dass ich das vor Jahren mal geändert habe.....

Gut...
Ich empfehle den CmdMessenger nicht mehr.

Für den Mega2560 bekomme ich diese Warnungen:

F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'void CmdMessenger::attach(byte, messengerCallbackFunction)':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:117:12: warning: comparison is always true due to limited range of data type [-Wtype-limits]
  if (msgId >= 0 && msgId < MAXCALLBACKS)
      ~~~~~~^~~~
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'void CmdMessenger::handleMessage()':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:182:20: warning: comparison is always true due to limited range of data type [-Wtype-limits]
  if (lastCommandId >= 0 && lastCommandId < MAXCALLBACKS && ArgOk && callbackList[lastCommandId] != NULL)
      ~~~~~~~~~~~~~~^~~~
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'int CmdMessenger::findNext(char*, char)':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:378:44: warning: unused parameter 'delim' [-Wunused-parameter]
 int CmdMessenger::findNext(char *str, char delim)
                                            ^~~~~
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'char* CmdMessenger::readStringArg()':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:492:9: warning: invalid conversion from 'char' to 'char*' [-fpermissive]
  return '\0';
         ^~~~
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp: In member function 'bool CmdMessenger::next()':
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:237:16: warning: this statement may fall through [-Wimplicit-fallthrough=]
   messageState = kProcessingArguments;
   ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
F:\arduino\libraries\CmdMessenger\CmdMessenger.cpp:238:2: note: here
  default:
  ^~~~~~~
Der Sketch verwendet 3454 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 884 Bytes (10%) des dynamischen Speichers, 7308 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.

Hast Du dafür auch noch Anpassungen gemacht?

Ja, offensichtlich (phuuu ist das schon lange her)

Die Warnungen sind berechtigt, und nicht schön, aber verhindern auch nicht die Funktion.

CmdMessenger.cpp (14,4 KB)

Dann ergänze ich noch HeaterSim.cpp (3,3 KB), damit auch die Kompilierung für den ESP32 funktioniert.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.