首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GPIO按钮控制Raspbmc

使用GPIO按钮控制Raspbmc
EN

Stack Overflow用户
提问于 2013-09-10 09:50:15
回答 1查看 3.4K关注 0票数 1

我正在尝试为一个汽车xbmc项目编写代码。我制作了自己的带下拉电阻的按键键盘,并插入了GPIO端口。已安装python和GPIO插件。我的目标是捕捉按钮按下,如果按钮被按住1.5秒,它将对xbmc执行不同的命令(例如,如果按住右键,将跳到下一个曲目)。我不太熟悉Python,所以我花了相当长的时间才走到今天我选择使用GPIO.add_event_detect()函数,因为它有一个内置的去保释器,但我认为它是新的,因为我找不到很多使用它的例子。这就是抛出错误的原因:

代码语言:javascript
复制
Traceback (most recent call last):
  File "buttons.py", line 15, in <module>
    GPIO.add_event_detect(buttons[index], GPIO.RISING, bouncetime=200)
RuntimeError: Edge detection already enabled for this GPIO channel


#!/usr/bin/env python
import Rpi.GPIO as GPIO
import time, os, httplib, json
GPIO.setmode(GPIO.BCM)

buttons = [4, 17, 18, 22, 23, 24, 27]
numbuttons = len(buttons)
index = 0
for index in numbuttons:
    GPIO.setup(index, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

while True:
    index = 0
    for index in numbuttons:
        GPIO.add_event_detect(buttons[index], GPIO.RISING, bouncetime=200)
        if GPIO.event_detected(buttons[index]):
            time_pressed = time.time()
            GPIO.add_event_detect(buttons[index], GPIO.FALLING, bouncetime=200)
            if GPIO.event_detected(buttons[index]):
                time_released = time.time()
                if (time_released - time_pressed) >= 1.5:
                    button_held(index)
                else:
                    button_pressed(index)
    time.sleep(0.01)

def button_pressed(index):
    url = "/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22"
    url2 = ",%22id%22:1}"
    player = "Player.GetActivePlayers%22"
    playcode = "Player.PlayPause%22,%22params%22:{%22playerid%22:"
    guidecode = "Player.GetProperties%22,%22params%22:{%22playerid%22:"
    upcode = "Input.Up%22,%22params%22:{%22playerid%22:"
    downcode = "Input.Down%22,%22params%22:{%22playerid%22:"
    leftcode = "Input.Left%22,%22params%22:{%22playerid%22:"
    rightcode = "Input.Right%22,%22params%22:{%22playerid%22:"
    backcode = "Input.Back%22,%22params%22:{%22playerid%22:"
    conn = httplib.HTTPConnection("127.0.0.1:8080")
    if index == 0:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + guidecode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc guide")
    elif index == 1:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + leftcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc left")
    elif index == 2:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + playcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc play/pause")
    elif index == 3:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + upcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc up")
    elif index == 4:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + backcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc backspace")
    elif index == 5:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + downcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc down")
    elif index == 6:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + rightcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc right")

def button_held(index):
    url = "/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22"
    url2 = ",%22id%22:1}"
    player = "Player.GetActivePlayers%22"
    playcode = "Player.PlayPause%22,%22params%22:{%22playerid%22:"
    upcode = "Input.Up%22,%22params%22:{%22playerid%22:"
    downcode = "Input.Down%22,%22params%22:{%22playerid%22:"
    backcode = "Input.Back%22,%22params%22:{%22playerid%22:"
    nextcode = "Player.GoNext%22,%22params%22:{%22playerid%22:"
    prevcode = "Player.GoPrevious%22,%22params%22:{%22playerid%22:"
    shuffcode = "Player.Shuffle%22,%22params%22:{%22playerid%22:"
    mutecode = "Application.SetMute%22,%22params%22:{%22playerid%22:"
    conn = httplib.HTTPConnection("127.0.0.1:8080")
    if index == 0:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + shuffcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc guide")
    elif index == 1:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + prevcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc left")
    elif index == 2:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + playcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc play/pause")
    elif index == 3:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + upcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc up")
    elif index == 4:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + backcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc backspace")
    elif index == 5:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + downcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc down")
    elif index == 6:
        conn.request("GET", url + player + url2)
        r = conn.getresponse()
        j = json.loads(r.read())
        playeron = j["result"]
        if json.dumps(playeron) == "[]":
            conn.request("GET", url + "input.select%22" + url2)
            conn.close()
        else:
            playerid = json.dumps(j["result"][0]["playerid"])
            conn.request("GET", url + nextcode + playerid + "}" + url2)
            conn.close()
        conn.close()
        print("execute xbmc right")
EN

回答 1

Stack Overflow用户

发布于 2013-09-11 11:23:02

我认为我只是点击该命令并弹出错误,但我是首先迭代循环。这是有意义的,因为事件捕获器不能多次打开。我只是简单地编辑了我的代码来初始化它,并添加了一个新的事件检测,只有当按钮被按下的时候。我还清理了我在XBMC论坛上找到的代码,它可以正常工作。

代码语言:javascript
复制
import Rpi.GPIO as GPIO
import time, os, httplib, json, requests, pdb
from requests.auth import HTTPBasicAuth
GPIO.setmode(GPIO.BCM)

def main():
    buttons = [4, 17, 18, 22, 23, 24, 27]
    numbuttons = len(buttons)
    index = 0
    for index in range(numbuttons):
        GPIO.setup(buttons[index], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(buttons[index], GPIO.RISING, bouncetime=200)
    while True:
        index = 0
        for index in range(numbuttons):
            if GPIO.event_detected(buttons[index]):
                GPIO.remove_event_detect(buttons[index])
                time_pressed = time.time()
                GPIO.wait_for_edge(buttons[index], GPIO.FALLING)
                time.sleep(0.01)
                time_released = time.time()
                if (time_released - time_pressed) >= 1.5:
                    button_held(index)
                else:
                    button_pressed(index)
                GPIO.add_event_detect(buttons[index], GPIO.RISING, bouncetime=200)
        time.sleep(0.01)

def button_pressed(index):
    url = 'http://192.168.1.138:8888/jsonrpc'
    postheaders = {'content-type': 'application/json'}
    command = {"jsonrpc":"2.0", "id": 1, "method": ""}
    if index == 0:
        command['method'] = 'Input.Select'
        print("execute xbmc guide")
    elif index == 1:
        command['method'] = 'Input.Left'
        print("execute xbmc left")
    elif index == 2:
        command['method'] = 'Input.Info'
        print("execute xbmc play/pause")
    elif index == 3:
        command['method'] = 'Input.Up'
        print("execute xbmc up")
    elif index == 4:
        command['method'] = 'Input.Back'
        print("execute xbmc backspace")
    elif index == 5:
        command['method'] = 'Input.Down'
        print("execute xbmc down")
    elif index == 6:
        command['method'] = 'Input.Right'
        print("execute xbmc right")
    resp = requests.post(url, auth=('xbmc','xbmc'), data=json.dumps(command), headers=postheaders)

def button_held(index):
    url = 'http://192.168.1.138:8888/jsonrpc'
    postheaders = {'content-type': 'application/json'}
    command = {"jsonrpc":"2.0", "id": 1, "method": ""}
    if index == 0:
        command['method'] = 'Player.PlayPause'
        print("execute xbmc shuffle")
    elif index == 1:
        command['method'] = 'Player.GoNext'
        print("execute xbmc left")
    elif index == 2:
        command['method'] = 'Player.SetMute'
        print("execute xbmc play/pause")
    elif index == 3:
        command['method'] = 'Input.SetShuffle'
        print("execute xbmc up")
    elif index == 4:
        command['method'] = 'Input.Back'
        print("execute xbmc backspace")
    elif index == 5:
        command['method'] = 'Input.SetRepeat'
        print("execute xbmc down")
    elif index == 6:
        command['method'] = 'Player.GoPrevious'
        print("execute xbmc right")
    resp = requests.post(url, auth=('xbmc','xbmc'), data=json.dumps(command), headers=postheaders)
if __name__ == '__main__':
    main()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18709572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档