le programme que j ais pour ma télécommande fonctionne a merveille sauf pour une fonction
qui ne réagis pas quand j appuis sur cette touche!??
je m 'explique!
quand j'appuis sur une touche la led s'allume bien pendant le temps donner,quand j appuis sur l'autre touche
cela fonctionne très bien également mais j 'ais rajouter dans mon code une ligne qui quand j appuis sur
la troisième touche devrais éteindre la led verte ou rouge !!
mais rien ne se passe les leds reste allumer le temps que je leur est donnez!!
une idée?
voici le code:
#include <IRremote.h>
int IR = 11; // Récepteur IR en broche 11
const byte LED3 = 3; // led rouge en broche 3
const byte LED4 = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //
void setup()
{
Serial.begin(9600); // permet de vérifier sur le moniteur série si le code de la touche est le bon
// sinon cette ligne n'est pas nécessaire
RCEP.enableIRIn(); // Commencement de la réception
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
digitalWrite (LED3, LOW);
digitalWrite (LED4, LOW);
}
void loop()
{
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
Serial.println(RIR.value, DEC); // vérification du code de la touche actionnée sur le moniteur série
// sinon cette ligne n'est pas nécessaire
if (RIR.value == 0x40bf00ff) // si touche 0 actionnée CETTE LIGNE NE FONCTIONNE PAS!SA
N'ARRETE PAS LA LED 3 OU 4 de S' ALLUMER!!
{
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
}
if (RIR.value == 0xfb9) // si touche 1 actionnée
{
digitalWrite(LED3, HIGH); // La LED verte s'allume
delay (20000);
digitalWrite(LED3, LOW);
}
if (RIR.value == 0x40bf50af) //telecomande differente
{
digitalWrite(LED3, HIGH);
delay (20000);
digitalWrite(LED3, LOW);
}
if (RIR.value == 0x40bf906f) //telecommande differente
{
digitalWrite(LED4, HIGH);
delay (20000);
digitalWrite(LED4, LOW);
}
if (RIR.value == 0x7ba) // si touche 2 actionnée
{
digitalWrite(LED4, HIGH); // La LED Rouge s'allume
delay (20000);
digitalWrite(LED4, LOW);
}
RCEP.resume(); // Réception de la prochaine valeur
}
}
je vous est mis un commentaire sur la ligne qui ne fonctionne pas!
des que j'appuis sur une touche la led rouge s'allume et j'appuis tous de suite apres sur l'autre touche pour éteindre cette led mais elle ne s'éteint pas!!
elle continue de s'allumer jusqu'a la fin du delais!
Pas la peine, tu peux utiliser ton code actuel et le débuguer. Tu as mis un serial.print : dis nous ce qu'il indique lorsque tu le fais fonctionner. Mets deux lignes :
Serial.println(RIR.value, DEC); // vérification du code de la touche actionnée sur le moniteur série
Serial.println(RIR.value, HEX); // vérification du code de la touche actionnée sur le moniteur série
Serial.println(); // vérification du code de la touche actionnée sur le moniteur série
comme ça on verra les codes.
Selon la bibliothèque utilisée, decode_results est une classe:
class decode_results
{
public:
decode_type_t decode_type; // UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; // Used by Panasonic & Sharp [16-bits]
unsigned long value; // Decoded value [max 32-bits]
int bits; // Number of bits in decoded value
volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks
int rawlen; // Number of records in rawbuf
int overflow; // true iff IR raw code too long
};
et value est un unsigned long.
Tu peux donc modifier ton code pour créer une variable
C'est normal : la fonction delay est bloquante. Le microcontrôleur s'arrête et ne reçoit donc pas le code que tu lui envoies pendant ce delay. Si tu veux une lecture de codes plus rapide, il faut diminuer l'argument du delay, et la LED s'allumera moins longtemps.
car en faite les leds n'existe pas! je commande 4 mosfet qui eux commande 4 relais 24volt!
pour inversement de polarité pour un verin electrique,
j'ais fabriquer un portail chez moi avec ouverture a distance avec une cellule ir de télé!
et tous fonctionne bien ! mais pour une sécurité je voulais rajouter une autre commande au cas ou il y aurais un obsatacle a l'ouverture comme sa je pourrais la stopper!
Je vais te demander comme je le demande souvent à d'autres : il faut bien définir son besoin. ça peut être fait par un logigramme ou par une liste ou un diagramme d'états, peu importe mais il faut définir tout précisément, sous peine de ramer lors du codage.
Voici un exemple de diagramme d'états :
Un autre :
Bien sûr tu n'es pas obligé, mais ça aide vraiment à comprendre les blocages ou identifier les problèmes de codage.
Pour l'instant, j'ai du mal à suivre ce qui se passe ou ne se passe pas quand tu appuies sur une touche, car je ne suis pas avec toi pour voir de quelle touche et quelle télécommande tu parles. Pour que je puisse t'aider efficacement, soit on part d'un diagramme bien fait, soit tu me décris un exemple d'utilisation de manière très précise, du genre :
Je veux ça
Je fais ceci
il se passe cela
en décrivant très précisément les 'ça', 'ceci' et 'cela'. Plusieurs exemples aideront encore mieux.
Il faut aussi que tu débugues ton code : mets des Serial.print au début de tes if pour voir où tu passes. Exemple :
Quels sont les codes de ces trois touches ?
Faut il prendre en compte le cas où tu appuies sur la touche 1 et sans attendre tu appuies sur la touche 2 (par exemple).?
#include <IRremote.h>
int IR = 11; // Récepteur IR en broche 11
const byte LED3 = 3; // led rouge en broche 3
const byte LED4 = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //
void setup()
{
Serial.begin(115200); // permet de vérifier sur le moniteur série si le code de la touche est le bon
// sinon cette ligne n'est pas nécessaire
RCEP.enableIRIn(); // Commencement de la réception
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
digitalWrite (LED3, LOW);
digitalWrite (LED4, LOW);
}
void loop()
{
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
Serial.println(RIR.value, HEX); // vérification du code de la touche actionnée sur le moniteur série
// sinon cette ligne n'est pas nécessaire
if (RIR.value == 0x40bf00ff) // si touche 0 actionnée
{
Serial.println("Télécommande X, touche 3");
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
}
if (RIR.value == 0xfb9) // si touche 1 actionnée
{
Serial.println("Télécommande Y, touche 1");
digitalWrite(LED3, HIGH); // La LED verte s'allume
delay (20000);
digitalWrite(LED3, LOW);
}
if (RIR.value == 0x40bf50af) //telecomande differente
{
Serial.println("Télécommande X, touche 1");
digitalWrite(LED3, HIGH);
delay (20000);
digitalWrite(LED3, LOW);
}
if (RIR.value == 0x40bf906f) //telecommande differente
{
Serial.println("Télécommande X, touche 2");
digitalWrite(LED4, HIGH);
delay (20000);
digitalWrite(LED4, LOW);
}
if (RIR.value == 0x7ba) // si touche 2 actionnée
{
Serial.println("Télécommande y, touche 2");
digitalWrite(LED4, HIGH); // La LED Rouge s'allume
delay (20000);
digitalWrite(LED4, LOW);
}
RCEP.resume(); // Réception de la prochaine valeur
}
}
OK, j'ai mis un peu de temps avant de comprendre, désolé.
Je pense qu'il faut voir ton problème comme une succession d'états. Le système peut être dans 4 états :
Etat 0 : attente d'une touche
Etat 1 : action suite à la touche 1. On y reste pendant une certaine durée, sauf si la touche 3 est appuyée, puis retour à l'état 0
Etat 2 : action suite à la touche 2. On y reste pendant une certaine durée, sauf si la touche 3 est appuyée, puis retour à l'état 0
Etat 3 : suite à l'appui sur la touche 3, interruption des états 1 et 2, puis retour à l'état 0
J'ai essayé de coder ça :
#include <IRremote.h>
int IR = 11; // Récepteur IR en broche 11
const byte LED3 = 3; // led rouge en broche 3
const byte LED4 = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //
/*
On définit 4 états :
état 0 : attente d'une touche
état 1 : LED verte allumée, rouge éteinte, durée 2 sec puis retour à 0
état 2 : LED rouge allumée, verte étaeinte, durée 3 sec puis retour à 0
état 3 : on éteint les LED, retour à état 0
*/
int etat = 0;
unsigned long dureeEtat1 = 2000;
unsigned long dureeEtat2 = 3000;
unsigned long chrono1 = 0;
unsigned long chrono2 = 0;
void setup() {
Serial.begin(115200);
RCEP.enableIRIn(); // Commencement de la réception
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
digitalWrite (LED3, LOW);
digitalWrite (LED4, LOW);
}
void loop() {
switch (etat) {
case 0:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
unsigned long valeur = RIR.value;
if (RIR.value == 0xfb9 || RIR.value == 0x40bf50af) {
etat = 1;
digitalWrite(LED3, HIGH);
chrono1 = millis();
}
if (RIR.value == 0x40bf906f || RIR.value == 0x7ba) {
etat = 2;
digitalWrite(LED4, HIGH);
chrono2 = millis();
}
if (RIR.value == 0x40bf00ff) etat = 3;
}
break;
case 1:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
if (RIR.value == 0x40bf00ff) etat = 3;
}
else if (millis() - chrono1 > dureeEtat1) {
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
}
break;
case 2:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
if (RIR.value == 0x40bf00ff) etat = 3;
}
else if (millis() - chrono2 > dureeEtat2) {
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
}
break;
case 3: // Interruption des commandes 1 et 2 uniquement
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
break;
default:
Serial.println("Probleme : etat non reconnu.");
etat = 0;
break;
}
RCEP.resume(); // Réception de la prochaine valeur
}
J'ai mis une durée différente pour les états 1 et 2, mais c'est réglable via les paramètres. Teste le et dis-moi ce que ça donne.
Pour un système simple comme celui-ci, j'ai fait un code "linéaire", c'est à dire avec des if et un switch/case. Mais si tu veux ajouter des états, des conditions, etc, il serait plus facile d'utiliser une machine à états (state machine), il y a pleins de bibliothèques Arduino qui mettent ça en oeuvre assez simplement.
Normalement, il attend que tu appuies sur une touche. Les LEDs ne s'allument que si tu appuies sur une touche.
On va debuguer et ajouter des Serial.print un peu partout : Essaye ça
#include <IRremote.h>
int IR = 11; // Récepteur IR en broche 11
const byte LED3 = 3; // led rouge en broche 3
const byte LED4 = 4; // led verte en broche 4
IRrecv RCEP(IR);
decode_results RIR; //
/*
On définit 4 états :
état 0 : attente d'une touche
état 1 : LED verte allumée, rouge éteinte, durée 2 sec puis retour à 0
état 2 : LED rouge allumée, verte étaeinte, durée 3 sec puis retour à 0
état 3 : on éteint les LED, retour à état 0
*/
int etat = 0;
unsigned long dureeEtat1 = 2000;
unsigned long dureeEtat2 = 3000;
unsigned long chrono1 = 0;
unsigned long chrono2 = 0;
void setup() {
Serial.begin(115200);
RCEP.enableIRIn(); // Commencement de la réception
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
digitalWrite (LED3, LOW);
digitalWrite (LED4, LOW);
}
void loop() {
Serial.print("Etat : ");
Serial.println(etat);
switch (etat) {
case 0:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
if (valeur == 0xfb9 || valeur == 0x40bf50af) {
etat = 1;
digitalWrite(LED3, HIGH);
chrono1 = millis();
} else
if (valeur == 0x40bf906f || valeur == 0x7ba) {
etat = 2;
digitalWrite(LED4, HIGH);
chrono2 = millis();
} else
if (valeur == 0x40bf00ff) etat = 3;
} else Serial.println ("Touche non reconnue");
break;
case 1:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
if (valeur == 0x40bf00ff) etat = 3;
}
else if (millis() - chrono1 > dureeEtat1) {
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
}
break;
case 2:
if (RCEP.decode(&RIR)) // si il y a une réception sur le capteur
{
unsigned long valeur = RIR.value;
Serial.print("Valeur: ");
Serial.println(valeur);
if (valeur == 0x40bf00ff) etat = 3;
}
else if (millis() - chrono2 > dureeEtat2) {
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
}
break;
case 3: // Interruption des commandes 1 et 2 uniquement
Serial.println("Extinection LEDs ");
digitalWrite(LED3, LOW); // Les LED s'éteignent
digitalWrite(LED4, LOW);
etat = 0;
break;
default:
Serial.println("Probleme : etat non reconnu.");
etat = 0;
break;
}
RCEP.resume(); // Réception de la prochaine valeur
}