Buhai Ioan
Published

RPi-Distance&Frequency

The project is made using Python3 programming on a Raspberry Pi Zero W

IntermediateFull instructions provided5 hours398
RPi-Distance&Frequency

Things used in this project

Hardware components

Raspberry Pi Zero Wireless
Raspberry Pi Zero Wireless
×1
Breadboard (generic)
Breadboard (generic)
×1
Buzzer
Buzzer
×1
4 Digit 7 Segment Display
×1
Ultrasonic Sensor - HC-SR04 (Generic)
Ultrasonic Sensor - HC-SR04 (Generic)
×1
1N4007 – High Voltage, High Current Rated Diode
1N4007 – High Voltage, High Current Rated Diode
×1
General Purpose Transistor NPN
General Purpose Transistor NPN
×1
Through Hole Resistor, 150 ohm
Through Hole Resistor, 150 ohm
×4
Resistor 1k ohm
Resistor 1k ohm
×1
Male/Female Jumper Wires
Male/Female Jumper Wires
×1
Male/Male Jumper Wires
×1

Software apps and online services

Raspbian
Raspberry Pi Raspbian
WinSCP
Used for files transfer between PC/Laptop and Raspberry Pi
PuTTY
Used for testing/compiling the code.

Story

Read more

Schematics

Schematic

Code

Source Code

Python
import RPi.GPIO as GPIO
import time
import pigpio
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pi = pigpio.pi()
# global variables
Segments = (a, b, c, d, e, f, g, dot) = (26, 22, 11, 13, 15, 24, 7, 35)
Digits = (D1, D2, D3, D4) = (32, 40, 38, 37)
Trig = 16
Echo = 18	
Buzzer = 18

GPIO.setup(Trig, GPIO.OUT)
GPIO.setup(Echo, GPIO.IN)


for d in Digits:
        GPIO.setup(d, GPIO.OUT)
        GPIO.output(d, GPIO.HIGH)

for s in Segments:
        GPIO.setup(s, GPIO.OUT)
        GPIO.output(s, GPIO.LOW)
	

def display_segment(number, dot):
	null = [0,0,0,0,0,0,0,0]
	zero = [1,1,1,1,1,1,0,0]
	one = [0,1,1,0,0,0,0,0]
	two = [1,1,0,1,1,0,1,0]
	three = [1,1,1,1,0,0,1,0]
	four = [0,1,1,0,0,1,1,0]
	five = [1,0,1,1,0,1,1,0]
	six = [1,0,1,1,1,1,1,0]
	seven = [1,1,1,0,0,0,0,0]
	eight = [1,1,1,1,1,1,1,0]
	nine = [1,1,1,1,0,1,1,0]
	n = [0,1,1,0,1,1,1]
	u = [0,1,1,1,1,1,0]
	l = [0,0,0,1,1,1,0]
    	

        if number == 1:
        	for i in range(8):
			GPIO.output(Segments[i], one[i])
	     		if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 2:
        	for i in range(8):
        		GPIO.output(Segments[i], two[i])
    			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 3:
        	for i in range(8):
        		GPIO.output(Segments[i], three[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 4:
        	for i in range(8):
        		GPIO.output(Segments[i], four[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 5:
        	for i in range(8):
        		GPIO.output(Segments[i], five[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 6:
        	for i in range(8):
        		GPIO.output(Segments[i], six[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 7:
        	for i in range(8):
        		GPIO.output(Segments[i], seven[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 8:
        	for i in range(8):
        		GPIO.output(Segments[i], eight[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 9:
        	for i in range(8):
        		GPIO.output(Segments[i], nine[i])
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)
        elif number == 0:
        	for i in range(8):
        		GPIO.output(Segments[i], zero[i]) 
			if i == 7 and dot == 1:
				GPIO.output(Segments[i], 1)      
        elif number == 10:
		for i in range(7):
			GPIO.output(Segments[i], n[i])
        elif number == 11:
		for i in range(7):
			GPIO.output(Segments[i], u[i])
        elif number == 12:
		for i in range(7):
			GPIO.output(Segments[i], l[i])
    

def display_digit(digit, number, dot):
    
	display_segment(number, dot)
	GPIO.output(Digits[digit], GPIO.LOW)
	time.sleep(0.0007)
	GPIO.output(Digits[digit], GPIO.HIGH)

def display_distance(number, type):
	#type = 0 => frecventa
	#type = 1 => cm
	if number < 1000:
		n3 = (int)((number * 10) % 10)
		n2 = (int)((number) % 10)
		n1 = (int)((number // 10) % 10)
		n0 = (int)(number // 100)
		#print("n0 =",n0," n1=",n1," n2=",n2," n3=",n3)
		if type == 1:	
			if n0 != 0:
				display_digit(0,n0,0)
			display_digit(1,n1,0)
			display_digit(2,n2,1)
			display_digit(3,n3,0)
		elif type == 0:
			if n0 !=0:
				display_digit(0,n0,0)
			elif n0 == 0:
				display_digit(0,0,0)	
			display_digit(1,n1,0)
			display_digit(2,n2,0)
			display_digit(3,10,0) #hertz

	if number>=1000:
		display_digit(0,10,0)
		display_digit(1,11,0)
		display_digit(2,12,0)
		display_digit(3,12,0)

def get_distance():
	GPIO.output(Trig, GPIO.HIGH)
	time.sleep(0.00001)
	GPIO.output(Trig, GPIO.LOW)

	start = time.time()
	stop = time.time()
	while GPIO.input(Echo) == 0:
		start = time.time()
	while GPIO.input(Echo) == 1:
		stop = time.time()

	duration = stop-start
	distance = 34300/2 * duration

	print ("Distance = %.2f" % distance)
	return distance
try:
	buzzer = 0
	freq = 0
	while True:
		sleeper = 0
		if buzzer == 0:
			distance = get_distance()
			if distance > 0 and distance < 150:
				freq = distance * 3
			elif distance > 500 and distance < 1000:
				freq = distance / 2
			elif distance > 1000:
				freq = 250
			elif distance > 150 and distance < 500:
				freq = distance
			
			while sleeper < 1500:
				display_distance(distance,1)
				sleeper = sleeper + 1
		if buzzer == 1:
			pi.hardware_PWM(Buzzer, freq, 500000)
			while sleeper < 500:
				display_distance(freq, 0)
				sleeper = sleeper + 1	
		if buzzer == 0:
			buzzer = 1
		elif buzzer == 1:
			buzzer = 0		
			pi.hardware_PWM(Buzzer,0,0)

except KeyboardInterrupt:
	pass

pi.hardware_PWM(Buzzer, 0, 0)

GPIO.cleanup()

Credits

Buhai Ioan
1 project • 0 followers

Comments