Segnalazioni diverse con un unico led

salve ho necessita di accendere un led con funzioni lampeggio diverse a seconda della situazione usando un contatore. Sto modificando un esempio trovato sui forum ma non riesco a fare il cambio di gioco, qualcuno mi puo aiutare? se carico un solo gioco alla volta tutto ok, se entrambi il secondo non funziona mai

[code]
// GIOCHI LED CON DISPLAY TM1632
//       ********************                      **********************


#define led   6               //led attaccato al pin 6

int intervallo_led = 1000;    
unsigned long tempo_led;      
byte ciclo_led = 0;


int intervallo_ledd = 1000;    
unsigned long tempo_ledd;      
byte ciclo_ledd = 0;



        /****************  IMPOSTAZIONE DISPLAY    *****************/                     
#include "TM1637.h"          
#define DIO   2
#define CLK   3
TM1637  tm1637(CLK,DIO);

int countgiochi = 0;               

void setup() {
 Serial.begin (9600);
 
 tm1637.init();                     
 tm1637.set (BRIGHT_TYPICAL);       
 
 pinMode(4,  INPUT_PULLUP);         
 pinMode(13, INPUT_PULLUP);         //  reset        pulsante di reset display 
 pinMode(led,OUTPUT);               // imposto pin 6 come uscita  
 }  

 int giochi, prevgiochi;   

 void loop() {
   
   shownumber (countgiochi);             //questo serve per accendere il display
   
   int giochi = digitalRead(4);          

   
  if (!giochi && prevgiochi ){          
    countgiochi++;                       
    delay (150);
     } 
  
  if (digitalRead (13))                  //qui resetto il contatore
  { 
    countgiochi = 0;                     
  }
   prevgiochi = giochi;               // contagiochi
 }

void shownumber(int n){     
  int d1 =  n % 10;            // qui prendo il numero del modulo e trovo le unita
  int d2 = (n/10) % 10;        // qui prendo il numero del modulo e trovo le decine
  int d3 = (n/100) % 10;       // qui prendo il numero del modulo e trovo le centinaia
  int d4 = (n/1000) % 10;      // qui prendo il numero del modulo e trovo le migliaia
  tm1637.display(0,d4);        // migliaia
  tm1637.display(1,d3);        // centinaia
  tm1637.display(2,d2);        // decine    
  tm1637.display(3,d1);        // unita e quindi numero + a destra


/**************************************************************************/
               /**** *         GIOCO 1           *****/       
/**************************************************************************/

 if ( countgiochi >=1 && countgiochi <=5 ) 
 if  (millis() - tempo_led >= intervallo_led)        
 {
   play_led();                                      

 if (ciclo_led < 5) ++ ciclo_led; else ciclo_led = 0;        
   tempo_led = millis();                                      
 
  }
}
void play_led() {                
    
  switch (ciclo_led) {
    case 0:                       // il led e spento
      digitalWrite(led, LOW);   
     break;
    case 1:                      
      digitalWrite(led, HIGH);   //lo accendo per 30 millis
      intervallo_led = 30;     
     break;
    case 4:                   
      digitalWrite(led, LOW);    // lo spengo per 1 secondo
      intervallo_led = 1000;     //e riparte il ciclo tenendo conto anche del ritardo play_led,
      break;
 }
   /**************************************************************************/
               /**** *         GIOCO 2           *****/       
/**************************************************************************/
 
if ( countgiochi >=6 && countgiochi <=10 ) 
 if  (millis() - tempo_ledd >= intervallo_ledd)         
 {
   play_ledd();                                      

 if (ciclo_ledd < 5) ++ ciclo_ledd; else ciclo_ledd = 0;         
   tempo_ledd = millis();                                      
 
  }
}

void play_ledd() {                 
    
  switch (ciclo_ledd) {
    case 0:                       // il led è spento
      digitalWrite(led, LOW);   
     break;
    case 1:                      
      digitalWrite(led, HIGH);   //lo accendo per 120 millis
      intervallo_ledd = 120;     
     break;
    case 2:                      
      digitalWrite(led, LOW);    //lo spengo  
      break;
    case 3:                     
      digitalWrite(led, HIGH);   // lo accendo per 30 millis
      intervallo_ledd = 30;       
      break;
   case 4:                   
      digitalWrite(led, LOW);    // lo spengo per 1 secondo
      intervallo_ledd = 1000;     //e riparte il ciclo tenendo conto anche del ritardo play_led,
      break;
 }




}    
[/code]

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

