Go Down

Topic: Problème en boucle (Read 1 time) previous topic - next topic

voodou

Feb 08, 2011, 12:25 am Last Edit: Feb 18, 2011, 02:43 pm by voodou Reason: 1
Bonjour, le principe est d'envoyer et de recevoir des impulsions IR. Séparément tout fonctionne. Par contre dès que les codes émetteur/récepteur sont ensemble, il est possible de recevoir cependant dès qu'un tir est effectué, impossible de recevoir de nouveau.

Est-ce un problème de la fonction tir qui tourne en boucle?

Merci d'avance.

Code: [Select]
/*
#include <IRremote.h>
//Partie réception
int RECV_PIN = 11;
int LEDHIT = 8;
int HP = 12;

//Partie tir
int LEDTIR =7;
int TRIGGER = 4;
int BUTTONSTATE = 0;
int LEDE = 9;
boolean fired  = false;

//Jeu
int nbredeballestirees   = 0;    //Number of shoots
int nbreblessures        = 0;    //Hit counter

IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

void setup(){

Serial.begin(9600);
//Réception
   pinMode(LEDHIT, OUTPUT);
   pinMode(HP, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver

//Tir
pinMode(LEDTIR, OUTPUT);
pinMode(TRIGGER, OUTPUT);
pinMode (BUTTONSTATE, INPUT);
pinMode(LEDE, OUTPUT);
}

void loop() {

//Réception
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
    unsigned long codeValue;
    codeValue = results.value;
    if (codeValue == 33441975){
    nbreblessures++;
    if (nbreblessures > 5){
      Serial.print("T'es foutu!");
      digitalWrite (HP, HIGH);    delay (50);
      digitalWrite (HP, LOW);     delay (50);
      digitalWrite (HP, HIGH);    delay (50);
      digitalWrite (HP, LOW);     delay (50);
      digitalWrite (HP, HIGH);    delay (50);
      digitalWrite (HP, LOW);
      playTone(9000, 50);
      playTone(900, 50);
      playTone(9000, 50);
      playTone(900, 50);
      delay (3000);
      }
      else {
        digitalWrite (LEDHIT, HIGH);
        Serial.print("Trou(s) dans la peau: "); Serial.println(nbreblessures);
        digitalWrite (LEDHIT, LOW);
        playTone(450, 50);
        playTone(9000, 50);
        playTone(450, 50);
      }
    }
   }

     BUTTONSTATE = digitalRead(TRIGGER);
     if (BUTTONSTATE == HIGH && fired == false) { 
     fired = true;
     digitalWrite(LEDTIR, HIGH);
     irsend.sendNEC(0x00FF30CF, 32);
     delay (1000);
     digitalWrite(LEDTIR, LOW);
     //delay(100); 
     fired = false;
     }
}





// FIN DE PROGRAMMATION LOOP

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(HP, HIGH);
    delayMicroseconds(tone);
    digitalWrite(HP, LOW);
    delayMicroseconds(tone);
  }
}

voodou

Voilà mon petit problème...

B@tto

Comme ça je ne vois pas de soucis dans le code, ce que tu peux faire c'est déjà dans un premier temps le simplifier (enlever le système de blessure etc) et/ou ajouter des balises pour repérer où ça bloque (des Serial.println("1"),Serial.println("2"),Serial.println("3") etc ...).

taddot

#3
Feb 18, 2011, 04:30 pm Last Edit: Feb 18, 2011, 04:34 pm by taddot Reason: 1
Je vais probablement dire une bétise, mais je crois que le
Code: [Select]
fired = false; à la fin de la boucle loop doit,
- soit être mis en dehors du if
- soit mis au début de la boucle loop

Parce que ton problème évoque un défaut de réinitialisation d'une variable "bistable"
pas taper... sauf application de l'article 35 ...

B@tto

Mais ce qui est bizarre c'est que d'après ce qu'il dit, les codes réception et émission fonctionnent séparement ...

voodou

Le fired= false je l'avai testé sans mais même sans ça ne fonctionnait pas. Pourtant le code est simple et c'est là que je comprends pas pourquoi ça bloque une fois qu'un tir est émis, plus de réception possible.

voodou

#6
Feb 18, 2011, 07:57 pm Last Edit: Feb 18, 2011, 08:16 pm by voodou Reason: 1
Fonction réception seule:

Code: [Select]
#include <IRremote.h>
//Partie réception
int RECV_PIN = 11;
int LEDHIT = 8;


IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

void setup(){

Serial.begin(9600);
//Réception
  pinMode(LEDHIT, OUTPUT);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {

//Réception
 if (irrecv.decode(&results)) {
   //Serial.println(results.value, HEX);
   irrecv.resume(); // Receive the next value
   unsigned long codeValue;
   codeValue = results.value;
   if (codeValue == 33441975){
    digitalWrite (LEDHIT, HIGH);
    delay (3000);
    digitalWrite (LEDHIT, LOW);
     }
  }
}


Fonction émission:
Code: [Select]
/*
* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
// Problémé Ir emiussion se met sur le pin 9... va comprendre... fin ca marche


#include <IRremote.h>

int RECV_PIN = 11;
int BOUTTON = 2;
int LEDE = 9;
int TRIGGER = 4;
int buttonState = 0;

IRrecv irrecv(RECV_PIN); //pin 3 emetteur
IRsend irsend;

decode_results results;

void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(LEDE, OUTPUT);
pinMode(BOUTTON, OUTPUT);
pinMode (TRIGGER, INPUT);
}

void loop() {
  buttonState = digitalRead(TRIGGER);
    if (buttonState == HIGH) {  
    digitalWrite(BOUTTON, HIGH);
    irsend.sendNEC(0x00FF30CF, 32);
    delay (1000);
    digitalWrite(BOUTTON, LOW);
    delay(100);
 }    
}


Il doit y avoir quelques lignes de trop mais ça fonctionne indépendamment, je viens de refaire le test à l'instant.

Les deux en un et toujours le même problème.
Code: [Select]
#include <IRremote.h>
//Partie réception
int RECV_PIN = 11;
int LEDHIT = 8;
int BOUTTON = 2;
int LEDE = 9;
int TRIGGER = 4;
int buttonState = 0;

IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

void setup(){

Serial.begin(9600);
//Réception
  pinMode(LEDHIT, OUTPUT);
 irrecv.enableIRIn(); // Start the receiver
 pinMode(LEDE, OUTPUT);
pinMode(BOUTTON, OUTPUT);
pinMode (TRIGGER, INPUT);
}

void loop() {

//Réception
 if (irrecv.decode(&results)) {
   //Serial.println(results.value, HEX);
   irrecv.resume(); // Receive the next value
   unsigned long codeValue;
   codeValue = results.value;
   if (codeValue == 33441975){
    digitalWrite (LEDHIT, HIGH);
    delay (3000);
    digitalWrite (LEDHIT, LOW);
     }
  }
 
//Tir
buttonState = digitalRead(TRIGGER);
    if (buttonState == HIGH) {  
    digitalWrite(BOUTTON, HIGH);
    irsend.sendNEC(0x00FF30CF, 32);
    delay (1000);
    digitalWrite(BOUTTON, LOW);
    delay(100);
 }

}






Uploaded with ImageShack.us

Gromain59

Salut,

Pour déboguer, n'hésites pas à placer des mouchards (Serial.print) un peu partout dans ton code pour vérifier où ça passe et où ça ne passe pas.
Peut-être ne sort-il pas de l'appel de routine irrecv.decode() par exemple ?

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

voodou

Bonne idée, je vais tenter le coup.

voodou

J'ai trouvé la solution, en fait à la fin de la fonction tir, il suffit de réactiver la fonction réception avec cette simple ligne:

irrecv.enableIRIn();

Voilà. Merci pour votre aide en tout cas. Bon courage à tous!

Go Up