Obiettivo: Accensione automatica di quattro LED al diminuire dell’intensità di luce rilevata.
Componenti elettronici:
- Arduino UNO
- Breadboard
- 4 Led
- 1 Foto-resistenza
- 4 Resistenze (100Ohm) per Led
- 1 Resistenza (2.2kOhm) per Foto-resistenza
Teoria: La foto resistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di intensità luminosa che lo colpisce. Questo significa che la corrente (inversamente proporzionale alla resistenza) aumenta all’aumentare dell’intensità luminosa.
A seguire, viene riportato la caratteristica Ohm/Lux di una fotoresistenza tipicamente impiegata in applicazioni realizzate mediante Arduino.
Nel caso specifico, è importante ricordare che Arduino non può rilevare né variazioni di resistenza né variazioni di corrente. Il microcontrollore può infatti analizzare solamente valori di tensione. Per questo motivo, l’utilizzo di una resistenza è indispensabile al fine di collegare correttamente la fotoresistenza ad Arduino. Nel dettaglio, il circuito previsto per trasformare la variazione di resistenza in una variazione di tensione è il partitore di tensione.
Nel circuito presentato, la variazione di luminosità produce una variazione del valore della fotoresistenza. Di conseguenza anche il valore della corrente risulta funzione dell’intensità luminosa e di conseguenza anche il valore di tensione in ingresso ad Arduino. Nel dettaglio:
- Un incremento della luminosità porta ad un decremento della tensione.
- Un decremento della luminosità porta ad un incremento della tensione.
- se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a 0.
- se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V)
- Resistenza di Pull Down:
- se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V).
- se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a 0.
Attraverso l’utilizzo del comando analogRead è possibile leggere la tensione su uno specifico pin analogico (A0-A5) di Arduino. La funzione analogRead restituisce un valore compreso tra 0 e 1023 a seconda della tensione letta dal microcontrollore.
A titolo di esempio, se il valore di tensione letto utilizzando la funzione analogRead sul pin A0 di Arduino risulta pari a 613. Il valore di tensione può essere facilmente calcolato:
valoreTensioneAnalogico = 613/1023*5 = 3V
dove:
- Il valore analogico di tensione letto utilizzando l’istruzione analogRead è pari a 613
- Il valore di tensione massimo che può essere letto dalla funzione analogRead è pari a 1023
- La tensione massima in uscita ad Arduino è pari a 5V
Tale valore può essere facilmente utilizzato per controllare uno o più led mediante l’istruzione condizionale IF.
Collegamento Circuitale:
Codice:
A seguire viene riportata la schematizzazione mediante flowchart dell’algoritmo utilizzato per realizzare il programma.
Codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/* Lezione 9: SMART LAMP Accende quattro LED in base a differenti soglie di luminosità valutate mediante una foto resistenza. Creato 15 Apr 2019 da Andrea Primavera */ int pinLed1 = 13; int pinLed2 = 12; int pinLed3 = 11; int pinLed4 = 10; void setup() { Serial.begin(9600); // Inizializza la comunicazione seriale a 9600 bits per secondo pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); } void loop() { int threshold1 = 300; int threshold2 = 400; int threshold3 = 500; int threshold4 = 600; int sensorValue = analogRead(A0); // legge il segnale di input sul pin analogico A0 Serial.println(sensorValue); // stampa il valore letto sul monitor seriale if(sensorValue>threshold4){ digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); } else if(sensorValue>threshold3){ digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW); } else if(sensorValue>threshold2){ digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); } else if(sensorValue>threshold1){ digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); } else{ digitalWrite(pinLed1, LOW); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); } delay(50); // ritardo tra letture per stabilizzare il sistema } |
P