This week Bob shows us his real world project to monitor activity in a room to turn on a light using a Raspberry Pi.

### Segment 1

``````Segment 1

#!/usr/bin/python

import math
import time
import RPi.GPIO as GPIO

global TRIGPIN
global ECHOPIN
global RELAY1PIN
# Pin numbers are based on functions,
# not physical pins.
TRIGPIN = 25     # physical pin 22
ECHOPIN = 24     # physical pin 18
RELAY1PIN = 23   # physical pin 16

global DEBUG
DEBUG = True

# Disable warning
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

distance = 0

# Setup Trig pin, and turn it off
GPIO.setup(TRIGPIN,GPIO.OUT)
GPIO.output(TRIGPIN,GPIO.LOW)

# Setup Echo pin
GPIO.setup(ECHOPIN,GPIO.IN)

# Turn on Trig pin for 10 microseconds, then turn it off
GPIO.output(TRIGPIN, True)
time.sleep(0.00001)
GPIO.output(TRIGPIN, False)

# Listen to the input pin and wait for the pin to go high.
#==========================================================
# The signalOff keeps being reset until the pin goes high
startTime = time.time()
signalOff = 0
while (GPIO.input(ECHOPIN) == 0 and distance == 0):
signalOff = time.time()
elapsedTime = signalOff - startTime
if elapsedTime > 1:
distance = 999

# The signalOn keeps being reset until the pin goes low.
startTime = time.time()
signalOn = 0
while (GPIO.input(ECHOPIN) == 1 and distance == 0):
signalOn = time.time()
elapsedTime = signalOn - startTime
if elapsedTime > 1:
distance = 998

# Calculate the time the pin was on
if (distance == 0):
timeOn = signalOn - signalOff
if (DEBUG == True):
buffer = 'timeOn = ' + repr(timeOn)
print buffer

# convert the time in seconds to cm or inches
# speed of sound is approx. 34000 cm/sec
# speed of sound is approx. 13500 inch/sec
# The value must be divided by 2 because we only need the
# return value.  The timeOn includes the time it takes to
# get to the surface in addition to the time it took to return.
tempDistance = timeOn * (34000/2)

# round to 2 significant digits
distance = math.ceil(tempDistance * 100) / 100

GPIO.cleanup()

# return the distance, or the error code
return distance

#
#  Loop through reading the sensor forever
#
count = 0
errors = 0
beginTime = time.time()
timeNow = time.time()
startingTime = time.strftime("%c")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(23,GPIO.OUT)
GPIO.output(23,GPIO.HIGH)
whileLoop = True

while (whileLoop == True):
try:
count += 1

errors += 1

if (DEBUG == True):
buffer = 'Sensor reading ' + repr(count) + ' = ' + repr(sensorReading) + 'cm'
print buffer
buffer = 'Error count = ' + repr(errors)
print buffer

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(RELAY1PIN,GPIO.OUT)

# if the sensor reads something within
# 10cm, then turn on the light
GPIO.output(RELAY1PIN,GPIO.LOW)
beginTime = time.time()
if (DEBUG == True):

timeNow = time.time()
elapsedTime = math.ceil((timeNow - beginTime) * 100) / 100
if (DEBUG == True):
buffer = 'elapsedTime = ' + repr(elapsedTime) + ' sec'
print buffer

# if time is greater than 10 seconds,
# turn off the light
if (elapsedTime > 10):
GPIO.output(RELAY1PIN,GPIO.HIGH)
if (DEBUG == True):
buffer = 'Time has expired on lightOn cycle ' #+ repr(lightOn)
print buffer

# Wait 1 sec and start the loop over
time.sleep(1)

# capture interrupt nicely for a clean exit from program
except KeyboardInterrupt:
whileLoop = False

# this code isn't reached until the program is exiting
GPIO.output(RELAY1PIN,GPIO.HIGH)
GPIO.cleanup()
print ''
print ''
print 'Summary:'
print '========'
buffer = 'Starting Time = ' + repr(startingTime)
print buffer
buffer = 'Total count = ' + repr(count)
print buffer
buffer = 'Total errors = ' + repr(errors)
print buffer
endingTime = time.strftime("%c")
buffer = 'Ending Time: ' + repr(endingTime)
print buffer
``````
Don’t worry, we hate spam as much as you do. You can unsubscribe anytime.