Go Down

Topic: Valore Fotoresistenza e millis (Read 5202 times) previous topic - next topic

frankdas092

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
http://1.bp.blogspot.com/_2r9J42_zCwU/TM7moVzGkdI/AAAAAAAAABM/jMfhtrdqWAA/s1600/fetch.jpg

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

cyberhs

Prova con questo.

Ettore Massimo Albani

Code: [Select]


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;
  }
}




frankdas092

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

PaoloP

Prova così.

Code: [Select]
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. :smiley-sweat:

frankdas092

#4
Jul 30, 2012, 06:26 pm Last Edit: Jul 30, 2012, 06:36 pm by frankdas092 Reason: 1
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...

frankdas092

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

leo72

Code: [Select]

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

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

frankdas092

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

leo72

Usa un flag per attivare il conteggio dei 10s e sostituisci al delay il controllo con millis.
Code: [Select]

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ì

frankdas092

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

nagy

#10
Jul 31, 2012, 09:38 pm Last Edit: Jul 31, 2012, 09:41 pm by nagy Reason: 1
Ciao,
prova così

Code: [Select]

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...

leo72

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  :smiley-yell:

frankdas092

Lo so lo so :D 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

Go Up