.. note::
Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Unisciti a noi per esplorare più a fondo Raspberry Pi, Arduino e ESP32 con altri appassionati.
**Perché unirti?**
- **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra community e del nostro team.
- **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
- **Sconti Speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni Festive e Giveaway**: Partecipa a promozioni e giveaway durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti subito!
2.2.1 Fotoresistore
======================
.. note::
.. image:: img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
A seconda della versione del kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente.
Introduzione
---------------
Il fotoresistore è un componente comunemente utilizzato per rilevare
l'intensità della luce ambientale. Aiuta il controller a distinguere
tra giorno e notte e permette di implementare funzioni di controllo
della luce, come quelle di una lampada notturna. Questo progetto è
molto simile a quello con il potenziometro e può essere visto come una
trasformazione della variazione di tensione in sensibilità alla luce.
Componenti
--------------
.. image:: img/list_2.2.1_photoresistor.png
Principio di Funzionamento
-----------------------------
Un fotoresistore, o fotocellula, è una resistenza variabile controllata
dalla luce. La resistenza del fotoresistore diminuisce con l'aumentare
dell'intensità della luce incidente; in altre parole, mostra fotoconduttività.
Un fotoresistore può essere utilizzato in circuiti di rilevamento sensibili
alla luce, e in circuiti che si attivano con luce o oscurità.
.. image:: img/image196.png
:width: 200
:align: center
Schema del Circuito
----------------------
.. image:: img/image321.png
.. image:: img/image322.png
Procedure Sperimentali
-------------------------
**Passaggio 1:** Costruisci il circuito.
.. image:: img/image198.png
:width: 800
Per Utenti C
^^^^^^^^^^^^^^^
**Passaggio 2:** Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.2.1/
**Passaggio 3:** Compila il codice.
.. raw:: html
.. code-block::
gcc 2.2.1_Photoresistor.c -lwiringPi
**Passaggio 4:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Una volta eseguito il codice, la luminosità del LED varierà a seconda
dell'intensità di luce rilevata dal fotoresistore.
.. note::
Se il programma non funziona o viene visualizzato un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta la sezione :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
#define LedPin 3
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Bit di avvio
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Modalità Single End
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Selezione
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
**Passo 3:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo python3 2.2.1_Photoresistor.py
Durante l'esecuzione del codice, la luminosità del LED varierà a seconda
dell'intensità di luce rilevata dalla fotoresistenza.
**Codice**
.. note::
Puoi **Modificare/Reimpostare/Copiare/Eseguire/Arrestare** il codice qui sotto. Prima di ciò, però, è necessario andare nel percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import ADC0834
import time
LedPin = 22
def setup():
global led_val
# Imposta la modalità GPIO a Numerazione BCM
GPIO.setmode(GPIO.BCM)
# Imposta LedPin come output e il livello iniziale ad High (3.3v)
GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH)
ADC0834.setup()
# Imposta il LED come canale PWM con frequenza a 2KHz
led_val = GPIO.PWM(LedPin, 2000)
# Inizializza con il valore 0
led_val.start(0)
def destroy():
# Interrompi tutti i canali PWM
led_val.stop()
# Rilascia le risorse
GPIO.cleanup()
def loop():
while True:
analogVal = ADC0834.getResult()
print ('analog value = %d' % analogVal)
led_val.ChangeDutyCycle(analogVal*100/255)
time.sleep(0.2)
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt: # Quando viene premuto 'Ctrl+C', verrà eseguito il programma destroy().
destroy()
**Spiegazione del Codice**
.. code-block:: python
def loop():
while True:
analogVal = ADC0834.getResult()
print ('analog value = %d' % analogVal)
led_val.ChangeDutyCycle(analogVal*100/255)
time.sleep(0.2)
Legge il valore analogico di CH0 di ADC0834. Per impostazione predefinita,
la funzione getResult() legge il valore di CH0; se desideri leggere altri
canali, inserisci 1, 2 o 3 nei parametri della funzione getResult().
Successivamente, stampa il valore utilizzando la funzione print. Poiché
l'elemento che cambia è il ciclo di lavoro di LedPin, è necessario utilizzare
la formula di calcolo analogVal*100/255 per convertire analogVal in percentuale.
Infine, ChangeDutyCycle() viene chiamata per scrivere la percentuale in LedPin.
Immagine del Fenomeno
---------------------------
.. image:: img/image199.jpeg