Lesson 10 Photoresistor

Share for us
Share on facebook
Share on twitter
Share on pinterest
Share on whatsapp

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 !'