Guglielmo

Io non sono un programmatore, pero' non capisco come possano funzionare quegli if di countgiochi ... ad esempio ...

Questo dovrebbe significare (se non sbaglio), che l'if e' eseguito se countgiochi e' "maggiore o uguale ad 1" e contemporaneamente "minore o uguale a 5" ... salvo che il compilatore non si prenda cura lui della cosa, come potrebbe essere contemporaneamente uguale ad 1 e a 5 ? (oppure mi sfugge qualcosa a causa del troppo spumante :grin: )

E poi, in gioco 1, dove sono finiti i case 2 e 3 ? ... ok, vengono ignorati, ma viene comunque eseguito il ritardo dell'ultimo tempo_led impostato, e' intenzionale ?

... significa che la if è verificata per countgiochi compreso tra 1 e 5 ovvero un qualsiasi numero maggiore e uguale ad uno, ma minore o uguale a cinque :wink:

Guglielmo

Ah, vero, "oppure" ... lo sapevo, troppe bollicine :grin:

anche io non conosco arduino e ogni cosa che faccio cerco di studiarmelo
inizialmente avevo messo dei delay che pero bloccavano il sw poi ho temporizzato con dei millis ma come ho già detto non riesco a far funzionare le due sequenze
in realta contagiochi non sarebbe il nome più opportuno il contagiochi è nato con il solo gioco 2
adesso ho necessità di contare dei pezzi: se sono compresi in un certo quantitativo lampeggio lento se in un secondo quantitativo lampeggio un po più veloce se supero un terzo quantitativo led fisso( questa parte la aggiungo quando funzionano i primi due)

grazie gbp della segnalazione se devo dirti sinceramente non so come capire se sono nulla sezione in lingua inglese; mi sono collegato al forum, leggevo tutto in italiano e ho creato una nuova discussione

... hai probabilmente la trduzione automatica delle pagine impostata nel browser ... questo qui ti creerà problemi e, continuando a sbagliare, potrebbe anche portare alla sospensione dell'account, quindi ... disattiva la traduzione automatica :wink:

Guglielmo

Richiami play_ledd dentro play_led. E richiami play_led dentro l'if (compreso tra 1 e 5).
Quindi l'if (copreso tra 6 e 10) dentro play_led non sarà mai vero.
Mi pare un po' macchinoso.
Ti bastano 2 lampeggi diversi o ti serve per forza con quella logica?

ho provato a capire cosa intendi ma non funziona niente
sembrava facile: se sono compreso tra 1 e 5 ottengo un lampeggio, se 6 e 10 2 lampeggi
quando conto fra 6 e 10 la condizione 1 e 5 risulta falsa quindi non capisco perchè non funziona
come dicevo prima le funzioni play_led e play_ledd caricate separatamente funzionano

Sono sbagliate le parentesi delle strutture if, quindi il programma fa tutt'altro da quello che ti aspetti. Prova a incolonnare le parentesi aperte con quelle chiuse e gli errori si riveleranno immediatamente :wink:

scusa claudio ma non so cosa vuoi dire

Prendi il tuo codice, dallo in pasto all'IDE di Arduino ed usa l'apposito strumento di formattazione del codice ... Tools -> Auto Format ... ti sistemerà tutte le varie indentature e ... potrai facilmente scoprire se ti è scappata qualche parentesi graffa in qualche if (vedrai indentature non corrette) ...

Guglielmo

o eseguito la formattazione automatica, ho ricompilato ma non da nessun errore

Chi ti ha detto di ricompilare? Claudio_FF ti ha detto di LEGGERE attentamente il codice indentato per scoprire, grazie proprio alle indentature, degli IF male aperti/chiusi che ... fanno fare al programma cose diverse da quelle che ti aspetti.

Considera che basta, ad esempio, digitare un ';' di troppo per avere effetti completamente diversi
... esempio:

