consigli per led random con input da fotocellula

Buonasera, finalmante ho soddisfatto la mia curiosità. Mi sono comprato uno starter kit e ho iniziato a fare un po di pratica prendendo spunti dalla rete.
Sto provando da qualche sera a fare questo progetto: 2 led, uno rosso e uno blu, e un pulsante di start.
Allo start del pulsante vorrei accendere uno dei due led in maniera casuale e mantenerlo acceso per 5 secondi, dopodiche si spegne fino a quando do ancora uno start dal pulsante e si accende ancora uno dei due led.
Ho provato a fare questo codice prendendo qua e la qualche spunto però una volta fatti i collegamenti mi rimane acceso fisso il led sul pin 10.
Qualcuno ha qualche consiglio da darmi?
ringrazio in anticipo

#define LED rosso 10        //led rosso collegato al pin 10
#define LED blu 11          //led blu collegato al pin 11
#define start 2             //segnale di start collegato al pin 2
int val = 0;                // uso val per conservare le stato del pin di input

long randNumber;
           
void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(2, INPUT);
  randomSeed(analogRead(A0));   //senza questa istruzione la sequenza sarebbe sempre la stessa

}

void loop() {
  val = digitalRead(2);
 
  randNumber = random(1, 2);    //genera un numero pseudo casuale tra 1 e 2
   if (randNumber == 1) digitalWrite(10, HIGH);
  else digitalWrite(10, LOW);

  if (randNumber == 2) digitalWrite(11, HIGH);
  else digitalWrite(11, LOW);
  
  delay(5000);

}

In primo luogo noto che lei non esegue mai controlli sullo stato del pulsante. Basterebbe moltiplicare il numero preso random per lo stato del pulsante, anche preso in maniera diretta. In tale modo tutto comincerebbe solo se il pulsante viene premuto. Inoltre sarebbe necessario allo scopo inserire la delay () all'interno di ognuna delle due if {}.
Inoltre mi pare, ma non ne sono sicuro che randNunber (a,b) generi un numero random compreso tra a e b-1

Robiorlandi:
Buonasera,

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Buonasera, scusate i tempi di risposta.
Io ho provato a fare qualche aggiunta/modifica secondo i consigli, ma credo proprio di non esserci...
Ora i led si accendono in maniera casuale ma si accendono appena do alimentazione alla scheda.
Il pulsante praticamente non comanda nulla. Inoltre ho dei casi di led entrambi accesi o entrambi spenti.

ecco il codice che ho fatto

#define LED rosso 10        //led rosso collegato al pin 10
#define LED blu 11          //led blu collegato al pin 11
#define start 2             //segnale di start collegato al pin 2
int val = LOW;                // uso val per conservare le stato del pin di input
long randNumber;
           
void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(2, INPUT);
  randomSeed(analogRead(A0));   //senza questa istruzione la sequenza sarebbe sempre la stessa

}

void loop() {
  val = digitalRead(2);
  if (val == HIGH);
  randNumber = random(-1, 1);     //genera un numero pseudo casuale tra -1 e 1
  if (randNumber == -1) digitalWrite(10, HIGH);
  else digitalWrite(10, LOW);

  delay(500);

  if (randNumber == 0) digitalWrite(11, HIGH);
  else digitalWrite(11, LOW);
  
  delay(500);

}

cosa posso fare?
grazie in anticipo

  1. vedo che controlli se il pulsante è premuto, verificando che sia HIGH ... hai previsto una resistenza di pull-down (ovvero una resistenza da un 10KΩ verso GND) che, quando NON è premuto, lo tenga LOW ? ... altrimenti, essendo ad alta impedenza, quando il pulsante non è premuto, si trova flottante e, casualmente, assume valori HIGH e LOW.

  2. studiati bene la sintassi del IF e l'uso del ';' ... se mi metti il ';' subito dopo lo statement IF ... praticamente me lo concludi li ... quindi ... cosa pensi possa fare la tua riga: "if (val == HIGH);" ? ? ?

Guglielmo

mi sono guardato un po di appunti in rete e grazie ai vostri spunti ci sono riuscito :slight_smile: :slight_smile:

grazie davvero!!

posto il codice e se c'è qualche altro appunto che secondo voi potrebbe migliorare il sistema sarò ben felice di accoglierlo e cercare di metterlo in atto.

Noto però che quando il random mi porta ad accendere il led blu lo fa con un po di ritardo, cosa che non succede quando mi porta ad accendere quello rosso. Sapreste dirmi da cosa può essere dovuto?

ecco il codice

#define LED rosso 10        //led rosso collegato al pin 10
#define LED blu 11          //led blu collegato al pin 11
#define start 2             //segnale di start collegato al pin 2
int val = LOW;                // uso val per conservare le stato del pin di input
long randNumber;
           
void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(2, INPUT);
  randomSeed(analogRead(A0));   //senza questa istruzione la sequenza sarebbe sempre la stessa

}

void loop() {
  val = digitalRead(2);
  if (val == HIGH)
  {
  randNumber = random(-1, 1);     //genera un numero pseudo casuale tra -1 e 1
  if (randNumber == -1) digitalWrite(10, HIGH);
  else digitalWrite(10, LOW);

  delay(2000);
  
  if (randNumber == 0) digitalWrite(11, HIGH);
  else digitalWrite(11, LOW);
  
  delay(2000);
  
  }

se aumento il tempo del delay al primo "if...else" mi aumenta il ritardo sull'accensione del secondo "if...else"

ho tolto il primo delay e ora funziona correttamente