esp8266 to m5stack wifi communication



  • Hi, Im looking for a way to port my "espnow esp8266 to esp8266" project to m5stack
    I'm using arduino core
    I need to send a sensor value from esp8266 to m5stuck as faster as possible

    this is my sender code: (sorry I can't find how to insert code)

    // EspnowController.ino

    // a minimal program derived from
    // https://github.com/HarringayMakerSpace/ESP-Now

    // This is the program that sends the data. (The Controller)

    //=============

    #include <ESP8266WiFi.h>
    extern "C" {
    #include <espnow.h>
    }

    // this is the MAC Address of the slave which receives the data
    uint8_t remoteMac[] = {0x36, 0x33, 0x33, 0x33, 0x33, 0x33}; //se cambia il MAC ADDRESS ricordarsi di cambiare anche il serial print per poter clonare il modulo

    #define WIFI_CHANNEL 4 // se cambia il canale ricordarsi di cambiare anche il serial print per poter clonare il modulo

    // must match the slave struct
    struct attribute((packed)) DataStruct {
    char text[32];
    unsigned long time;
    };

    DataStruct myData;

    unsigned long lastSentMillis;
    unsigned long sendIntervalMillis = 10;
    unsigned long sentMicros;
    unsigned long ackMicros;

    unsigned long lastBlinkMillis;
    unsigned long fastBlinkMillis = 200;
    unsigned long slowBlinkMillis = 700;
    unsigned long blinkIntervalMillis = slowBlinkMillis;

    byte ledPin = 14;
    /////////////////////////////////////////////////////////
    #include <NewPingESP8266.h>
    #define TRIGGER_PIN D5 // 14 Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN D6 // 12 Arduino pin tied to echo pin on the ultrasonic sensor.
    //#define MAX_DISTANCE 350 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

    //NewPingESP8266 sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPingESP8266 setup of pins and maximum distance.
    NewPingESP8266 sonar(TRIGGER_PIN, ECHO_PIN); // NewPingESP8266 setup of pins and maximum distance.
    long echoTime;
    ////////////////////////////////////////////////////////

    //==============

    void setup() {
    Serial.begin(115200); Serial.println();
    Serial.println("Starting EspnowController.ino");

    WiFi.mode(WIFI_STA); // Station mode for esp-now controller
    WiFi.disconnect();

    Serial.printf("This mac: %s, ", WiFi.macAddress().c_str());
    Serial.printf("slave mac: %02x%02x%02x%02x%02x%02x", remoteMac[0], remoteMac[1], remoteMac[2], remoteMac[3], remoteMac[4], remoteMac[5]);

    Serial.printf(", channel: %i\n", WIFI_CHANNEL);

    if (esp_now_init() != 0) {
    Serial.println("*** ESP_Now init failed");
    while (true) {};
    }
    esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
    esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0);

    esp_now_register_send_cb(sendCallBackFunction);

    strcpy(myData.text, "WIFI CH 4");
    //strcpy(myData.text, "CRISTO !!!");
    Serial.print("WIFI_CHANNEL "); Serial.println(myData.text);

    pinMode(ledPin, OUTPUT);
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);

    Serial.println("Setup finished");

    }

    //==============

    void loop() {
    echoTime = (sonar.ping_median(10));
    sendData();
    blinkLed();
    }

    //==============

    void sendData() {
    if (millis() - lastSentMillis >= sendIntervalMillis) {
    lastSentMillis += sendIntervalMillis;
    //myData.time = millis();
    myData.time = echoTime;
    uint8_t bs[sizeof(myData)];
    memcpy(bs, &myData, sizeof(myData));
    sentMicros = micros();
    esp_now_send(NULL, bs, sizeof(myData)); // NULL means send to all peers
    Serial.println("sent data");
    }
    }

    //==============

    void sendCallBackFunction(uint8_t* mac, uint8_t sendStatus) {
    ackMicros = micros();
    Serial.print("Trip micros "); Serial.println(ackMicros - sentMicros);
    Serial.printf("Send status = %i", sendStatus);
    Serial.println();
    Serial.println();

    Serial.println("MAC ADD 0x36, 0x33, 0x33, 0x33, 0x33, 0x33"); //RICORDARSI DI CAMBIARLO SE CAMBIA NEL SETUP
    Serial.println("WIFI CHANNEL 4"); //RICORDARSI DI CAMBIARLO SE CAMBIA NEL SETUP
    Serial.println();
    Serial.println();
    if (sendStatus == 0) {
    blinkIntervalMillis = fastBlinkMillis;
    }
    else {
    blinkIntervalMillis = slowBlinkMillis;
    }
    }

    //================

    void blinkLed() {
    if (millis() - lastBlinkMillis >= blinkIntervalMillis) {
    lastBlinkMillis += blinkIntervalMillis;
    digitalWrite(ledPin, ! digitalRead(ledPin));
    }
    }

    and this is my rx code:

    // a minimal program derived from
    // https://github.com/HarringayMakerSpace/ESP-Now

    // This is the program that receives the data. (The Slave)

    //=============

    #include <ESP8266WiFi.h>
    extern "C" {
    #include <espnow.h>
    #include <user_interface.h>
    }

    // it seems that the mac address needs to be set before setup() is called
    // and the inclusion of user_interface.h facilitates that
    // presumably there is a hidden call to the function initVariant()

    /* Set a private Mac Address
    http://serverfault.com/questions/40712/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines
    Note: by setting a specific MAC you can replace this slave ESP8266 device with a new one
    and the new slave will still pick up the data from controllers which use that MAC
    */
    uint8_t mac[] = {0x36, 0x33, 0x33, 0x33, 0x33, 0x33};

    //==============

    void initVariant() {
    WiFi.mode(WIFI_AP);
    wifi_set_macaddr(SOFTAP_IF, &mac[0]);
    }

    //==============

    #define WIFI_CHANNEL 4

    // must match the controller struct
    struct attribute((packed)) DataStruct {
    char text[32];
    unsigned int time;
    };

    DataStruct myData;

    //============

    void setup() {
    Serial.begin(115200); Serial.println();
    Serial.println("Starting EspnowSlave.ino");

    Serial.print("This node AP mac: "); Serial.println(WiFi.softAPmacAddress());
    Serial.print("This node STA mac: "); Serial.println(WiFi.macAddress());

    if (esp_now_init() != 0) {
    Serial.println("*** ESP_Now init failed");
    while (true) {};
    }

    esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);

    esp_now_register_recv_cb(receiveCallBackFunction);

    Serial.println("End of setup - waiting for messages");
    }

    //============

    void loop() {

    }

    //============

    void receiveCallBackFunction(uint8_t *senderMac, uint8_t *incomingData, uint8_t len) {
    memcpy(&myData, incomingData, sizeof(myData));
    int cm = myData.time / 29 / 2;
    int inc = myData.time / 74 / 2;
    Serial.print("NewMsg ");
    Serial.print("MacAddr ");
    for (byte n = 0; n < 6; n++) {
    Serial.print (senderMac[n], HEX);
    }
    Serial.print(" MsgLen ");
    Serial.print(len);
    Serial.print(" Text ");
    Serial.print(myData.text);
    Serial.print(" Time ");
    Serial.print(myData.time);
    Serial.print(" CM = ");
    Serial.print(cm);
    Serial.print(" IN = ");
    Serial.print(inc);
    Serial.println();
    }
    every tips apreciated ...

    tanks a lot