07. Interruttore crepuscolare

In questo progetto il led si accende automaticamente quando la luminosità ambientale è bassa.

Nel circuito compaiono due resistori, un led rosso ed un fotoresistore.

La resistenza inserita nel circuito del led rosso è di 150 Ω.

La resistenza per la fotoresistenza è di 1K Ω.

Per far comparire la slider bar associata alla fotoresistenza occorre cliccare sul fotoresistore dopo aver avviato la simuazione.

Il codice di riferimento è il seguente:

void setup()

{

pinMode(12, OUTPUT);

pinMode(A0, INPUT);

Serial.begin(9600);

}

void loop()

{

int v;

v=analogRead(A0);

Serial.println(v);

if (v<400)

digitalWrite(12, HIGH);

else

digitalWrite(12, LOW);

}

Lo sketch fa uso del monitor seriale per consentire di valutare il codice numerico letto sul pin analogico A0 e metterlo in relazione alla luminosità ambientale.

Il valore 400 presente nell'if è puramente indicativo; il valore più opportuno deve essere individuato sperimentalmente.

I risultati ricavati dalla precedente sperimentazione sono inseriti in un progetto che implementa una macchina a stati finiti in cui solo uno stato è riservato all'interruttore crepuscolare.

Il pulsante sinistro fa avanzare, in modo circolare, tra i 6 stati gestiti. Il pulsante destro opera in modo inverso.

I 5 stati gestiti, nell'ordine, determinano le seguenti azioni sui led: spento/spento, spento/acceso, acceso/spento, acceso/acceso, lampeggiante, crepuscolare.

long TIMER1;

int lampeggiante;

int ultimo_rilevato=LOW;

int ultimo_rilevato2=LOW;

int stato=0;

int v;

int timer(long *t, long millisecondi)

{

long x;

x=millis();

if (!*t){

*t=x;

return 0;

}

else if (x-*t > millisecondi) {

*t=millis();

return 1;

}

else

return 0;

}

void setup()

{

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(8, INPUT);

pinMode(4, INPUT);

pinMode(A0, INPUT);

Serial.begin(9600);

}

void loop()

{

if (digitalRead(8)==HIGH && ultimo_rilevato==LOW){

ultimo_rilevato=HIGH;

stato++;

if (stato==6)

stato=0;

}

if (digitalRead(8)==LOW)

ultimo_rilevato=LOW;

if (digitalRead(4)==HIGH && ultimo_rilevato2==LOW){

ultimo_rilevato2=HIGH;

stato--;

if (stato==-1)

stato=5;

}

if (digitalRead(4)==LOW)

ultimo_rilevato2=LOW;

v=analogRead(A0);

Serial.println(v);

if(stato==0) {

digitalWrite(12, LOW);

digitalWrite(11, LOW);

}

if(stato==1) {

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

}

if(stato==2) {

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

}

if(stato==3) {

digitalWrite(12, HIGH);

digitalWrite(11, HIGH);

}

if(stato==4) {

if (timer(&TIMER1, 1000)){

if (lampeggiante==0){

digitalWrite(12, HIGH);

digitalWrite(11, HIGH);

lampeggiante=1;

}

else{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

lampeggiante=0;

}

}

}

if(stato==5) {

if (v<400){

digitalWrite(12, HIGH);

digitalWrite(11, HIGH);

}

else{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

}

}

}