[Grand débutant] Projet détecteur de mouvement et lecteur mp3

Bonjour,
J'ai un projet de création d'un robot qui au passage de personnes (mouvement) allume deux leds (ses yeux) et dit par exemple bonjour. J'ai réussi a créer le montage et à "bidouiller" un code. Le robot est opérationnel mais il y a un long temps d'initialisation (env. 1mn) avant qu'il fonctionne correctement. Pourriez-vous svp m'aider à améliorer ce code (en m'expliquant si possible pour que je comprenne mes erreurs). Merci par avance !

Voici le code (je vais réaliser un schéma du montage avec (je ne me souviens plus du nom désolé):

#include "SoftwareSerial.h"
#include <DFRobotDFPlayerMini.h> 

#define PIR 2
#define LED_UN 5
#define LED_DEUX 6
SoftwareSerial mySoftwareSerial(9, 8);  // TX, RX
DFRobotDFPlayerMini myDFPlayer ; 

void setup() {
  pinMode(PIR, INPUT);
  pinMode(LED_UN, OUTPUT);
  pinMode(LED_DEUX, OUTPUT);
  mySoftwareSerial.begin(9600) ;
  myDFPlayer.begin(mySoftwareSerial) ;
}

void loop() {
   int pirVal = digitalRead(PIR);

   if (pirVal == HIGH) {
digitalWrite(LED_UN, HIGH);
digitalWrite(LED_DEUX, HIGH);
      delay(100);
  // Joue la premiere chanson de la carte SD pendant 10 secondes
  myDFPlayer.setTimeOut(500) ;

  myDFPlayer.volume(30) ; // fixe le son à 10 (maximum)

  myDFPlayer.play(1);         // joue le premier fichier son.

  delay(10000);
}

A première vue niveau code, je ne voit rien de spécial, mais je n'ai encore pas pratiqué la lib DFRobotDFPlayerMini.

Je dirais déjà pour identifier la cause du soucis, de mettre des traces pour cerner d'où viendrait la lenteur.

Est-ce l'initialisation de la lib avec myDFPlayer.begin qui prendrait du temps ?

Une trace avant, une trace après.... ca peut aider.
Tu peux aussi utiliser la fonction millis() pour mesurer le temps dans ton programme.

Une fois le programme démarré, les autres détection sont-elles "rapides" ? (en gros, la détection du mouvement est-elle rapide une fois le programme démarré)

1 Like

Si le problème vient de la bibliothèque, trop lente, une alternative est possible avec celle-ci :

1 Like

Bonjour, et merci pour la réponse. Après la minute d'"initialisation" tout fonctionne très bien, la détection est instantanée et le son aussi. Par contre je ne sais pas comment mettre des traces. Comment faire stp ?

Je vais essayer avec cette bibliothèque, merci.

void setup() {
  pinMode(PIR, INPUT);
  pinMode(LED_UN, OUTPUT);
  pinMode(LED_DEUX, OUTPUT);
  mySoftwareSerial.begin(9600) ;
  myDFPlayer.begin(mySoftwareSerial) ;
  Serial.print ("Fin du begin : ");
  Serial.println(millis());
}

Voici un exemple de trace qui te donne le temps passé depuis le lancement du code.

1 Like

Tant qu'à faire, autant mettre aussi une trace avant l'initialisation du lecteur pour vérifier que c'est bien lui qui prend du temps.

  mySoftwareSerial.begin(9600) ;
  Serial.print ("Initialisation de myDFPlayer : ");
  Serial.println(millis());
  myDFPlayer.begin(mySoftwareSerial) ;
  Serial.print ("Fin du begin : ");
1 Like

Je n'ai aucun affichage sur le moniteur (ça fonctionne bien avec d'autres codes) . Auriez-vous une idée de ce qui manque ou faut modifier svp ?

void setup() {
  pinMode(PIR, INPUT);
  pinMode(LED_UN, OUTPUT);
  pinMode(LED_DEUX, OUTPUT);
  mySoftwareSerial.begin(9600) ;
  Serial.print ("Initialisation de myDFPlayer : ");
  Serial.println(millis());
  myDFPlayer.begin(mySoftwareSerial) ;
  Serial.print ("Fin du begin : ");
  Serial.println(millis());
}

Serial.begin(115200);
au début du setup

1 Like

ça marche merci. Pourquoi 115200 ?

Voici les valeurs retournées :

Initialisation de myDFPlayer : 0

Fin du begin : 1044

C'est rapide pourtant

C'est 1044 millisecondes soit près d'une seconde

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.