Bon, ton programme a 2 problèmes :
- le premier, tu l'as identifié, c'est de lancer la fonction jeuled à l’appui sur une touche,
- mais le second, c'est la durée de cette même fonction : tu as des delay (qui sont des instructions bloquantes : le processeur ne fait rien pendant ce temps, il attend juste la fin du délai) dans cette fonction, pour une durée cumulée de près de 6 secondes. Donc si tu appuies sur le bouton stop pendant ce temps, la commande ne sera pas reçue et donc pas exécutée.
Pour le premier problème, je pense que remplacer le while par un if suffira à le résoudre :
if (results.value != 0xFF6897) jeuled();
Mais pour le second, c'est l'architecture de ton programme qu'il faut adapter pour le résoudre. Je crois comprendre que le code 0xFF6897 correspond à la touche 'stop'. Donc, il ne faut pas tester si le code reçu est différent de 0xFF6897 mais s'il est égal, et exécuter la fonction 'off' dans ce cas.
Donc, si je comprends bien ton besoin : si le code reçu est différent de 0xFF6897 tu joues l'animation 'jeuled', mais si le code reçu vaut 0xFF6897 tu exécutes 'off' pour éteindre toutes les leds.
Question : que se passe-t-il après avoir tout éteint ? C'est important de savoir ça pour écrire le programme correctement.
Si rien ne se passe, alors c'est plus simple : tu ajoutes une boucle infinie dans la fonction 'off' est c'est tout :
void off() {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
while (1); // <-- boucle infinie
}
Si tu veux continuer sur autre chose, il faut garder en mémoire l'état des leds : soit animation, soit off.
Dans les deux cas, il faut réorganiser ton code autour de l'animation : le code principal joue l'animation et teste régulièrement (si possible sans bloquer) l'arrivée d'un code et sa valeur : si le code vaut 0xFF6897 il exécute off, sinon il continue.
Une façon simple mais "sale" de faire ça est de remplacer les delay par des boucles de lecture de la télécommande de mêmes durées :
bool lectureTelec (int duree) {
unsigned long chrono = millis();
while (millis()-chrono < tempo) {
if (irrecv.decode(&results)) {
if (results.value == 0xFF6897) return true;
}
}
return false;
}
Cette fonction renvoie un booléen qui vaut true si la touche off est reçue sinon false.
Tu l'appelles en remplaçant par exemple
delay(300);
par
toucheOff = lectureTelec (300);
en ayant déclaré toucheOff en bool auparavant.
La loop joue alors l'animation et attend la réception d'un code pour lancer la fonction off si le code reçu est le bon :
#include <IRremote.h>
int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
irrecv.enableIRIn();
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
bool toucheOff ;
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (200); // <-- 200 ???
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
toucheOff = lectureTelec (300);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (300);
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
toucheOff = lectureTelec (500);
}
void off() {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
while (1);
}
A tester, je n'ai même pas vérifié que ça compile...