IR GUN per Laser Tag :D

Sera a tutti! :smiley:
Sto lavorando ad un progetto con la mia board UNO riguardante il gioco del laser tag 8).

Ho creato un sistema provvisorio per eseguire dei test dove ho un ricevitore IR(non so il modello ma è uno che ha 3 pin)
e tre led collegati alla mia board. Come dovrebbe funzionare il tutto? Bè è semplice! Ogni volta che il mio ricevitore capta un segnale ir mi leva una vita (In totale sono tre vite per ora). Se ho 3 vite su tre tutti e tre i led sono accesi, se ho 2 vite su tre un led si spegne e gli altri due sono accesi, se ho 1 vita su tre 2 led sono spenti e 1 rimane acceso, invece se ho 0 vite su tre i tre led lampeggiano(segnalando un game over :P) Ho creato lo script ma ho dei problemi…con il segnale ir e il conteggio delle vite…vedete i commenti nel mio script e capirete

Questo è il mio script:

#include <IRremote.h>

const int R = 2;  //ricevitore IR sul pin 2//
IRrecv irrecv(R); //Dichiaro il ricevitore R//


//I Led RAPPRESENTANO per ora la vite del giocatore//

int led1 = 13;    //LED 1//
int led2 = 12;    //LED 2//
int led3 = 11;    //LED 3//

//Vita v del giocaotre è uguale a 3//

int v = 3;

//Variabile Segnale//

decode_results S;

void setup() 
  {
  Serial.begin(9600);//Attiva il Monitor Seriale
  irrecv.enableIRIn(); //Avvia ricezione
  
  //Uscita LED//
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);  
  }


void loop() 
{
  ////////////////////////////-Sistema della vita del giocatore-////////////////////////////////////////////////////
  
  
  //Se la vita è = 3, tutti i LED sono accesi//
  if(v=3)
  {
    digitalWrite(led1, HIGH); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 2, tutti i LED sono accesi tranne il LED 1//
  if(v=2)
  {
    digitalWrite(led1, LOW); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 1, tutti i LED sono accesi tranne il LED 1 e 2//
  if(v=1)
  {
    digitalWrite(led1, LOW); 
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 0, tutti i LED lampeggiano//
  if(v=0)
  {
    digitalWrite(led1, HIGH); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    delay(1000);  
    digitalWrite(led1, LOW); 
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    delay(1000); 
  }
  //////////////////////////////-Fine-/////////////////////////////////////////////////////
   
   
 if (irrecv.decode(&S)) //Se ricevo Segnale S//
   {
     Serial.println(S.value); //Avvio il Monitor Seriale//
    
    if (S.value>0) //Se il valore del segnale è >0 (Qui non so come fare con il valore di S perchè con il mio led ir il valore cambia sempre)//
     {
      v --; //Leva 1 vita (Non so se questa stringa vada bene perche mi fa spegnere 2 led anziché di uno)//
     }
   }
}

Prova ad aggiungere:
S.value=0;
irrecv.resume();
dove avviene la ricezione

Questo è il mio script:

#include <IRremote.h>

const int R = 2;  //ricevitore IR sul pin 2//
IRrecv irrecv(R); //Dichiaro il ricevitore R//


//I Led RAPPRESENTANO per ora la vite del giocatore//

int led1 = 13;    //LED 1//
int led2 = 12;    //LED 2//
int led3 = 11;    //LED 3//

//Vita v del giocaotre è uguale a 3//

int v = 3;

//Variabile Segnale//

decode_results S;

void setup() 
  {
  Serial.begin(9600);//Attiva il Monitor Seriale
  irrecv.enableIRIn(); //Avvia ricezione
  
  //Uscita LED//
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);  
  }


void loop() 
{
  ////////////////////////////-Sistema della vita del giocatore-////////////////////////////////////////////////////
  
  
  //Se la vita è = 3, tutti i LED sono accesi//
  if(v=3)
  {
    digitalWrite(led1, HIGH); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 2, tutti i LED sono accesi tranne il LED 1//
  if(v=2)
  {
    digitalWrite(led1, LOW); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 1, tutti i LED sono accesi tranne il LED 1 e 2//
  if(v=1)
  {
    digitalWrite(led1, LOW); 
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);  
  }
  
  //Se la vita è = 0, tutti i LED lampeggiano//
  if(v=0)
  {
    digitalWrite(led1, HIGH); 
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    delay(1000);  
    digitalWrite(led1, LOW); 
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    delay(1000); 
  }
  //////////////////////////////-Fine-/////////////////////////////////////////////////////
   
   
 if (irrecv.decode(&S)) //Se ricevo Segnale S//
   {
     Serial.println(S.value); //Avvio il Monitor Seriale//
    
    if (S.value>0) //Se il valore del segnale è >0 (Qui non so come fare con il valore di S perchè con il mio led ir il valore cambia sempre)//
     {
      v --; //Leva 1 vita (Non so se questa stringa vada bene perche mi fa spegnere 2 led anziché di uno)//
     }


    //qui dovresti  aggiungere:    
    S.value=0;
    irrecv.resume();

   }
}

Aspe in quale parte del codice? :astonished: Non ho capito? :roll_eyes: :roll_eyes: :roll_eyes:

Guarda qui:

if (irrecv.decode(&S)) //Se ricevo Segnale S//
   {
     Serial.println(S.value); //Avvio il Monitor Seriale//
    
    if (S.value>0) //Se il valore del segnale è >0 (Qui non so come fare con il valore di S perchè con il mio led ir il valore cambia sempre)//
     {
      v --; //Leva 1 vita (Non so se questa stringa vada bene perche mi fa spegnere 2 led anziché di uno)//
     }


    //qui dovresti  aggiungere:    
    S.value=0;
    irrecv.resume();

   }

Non cambia nulla...rimangono accesi tutti e tre i leds

Forse dovrei creare una void solo per la gestione della vita....come si crea?

Niente da fare.....qualcuno vuole collaborare con me a questo progetto? :smiley: :smiley: :smiley: :grin: :grin: :grin: