ben de duyuyorum kalmak sinyali kaybetti düşünüyorum Değil bu sensör ile ilgili olarak mucking. Benim kodum sizinkine benziyor ve çalışabilmesi için zaman aşımı gerekmiyor. bulabilirim tek fark şudur:
while i< 1:
GPIO.output(GPIO_TRIGGER, False)
time.sleep(C.time['count'])
Ben uyku süresi burada ne kadar süreceğini bilmiyorum, ama o kadar soruna neden olduğunu olabilir. Tetikleyicinin yanlış ayarlanması benimkiyle aynı olacaksa, bunun yerine giriş/çıkış pimlerinin kurulumundan hemen sonra olacaktır ve daha sonra gürültüyü ortadan kaldırmak için iki saniye bekleyecektir. Bekleme süreniz daha düşük olabilir, anlatamam. Nabzını göndermeden hemen önce tetiği tekrar tetiklemeye gerek yoktur ve bilmiyorum, ama yanlış bir başlangıca neden olabilir. Benimkiyle benzer şekilde çalışmak için bunu değiştiririm ve sonra ayarı while döngüsünde false olarak kaldırırdım.
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
GPIO.output(GPIO_TRIGGER, False)
print("Waiting for sensor to settle\n")
time.sleep(2)
Bu durumun zaman aşımı gerekmeden sorunu çözüp çözemeyeceğinden emin değilim, ancak bir taneye ihtiyacım yok gibi görünüyor.
Sensörün bir nesnesini yapmak için bir modül yazdım ve ardından daha okunabilir bir komut dosyası oluşturulmasına izin verdim. Ben bu kadar eğlenceli hatalar bir yerde olabilir ayrıca tüm deneyimli programcı de piton ve oldukça yeniyim ama bunu kullanmak istiyorsanız aşağıdaki burada ya da sadece kod karşılaştırmak:
#! /usr/bin/python3
# dist.py this is a module for objectifying an ultrasonic distance sensor.
import RPi.GPIO as GPIO
import time
class Distancer(object):
#init takes an input of one GPIO for trigger and one for echo and creates the object,
#it searches for a calibration file in the working directory (name)Const.txt, if none
#is found it will initiate a calibration
def __init__(self, trig, cho, name):
self.trigger = trig
self.echo = cho
self.name = name
self.filename = self.name + 'Const.txt'
GPIO.setup(self.trigger, GPIO.OUT)
GPIO.setup(self.echo, GPIO.IN)
GPIO.output(self.trigger, False)
print("Waiting for sensor to calm down")
time.sleep(2)
try:
with open(self.filename, "r") as inConst:
self.theConst = int(inConst.read())
except (OSError, IOError) as e:
print("Not calibrated, initializing calibration")
self.calibrate()
with open(self.filename, "r") as inConst:
self.theConst = int(inConst.read())
#Returns the echo time
def measureTime(self):
GPIO.output(self.trigger, True)
time.sleep(0.00001)
GPIO.output(self.trigger, False)
while GPIO.input(self.echo) == 0:
pulse_start = time.time()
while GPIO.input(self.echo) == 1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
return pulse_duration
#Returns a distance in cm
def measure(self):
return self.measureTime() * self.theConst
#Makes you set up the sensor at 3 different distances in order to find the
#relation between pulse time and distance, it creates the file (name)Const.txt
#in the working directory and stores the constant there.
def calibrate(self):
ten = []
thirty = []
seventy = []
print("Make distance 10 cm, enter when ready")
input()
for i in range(30):
ten.append(10/self.measureTime())
time.sleep(0.2)
print("Make distance 30 cm, enter when ready")
input()
for i in range(30):
thirty.append(30/self.measureTime())
time.sleep(0.2)
print("Make distance 70 cm, enter when ready")
input()
for i in range(30):
seventy.append(70/self.measureTime())
time.sleep(0.2)
allTime = ten + thirty + seventy
theOne = 0.0
for i in range(90):
theOne = theOne + allTime[i]
theOne = theOne/90
with open(self.filename, "w") as inConst:
inConst.write(str(round(theOne)))
#Will continually check distance with a given interval until something reaches the
#treshold (cm), takes an argument to set wether it should check for something being
#nearer(near) or farther(far) than the treashold. Returns True when treshold is reached.
def distWarn(self, nearfar, treashold):
if nearfar.lower() == "near":
while True:
if self.measure() < treashold:
return True
break
time.sleep(0.2)
if nearfar.lower() == "far":
while True:
if self.measure() > treashold:
return True
break
time.sleep(0.2)
#Will measure with a second interval and print the distance
def keepGoing(self):
while True:
try:
print(str(round(self.measure())) + ' cm')
time.sleep(1)
except KeyboardInterrupt:
print("Won't keep going")
break
Ben yönetebilirim ettik Bunu test etmek için aşağıdaki kodla ve her şey işe yarıyor gibi görünüyor. İlk kez çalıştırıldığında, sensörü bir şeyden farklı mesafelere yerleştirerek kalibre etmenizi isteyecektir.
#! /usr/bin/python3
import RPi.GPIO as GPIO
import time
import dist as distancer
GPIO.setmode(GPIO.BOARD)
TRIG = 16
ECHO = 18
dist = distancer.Distancer(TRIG, ECHO, 'dist')
def main():
global dist
print(str(round(dist.measureTime(),5)) + ' s')
print(str(round(dist.measure())) + ' cm')
dist.distWarn('near', 10)
print('Warning, something nearer than 10 cm at ' + time.asctime(time.localtime(time.time())))
dist.distWarn('far', 10)
print('Warning, something further than 10 cm at ' + time.asctime(time.localtime(time.time())))
dist.keepGoing()
GPIO.cleanup()
print('Fin')
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
GPIO.cleanup()
print("Exiting")
time.sleep(1)
Bu soruya yardım edebilmek için çok geniştir .... ancak bazı olası nedenler şunlardır: Multimetre alınız ... kod çalışırken pimi ve toprağı ölçünüz, kod çalışırken, üzerinde herhangi bir osidasyon var mı? ya da her zaman sıfır mı? '(X == 0 iken)' her zaman doğru gibi görünüyor. Ardından, [ahududu mikroişlemcileri] için ayrılmış stackoverflow forumunu kontrol edin (http://raspberrypi.stackexchange.com/) – Bonatti