if ( condizione ) ;
{
   ... istruzioni
   ... istruzioni
}

ecco, le istruzioni tra le graffe verranno eseguire sempre, indipendentemnete dalla condizione, causa il ';' di troppo.

Similmente, graffe mal poste o proprio omesse, cambiano tutta la logica del programma che però, se ci sono tutte, comunque non danno errori di compilazione.

Guglielmo

risolto in questo modo`

// GIOCHI LED CON DISPLAY TM1632
//       ********************                      **********************


#define led   6               //led attaccato al pin 6
int intervallo_led = 1000;
unsigned long tempo_led;
byte ciclo_led = 0;


int intervallo_ledd = 1000;
unsigned long tempo_ledd;
byte ciclo_ledd = 0;



/****************  IMPOSTAZIONE DISPLAY    *****************/
#include "TM1637.h"
#define DIO   2
#define CLK   3
TM1637  tm1637(CLK, DIO);

int countgiochi = 0;

void setup() {
  Serial.begin (9600);

  tm1637.init();
  tm1637.set (BRIGHT_TYPICAL);

  pinMode(4,  INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);         //  reset        pulsante di reset display
  pinMode(led, OUTPUT);              // imposto pin 6 come uscita
}

int giochi, prevgiochi;

void loop() {

  shownumber (countgiochi);             //questo serve per accendere il display

  int giochi = digitalRead(4);


  if (!giochi && prevgiochi ) {
    countgiochi++;
    delay (150);
  }

  if (digitalRead (13))                  //qui resetto il contatore
  {
    countgiochi = 0;
  }
  prevgiochi = giochi;               // contagiochi
}

void shownumber(int n) {
  int d1 =  n % 10;            // qui prendo il numero del modulo e trovo le unita
  int d2 = (n / 10) % 10;      // qui prendo il numero del modulo e trovo le decine
  int d3 = (n / 100) % 10;     // qui prendo il numero del modulo e trovo le centinaia
  int d4 = (n / 1000) % 10;    // qui prendo il numero del modulo e trovo le migliaia
  tm1637.display(0, d4);       // migliaia
  tm1637.display(1, d3);       // centinaia
  tm1637.display(2, d2);       // decine
  tm1637.display(3, d1);       // unita e quindi numero + a destra




  if ( countgiochi >= 1 && countgiochi <= 5)
    if ( millis() - tempo_led >= intervallo_led)
    {
      play_led();

      if ( ciclo_led < 3) ++ ciclo_led; else ciclo_led = 0;
      tempo_led = millis();
    }
  if ( countgiochi >= 6 && countgiochi <= 10 )
    if ( millis() - tempo_ledd >= intervallo_ledd)
    {
      play_ledd();

      if (ciclo_ledd < 5) ++ ciclo_ledd; else ciclo_ledd = 0;
      tempo_ledd = millis();
    }
}
/**************************************************************************/
/**** *         GIOCO 1           *****/
/**************************************************************************/

void play_led() {

  switch (ciclo_led) {
    case 0:                       // il led e spento
      digitalWrite(led, LOW);
      break;
    case 1:
      digitalWrite(led, HIGH);   //lo accendo per 20 millis
      intervallo_led = 20;
      break;
    case 2:
      digitalWrite(led, LOW);    // lo spengo per 1 secondo
      intervallo_led = 2000;     //e riparte il ciclo tenendo conto anche del ritardo play_led,
      break;
  }
}
/**************************************************************************/
/**** *         GIOCO 2           *****/
/**************************************************************************/
void play_ledd() {

  switch (ciclo_ledd) {
    case 0:                       // il led è spento
      digitalWrite(led, LOW);
      break;
    case 1:
      digitalWrite(led, HIGH);   //lo accendo per 120 millis
      intervallo_ledd = 120;
      break;
    case 2:
      digitalWrite(led, LOW);    //lo spengo
      break;
    case 3:
      digitalWrite(led, HIGH);   // lo accendo per 30 millis
      intervallo_ledd = 30;
      break;
    case 4:
      digitalWrite(led, LOW);    // lo spengo per 1 secondo
      intervallo_ledd = 2000;     //e riparte il ciclo tenendo conto anche del ritardo play_led,
      break;
  }
}