Introduction
A photoresistor is a light-controlled variable resistor. The resistance of a photoresistor decreases with increasing incident light intensity.
Components
– 1 * Raspberry Pi
– 1 * Network cable (or USB wireless network adapter)
– 1 * ADC0832
– 1 * Photoresistor module
– Several jumper wires
Experimental Principle
With light intensity increasing, the resistance of a photoresistor will decrease. Thus the output voltage changes. Analog signals collected by the photoresistor will be converted to digital signals through ADC0832. Then these digital signals are transmitted to Raspberry Pi and printed on the screen.
Experimental Procedures
Step 1: Build the circuit
Connect pin S on the photoresistor module to pin CH0 of ADC0832.
Step 2: Edit and save the code (see path/Rpi_SensorKit_code/19_photoResistor/photoResistor.c)
Step 3: Compile
gcc photoResistor.c -lwiringPi
Step 4: Run
./a.out
Now, cover the photoresistor with a cloth or your palm to change the light intensity. Then the value printed on the screen will 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)
{
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);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,0); 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);
return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
uchar analogVal;
uchar illum;
if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
printf("setup wiringPi failed !");
return 1;
}
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
pinMode(ADC_DIO, OUTPUT);
analogVal = get_ADC_Result();
illum = 210 - analogVal;
printf("Current illumination : %d\n", illum);
delay(500);
}
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 !'