Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révisionLes deux révisions suivantes | ||
howto:arduino-esp:esp-now [2021/10/08 16:00] – [Connaître l'adresse MAC] guillaume | howto:arduino-esp:esp-now [2021/10/12 12:52] – guillaume | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
ESP-NOW est un protocole d' | ESP-NOW est un protocole d' | ||
- | |||
- | Ce qui va suivre s' | ||
===== Le protocole ESP-NOW ===== | ===== Le protocole ESP-NOW ===== | ||
- | Tel qu'il est décrit sur le site d' | + | Tel qu'il est décrit sur le site d' |
- | Il est possible de réaliser un schéma | + | Il est possible de réaliser un schéma |
Il est possible de chiffrer les communications, | Il est possible de chiffrer les communications, | ||
- | Il n'est possible d' | + | Il n'est possible d' |
===== Connaître l' | ===== Connaître l' | ||
Ligne 19: | Ligne 17: | ||
Il est possible de changer de manière logicielle l' | Il est possible de changer de manière logicielle l' | ||
- | Uploader | + | Téléverser |
< | < | ||
Ligne 34: | Ligne 32: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | Cette étape manuelle permettra d' | ||
+ | |||
+ | ===== Principe de communication ===== | ||
+ | |||
+ | Pour commencer, nous allons simplement envoyer des informations d'un ESP vers un autre. Par commodité, nous les appellerons donc " | ||
+ | |||
+ | **Côté émetteur: | ||
+ | * Initialiser ESP-NOW. | ||
+ | * Enregistrer une fonction de rappel, qui sera exécutée quant un message est envoyé. Cela nous permettra de vérifier la bonne transmission du message. | ||
+ | * On ajoute l' | ||
+ | * On envoie le message. | ||
+ | |||
+ | **Côté récepteur: | ||
+ | * Initialiser ESP-NOW. | ||
+ | * Enregistrer une fonction de rappel, qui sera exécutée quant un message est reçu. | ||
+ | * Dans cette fonction de rappel, on sauve le contenu du message dans une variable pour en faire quelque chose. | ||
+ | |||
+ | À Chaque étape listée ci-dessus va correspondre une fonction spécifique à l' | ||
+ | |||
+ | **esp_now_init()** Initialiser ESP-NOW. Il faut initialiser le wifi avant d' | ||
+ | **esp_now_add_peer()** On appelle cette fonction pour appairer un ESP, on passe son adresse MAC en argument.\\ | ||
+ | **esp_now_send()** Envoie des données avec ESP-NOW.\\ | ||
+ | **esp_now_register_send_cb()** Enregistre une fonction de rappel qui sera déclenchée lorsque l'on envoie des données.\\ | ||
+ | **esp_now_register_rcv_cb()** Enregistre une fonction de rappel qui sera déclenchée lorsque l'on reçoit des données.\\ | ||
+ | |||
+ | ===== Code de l' | ||
+ | |||
+ | Ci-dessous, le code commenté: | ||
+ | |||
+ | < | ||
+ | // Reference technique: https:// | ||
+ | |||
+ | // Inclure les librairies | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // Stockage de l' | ||
+ | uint8_t MAC_recepteur[] = {0xAC, 0x67, 0xB2, 0x38, 0x94, 0x24}; | ||
+ | |||
+ | // La variable qui sera envoyée au récepteur (nous générerons une valeur aléatoire pour l' | ||
+ | float maValeurEnvoyee; | ||
+ | |||
+ | // La fonction de rappel qui nous assurera de la bonne livraison du message | ||
+ | void quand_donnees_Envoyees(const uint8_t *mac_addr, esp_now_send_status_t status) { | ||
+ | Serial.print(" | ||
+ | Serial.println(status == ESP_NOW_SEND_SUCCESS ? " | ||
+ | } | ||
+ | |||
+ | // Une variable qui servira à stocker les réglages concernant le récepteur | ||
+ | esp_now_peer_info_t infosRecepteur; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // On initie la comm série à 115200 Bauds | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | // On démarre le Wifi en mode Station | ||
+ | WiFi.mode(WIFI_STA); | ||
+ | |||
+ | // Puis on initialise ESP-NOW | ||
+ | if (esp_now_init() != ESP_OK) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Si ESP-NOW a coorectement démarré, il est temps d' | ||
+ | esp_now_register_send_cb(quand_donnees_Envoyees); | ||
+ | | ||
+ | // Tout est prêt pour l' | ||
+ | memcpy(infosRecepteur.peer_addr, | ||
+ | | ||
+ | // On définit un canal (0 utilisera automatiquement le même canal que celui utilisé par le wifi) | ||
+ | infosRecepteur.channel = 0; | ||
+ | |||
+ | // On ne chiffre pas les échanges | ||
+ | infosRecepteur.encrypt = false; | ||
+ | | ||
+ | // Appairage | ||
+ | if (esp_now_add_peer(& | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | | ||
+ | // On définit la valeur de la variable à envoyer à l'aide d'un générateur aléatoire | ||
+ | maValeurEnvoyee = random(1, | ||
+ | | ||
+ | // On envoie le message | ||
+ | esp_err_t resultat = esp_now_send(MAC_recepteur, | ||
+ | |||
+ | if (resultat == ESP_OK) { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | // On effectue cette opération toutes les secondes | ||
+ | delay(1000); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Code du récepteur ===== | ||
+ | |||
+ | Voici le code du récepteur, commenté: | ||
+ | |||
+ | < | ||
+ | // Inclure les librairies | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // La variable qui sera envoyée au récepteur (nous générerons une valeur aléatoire pour l' | ||
+ | float maValeurRecue; | ||
+ | |||
+ | // La fonction de rappel qui nous assurera de la bonne livraison du message | ||
+ | void quand_donnees_Recues(const uint8_t * mac, const uint8_t *data_reception, | ||
+ | memcpy(& | ||
+ | Serial.print(" | ||
+ | Serial.println(taille); | ||
+ | Serial.print(" | ||
+ | Serial.println(maValeurRecue); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | void setup() { | ||
+ | // On initie la comm série à 115200 Bauds | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | // On démarre le Wifi en mode Station | ||
+ | WiFi.mode(WIFI_STA); | ||
+ | |||
+ | // Puis on initialise ESP-NOW | ||
+ | if (esp_now_init() != ESP_OK) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Si ESP-NOW a corectement démarré, il est temps d' | ||
+ | esp_now_register_recv_cb(quand_donnees_Recues); | ||
+ | | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Tester et aller plus loin ===== | ||
+ | |||
+ | Lorsque vous regarderez les console série des deux ESP, vous constaterez que les messages sont bien expédiés, bien reçus et leur contenu correctement interprété côté récepteur. Les différentes sources trouvées sur le net parlent d'une portée en extérieur supérieur à 200 mètres, avec les deux antennes pointant l'une vers l' | ||
+ | |||
+ | Nous vous renvoyons aux exemples disponibles dans la bibliothèque Arduino pour aller plus loin ! | ||
+ | |||