Ricezione con ESP32

Ciao
Rieccomi con lo step successivo per il progetto di datalogger radio
Sotto lo sketch del trasmettitore

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp32-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

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

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xA0, 0xA3, 0xB3, 0x2F, 0x84, 0xC0};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;

esp_now_peer_info_t peerInfo;

// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
 
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  
  // Add peer        
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 
void loop() {
  // Set values to send
  strcpy(myData.a, "THIS IS A CHAR");
  myData.b = random(1,20);
  myData.c = 1.2;
  myData.d = false;
  
  // Send message via ESP-NOW
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
     
  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(2000);
}

Sotto lo sketch del ricevitore

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp32-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

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

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
    char a[32];
    int b;
    float c;
    bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Char: ");
  Serial.println(myData.a);
  Serial.print("Int: ");
  Serial.println(myData.b);
  Serial.print("Float: ");
  Serial.println(myData.c);
  Serial.print("Bool: ");
  Serial.println(myData.d);
  Serial.println();
}
 
void setup() {
  // Initialize Serial Monitor

  Serial.begin(115200);
  
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {  
}

e qua sotto la stampa sul serial all avvio del modulo ricevitore

17:11:16.279 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
17:11:16.279 -> configsip: 0, SPIWP:0xee
17:11:16.279 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
17:11:16.279 -> mode:DIO, clock div:1
17:11:16.279 -> load:0x3fff0030,len:1344
17:11:16.279 -> load:0x40078000,len:13964
17:11:16.279 -> load:0x40080400,len:3600
17:11:16.279 -> entry 0x400805f0
17:11:16.605 -> A0:A3:B3:2F:84:C0
17:11:16.605 -> A0:A3:B3:2F:84:C0
17:11:18.604 -> A0:A3:B3:2F:84:C0
17:11:20.622 -> A0:A3:B3:2F:84:C0

Le mie domande sono diverse
Il loop e' vuoto, perche' su rx ricevo continuamente il mac del rx?
All avvio non dovrei ricevere anche

void loop() {
  // Set values to send
  strcpy(myData.a, "THIS IS A CHAR");
  myData.b = random(1,20);
  myData.c = 1.2;
  myData.d = false;

Ultima domanda, come faccio a mettere nel loop del ricevitore la funzione di ricezione

OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)

Non hai bisogno di mettere nulla nel loop perché la funzione di callback OnDataRecv() viene associata all'evento di ricezione dati nel setup() con l'istruzione che ho evidenziato ed eseguita "in automatico" ogni volta che serve.

Senza dilungarci troppo nei dettagli, tieni a mente che l'ESP32 è un micro che di base usa FreeRTOS.
Come c'è scritto nella documentazione la funzione di callback verrà eseguita nel task che si occupa del WiFi, quindi è bene fare in modo che faccia solo lo stretto necessario per la ricezione (come negli esempi inclusi nel core).

Eventuali operazioni "time consuming" sui dati ricevuti andranno poi fatte con calma (ad esempio nel loop())

Grazie
Non sapevo che qualcosa venisse esguita fuori dal loop
E per la altre domade? :grinning:

cosa significa?

sotto il link che sto'studiando
https://randomnerdtutorials.com/esp-now-one-to-many-esp32-esp8266/

Che non devi usare delay()o cicli bloccanti come while o lunghi for

Ad ogni modo, sei sicuro degli sketch che hai postato come esempio sono effettivamente quelli che ti stanno dando problemi?
Perché io li ho appena provati cosi come sono (ho cambiato solo il MAC address ovviamente) e funzionano come dovrebbero.
Che versione del Core ESP32 per Arduino stai usando?

... significa che, la cosa più semplice che puoi fare, è alzare solo una flag (operazione velocissima) e poi, con calma, nel loop(), se si trova la flag alzata, si fa quello che si deve fare e si riazzera la flag.

Guglielmo

grazie

capito

adesso funzionano credo di avere capito cosa sbagliavo, in pratica contenitore ricevente diverso dal contenitore trasmittente

dovrei andare meglio da ora

grazie

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