- 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
}