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