Nota
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 [Qui] e unisciti subito!
2.2.1 Fotoresistore
Nota
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
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à.
Schema del Circuito
Procedure Sperimentali
Passaggio 1: Costruisci il circuito.
Per Utenti C
Passaggio 2: Accedi alla cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/c/2.2.1/
Passaggio 3: Compila il codice.
gcc 2.2.1_Photoresistor.c -lwiringPi
Passaggio 4: Esegui il file eseguibile.
sudo ./a.out
Una volta eseguito il codice, la luminosità del LED varierà a seconda dell’intensità di luce rilevata dal fotoresistore.
Nota
Se il programma non funziona o viene visualizzato un messaggio di errore: "wiringPi.h: No such file or directory", consulta la sezione Il codice C non funziona?.
Codice
#include <wiringPi.h>
#include <stdio.h>
#include <softPwm.h>
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))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
uchar analogVal;
if(wiringPiSetup() == -1){ //se l'inizializzazione di wiring fallisce, stampa un messaggio a schermo
printf("setup wiringPi failed !");
return 1;
}
softPwmCreate(LedPin, 0, 100);
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
analogVal = get_ADC_Result(0);
printf("Current analogVal : %d\n", analogVal);
delay(100);
softPwmWrite(LedPin, analogVal);
delay(100);
}
return 0;
}
Spiegazione del Codice
I codici qui sono gli stessi presenti nella sezione 2.1.4 Potenziometro. Se hai ulteriori domande, consulta la spiegazione del codice in 2.1.4 Potenziometro.c per i dettagli.
Per gli Utenti di Linguaggio Python
Passo 2: Vai alla cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/python/
Passo 3: Esegui il file eseguibile.
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
Nota
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.
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
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