Valore Fotoresistenza e millis

Ciao Ragazzi, questo è il mio primo post sul forum anche se è già qualche mese che vi leggo, vi scrivo perchè ho un problema su cui è due giorni che sto perdendo la testa:
ho una fotoresistenza che attiva un output e che dopo 10 secondi lo deve disattivare se il valore della fotoresistenza è ritornato ottimale, ma non riesco a farlo funzionare, per ora l’ultimo codice che ho scritto è:

unsigned long timer_illuminazione = 0;
int illuminazione = 11;

void setup()
{
pinMode (illuminazione, OUTPUT);
}

void loop ()
{
int fotoresistenza = (analogRead, A0);

if (fotoresistenza<700)
{
timer_illuminazione = millis();
digitalWrite(illuminazione, HIGH);
}

if (timer_illuminazione>10000 && fotoresistenza>700)
{
digitalWrite(illuminazione,LOW);
timer_illuminazione=0;
}
}

Problema HW lo escluderei, il circuito è come questo, montato però su un arduino UNO R3

Ho provato a cercare un po in giro come dovrebbe funzionare millis in questa situazione, ma in tutta sincerità ho una gran confusione in testa al momento…

Ora come ora il circuito accende il led se la luminosità cala, ma quando poi si rialza invece di aspettare che timer_illuminazione = millis() raggiunga i 10 secondi impostati spegne subito il led…

Grazie in anticipo per l’ aiuto

Ciao

Francesco

Prova con questo.

Ettore Massimo Albani

unsigned long timer_illuminazione = 0;
int illuminazione = 11;
int fotoresistenza = 0

void setup() {
  pinMode (illuminazione, OUTPUT);
}

void loop () {

  fotoresistenza = (analogRead, A0);

  if (fotoresistenza < 700) { 
    timer_illuminazione = millis();
    digitalWrite(illuminazione, HIGH);     
  }
  else if (millis() - timer_illuminazione > 10000 {
    digitalWrite(illuminazione, LOW);
    timer_illuminazione = 0;
  }
}

Ho provato il codice che mi hai consigliato e funziona, però non è ancora tutto a posto: la luminosità esterna si abbassa, accende la luce, poi però ho notato che i 10 secondi li conta dal momento in cui la luminosità esterna ritorna sopra al valore stabilito (700 in questo caso) se rimane sotto anche se passano i 10 secondi rimane accesa l'illuminazione, nel momento in cui la luce ritorna sopra i 700 conta 10 secondi e spegne l' illuminazione

Prova così.

unsigned long timer_illuminazione = 0;
int illuminazione = 11;
int fotoresistenza = 0

void setup() {
  pinMode (illuminazione, OUTPUT);
}

void loop () {
  fotoresistenza = (analogRead, A0);
  if (fotoresistenza < 700)
  { 
    timer_illuminazione = millis();
    digitalWrite(illuminazione, HIGH);     
  }
  if ((millis() - timer_illuminazione > 10000) && fotoresistenza > 700)
  {
    digitalWrite(illuminazione, LOW);
   }
}

Però spiega meglio il comportamento che deve avere il led. :sweat_smile:

ora provo ad aggiungere quel codice, comunque il comportamento vorrei fosse il seguente (spero di riuscire a spiegarlo bene questa volta):

  • fotoresistenza > 700 = led spento
  • fotoresistenza < 700 = accende il led e conta 10 secondi
  • sono passati i 10 secondi, se fotoresistenza > 700 spegne il led, se no lo lascia acceso fino a che fotoresistenza > 700

Il mio problema è che dopo aver acceso il led lui non inizia a contare i 10 secondi fino a che il valore della fotoresistenza non diventa > 700…

può essere che fino a che il valore di fotoresistenza rimane inferiore a 700 lui continua a "resettare" millis?

void setup() {
  pinMode (illuminazione, OUTPUT);
}

void loop () {
  if (analogRead(A0) < 700) { 
    digitalWrite(illuminazione, HIGH);     
    delay(10000);
  } else {
    digitalWrite(illuminazione, LOW);
  }
}

non posso permettermi un delay perchè nel programma definitivo avrò altri sensori da usare e non posso bloccare gli altri nel frattempo...

Usa un flag per attivare il conteggio dei 10s e sostituisci al delay il controllo con millis.

unsigned long timer;
boolean flag=false;
void setup() {
  pinMode (illuminazione, OUTPUT);
}

void loop () {
  if (analogRead(A0) < 700) { 
    if (!flag) {
      digitalWrite(illuminazione, HIGH);
      flag=true;
      timer=millis()+10000;
  }
  if (flag) {
    if (millis()>timer) {
      if (analogRead(A0) > 700) {
        digitalWrite(illuminazione, LOW);
      }
      flag=false;
    }
  }
}

Prova così

mmm provato ma non funziona, ora rimane sempre HIGH anche perchè non riesco a capire come possa verificarsi "if (millis()>timer)" nella seconda parte di codice se timer = millis() + 10000

Ciao,
prova così

unsigned long timer;
boolean flag=false;

void setup() {
  pinMode (illuminazione, OUTPUT);
}

void loop () {  
     if (analogRead(A0) < 700) {
       digitalWrite(illuminazione, HIGH);
       flag=1;
       timer=0;
     }
     else if (analogRead(A0) > 700 && flag)
     {
        
        if(timer==0){timer=millis()+10000;}
        if(timer!=0 && millis()>timer)
        {
          digitalWrite(illuminazione, LOW);
          timer=flag=0;
        }
     }
 
}

Ho fatto la prova con un potenziometro ed un led sembra funzionare…

OK. Hai una mezza dozzina di esempi diversi di codice.... quand'è che ci fai vedere un tuo codice aggiornato?
Dopo la prima pubblicazione, ti sei limitato a dire "no, non funziona.." ma... non è che possiamo fartelo noi, eh :stuck_out_tongue_closed_eyes:

Lo so lo so :smiley: solo che causa lavoro durante la settimana non riesco a mettermici sul serio, ho trovato giusto il tempo di provare i codici che mi avete suggerito per vedere se funzionano e ho provato ad invertire un segno nell'ultimo che mi hai dato, nel fine settimana o una di queste notti provo a quello del ragazzo qui sopra poi nel caso provo qualche modifica/mix degli altri qui sopra e vi aggiorno