1

我想检查是否使用 charlieplexing 按下按钮。为了测试,我使用了 19 个按钮。完全像在这张图片中一样连接它们,但每段有 4 个按钮,有 5 个段(5 个二极管):在此处输入图像描述

我创建了这段代码:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
pins = [5, 6, 13, 19, 26]
GPIO.setup(pins, GPIO.IN, pull_up_down=GPIO.PUD_UP)
outputs = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

while True:
        for pin in pins:
                GPIO.setup(pin, GPIO.OUT)
                GPIO.output(pin, GPIO.LOW)
                segment = pins.index(pin)
                pinsTemp = list(pins)
                pinsTemp.remove(pin)
                for pinTemp in pinsTemp:
                        button = pinsTemp.index(pinTemp)
                        if GPIO.input(pinTemp) == GPIO.LOW:
                                outputs[segment][button] = 1;
                        else:
                                outputs[segment][button] = 0;
                GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        print outputs;
        time.sleep(0.1);

当我只按下一个按钮时工作正常,但在按下其中两个按钮后,我得到一个响应,即按下了四个按钮。例子:

S1S2

输出:[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1]]

S1S3

输出:[[0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 1]]

我已经尝试使用 HIGH 和 LOW 进行检测(在这两种情况下都尝试了反向二极管)。结果相同。对于二极管,我使用的是 1N4148。这与我的连接有关还是我的代码不好?或者有没有更好的解决方案?

4

1 回答 1

0

当您从列表中“删除”时,您会得到一个带有新索引的新列表。
但是您不必制作临时列表。
我可以尝试这样的事情:

while True:
    for segment, pin in enumerate(pins):
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)
        for idx, button in enumerate(pins):
            if idx==segment:
                continue
            if GPIO.input(button) == GPIO.LOW:
                outputs[segment][idx] = 1
            else:
                outputs[segment][idx] = 0
        GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    print(outputs)
    time.sleep(0.1)

顺便说一句,您使用的二极管类型不会改变任何东西。☺

于 2019-12-20T13:11:10.200 回答