IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

ESP NOW déclencher un buzzer quand un message est reçu


Sujet :

Arduino

  1. #1
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut ESP NOW déclencher un buzzer quand un message est reçu
    Bonjour,
    J'utilise avec succès ESP NOW pour recevoir des messages de plusieurs modules. (ESP32 vers ESP8866)
    Voici une des tentatives pour générer 3 beep sur un buzzer lors de la réception des ces messages (le buzzer et le code associé est bien fonctionnel puisque j'en ai forcé un cycle au démarrage du programme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
      memcpy(&myData, incomingData, sizeof(myData));
      for (int i = 0; i < 3; i++) 
      {
        digitalWrite(buzzerPin, HIGH); // Set to HIGH to make the buzzer sound
        delay(40); 
        digitalWrite(buzzerPin, LOW); // LOW to turn off the buzzer
        delay(60);  
      }
    delay(1500);
     Serial.println(myData.a);
    Je reçois parfaitement les messages dans le port serie, mais pas les beep d'avertissement attendus :-(
    Information importante: cette partie de code (beep à l'arrivée) fonctionne parfaitement avec un ESP32 en destination?!?
    J'ai décidé de remplacer l'ESP32 par un ESP8266 car je recevais des messages parasites dans la trace sérielle que je n'ai jamais réussi à régler :-(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dhcps: send_nak>>udp_sendto result 0
    Si qq à une idée...
    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 865
    Par défaut
    Sans l'intégralité du code difficile de se faire une opinion, mais si OnDataRecv() est exécutée dans un contexte d'interruption (lié à ESP-NOW) vous ne devez pas utiliser delay() dans cette fonction.

    Levez un drapeau disant que le message est arrivé et traité le "beep" dans la loop.

  3. #3
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour PhilLU

    Quels sont les numéros de ports du beep utilisés dans l'ESP32 et l'ESP8266?

    Cordialement
    jpbbricole

  4. #4
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut
    Bonjour,
    Dans les deux cas, le port est 12.
    Vu que je demande 3 beep au démarrage, et que ceux-ci fonctionnent, je m'assure que le port et la config et bonne.
    Merci pour vos réponses...
    Phil.

  5. #5
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 476
    Par défaut
    Bonjour,
    Voici ce que j'ai trouvé comme solution...
    Lors de la réception d'un message je met la variable booléene à true
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
      memcpy(&myData, incomingData, sizeof(myData));
     
      arrived = true;
     
    delay(10); 
     Serial.println(myData.a);
    }
    ... ensuite dans le loop, je génère les beep et je remet la variable à false...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void loop(){
     
      if (arrived == true){
        for (int i = 0; i < 3; i++) 
      {
        digitalWrite(buzzerPin, HIGH); // Set to HIGH to make the buzzer sound
        delay(40); 
        digitalWrite(buzzerPin, LOW); // LOW to turn off the buzzer
        delay(60);  
      }
    delay(100);
     
    }
    arrived = false;
    }
    ... reste à optimiser les delay pour ne pas risquer de rater un autre message (à moi que la tâche OnDataRecv soit prioritaire; à vrai dire je n'en sais rien :-(

    Merci pour vos suggestions...

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 865
    Par défaut
    le drapeau c'est bien mais si OnDataRecv() est celui d'ESP-NOW, vous êtes dans un contexte d'interruption et donc il ne fait pas faire de delay() du tout et le drapeau doit être une variable déclarée volatile.

    idéalement il faudrait aussi traiter sa lecture et remise à false dans une section critique (avec un sémaphore / mutex) dans la loop et ne mettre le drapeau false qu'une fois le message traité.

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 735
    Par défaut
    Hello,

    Pour répondre à la question de @Jay M: comment le programme entre-t-il dans la fonction OnDataRecv() ? Montrer le setup() serait une bonne chose.

    Ensuite, il faudrait faire à l'indentation du code: par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void loop(void) {
        if (arrived == true) {
            for (int i = 0; i < 3; i++) {
                digitalWrite(buzzerPin, HIGH); // Set to HIGH to make the buzzer sound
                delay(40);
                digitalWrite(buzzerPin, LOW);  // LOW to turn off the buzzer
                delay(60);
            }
            delay(100);
        }
        arrived = false;
    }
    Là, on voit clairement les blocs.

Discussions similaires

  1. message d'erreur quand un champs est vide
    Par VIRGINIE87 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2007, 13h13
  2. [javascript]Savoir quand une frame est chargée
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/08/2005, 10h18
  3. Comment savoir quand une JFrame est rafraichie?
    Par mardona dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 19/08/2005, 13h20
  4. Réponses: 9
    Dernier message: 08/12/2004, 15h36
  5. Savoir quand une hotkey est relachée
    Par kriterium dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2004, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo