Funzione Random sotto fotoresistenza

ciao ragazzi, non capisco dove sbaglio, vorrei comandare 4 Led tramite fotoresistenza, in questa maniera:

1 led deve accendersi e spegnersi in base ai dati della fotoresistenza
3 led devono lampeggiare random quando la fotoreistenza legge poca luce e spegnersi quando legge molta luce

Riesco a comandare il primo led, mentre non riesco a gestire il lampeggio, infatti il ciclo non viene comandato dalla fotoresistenza.

Ho scritto il codice a pezzi, nel senso prima ho cercato di capire come si comanda la fotoresistenza e poi ho scritto la parte del ciclo per capire come funziona il comando random
Non riesco a collegarli fra di loro, sicuramente l'errore è qui.
E' un codice che ho creato per imparare nuovi comandi, non mi serve per qualche lavoro ma solo per imparare qualche comando nuovo.

Potete spiegarmi dove sbaglio?
ricordate che sono ancora neofita siate buoni :slight_smile:
Grazie.

int luce;  //valore dalla fotoresistenza
int ledUV = 10;  //Led ultravioletto
int ledROSSO = 11; //Led rosso
int ledGIALLO = 12; // Led giallo
int ledBLU = 13; //led blu
int ciclo = luce; // ciclo tre led colorati

void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  luce = analogRead(A0);  //Lettura della fotoresitenza 
  digitalWrite(ledUV,luce);
  // INIZIO CICLO DI LAMPEGGIO
ciclo = 0;
  ciclo += random(1, 3 + 1);
  if (1 == ciclo) 
  {
    digitalWrite(ledROSSO, HIGH);
    delay(250);
    digitalWrite(ledROSSO, LOW);
  } 
  else 
  {
    digitalWrite(ledROSSO, LOW);
  }
  if (2 == ciclo) 
  {
    digitalWrite(ledGIALLO, HIGH);
    delay(250);
    digitalWrite(ledGIALLO, LOW);
  } 
  else 
  {
    digitalWrite(ledGIALLO, LOW);
  }
  if (3 == ciclo) 
  {
    digitalWrite(ledBLU, HIGH);
    delay(250);
    digitalWrite(ledBLU, LOW);
  } 
  else 
  {
    digitalWrite(ledBLU, LOW);
  }
}

Non controlli da nessuna parte se la fotoresistenza vede tanta o poca luce.
Prima degli if del lampeggio devi controllare se luce è maggiore o minore della soglia "poca luce".

ciao, forse ho capito, dovrei insiemi una valore sopra il quale si accendono i Led giusto?
Ho modificato il codice ma adesso restano accesi sempre

Prova a postare il nuovo codice

Ciao, ho riscritto il codice da zero, su tinkercad, non mi da errori e la simulazione mi da l’effetto desiderato.
Però sono aperto ad eventuali modifiche per imparare qualcosa di nuovo :slight_smile:

int ledUV = 10;  //Led ultravioletto
int ledROSSO = 11;
int ledGIALLO = 12;
int ledBLU = 13;
int luce; //Valore resistenza
int valore = 800; //soglia luminosità
int ciclo;

void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  luce = analogRead(A0);  //Lettura della luminosità
  if (luce>valore) //controllo valore luminosità
  {
    digitalWrite(ledUV, HIGH);
 // INIZIO CICLO LAMPEGGIO
    ciclo = 0;
    ciclo +=random(1, 3+1);
    if (1 == ciclo)
    {
      digitalWrite(ledROSSO, HIGH);
      delay(100);
      digitalWrite(ledROSSO, LOW);
    }
    if (2 == ciclo)
    {
      digitalWrite(ledGIALLO, HIGH);
      delay(100);
      digitalWrite(ledGIALLO, LOW);
    }
    if (3 == ciclo)
      digitalWrite(ledBLU, HIGH);
      delay(100);
      digitalWrite(ledBLU, LOW);
  }
  else
  {
    digitalWrite(ledUV, LOW);
    digitalWrite(ledROSSO, LOW);
    digitalWrite(ledGIALLO, LOW);
    digitalWrite(ledBLU, LOW);
  }
  
  Serial.print("Luminosità: ");
  Serial.println(luce);
  Serial.print("ciclo:  ");
  Serial.println(ciclo);
  Serial.print("luce:  ");
  Serial.println(luce);
  delay(500);  //Aspetta mezzo secondo prima di ricontrollare
}

Diciamo che funziona. Si potrebbe sindacare sull'uso del delay, ma se l'obiettivo è solo lampeggiare i led e non hai bisogno di una risposta "immediata" allora va bene.

fratt:
Diciamo che funziona. Si potrebbe sindacare sull'uso del delay, ma se l'obiettivo è solo lampeggiare i led e non hai bisogno di una risposta "immediata" allora va bene.

