Read an LDR On The Raspberry Pi Using An MCP3008

In this example we will use the MCP3008 to help us read the value of an LDR, as you will know the Raspberry Pi has no analogue input which can be a bit of a hassle considering there are a few sensors that requires this

The Microchip MCP3008 ADC is a 10-bit Analog to Digital (A/D) converter with on-board sample and hold circuitry.
Communication with the device is accomplished using a simple serial interface compatible with the SPI protocol. The MCP3008 operates over a broad voltage range (2.7V – 5.5V), and low-current design permits operation with typical standby currents of only 5 nA and typical active currents of 320 µA.

Features

10bit ADC
8 channels
SPI Interface
Sampling Rate: 200kSPS
Supply Voltage 2.7V to 5.5V
Supply Current: 425µA
16 pin DIP
Conversion Time: 10µs

 

Schematics and Connections

You connect the MCP3008 to your Raspberry Pi like this

mcp3008-2

 

 VDD  3.3V
 VREF  3.3V
 AGND  GROUND
 CLK  GPIO9 (P1-21)
 DOUT  GPIO10 (P1-19)
 DIN  GPIO10 (P1-19)
 CS GPIO8 (P1-24)
 DGND  GROUND

 

Here is a sample layout on a breadboard with an LDR connected to channel 0

pi-and-mcp3008-and-ldr_bb

Code

 

I used the gpiozero library, here is how to install this

sudo apt-get update
sudo apt-get install python-pip python3-pip
sudo pip install gpiozero

Now save the following as mcp3008.py or similar

#!/usr/bin/python
import time
from gpiozero import MCP3008
 
divider = MCP3008(0)
 
while True:
    print(divider.value)
time.sleep(1.0)

Run this from your terminal by typing in sudo python mcp3008.py

You should see a value outputted every second, now vary the light to the LDR by positioning closer to a light source, covering it up and so on

UPDATE

here is a code example that requires no library

import spidev
import time
 
#Define Variables
delay = 2
ldr_channel = 0
 
#Create SPI
spi = spidev.SpiDev()
spi.open(0, 0)
 
def readadc(adcnum):
    # read SPI data from the MCP3008, 8 channels in total
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([1, 8 + adcnum << 4, 0])
    data = ((r[1] & 3) << 8) + r[2]
    return data
 
 
while True:
    ldr_value = readadc(ldr_channel)
    print("LDR Value: %d" % ldr_value)
time.sleep(delay)

Links

You can pick these up quite easily for around $2 a piece.

MCP3008-I/SL MCP3008 SOP 8-CH 10-BIT SUCCESSIVE APPROXIMATION ADC SERIAL ACCESS

SHARE
Previous articleRaspberry Pi and MLX90614 infrared thermometer
Next articleRaspberry Pi and SHT31 sensor example