Autres articles / Other articles

Les mots ESP-NOW

publication: 28 décembre 2025 / mis à jour 28 décembre 2025

Read this page in english

 


Liste des mots ESP-NOW

esp_now_init esp_now_deinit esp_now_get_version esp_now_send esp_now_register_recv_cb 
esp_now_unregister_recv_cb esp_now_register_send_cb esp_now_unregister_send_cb 
esp_now_add_peer esp_now_del_peer esp_now_mod_peer esp_now_is_peer_exist 
esp_now_get_peer_num esp_now_set_pmk espnow-builtins ESP_NOW_MAX_DATA_LEN 
ESP_NOW_MAX_ENCRYPT_PEER_NUM ESP_NOW_MAX_TOTAL_PEER_NUM ESP_NOW_KEY_LEN 
ESP_NOW_ETH_ALEN 

Dans la suite de l'article, nous n'aborderons que les mots essentiels permettant la gestion de transmissions ESP-NOW entre deux cartes ESP32 ou plus.

Le code source développé dans cet article est disponible ici:
  github.com/MPETREMANN11/ESP32forth/blob/main/espnow/espnow.fs

esp_now_init ( -- fl )

Le mot esp_now_init est utilisé pour initialiser le protocole de communication ESP-NOW avec ESP32Forth.

Le mot esp_now_init doit être appelé avant d'utiliser d'autres mots ESP-NOW, telles que esp_now_add_peer ou esp_now_send.

Le mot esp_now_init ne prend aucun argument et retourne une valeur entière. Si l'exécution réussit, retourne 0. Si la fonction échoue, retourne un code d'erreur.

Pour simplifier l'accès à esp_now_init, on l'intègre au mot espnowInit qui restera accessible depuis le vocabulaire FORTH:

also espnow 
 
 0 constant ESP_OK 
-1 constant ESP_FAIL 
 
\ Initialize ESPNOW 
: espnowInit ( -- ) 
    wifi-init 
    esp_now_init ESP_OK <>   \ 0 for success 
    if  
        ." ESP-NOW init failed" cr  
        -1 throw 
    then 
    ." ESP-NOW init success" cr 
  ; 

esp_now_register_recv_cb ( xtAddr -- fl )

Le mot esp_now_register_recv_cb est essentiel dans le protocole ESP-NOW. Il sert à enregistrer une fonction de rappel (callback) qui s'exécutera automatiquement chaque fois que votre module reçoit un paquet de données.

Il est initialisé avec le code d'exécution d'un mot FORTH.

Pour simplifier l'accès à esp_now_register_recv_cb, on l'intègre au mot espnowRegisterRecv qui restera accessible depuis le vocabulaire FORTH:

\ Register receive callback 
: espnowRegisterRecv ( callback -- ) 
    esp_now_register_recv_cb ESP_OK <>     \ 0 for success 
    if  cr ." ESP-NOW esp_now_register_recv_cb failed"  
        -1 throw 
    then ; 

Exemple:

: testReception ( -- ) 
    cr ." ESP6NOW receiving" 
  ; 
' testReception espnowRegisterRecv 

A chaque réception d'une trame sur la carte réceptrice, le mot testReception sera exécuté.

esp_now_add_peer ( addr-mac -- fl )

Le mot esp_now_add_peer est l'étape indispensable pour établir une communication ciblée avec une autre carte ESP32.

Ce mot permet d'enregistrer un appareil distant (un "pair" ou "peer") dans la mémoire de votre module. Sans cette étape, votre module ne peut pas envoyer de données à une adresse MAC spécifique.

Pour simplifier l'accès à esp_now_add_peer, on l'intègre au mot espnowAddPeer qui restera accessible depuis le vocabulaire FORTH:

\ add peer to peer list 
\ ex: SLAVE1 add-peer 
: espnowAddPeer ( peer-addr -- ) 
    peer-exist? 
    esp_now_add_peer ESP_OK <>   \ 0 for success 
    if  cr ." ESP-NOW add_peer failed"  
        -1 throw 
    then ; 

Exemple:

$EC $62 $60 $9C $76 $30 define-mac-address: MASTER 
$08 $3A $F2 $6E $1E $F8 define-mac-address: SLAVE1 
$EC $62 $60 $9C $A9 $50 define-mac-address: SLAVE2 
 
myMac 6 MASTER 6 str= [IF]      \ peers for MASTER 
    SLAVE1 espnowAddPeer 
    SLAVE2 espnowAddPeer 
    s" MASTER" set-title 
[THEN] 

esp_now_send ( addr-mac dataAddr len -- fl )

Le mot esp_now_send est le moteur qui permet d'expédier vos données vers un ou plusieurs destinataires via le protocole ESP-NOW. Voici ce qu'il faut retenir de son fonctionnement:

\ send datas to peer 
: espnowSend ( peerAddr myData len -- ) 
    esp_now_send  ?dup ESP_OK <>     \ 0 for success 
    if  cr ." ESP-NOW esp_now_send failed"  
        ." error: " . 
        -1 throw 
    then ; 

Exemple:

: ttrans 
    SLAVE1 s" TEST TRANSMISSION VERS SLAVE1" espnowSend 
  ; 
 
: tvl 
    SLAVE1 s" PAGE VLIST" espnowSend 
  ; 

Chronologie des actions en émission et réception

Nous venons de voir les mots essentiels permettant de gérer les actions en émission et en réception.

L'ordre des opérations à réaliser, tant coté émetteur que récepteur sont les suivantes:

Coté récepteur on indique le mot FORTH à exécuter si on reçoit un signal, avec le mot espnowRegisterRecv, précédé du code d'exécution de ce mot FORTH à exécuter.

Si vous souhatez gérer un dialogue bidirectionnel, il faudra initialiser la réception sur chaque carte avec le code adapté.

Dans notre projet, nous retrouvons cette séquence de chargement des fichiers:

needs /spiffs/oled128x32-display.fs 
needs /spiffs/datas-structs.fs 
needs /spiffs/mac-address.fs 
needs /spiffs/espnow.fs 
needs /spiffs/config.fs 
\ needs /spiffs/tests.fs 
myMac 6 MASTER 6 str= [IF]      \ peers for MASTER 
    needs tests-MASTER.fs 
[THEN] 
 
myMac 6 SLAVE1 6 str= [IF]      \ peers for SLAV1 
    needs tests-SLAVE1.fs 
[THEN] 
 
myMac 6 SLAVE2 6 str= [IF]      \ peers for SLAV2 
    needs tests-SLAVE2.fs 
[THEN] 

La première ligne needs /spiffs/oled128x32-display.fs n'est nécessaire que si on souhaite exploiter un afficheur OLED. Elle peut être supprimée ou mise en commentaire.

Avec la seconde ligne, on charge la structure des données nécessaires à notre projet ESP-NOW.

Dans la troisième ligne, on gère les adresses MAC.

Avec la ligne needs /spiffs/espnow.fs, on charge les mots essentiels à l'initialisation de ESP-NOW et la gestion de la transmission.

La ligne suivante needs /spiffs/config.fs gère la configuration propre à notre projet. C'est dans le fichier config.fs que sont décrits les pairs nécessaires.


Legal: site web personnel sans commerce / personal site without seling