Serial communication between ESP8266 and Arduino Mega

Hi all.
8266_22_1_25.ino (2.2 KB)
Mega22_1_25.ino (2.9 KB)

I have a project that I send data (Digital) from a touch screen espnow to an esp8266 and from the esp8266 communicate via serial to the Mega 2560. I do get the data to read as expected on the esp8266 but the data on the Mega is raw data only. I fail to get the data in the ("1", "0" and digital) format. It's probably a small issue but hope somebody can help me out. The touch screen code is too big to print but the data received by the esp8266 is all good.

/ Define the data structure
typedef struct {
  int xval;
  int yval;
  int x;
  int y;
  float Slider1;
  float Slider2;
  int Value_SelectC;
  int Value_SelectCsharp;
  int Value_SelectA;
  int Value_SelectB;
  int Value_SelectBb;
  int Value_SelectD;
  int Value_SelectFb;
  int Value_SelectE;
  int Value_SelectFsharp;
  int Value_SelectG;
  float Slider_LUP;
  float Slider_LL;
  float Slider_LR;
  float Slider_RR;
  float Slider_RL;
  int Value_AutoAdjust;
  int Value_StringUP;
  int Value_StringDOWN;
  int Value_String1;
  int Value_String2;
  int Value_String3;
  int Value_String4;
  int Value_String5;
  int Value_String6;
  int Value_String7;
  int Value_String8;
  int Value_String9;
  int Value_String10;
  int Value_String11;
  int Value_String12;
} struct_message;

// Create a variable for the data structure
struct_message myData1;

void setup() {
  Serial.begin(9600);  // Debug serial
  Serial1.begin(9600);   // Communication with ESP8266
  Serial.println("Arduino Mega is ready to receive data from ESP8266");

  // Initialize motor control pins
  pinMode(9, OUTPUT);   // Motor direction pin
  pinMode(10, OUTPUT);  // Motor enable pin
  digitalWrite(9, LOW); // Ensure motor is stopped
  digitalWrite(10, LOW);
}

void loop() {

  // Check if data is available from ESP8266
  if (Serial1.available()) {
    String receivedData = "";  // Variable to store incoming data

    // Read data until a newline or timeout
    while (Serial1.available()) {
      char incomingChar = Serial1.read();
      if (incomingChar == '\n') break; // End of message
      receivedData += incomingChar;
    }

    // Parse received data into the structure
    if (receivedData.length() > 0) {
      Serial.println("Data received from ESP8266:");
      Serial.println(receivedData);

      // Parse the structure
     sscanf(receivedData.c_str(), "%d,%d,%d", 
            &myData1.Value_StringUP, 
            &myData1.Value_StringDOWN, 
            &myData1.Value_String1);

      // Debug parsed values
      Serial.print("Value_StringUP: ");
      Serial.println(myData1.Value_StringUP);
      Serial.print("Value_StringDOWN: ");
      Serial.println(myData1.Value_StringDOWN);
      Serial.print("Value_String1: ");
      Serial.println(myData1.Value_String1);

      // Control the motor based on the received data
      if (myData1.Value_StringUP == 1 && myData1.Value_String1 == 1) {
        digitalWrite(9, HIGH);  // Set direction to forward
        digitalWrite(10, HIGH); // Enable motor
        Serial.println("Motor running forward");
      } else if (myData1.Value_StringDOWN == 1 && myData1.Value_String1 == 1) {
        digitalWrite(9, LOW);   // Set direction to reverse
        digitalWrite(10, HIGH); // Enable motor
        Serial.println("Motor running reverse");
      } else {
        digitalWrite(10, LOW);  // Stop the motor
        Serial.println("Motor stopped");
      }
    }
  }

#include <ESP8266WiFi.h>
#include <espnow.h>

// Define data structure
typedef struct {
  int xval;
  int yval;
  int x;
  int y;
  float Slider1;
  float Slider2;
  int Value_SelectC;
  int Value_SelectCsharp;
  int Value_SelectA;
  int Value_SelectB;
  int Value_SelectBb;
  int Value_SelectD;
  int Value_SelectFb;
  int Value_SelectE;
  int Value_SelectFsharp;
  int Value_SelectG;
  float Slider_LUP;
  float Slider_LL;
  float Slider_LR;
  float Slider_RR;
  float Slider_RL;
  int Value_AutoAdjust;
  int Value_StringUP;
  int Value_StringDOWN;
  int Value_String1;
  int Value_String2;
  int Value_String3;
  int Value_String4;
  int Value_String5;
  int Value_String6;
  int Value_String7;
  int Value_String8;
  int Value_String9;
  int Value_String10;
  int Value_String11;
  int Value_String12;
} struct_message;

struct_message myData1;

void onDataRecv(uint8_t *mac, uint8_t *incomingData, uint8_t len) {
    memcpy(&myData1, incomingData, sizeof(myData1));
    Serial.println("Data received:");
    Serial.print("Value_StringUP: ");
    Serial.println(myData1.Value_StringUP);
    Serial.print("Value_StringDOWN: ");
    Serial.println(myData1.Value_StringDOWN);
    Serial.print("Value_String1: ");
    Serial.println(myData1.Value_String1);

    // Send data to Arduino Mega via Serial1
    Serial1.print(myData1.Value_StringUP);
    Serial1.print(",");
    Serial1.print(myData1.Value_StringDOWN);
    Serial1.print(",");
    Serial1.println(myData1.Value_String1);
}

void setup() {
    Serial.begin(115200);  // Debug serial
    Serial1.begin(9600);   // Communication with Arduino Mega (adjust baud rate as needed)

    // Initialize WiFi
    WiFi.mode(WIFI_STA);
    Serial.println(WiFi.macAddress());

    // Initialize ESP-NOW
    if (esp_now_init() != 0) {
        Serial.println("ESP-NOW initialization failed");
        return;
    }

    // Set ESP-NOW receive callback
    esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
    esp_now_register_recv_cb(onDataRecv);

    Serial.println("ESP-NOW receiver initialized");
}

void loop() {
    // Receiver is event-driven, so no need to handle logic here
}

Is it too difficult for you to post the program code right here on the forum?

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