I am working on a project which sensed four speed by using hall sensor attached to wheel by using raspberry pi.
I have wrote program for that only issue with that it gives fairly good results when wrote program for one sensor, and when using all sensor (using interrupt add_event_detect by pull up resistor), readings are quite different either one or for every sensor. One thing I noticed is that it gives good results when I run 4 program for 4 sensor differently. So I conclude that may be the issue is to convert code to multithread or something schedule task one sensor to another until first is finished.
One more issue it never gives 0 value even I unplugged sensor (I know the reason behind it there is no statement in code to do that) actually I don't know much coding hence help me to figure out this problem.
import RPi.GPIO as GPIO
import time
import requests
import sys
import csv
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
distance1 = 0
distance2 = 0
distance3 = 0
distance4 = 0
rps1 = 0.00
rps2 = 0.00
rps3 = 0.00
rps4 = 0.00
speed1 = 0.00
speed2 = 0.00
speed3 = 0.00
speed4 = 0.00
start_time1 = 0.00
start_time2 = 0.00
start_time3 = 0.00
start_time4 = 0.00
end_time1 = 0.00
end_time2 = 0.00
end_time3 = 0.00
end_time4 = 0.00
wheel_c = 2.874
hall1 = 2
hall2 = 3
hall3 = 20
hall4 = 21
elapse1 = 0.00
elapse2 = 0.00
elapse3 = 0.00
elapse4 = 0.00
GPIO.setup(hall1, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(hall2, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(hall3, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(hall4, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
def get_pulse1(number):
global elapse1, distance1, start_time1, end_time1, speed1, rps1
while GPIO.input(hall1) == 0:
start_time1 = time.time()
while GPIO.input(hall1) == 1:
end_time1 = time.time()
elapse1 = end_time1 - start_time1
rps1 = (1/elapse1) / 2
speed1 = (rps1*1293)/10000
distance1 += 1.293 * elapse1
def get_pulse2(number):
global elapse2,distance2,start_time2,end_time2,speed2,rps2
while GPIO.input(hall2) == 0:
start_time2 = time.time()
while GPIO.input(hall2) == 1:
end_time2 = time.time()
elapse2 = end_time2 - start_time2
rps2 = (1/elapse2) / 2
speed2 = (rps2*1293)/10000
distance2 += 1.293 * elapse2
def get_pulse3(number):
global elapse3,distance3,start_time3,end_time3,speed3,rps3
while GPIO.input(hall3) == 0:
start_time3 = time.time()
while GPIO.input(hall3) == 1:
end_time3 = time.time()
elapse3 = end_time3 - start_time3
rps3 = (1/elapse3) / 2
speed3 = (rps3*1293)/10000
distance3 += 1.293 * elapse3
def get_pulse4(number):
global elapse4,distance4,start_time4,end_time4,speed4,rps4
while GPIO.input(hall4) == 0:
start_time4 = time.time()
while GPIO.input(hall4) == 1:
end_time4 = time.time()
elapse4 = end_time4 - start_time4
rps4 = (1/elapse4) / 2
speed4 = (rps4*1294)/10000
distance4 += 1.294 * elapse4
try:
print('1 seconds...')
time.sleep(1)
GPIO.add_event_detect(hall1,GPIO.FALLING,callback = get_pulse1,bouncetime=20)
GPIO.add_event_detect(hall2,GPIO.FALLING,callback = get_pulse2,bouncetime=20)
GPIO.add_event_detect(hall3,GPIO.FALLING,callback = get_pulse3,bouncetime=20)
GPIO.add_event_detect(hall4,GPIO.FALLING,callback = get_pulse4,bouncetime=20)
while True:
print(speed1,speed2,speed3,speed4)
time.sleep(2) #to reduce CPU load, print every 100 milliseconds
data = str(speed1) + "@" + str(speed2) + "@" + str(speed3) + "@" + str(speed4)
with open('test.csv', "a") as file:
writer = csv.writer(file)
writer.writerow([time.ctime(),speed1,distance1,speed2,distance2,speed3,distance3,speed4,distance4])
try:
r = requests.post('http://dgprojects.co.in/Park/Hardware.php',params={'sensor': data})
a = (r.text[0:1500])
except:
print("exeption");
except KeyboardInterrupt:
print('You have pressed Ctrl+C! How dare you stopped this beautiful thing?!')
GPIO.cleanup()