node-red-nodes/hardware/PiSrf/nrsrf.py

97 lines
2.5 KiB
Python
Executable File

#!/usr/bin/python
# Python driver for SRF04 and SRO05 Ultrasonic sensors
# Modified to use PINS not BCM : Dave Conway-Jones
#import
import RPi.GPIO as GPIO
import time
import sys
import os, select
# Turn off warnings if you run it a second time...
GPIO.setwarnings(False)
ECHO = 0
TRIGGER = 0
OLD = 0
SLEEP = 0.5
def Measure():
start = 0
GPIO.output(TRIGGER, True)
time.sleep(0.00001)
GPIO.output(TRIGGER, False)
channel = GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=200)
if channel is None:
print("Ultrasonic sensor timed out (pre-echo).")
GPIO.remove_event_detect(ECHO)
restart()
# else:
# print("Echo start detected")
start = time.time()
GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=400)
if channel is None:
print("Ultrasonic sensor timed out (post-echo).")
GPIO.remove_event_detect(ECHO)
restart()
# else:
# print("Echo finish detected")
stop = time.time()
elapsed = stop-start
distance = (elapsed * 34300)/2 # Using speed of sound at 20C (68F)
return distance
def restart():
# print("Restarting...")
GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers
GPIO.setup(TRIGGER, GPIO.OUT) # Trigger
GPIO.output(TRIGGER, False) # Set low
GPIO.setup(ECHO, GPIO.OUT) # Echo
GPIO.output(ECHO, False)
time.sleep(0.1)
GPIO.setup(ECHO,GPIO.IN)
GPIO.add_event_detect(ECHO, GPIO.BOTH)
time.sleep(2.0)
# Main program loop
if len(sys.argv) > 1:
pins = sys.argv[1].lower().split(',')
if len(pins) != 3:
print "Bad parameters supplied"
print pins
sys.exit(0)
TRIGGER = int(pins[0])
ECHO = int(pins[1])
SLEEP = float(pins[2])
restart()
# Flush stdin so we start clean
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
os.read(sys.stdin.fileno(), 4096)
while True:
try:
distance = int( Measure() + 0.5 )
if distance != OLD and distance > 2 and distance < 400:
print(distance)
OLD = distance
time.sleep(SLEEP)
except Exception as e: # try to clean up on exit
print(e) # Print error message on exception
GPIO.remove_event_detect(ECHO)
GPIO.cleanup(TRIGGER)
GPIO.cleanup(ECHO)
sys.exit(0)
else:
print "Bad params"
print " sudo nrsrf.py trigger_pin,echo_pin,rate_in_seconds"
sys.exit(0)