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.
/*
#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);
}
}
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 ...).
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.
#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:
/*
* 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.
#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);
}
}
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 ?