Одиночный ультразвуковой датчик для Raspberry pi 2B+ не работает от Pi Terminal

Я работал с 4-контактными ультразвуковыми датчиками HC-SRO4, до четырех одновременно. Я разрабатывал код для одновременной работы 4 из этих датчиков, и после реорганизации проводов для установки в проекте и использования базового кода для запуска одного из них я не могу настроить датчик. Код следует:

import RPi.GPIO as GPIO
import time

TRIG1 = 15
ECHO1 = 13
start1 = 0
stop1 = 0

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(TRIG1, GPIO.OUT)
GPIO.output(TRIG1, 0)

GPIO.setup(ECHO1, GPIO.IN)
while True:
       time.sleep(0.1)

       GPIO.output(TRIG1, 1)
       time.sleep(0.00001)
       GPIO.output(TRIG1, 0)

       while GPIO.input(ECHO1) == 0:
               start1 = time.time()
               print("here")

       while GPIO.input(ECHO1) == 1:
               stop1 = time.time()
               print("also here")
       print("sensor 1:")
       print (stop1-start1) * 17000

GPIO.cleanup()

После замены проводов, датчиков и других компонентов в цепи (включая выводы GPIO) я просмотрел код и добавил операторы печати в терминал, чтобы увидеть, какие части кода работают. 1-е печатное заявлениеprint("here")выполняется последовательно, но второй оператор печатиprint("also here") нет, и я затрудняюсь объяснить. Другими словами, почему второй цикл while не выполняется? Другие вопросы, задаваемые здесь, не сработали для моей проблемы. Любая помощь будет принята с благодарностью.

Спасибо, Х.

1 ответ

Решение

Вот учебник от Gaven MacDonald, который может помочь с этим: https://www.youtube.com/watch?v=xACy8l3LsXI

Прежде всего, блок while с ECHO1 == 0 будет цикл до тех пор, пока ECHO1 не станет 1. В этот период времени код внутри будет выполняться снова и снова. Вы не хотели бы устанавливать время снова и снова, поэтому вы можете сделать что-то вроде этого:

while GPIO.input(ECHO1) == 0:
    pass #This is here to make the while loop do nothing and check again.

start = time.time() #Here you set the start time.

while GPIO.input(ECHO1) == 1:
    pass #Doing the same thing, looping until the condition is true.

stop = time.time()

print (stop - start) * 170 #Note that since both values are integers, python would multiply the value with 170. If our values were string, python would write the same string again and again: for 170 times.

Кроме того, как лучший метод, вы должны использовать try кроме блоков для безопасного выхода из кода. Такие как:

try:
    while True:
        #Code code code...
except KeyboardInterrupt: #This would check if you have pressed Ctrl+C
    GPIO.cleanup()
Другие вопросы по тегам