L'obbiettivo in realtà è imparare

Allora potresti provare ad ottenere lo stesso risultato utilizzando millis() invece di delay().

fratt:
Allora potresti provare ad ottenere lo stesso risultato utilizzando millis() invece di delay().

Grazie :slight_smile:
Ora mi studio la differenza e provo con lo stesso codice :wink:

Ti aggiorno quando farò la prova

Hedaa:
... provo con lo stesso codice :wink:

Ti anticipo che dovrai rivederne un po' la logica ... l'uso di millis(), poiché NON arresta il programma, prevede una logica diversa da quella di delay(), che invece arresta il programma.

Prova a leggere come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

gpb01:
Ti anticipo che dovrai rivederne un po' la logica ... l'uso di millis(), poiché NON arresta il programma, prevede una logica diversa da quella di delay(), che invece arresta il programma.

Prova a leggere come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

Ok grazie :slight_smile:
Stavo per pubblicare il mio codice, scrivendo riesco ad avere un lampeggio costante ma non casuale, ma a questo punto leggo prima i tuoi link e poi lo posto :wink:

Ciao ragazzi ho lavorato sul codice, l'ho diviso in 3 sotto codici per comodità
Ottengo il lampeggio ma non riesco a modificare la frequenza anche se vario il valore delle costanti, non capisco dove sbaglio :frowning:
Inoltre nella sezione dei 3 led, a differenza dell'uso di delay, adesso ottengo anche l'accensione di più led in contemporanea, oppure un led acceso in maniera costante mentre lampeggia un altro led.
Non capisco come poter ottenere il lampeggio di un singolo led per volta, come lo otterrei con delay.

Grazie ancora

#define ledVERDE 9 //STROBO
#define ledUV 10  //Led ultravioletto
#define ledROSSO 11
#define ledGIALLO 12
#define ledBLU 13
const int INTERVALLO = 10; //tempo di lampeggio led
const int LAMPEGGIO = 1000;
int luce; //Valore resistenza
int valore = 800; //soglia luminosità
int ciclo;
int precedenteVERDE = LOW; //valore precedente del led
int precedenteROSSO = LOW; 
int precedenteGIALLO = LOW;
int precedenteBLU = LOW;
unsigned long ultimoVALORE = 0; //ultima volta che il led è stato aggiornato

void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  UV();
  VERDE();
  TRIS();
  testocontatore();
}

// LED UV
void UV(){
  luce = analogRead(A0);  //Lettura della luminosità
  if (luce>valore) //controllo valore luminosità
  {
    digitalWrite(ledUV, HIGH);    
  }
  else {
    digitalWrite(ledUV, LOW);
  }
}
//LED VERDE 
    void VERDE(){
    luce = analogRead(A0);
      if (luce>valore)
    if(millis()+INTERVALLO > ultimoVALORE )
    {
      ultimoVALORE = millis();
      if (precedenteVERDE == LOW) //cambia il contenuto della variabil
		  precedenteVERDE = HIGH; //in base al valore precedente
      else
        precedenteVERDE = LOW;
      digitalWrite(ledVERDE, precedenteVERDE);
    }
    }
    
// INIZIO CICLO LAMPEGGIO 3 LED
      void TRIS(){
      luce = analogRead(A0);
        if (luce>valore)
    ciclo = 0;
    ciclo +=random(1,4);
    if (1 == ciclo)
    {
      if(millis() - precedenteROSSO > LAMPEGGIO) 
             {
               ultimoVALORE = millis();
      if(precedenteROSSO == LOW)
         precedenteROSSO = HIGH;
      else
        precedenteROSSO = LOW;
      digitalWrite(ledROSSO, precedenteROSSO);
    }
    }
    if (2 == ciclo)
    {
      if(millis() - precedenteGIALLO > LAMPEGGIO) 
             {
               ultimoVALORE = millis();
      if(precedenteGIALLO == LOW)
         precedenteGIALLO = HIGH;
	  else
         precedenteGIALLO = LOW;
      digitalWrite(ledGIALLO, precedenteGIALLO);
    }
    }
    if (3 == ciclo)
    {
      if(millis() - precedenteBLU > LAMPEGGIO) 
             {
               ultimoVALORE = millis();
      if(precedenteBLU == LOW)
         precedenteBLU = HIGH;
      else
        precedenteBLU = LOW;
      digitalWrite(ledBLU, precedenteBLU);
  }
      }
      }
void testocontatore(){
  
  Serial.print("Luminosità: ");
  Serial.println(luce);
  Serial.print("ciclo:  ");
  Serial.println(ciclo);
  Serial.print("luce:  ");
  Serial.println(luce);
  delay(250);
}

Fatti un giro su "aiutateci ad aiutarvi"