Отправить данные из NodeMcu (ESP266) в ESP32 с помощью esp сейчас?

Я пытаюсь отправить данные с Nodemcu (esp8266) на ESP32. Я пытаюсь использовать espnow для этой цели, но я действительно застрял, я не могу объединить Master и Slave для обеих плат, я считаю, что коды сильно различаются, я пробовал некоторые модификации, и я могу отправлять данные с Nodemcu, но могу Не получаю его на ESP32. Я пытаюсь отправить два аналоговых значения для автомобиля управления жестами.

Мастер-код или код контроллера, работающий на Nodemcu, приведен ниже.

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

#define MUX_A D4
#define MUX_B D3
#define MUX_C D2
#define ANALOG_INPUT A0
#define CHANNEL 4

extern "C" {
}
uint8_t remoteMac[] = {0x24, 0x6F, 0x28, 0xB6, 0x24, 0x49};

struct __attribute__((packed)) DataStruct {
    //char text[32];
    int x;
    int y;
    unsigned long time;
};

DataStruct myData;

unsigned long lastSentMillis;
unsigned long sendIntervalMillis = 1000;
unsigned long sentMicros;
unsigned long ackMicros;
int xAxis;
int yAxis;
int zAxis;

void InitESPNow() {
  WiFi.disconnect();
  if (esp_now_init()==0) {
    Serial.println("ESPNow Init Success");
  }
  else {
    Serial.println("ESPNow Init Failed");
    // Retry InitESPNow, add a counte and then restart?
    // InitESPNow();
    // or Simply Restart
    ESP.restart();
  }
}


void sendData() {
  if (millis() - lastSentMillis >= sendIntervalMillis) {
        lastSentMillis += sendIntervalMillis;
        myData.time = millis();
        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");
        Serial.println(myData.x);
        Serial.println(myData.y);
    }
}
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();
}
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",CHANNEL);
    InitESPNow();
    esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
    esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, CHANNEL, NULL, 0);

    esp_now_register_send_cb(sendCallBackFunction);

    Serial.print("Message "); 

    pinMode(MUX_A, OUTPUT);
    pinMode(MUX_B, OUTPUT);     
    pinMode(MUX_C, OUTPUT);
    Serial.println("Setup finished");

    }

void changeMux(int c, int b, int a) {
  digitalWrite(MUX_A, a);
  digitalWrite(MUX_B, b);
  digitalWrite(MUX_C, c);
}
void loop() {

    changeMux(LOW, LOW, LOW);
    xAxis = analogRead(ANALOG_INPUT); //Value of the sensor connected to  pin 0 of IC
    changeMux(LOW, LOW, HIGH);
    yAxis = analogRead(ANALOG_INPUT); //Value of the sensor connected to  pin 1 of IC
    changeMux(LOW, HIGH, LOW);
    zAxis = analogRead(ANALOG_INPUT); //Value of the sensor connected to  pin 2 of IC
    changeMux(LOW, HIGH, LOW);

    myData.x= xAxis;
    myData.y= yAxis;
    sendData();
    delay(500);
}

Код ведомого устройства, работающий на ESP32, приведен ниже.

#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>

#define CHANNEL 4

uint8_t mac[] = {0x36, 0x33, 0x33, 0x33, 0x33, 0x33};

struct __attribute__((packed)) DataStruct {
    //char text[32];
    int x;
    int y;
    unsigned long time;
};

DataStruct myData;
// Init ESP Now with fallback


void setup() {
  Serial.begin(115200);
  Serial.println("ESPNow/Basic/Slave Example");
  //Set device in AP mode to begin with
  WiFi.mode(WIFI_AP);
  // configure device AP mode
  // This is the mac address of the Slave in AP Mode
  esp_wifi_set_mac(ESP_IF_WIFI_STA, &mac[0]);


  Serial.print("AP MAC: "); Serial.println(WiFi.softAPmacAddress());
  // Init ESPNow with a fallback logic
  if (esp_now_init()!=0) {
        Serial.println("*** ESP_Now init failed");
        while(true) {};
    }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info.
  esp_now_register_recv_cb(OnDataRecv);
   Serial.print("Aheloiioi");
}

// callback when data is recv from Master
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
  memcpy(&myData, data, sizeof(myData));
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Recv from: "); Serial.println(macStr);
  Serial.print("Last Packet Recv Data: "); Serial.println(myData.x); Serial.println(myData.y);
  Serial.println("");
}

void loop() {
  // Chill
}

Это единственный вывод, который я получаю на ESP32.

ESPNow/Basic/Slave Example
AP MAC: 24:6F:28:B6:24:49
Aheloiioi

Пока это вывод на Nodemcu

Starting EspnowController.ino
This mac: BC:DD:C2:B5:E3:2B, slave mac: 246f28b62449, channel: 4
ESPNow Init Success
Message Setup finished
sent data
10
8
Trip micros 7320
Send status = 1

sent data
9
8
Trip micros 6817
Send status = 1

sent data
10
9
Trip micros 6731
Send status = 1

и это продолжается

Если есть другие способы отправки данных, укажите


person Jose Ben    schedule 23.02.2020    source источник


Ответы (1)


Я никогда раньше не использовал esp_now, поэтому сам не тестировал, но думаю, что это не имеет ничего общего с библиотекой или esp32, это всего лишь небольшая ошибка использования C ++.

На вашей sendData() функции вашего esp8266 вы сделали следующее:

        uint8_t bs[sizeof(myData)];
        memcpy(bs, &myData, sizeof(myData));
        sentMicros = micros();
        esp_now_send(NULL, bs, sizeof(myData));

bs имеет тип uint8_t и является массивом, и вы пытаетесь скопировать данные, имеющие тип struct myData, в массив. Затем вы пытаетесь передать массив в esp_now_send(). Я быстро взглянул на определение esp_now_send() прототипа функции, esp_now_send() необходимо передать адрес (который имеет тип uint8_t) вашей структуры данных myData.

Я не знаю, почему вам нужно выполнять memcpy, но я думаю, что будет проще и проще просто передать указатель myData в вызов функции.

void sendData() {
  if (millis() - lastSentMillis >= sendIntervalMillis) {
        lastSentMillis += sendIntervalMillis;
        myData.time = millis();
        esp_now_send(NULL, (uint8_t *)&myData, sizeof(myData)); // NULL means send to all peers
        Serial.println("sent data");
        Serial.println(myData.x);
        Serial.println(myData.y);
    }
}

Пожалуйста, дайте мне знать, работает ли это?

person hcheung    schedule 23.02.2020
comment
Это сработало!!!!!!! Большое спасибо, я закомментировал свою функцию и вставил вашу, и все заработало. Большое тебе спасибо - person Jose Ben; 23.02.2020
comment
Привет @hcheung, теперь у меня другая проблема, прочтите этот вопрос stackoverflow.com/questions/60421562/ - person Jose Ben; 28.02.2020