Raspberry Pi addEvent. Ошибка времени выполнения: не удалось добавить определение края - PullRequest
0 голосов
/ 11 ноября 2018

Я пишу код Python на Raspberry Pi 3. Я регистрирую событие на входном канале 21, чтобы проверить обнаружение влаги. Я получаю эту ошибку Ошибка времени выполнения: не удалось добавить обнаружение края. Мой код:

import RPi.GPIO as GPIO
import sys,os
import time
import datetime


channel = 21
led_output = 18
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.IN)
GPIO.setup(led_output, GPIO.OUT)


def callback(channel):
    filehandle = open("output.txt", "w") or die ("Could not write out")
    if GPIO.input(channel) == 1:
        print ("Water Detected!")
        filehandle.write("1")
        GPIO.output(led_output, GPIO.LOW)
    else:
        print ("Water Not Detected!")
        filehandle.write("0")
        GPIO.output(led_output, GPIO.HIGH)
    filehandle.close()




 GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300)   
 GPIO.add_event_callback(channel, callback)  

    print(GPIO.input(channel))

    while True:
        time.sleep(5)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Это не очень чистое решение, но вы также можете вызвать GPIO.cleanup() в начале вашего скрипта и в том случае, если ваш процесс был убит ранее и GPIO.cleanup() не был вызван.

0 голосов
/ 11 ноября 2018

Когда я перезагружаю Raspberry и запускаю твой код, он работает отлично. Проблема / ошибка возникает только после того, как процесс или клавиатура CTRL-C прервана и снова запущена. Я думаю, что это связано с тем, что вы выходите из программы без очистки должным образом ... Это работает, если вы выходите из запущенной программы с помощью CTRL-C с кодом ниже, в который я включил GPIO.cleanup () Однако ... это, к сожалению, не распространяется на ситуацию, в которой вы просто убиваете запущенную программу ... В этом случае вам все равно нужно перезагрузиться. Так что есть возможности для улучшения. Пожалуйста, заново вставьте свои собственные команды управления файлами.

import RPi.GPIO as GPIO  
import sys,os
import time
import datetime

channel = 21
led_output = 18
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(channel, GPIO.IN)
GPIO.setup(led_output, GPIO.OUT)

def callback(channel):
    if GPIO.input(channel) == 1:
        print ("Water Detected!")
        GPIO.output(led_output, GPIO.LOW)
    else:
        print ("Water Not Detected!")
        GPIO.output(led_output, GPIO.HIGH)

GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300)   
GPIO.add_event_callback(channel, callback)  
print(GPIO.input(channel))


try:
    while True:
        #main loop here with some (dummy) code
        eg_set_a_dummy_variable = 0

except KeyboardInterrupt:  
    # here you put any code you want to run before the program   
    # exits when you press CTRL+C  
    print ("Program interrupted by CTRL-C")

except:  
    # this catches ALL other exceptions including errors.  
    # You won't get any error messages for debugging  
    # so only use it once your code is working  
    print ("Other error or exception occurred!") 

finally:
     # this ensures a clean exit and prevents your
     # error "Runtime error:Failed to add edge detection"
     # in case you run your code for the second time after a break
    GPIO.cleanup()

     # credits to:
     # https://raspi.tv/2013/rpi-gpio-basics-3-how-to-exit-gpio-programs-cleanly-avoid-warnings-and-protect-your-pi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...