Problema con dado con display a 7 segmenti

Buongiorno a tutti, ho un problema:
ho creato un codice per un dado digitale e ho utilizzato la funzione random(1,6) ma come risultato esce sempre 3.
A seguire metterò il codice e se qualcuno mi può aiutare grazie in anticipo.

#define LED_A     5
#define LED_B     6
#define LED_C     7
#define LED_D     8       
#define LED_E     9
#define LED_F     10
#define LED_G     11
#define DP        12
int ran;
void setup ()
{
  Serial.begin(9600);
  //indiriziamo i led in uscita e il pulsante di start
  pinMode(LED_A, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(LED_C, OUTPUT);       
  pinMode(LED_D, OUTPUT); 
  pinMode(LED_E, OUTPUT);
  pinMode(LED_F, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(DP, OUTPUT);
}
void loop()
{       
    AZZERA();                          //azzera
    ran = random(1,6);
    Serial.println(ran);
    //specifichiamo i casi possibili (da 1 a 6)
    switch(ran) {
        case 1:
            UNO();
            break;
        case 2:
            DUE();
            break;
        case 3:
            TRE();
            break;
        case 4:
            QUATTRO();
            break;
        case 5:
            CINQUE();
            break;
        case 6:
            SEI();
            break;
       default:
            break;
    }
    delay(100000000);
  }
void UNO()
{
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
}

void DUE()
{
   digitalWrite(LED_A, HIGH);
   digitalWrite(LED_B, HIGH);
   digitalWrite(LED_D, HIGH);
   digitalWrite(LED_E, HIGH);
   digitalWrite(LED_G, HIGH);
}

void TRE()
{
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_G, HIGH);
}

void QUATTRO()
{
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void CINQUE()
{
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void SEI()
{
   digitalWrite(LED_A, HIGH);
   digitalWrite(LED_C, HIGH);
   digitalWrite(LED_D, HIGH);
   digitalWrite(LED_E, HIGH);
   digitalWrite(LED_F, HIGH);
   digitalWrite(LED_G, HIGH);
}

void AZZERA()
{  
   // spegne tutti i led
   digitalWrite(LED_A, LOW);
   digitalWrite(LED_B, LOW);
   digitalWrite(LED_C, LOW);  
   digitalWrite(LED_D, LOW);
   digitalWrite(LED_E, LOW);
   digitalWrite(LED_F, LOW);
   digitalWrite(LED_G, LOW);
}

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

Grazie dell'informazione, ho letto il regolamento e ho scritto la mia presentazione.
Spero che vada bene e aspetterò soluzioni.
Nicola

Così funziona:
ran = (int) random(1,7);

Il massimo deve essere 7, perché il valore che esce è sempre minore del massimo che imposti.

sbaglio o vedo un delay da 100000000 !?

Evidentemente serve solo per farlo eseguire una volta sola.

ciao.
La funzione random() genera numeri pseudo casuali ovvero genera sempre la stessa sequenza casuale di numeri.
Puoi usare randomSeed() per cambiare un po' le cose

Grazie mille

Grazie del consiglio proverò ad usarlo.

Sì, infatti. Sto notando ora che facendo produrre un numero al secondo vengono diversi.
Per ottenere la casualità bisogna usare un valore casuale come seme, per esempio analogRead() di un ingresso analogico lasciato libero di captare disturbi, oppure misurando con millis() per quanto tempo viene tenuto premuto il tasto di lancio del dado.

Nel momento in cui premi il tasto, prendi il tempo con qualcosa come:
uint32_t t_lancio=millis();
quando lo lasci, fai:
randomSeed(millis()-t_lancio);
poi per un paio di secondi puoi visualizzare tutte le combinazioni in una sequenza pseudo casuale, infine visualizzi il risultato.

Meglio ancora:
per tutto il tempo in cui il tasto è premuto, ogni 200ms leggi il tempo trascorso, "semini" e poi visualizzi il numero generato;
quando lo lasci, leggi ancora il tempo trascorso, semini un'altra volta, quindi visualizzi.
Se una volta lasciato il pulsante fai continuare la visualizzazione dei numeri casuali per 2 secondi è più realistico.

Passo successivo: in quei 2 o 3 secondi il dado rallenta. :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.