Pertanyaan saya adalah: GPIO.add_event_detect() mendeteksi Rising edge palsu terus menerus dalam infinite loop dan menjalankan fungsi call_back() tanpa batas meskipun saya tidak menekan tombol tekan yang terhubung ke GPIO 25 bahkan sekali Tapi fungsi call_back() terus dijalankan.

Ini kode saya, di mana saya ingin memanggil fungsi call_back x1() yang berisi fungsi WhatsApp(lat_o,long_o) hanya ketika tombol ditekan tetapi WhatsApp(lat_o,long_o) terus berjalan tanpa saya menekan tombol. Juga, saya menempatkan WhatsApp(lat_o,long_o) di dalam x1() untuk menghilangkan masalah melewatkan argumen ke fungsi call_back.

#                           INTERRUPTS (NOT WORKING)

# Sample Coordinates
lat_o=33
long_o=72

# Import Libraries
import RPi.GPIO as GPIO
from time import sleep

def x1(channel):
    WhatsApp(lat_o,long_o)

# Configure GPIO of Rpi
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BCM) # Use GPIO pin numbering
button1 = 25 # For WhatsApp

# Setup GPIO for Whatsapp
GPIO.setup(button1, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # Set GPIO 25 (pin 22) to be an input pin for WhatsApp

# Detect button1-press
GPIO.add_event_detect(button1 ,GPIO.RISING, callback = x1)


try:  
    while True : pass  
except:
    GPIO.cleanup()

Tolong bantu! Saya tidak ingin menjalankan WhatsApp(lat_o,long_o) menggunakan Polling (yaitu, menggunakan if-else dalam loop sementara) di Kode Akhir saya untuk Proyek Tahun Terakhir saya karena saya ingin GPIO mendeteksi penekanan tombol terus menerus dan menggunakan Polling di sini akan menguras banyak daya Raspberry Pi 4 saya.

0
Afaq Khan 12 Mei 2021, 15:47

1 menjawab

Jawaban Terbaik

Menurut ini diskusi tentang diskusi raspsberrypi

Tepi naik akan terdeteksi pada kira-kira. 1.25V. Namun, ketika tegangan turun lagi dan tegangan input turun di bawah level 1.16V, aliran interupsi akan dimulai, dan berlanjut hingga level di bawah 1.12V.

Ini paling dramatis ketika ada tepi naik atau turun yang lebih lambat, sebagai contoh, ketika tindakan anti-debounce yang berlebihan telah diambil.

Ini adalah solusi yang diberikan

Dalam perangkat lunak, saya menggunakan dua teknik lain untuk menghilangkan hit palsu. Pertama, setelah edge dikenali oleh sistem, kita tidak tahu apakah itu yang kita harapkan. Dengan menunggu 5mSec, dan kemudian membaca input lagi tetapi sekarang dengan perintah Level Logika, kita dapat menentukan apakah edge memang sesuai dengan yang kita harapkan dan kemudian kita menghindari dan membuang semua edge (false) lainnya.

Dan akhirnya kode untuk naik tepi

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

Input_Sig = 23 # any plain GPIO pin
# if there is no external pull, use the internal one (pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Input_Sig, GPIO.IN)


def interrupt_service_routine(Input_Sig):
    sleep(0.005) # edge debounce of 5mSec
    # only deal with valid edges
    if GPIO.input(Input_Sig) == 1:
        print("RISING")
    return

# define the event; bountime of 5mSec means that subsequent edges will be ignored for 5mSec
GPIO.add_event_detect(Input_Sig, GPIO.RISING, callback=interrupt_service_routine, bouncetime=5)


def main():

    try:
        while True:
            pass # your code

    except KeyboardInterrupt:
        pass
    finally:
        print("\nRelease the used pin(s)")
        GPIO.cleanup([Input_Sig])


if __name__ == '__main__':
    main()
0
kinshukdua 12 Mei 2021, 12:58