Raspberry PI GPIO add_event_detect按一个按钮触发多个频道

时间:2017-12-11 21:52:33

标签: python raspberry-pi gpio

项目: 我正在创建一个灯开关面板来控制我的LIFX WiFi灯。我有3个按钮连接到GPIO引脚6,20和22,我按下按钮时使用GPIO.add_event_detect进行捕获。

问题: 我的问题是,如果我按下一个按钮,有时它会触发一个或多个其他频道。例如,按下按钮通道6也将触发20和/或22.奇怪的是,它在80%的时间内完美地工作,所以我真的不相信它的任何物理信号,如信号穿过电线。我已经开了两个星期了。

我尝试过的事情:最初我制作了一个小型的原型板,我将其焊接到一个40针的头部,我认为有可能有一根电线正在穿过导致这个幻象按钮按下。然后我在亚马逊上买了一块20美元的电路板,每个GPIO引脚都有螺丝端子......同样的问题。我尝试将我正在使用的GPIO引脚切换到电路板上,以防万一它们正在穿越。

我已尝试更新GPIO库,但我有最新版本。

我尝试过不同的按钮,看看它们是否有问题。

我已经检查过,按下一个按钮不会使其他按钮摆动到足以触发它们。

我已尝试使用GPIO.input(频道)查看按钮是否在buttonPressed回调中被按下但多次没有按下按钮按下按钮(即使是我实际按下的按钮)。

我尝试删除LIFX局域网库和我启动的TCP服务器的其他代码。

按钮被拧成一块木头,它们之间有几英寸,所以我知道电线没有穿过那里。

接下来我要尝试换到另一个PI,但是我把所有东西都搞砸到一个柜子里很难到达。

设置: Raspberry Pi 2 B + Python 2.7 enter image description here

代码: 我省略了不相关的代码,以便于阅读

import os
import sys
from time import sleep
import time
import random
import threading
import json
import itertools, glob
from socket import error as SocketError
from TcpClient import *
from lifxlan import BLUE, CYAN, GREEN, LifxLAN, ORANGE, PINK, PURPLE, RED, YELLOW
from itertools import cycle
import RPi.GPIO as GPIO

BUTTON_1 = 6
BUTTON_2 = 20
BUTTON_3 = 22

# Setup Network
HOST = ''
PORT = 9998

GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(BUTTON_2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(BUTTON_3, GPIO.IN, pull_up_down=GPIO.PUD_UP)

lifx = None
currentScene = None

def stopScene():
    ...

def setScene(lan, scene):
    ...

def lightsOn(lan):
    ...

def lightsOff(lan):
    ...

class Message(object):
    ...

class Client(threading.Thread):
    ...

class Server(object):
    ...

def buttonPressed(channel):
    global lifx
    global currentScene
    global BUTTON_1
    global BUTTON_2

    print("Button Pressed: " + str(channel));

lifx = LifxLAN(None)
print("Discovering Lights...")
numLights = len(lifx.get_lights())
print("Lights discovered: " + str(numLights))

GPIO.add_event_detect(BUTTON_1, GPIO.RISING, callback=buttonPressed, bouncetime=1000)
GPIO.add_event_detect(BUTTON_2, GPIO.RISING, callback=buttonPressed, bouncetime=1000)
GPIO.add_event_detect(BUTTON_3, GPIO.RISING, callback=buttonPressed, bouncetime=1000)

server = Server(HOST, PORT)
server.start(10)

示例输出:仅按按钮6(图片中的左按钮)

Discovering Lights...
Lights discovered: 2
[SERVER] Starting...
[SERVER] Listening
Button Pressed: 6
Button Pressed: 20

示例输出:再次按下按钮6

Discovering Lights...
Lights discovered: 0
[SERVER] Starting...
[SERVER] Listening
Event: 22
Event: 20
Event: 6

0 个答案:

没有答案