Introduction
A photoresistor or light-dependent resistor (LDR) or photocell is a light-controlled variable resistor. The resistance of a photoresistor decreases with increasing incident light intensity; in other words, it exhibits photoconductivity. A photoresistor can be applied in light-sensitive detector circuits, and light- and dark-activated switching circuits.
Components
– 1*Raspberry Pi
– 1*Network cable (or USB wireless network adapter)
– 1*Resistor(10K)
– 1*ADC0832
– 1*Photoresistor
– Several jumper wires
Experimental Principle
With light intensity increasing, the resistance of a photoresistor will decrease. Thus the output voltage will change.
Experimental Procedures
Step 1: Connect the circuit
Step 2: Edit and save the code (see path/Rpi_UniversalStartKit/10_photoresistor/ photoresistor.c)
Step 3: Compile the code
gcc photoresistor.c -lwiringPi
Step 4: Run the program
./a.out
Now, if you change light intensity, you will find the value printed on the screen change accordingly.
photoresistor.c
#include <wiringPi.h>
#include <stdio.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
uchar get_ADC_Result(void)
{
//10:CH0
//11:CH1
uchar i;
uchar dat1=0, dat2=0;
digitalWrite(ADC_CS, 0);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2); //CH0 10
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,0); delayMicroseconds(2); //CH0 0
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 adcVal;
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
pinMode(ADC_DIO, OUTPUT);
adcVal = get_ADC_Result();
printf("adcval : %d\n",adcVal-80);
delay(400);
}
return 0;
}
Python Code
#!/usr/bin/env python
import ADC0832
import time
def init():
ADC0832.setup()
def loop():
while True:
res = ADC0832.getResult() - 80
if res < 0:
res = 0
if res > 100:
res = 100
print 'res = %d' % res
time.sleep(0.2)
if __name__ == '__main__':
init()
try:
loop()
except KeyboardInterrupt:
ADC0832.destroy()
print 'The end !'