Problème interruption programme

Bonjour, je rencontre un problème avec mon programme Arduino.

Je vous explique mon problème, j'ai relié le bouton play et le bouton musique suivante d'un mp3 à un relais qui est relié à Arduino. J'ai créée un programme qui lance des instructions lorsqu'une personne est détectée, voici le programme :

void loop () {

val = digitalRead(CapteurOptique);

if (val == HIGH) {

digitalWrite (Led1,HIGH);
delay (1000);
digitalWrite (Led2,HIGH);
delay (300);
digitalWrite (Play,HIGH);
delay (200);
digitalWrite (Play,LOW);
delay (500);
digitalWrite (Led1,LOW);
delay (500);
digitalWrite (Led2,LOW);
}
}

Ce programme fonctionne très bien sauf que je rencontre un soucis. Le lecteur MP3 s'éteint au bout d'une minute d'inactivité donc cela fait que si quelqu'un est détecté puis rien pendant 1 minute, la prochaine personne n'aura pas la musique vu que le lecteur MP3 sera éteint, si vous voyez ce que je veut dire...

La solution que j'ai envisagé est donc de relier le bouton musique suivante à un relais de l'arduino et faire tourner en boucle ce programme.

digitalWrite (Musique_Suivante,HIGH);
delay (200);
digitalWrite (Musique_Suivante,LOW);
delay (20000);

Cela permet de cliquer sur le bouton musique suivante toutes les 20 secondes et d'empêcher la mise en veille du MP3.

Sauf que je voudrais que dès que l'évènement d'une personne survient même pendant ces delay, le 1er programme se mette en route puis dès qu'il a fait un tour il retourne dans la seconde boucle.

J'espère que j'ai été clair si vous voulez des précisions hésitez pas !

Salut,

Je ne suis pas un expret, mais tous ces delay ça me semble pas ouf ouf.
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ExempleBlinkWithoutDelay
Va sur ce lien, il montre comment faire clignoter tes led sans delay. Tu pourrais l'utiliser pour voir si il y a quelqu'un devant ton capteur même pendant que tu joues de la musique.

Tu pourrais aussi utiliser une variable de temps genre previousMillis que tu met à 0 après avoir jouer ta musique. Et dès qu'elle est à 50 seconde (par exemple) ou tu appelles ta fonction appuie sur le bouton mp3 ou tu fais un if du type si previousMillis >= 50000 appuie sur le bouton et previousMillis = 0.

Je ne sais pas du tout si j'ai été clair :slight_smile: .
Mais je pense que les delay sont à enlever :slight_smile:

Tayo:
Je ne suis pas un expret, mais tous ces delay ça me semble pas ouf ouf.
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ExempleBlinkWithoutDelay
Va sur ce lien, il montre comment faire clignoter tes led sans delay.

Je comprends mais le problème c'est que les delay sont différents, regarde dans mon premier code, je ne peux rajouter la fonction previousMillis si? En tout cas je ne vois pas comment faire...

Ton programme doit être entièrement réécrit pour ne plus utiliser la fonction delay().

Par exemple, à la place de :

void loop () {

val = digitalRead(CapteurOptique);

if (val == HIGH) {

digitalWrite (Led1,HIGH);
delay (1000);
digitalWrite (Led2,HIGH);
delay (300);
digitalWrite (Play,HIGH);
delay (200);
digitalWrite (Play,LOW);
delay (500);
digitalWrite (Led1,LOW);
delay (500);
digitalWrite (Led2,LOW);
}
}

Il vaut mieux :

int etat = 0;
unsigned long int chrono;

void loop () {

if (etat == 0) val = digitalRead(CapteurOptique);

if (etat ==0 && val == HIGH)
{
  digitalWrite (Led1,HIGH);
  etat = 1;
  chrono = millis();
}

if (etat == 1 && millis() - chrono >= 1000)
{
  digitalWrite (Led2,HIGH);
  etat = 2;
  chrono = millis();
}

if (etat == 2 && millis() - chrono >= 300)
{
  digitalWrite (Play,HIGH);
  etat = 3;
  chrono = millis();
}

if (etat == 3 && millis() - chrono >= 200)
{
  digitalWrite (Play,LOW);
  etat = 4;
  chrono = millis();
}

if (etat == 4 && millis() - chrono >= 500)
{
  digitalWrite (Led1,LOW);
  etat = 5;
  chrono = millis();
}

if (etat == 5 && millis() - chrono >= 500)
{
  digitalWrite (Led2,LOW);
  etat = 0;
}
}

La fonction loop() va alors s'exécuter plusieurs centaines de milliers de fois par seconde, sans jamais s'arrêter sur un delay. Et une fois de temps en temps, elle entrera dans une des instructions IF.

A partir de là, tu peux ajouter d'autres instructions.
L'ensemble donnera l'impression de s'exécuter en parallèle.