Bonjour,
Je suis en 4eme et je dois faire une maquette de maison en techno... Le truc, c'est qu'une simple maquette manque un peu de réalisme : j'aimerais donc contrôler des LEDs et d'autre choses divers et variés avec une Arduino .
Mon idée étais de gérer tout ça avec une télécommande infrarouge, mais je suis coincé au niveau du code...
Pourriez vous m'aider à trouver LA bonne fonction ?
Problème : j'arrive à recevoir les signaux de la télécommande mais pas à faire une fonction du genre
Si l'Arduino reçoit ce "code", alors elle allume la LED . ( Je sais ça paraît bête mais étant novice dans la programmation, je galère depuis 3 heures sans résultat )
en claire si j'appuie sur le bouton 1 la LED s'allume, si j'appuie sur le 2 elle s'éteint ...
sauf que j'ai pas 36 boutons sur ma télécommande, je me demande donc si il y a un moyen d'appuyer sur le bouton 1 : sa s'allume : on reappuis : sa s'éteint
Si il y a une commande magique pour ça merci de me la dire... je galère
Utilise un flag (une variable type boolean par exemple ) !
Exemple:
Tu appuies sur ton bouton 1 avec le flag à False :
Ca allume ta led , puis tu passes le flag à True
Et quand tu ré-appuies sur ton bouton avec le flag à True :
Ca éteint la led et tu repasses le flag à False
boolean Flag = true;
If( appuibouton == HIGH && Flag == true)
{
//allume ta led
Flag = false ;
}
If( appuibouton == HIGH && Flag == false)
{
//eteint ta led
Flag = true;
}
Bonjour,
Je viens de tester et je pensait que ça allait marcher car sur papier ça sonne bien... Et ben non
je peux allumer la LED... mais pas l'éteindre, bonjour la facture d'électricité xD
Si quelqu'un sait ce qui cloche voila le code
#include <IRremote.h>
boolean Flag = true ;
const char DIN_RECEPTEUR_INFRAROUGE = 2;
IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);
decode_results messageRecu;
void setup()
{
pinMode ( 9, OUTPUT ) ;
Serial.begin(9600);
monRecepteurInfraRouge.enableIRIn();
monRecepteurInfraRouge.blink13(true);
}
void loop()
{
if (monRecepteurInfraRouge.decode(&messageRecu))
{
if ( messageRecu.value == 0xFF30CF && Flag == true ){
digitalWrite ( 9, HIGH );
Flag = false ;
}
delay (400) ;
if (monRecepteurInfraRouge.decode(&messageRecu))
{
if ( messageRecu.value == 0xFF30CF && Flag == false )
{
digitalWrite ( 9, LOW );
Flag = true ;
}
monRecepteurInfraRouge.resume();
}
delay(1);
}
}
nop, toujours pas... je penses que l'arduino continue à croire qu'elle reçoit le bouton 1 car elle l'a déja reçu avant et qu'elle garde ça en mémoire... ou c'est peut être autre chose... mystère et boule de gomme : /
Quoi qu'il en soit c'est galère...
si il y a un pro du code qui passe par la et qui nous dit la formule magique ce serait cool ; )
Tu nous fais une belle salade d'accolades là , tu peux te passer des if/else en utilisant juste des if , si ça marche avec un bouton , tu copie/colles l'ensemble ...
L'accolade } après le 1er if de loop est mal placée. Elle doit être à la fin.
Pour vérifier l'imbrication des blocs de condition formates ton texte avec CTRL T
Code corrigé:
Ton post ma donner envie d'essayer mon kit IR. Je vais te montrer une autre façon de faire avec se fameux switch case.
Pour commencer, je défini les touches de la télécommande
Ensuite je créer des boolean pour connaitre l'état des led a la différence de toi qui enregistre l'etat du boutton
boolean runLed1 = false;//Etat de la led qui changera en fonction de l'appui du boutton1
boolean runLed2 = false;//... piloter par le Boutton2
boolean runLed3 = false;//... piloter par le Boutton3
...
//je déclare mes variables constante
const byte led1 = 8;//pin de connexion
const byte led2 = 9;
...
const byte DIN_RECEPTEUR_INFRAROUGE = 2;
dans void loop tu met tout en place
void loop()
{
if (monRecepteurInfraRouge.decode(&messageRecu)){
switch (messageRecu.value) {
case Boutton1: //si le boutton1 est appuyé
runLed1 = !runLed1; //sa permet de changer la valeur de la boolean as l'inverse de ce quel est
digitalWrite (led1, runLed1);//on applique le changement
break;
case Boutton2:
runLed2 = !runLed2;
digitalWrite (led2, runLed2);
break;
case Boutton3:
runLed3 = !runLed3;
break;
.....
}
monRecepteurInfraRouge.resume();
}
}