Pages: [1]   Go Down
Author Topic: Problème en boucle  (Read 1044 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
#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);
  }
}
« Last Edit: February 18, 2011, 08:43:55 am by voodou » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà mon petit problème...
Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...).
Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vais probablement dire une bétise, mais je crois que le
Code:
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"
« Last Edit: February 18, 2011, 10:34:30 am by taddot » Logged

pas taper... sauf application de l'article 35 ...

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fonction réception seule:

Code:
#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:
/*
 * 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:
#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
« Last Edit: February 18, 2011, 02:16:15 pm by voodou » Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 418
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

"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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonne idée, je vais tenter le coup.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 34
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Pages: [1]   Go Up
Jump to: