Code pour le récepteur et affichage (ESP32 #3)

Ce code reçoit les données de température des deux ESP32 précédents et les affiche via la console série.

# include 
# include 


typedef struct struct_message {
    float temp;
} struct_message;

struct_message incomingReadings;

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
    memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
    Serial.print("Temperature Received: ");
    Serial.println(incomingReadings.temp);
}

void setup() {
    Serial.begin(115200);

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

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

    esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
    // Boucle vide, les données sont reçues via le callback OnDataRecv
}

Domotique – informatique – électronique – dictionnaire – projets

Copyright 2024

ESP NOW

Comment fonctionne ESP-NOW

ESP-NOW est un protocole de communication sans fil développé par Espressif Systems, l’entreprise derrière les microcontrôleurs ESP8266 et ESP32. Ce protocole permet une communication rapide, de faible puissance et sans connexion entre les appareils ESP, sans avoir besoin d’un point d’accès Wi-Fi. Voici une explication détaillée de ce protocole et de ses caractéristiques principales : envoyer des messages à tout moment.

Voici un aperçu de leur fonctionnement :

Caractéristiques de base :

  1. Sans connexion : Contrairement à la communication Wi-Fi traditionnelle qui nécessite une connexion à un réseau, ESP-NOW fonctionne sans connexion préalable à un routeur ou à un point d’accès. Les appareils communiquent directement entre eux.
  2. Faible latence : ESP-NOW offre une latence très faible, ce qui est idéal pour les applications nécessitant des réponses rapides.
  3. Faible consommation d’énergie : C’est un protocole économe en énergie, ce qui est crucial pour les appareils fonctionnant sur batterie.

Fonctionnement :

  • Adresse MAC : Chaque appareil ESP dispose d’une adresse MAC unique. ESP-NOW utilise ces adresses MAC pour envoyer et recevoir des données.
  • Paire de clé : Pour sécuriser la communication, ESP-NOW peut utiliser des paires de clés (peers) pour chiffrer les messages échangés.
  • Broadcast et Unicast : Il supporte à la fois les communications en broadcast (à tous les appareils) et en unicast (à un appareil spécifique).
Site en référence.

Architecture :

  • Stations : Les appareils ESP participant à une communication ESP-NOW sont appelés stations. Chaque station peut envoyer et recevoir des messages.
  • Groupes de pairs : Les stations peuvent être configurées pour communiquer avec plusieurs autres stations, formant ainsi un groupe de pairs.

Avantages :

  • Scalabilité : ESP-NOW peut gérer plusieurs appareils (jusqu’à 20 pairs pour l’ESP8266 et jusqu’à 250 pairs pour l’ESP32).
  • Simplicité : La configuration et la mise en œuvre d’ESP-NOW sont relativement simples comparées à d’autres protocoles de communication.
  • Résilience : Moins de dépendance à l’infrastructure réseau permet une communication plus résiliente dans des environnements avec une mauvaise couverture Wi-Fi.

Cas d'utilisation :

  • Maison intelligente : Utilisé dans des capteurs et actionneurs pour des maisons intelligentes où une réponse rapide et fiable est nécessaire.
  • Surveillance : Parfait pour des réseaux de capteurs déployés pour la surveillance environnementale ou industrielle.
  • Jouets connectés : Utilisé dans les jouets interactifs qui doivent échanger rapidement des données entre eux.

Configuration :

  • airage : Pour établir une communication, les appareils doivent être configurés avec les adresses MAC des appareils avec lesquels ils vont communiquer.
  • Sécurité : Les messages peuvent être chiffrés en utilisant des clés pré-partagées pour assurer la confidentialité et l’intégrité des données échangées.

Limites :

  • Portée limitée : La portée de communication est limitée par la portée Wi-Fi, généralement autour de 100 mètres en champ libre.
  • Bande passante : La bande passante est inférieure à celle du Wi-Fi traditionnel, ce qui limite la quantité de données pouvant être échangées rapidement.

Conclusion :

ESP-NOW est un protocole de communication efficace et performant pour des applications nécessitant une communication rapide, fiable et à faible consommation d’énergie entre les appareils ESP. Sa simplicité de mise en œuvre et ses faibles exigences en matière d’infrastructure en font une solution idéale pour de nombreux projets IoT (Internet of Things).

Pour illustrer comment utiliser ESP-NOW pour lire les températures extérieure et intérieure à partir de deux ESP32 (un pour chaque température) et envoyer ces données à un troisième ESP32 pour les afficher, voici un exemple pratique.

Matériel nécessaire :

Trois ESP32

Deux capteurs de température (par exemple, DHT22 ou DS18B20)

Câbles de connexion

Configuration des ESP32

Capteur extérieur (ESP32 #1)

Capteur intérieur (ESP32 #2)

Récepteur et affichage (ESP32 #3)

Code pour le capteur extérieur (ESP32 #1)

# include 
# include 
# include 

#define DHTPIN 4 // Pin où le capteur DHT est connecté
#define DHTTYPE DHT22 // Type de capteur DHT

DHT dht(DHTPIN, DHTTYPE);

typedef struct struct_message {
    float temp;
} struct_message;

struct_message myData;

// Adresse MAC du récepteur
uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC};

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() {
    Serial.begin(115200);
    dht.begin();

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

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

    esp_now_register_send_cb(OnDataSent);

    esp_now_peer_info_t peerInfo;
    memcpy(peerInfo.peer_addr, broadcastAddress, 6);
    peerInfo.channel = 0;
    peerInfo.encrypt = false;

    if (esp_now_add_peer(&peerInfo) != ESP_OK) {
        Serial.println("Failed to add peer");
        return;
    }
}

void loop() {
    myData.temp = dht.readTemperature();
    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);
}

Code pour le capteur intérieur (ESP32 #2)

Le code pour le capteur intérieur est presque identique à celui du capteur extérieur, avec une différence dans l’adresse MAC.

# include 
# include 
# include 

#define DHTPIN 4 // Pin où le capteur DHT est connecté
#define DHTTYPE DHT22 // Type de capteur DHT

DHT dht(DHTPIN, DHTTYPE);

typedef struct struct_message {
    float temp;
} struct_message;

struct_message myData;

// Adresse MAC du récepteur
uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC};

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() {
    Serial.begin(115200);
    dht.begin();

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

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

    esp_now_register_send_cb(OnDataSent);

    esp_now_peer_info_t peerInfo;
    memcpy(peerInfo.peer_addr, broadcastAddress, 6);
    peerInfo.channel = 0;
    peerInfo.encrypt = false;

    if (esp_now_add_peer(&peerInfo) != ESP_OK) {
        Serial.println("Failed to add peer");
        return;
    }
}

void loop() {
    myData.temp = dht.readTemperature();
    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);
}

Code pour le récepteur et affichage (ESP32 #3)

Ce code reçoit les données de température des deux ESP32 précédents et les affiche via la console série.

# include 
# include 


typedef struct struct_message {
    float temp;
} struct_message;

struct_message incomingReadings;

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
    memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
    Serial.print("Temperature Received: ");
    Serial.println(incomingReadings.temp);
}

void setup() {
    Serial.begin(115200);

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

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

    esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
    // Boucle vide, les données sont reçues via le callback OnDataRecv
}

Domotique – informatique – électronique – dictionnaire – projets

Copyright 2024