Contrôle d'une LED sur ESP8266 via ESP-NOW depuis un ESP32

  • Carte de développement ESP32
  • Module ESP-01S (basé sur ESP8266)
  • Adaptateur série (pour la programmation de l'ESP-01S)

Configurasion de l'ESP8266 (ESP-01S) - Récepteur

Code


/*
* Programme récepteur ESP-NOW pour ESP8266
* Contrôle une LED et un relais basés sur les commandes reçues ("on"/"off").
* La LED et le relais sont activés à l'état bas.
*/

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

// Broche pour la LED intégrée (souvent GPIO2 sur les cartes NodeMCU)
#define LED_PIN 2
// Broche pour le relais (activé à l'état bas)
#define RELAY_PIN 0

// État cible pour la LED et le relais (true = allumé, false = éteint)
volatile bool targetState = false;
// Indicateur pour mettre à jour l'état de la LED/relais
volatile bool needsUpdate = false;

// Fonction de rappel pour la réception des données (exécutée dans un contexte d'interruption)
void onDataReceived(uint8_t *mac_addr, uint8_t *data, uint8_t data_len) {
 Serial.print("Reçu de: ");
 for (int i = 0; i < 6; i++) {
   Serial.printf("%02X", mac_addr[i]);
   if (i < 5) Serial.print(":");
 }
 Serial.println();

 Serial.print("Données: ");
 for (int i = 0; i < data_len; i++) {
   Serial.print((char)data[i]);
 }
 Serial.println();

 // Analyse des commandes simples "on" ou "off"
 if (data_len == 2 && data[0] == 'o' && data[1] == 'n') {
   targetState = true; // Allumer (état bas)
   needsUpdate = true;
   Serial.println("Commande: ALLUMER");
 } 
 else if (data_len == 3 && data[0] == 'o' && data[1] == 'f' && data[2] == 'f') {
   targetState = false; // Éteindre (état haut)
   needsUpdate = true;
   Serial.println("Commande: ÉTEINDRE");
 }
 else {
   Serial.println("Commande inconnue, ignorée.");
 }
}

void setup() {
 Serial.begin(115200);
 delay(2000); // Petite pause pour stabiliser le port série
 Serial.println("\n\nInitialisation du récepteur ESP-NOW...");

 pinMode(LED_PIN, OUTPUT);
 pinMode(RELAY_PIN, OUTPUT);
 digitalWrite(RELAY_PIN, HIGH); // État initial : éteint (haut)

 WiFi.mode(WIFI_STA);

 if (esp_now_init() != 0) {
   Serial.println("Erreur d'initialisation ESP-NOW");
   return;
 }

 esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
 esp_now_register_recv_cb(onDataReceived);

 Serial.print("Adresse MAC locale: ");
 Serial.println(WiFi.macAddress());
 Serial.println("Veuillez configurer cette adresse MAC dans le programme de l'expéditeur.");
 Serial.println("Envoyez 'on' pour allumer, 'off' pour éteindre.");
}

void loop() {
 if (needsUpdate) {
   digitalWrite(LED_PIN, targetState ? LOW : HIGH);   // Gérer la LED
   digitalWrite(RELAY_PIN, targetState ? LOW : HIGH); // Gérer le relais
   needsUpdate = false; // Réinitialiser l'indicateur
 }
 delay(200); // Petite pause pour éviter une utilisation CPU excessive
}
   

Programmation

Connectez l'ESP-01S à l'adaptateur série comme suit :

ESP-01S Adaptateur Série
3V3 3V3
GND GND
RX TX
TX RX
IO0 GND

Utilisez l'IDE Arduino pour téléverser le code après avoir établi les connexions.

Configuration de l'ESP32 - Expéditeur

Code

Remplaecz targetMac par l'adresse MAC de votre ESP-01S obtenu lors de la programmation.


/*
* Exemple d'expéditeur ESP-NOW pour ESP32 (API récente)
* Envoie des commandes "on" et "off" à un appareil cible.
* Carte de développement : ESP32-C6 (ou compatible)
* Dépendances : esp_now, WiFi (inclus dans l'Arduino core pour ESP32)
*/

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

// ========== 1. Adresse MAC de l'appareil cible ==========
// Remplacez par l'adresse MAC de votre ESP8266 récepteur
uint8_t targetMac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; 

// ========== 2. Fonction de rappel pour l'envoi ==========
// status: ESP_NOW_SEND_SUCCESS ou ESP_NOW_SEND_FAIL
void onDataSent(const wifi_tx_info_t *tx_info, esp_now_send_status_t status) {
 Serial.print("Statut de l'envoi: ");
 if (status == ESP_NOW_SEND_SUCCESS) {
   Serial.println("Succès ✓");
 } else {
   Serial.println("Échec ✗");
 }
}

// ========== 3. Initialisation d'ESP-NOW ==========
bool initializeEspNow() {
 WiFi.mode(WIFI_STA);
 Serial.print("Adresse MAC locale: ");
 Serial.println(WiFi.macAddress());

 if (esp_now_init() != ESP_OK) {
   Serial.println("Erreur d'initialisation ESP-NOW !");
   return false;
 }
 Serial.println("ESP-NOW initialisé avec succès.");

 esp_now_register_send_cb(onDataSent);

 esp_now_peer_info_t peerInfo = {};
 memcpy(peerInfo.peer_addr, targetMac, 6);
 peerInfo.channel = 0; // Utilise le canal WiFi actuel
 peerInfo.encrypt = false;

 if (esp_now_add_peer(&peerInfo) != ESP_OK) {
   Serial.println("Échec de l'ajout du périphérique distant ! Vérifiez l'adresse MAC.");
   return false;
 }
 Serial.println("Périphérique distant ajouté avec succès.");
 return true;
}

// ========== 4. Fonction d'envoi de message ==========
void sendMessage(const char* message) {
 size_t messageLength = strlen(message);
 esp_err_t result = esp_now_send(targetMac, (uint8_t*)message, messageLength);
 
 if (result == ESP_OK) {
   Serial.println("Message envoyé (dans la file d'attente).");
 } else {
   Serial.printf("Échec de l'envoi du message, code d'erreur: %d\n", result);
 }
}

// ========== 5. Initialisation ==========
void setup() {
 Serial.begin(115200);
 delay(1000);
 Serial.println("\n--- Démarrage de l'expéditeur ESP-NOW ---");

 if (initializeEspNow()) {
   sendMessage("on"); // Envoi initial pour allumer
 } else {
   Serial.println("Initialisation ESP-NOW échouée. Arrêt de l'envoi.");
 }
}

// ========== 6. Boucle principale ==========
void loop() {
 delay(5000);
 sendMessage("on");  // Allumer
 delay(5000);
 sendMessage("off"); // Éteindre
}
   

Étiquettes: ESP32 ESP8266 ESP-NOW iot Communication sans fil

Publié le 1 juillet à 03h50