首页 > 解决方案 > 从字典运行 GPIO 命令

问题描述

我正在发布/订阅树莓派和远程网络服务器之间的消息/订阅消息。当我使用 mqtt 向 pi 发送消息时,我正在发送一个以我要运行的 pi 上的通道命名的字符串。我在名为pump1,pump2等的脚本中有变量,它们具有各自的 RPi 通道。我有一本字典,键是我要打开的 RPi 通道,值是执行此操作的 GPIO 命令。mqtt 消息应该与字典键匹配。如果键匹配,我想运行与该键关联的值。

下面是我的字典。当我访问字典时None,如果我不将它们用引号括起来,我会得到这些值。当我在 GPIO 命令周围用作字符串时,我无法运行该命令。有人知道运行这些命令吗?

我也试过运行这样的东西。此方法不起作用,因为 pump1 不是一个整数,表示要打开 pi 的哪个通道,但我有名为 pump1、pump2 等的变量与 RPi 通道相关联,所以我认为它可能有效,但 python 仍然看到的是一个字符串.

mqtt.message = ['pump1','on']
GPIO.output(mqtt.message[0], False)

字典:

pumps = {
    "pump1:on": GPIO.output(pump1,False),
    "pump1:off": GPIO.output(pump1,True),
    "pump2:on": GPIO.output(pump2,False),
    "pump2:off": GPIO.output(pump2,True),
    "pump3:on": GPIO.output(pump3,False),
    "pump3:off": GPIO.output(pump3,True),
    "waterpump:on": GPIO.output(waterpump,False),
    "waterpump:off": GPIO.output(waterpump,True),
}

标签: pythondictionaryraspberry-pi

解决方案


他们目前指定的方式将导致在构建pumps字典期间调用函数。相反,您希望将键的字典存储到函数中,然后在需要时调用它们。我们可以lambda为此使用 s。这是一个简化的示例:

funcs = {
    'print_int': lambda: print(1),
    'print_string': lambda: print("one"),
    'print_list': lambda: print([]),
}

然后,您可以通过使用键索引并调用函数来调用 then,如下所示:

>>> funcs['print_int']()
1
>>> funcs['print_string']()
one
>>> funcs['print_list']()
[]

您还可以拥有带参数的函数,如下所示:

funcs = {
    'print_num': lambda num: print(num),
}

>>> funcs['print_num'](123)
123

对于您的用例,使用参数,这可能看起来像

pumps = {
    "pump1": lambda state: GPIO.output(pump1, not state),
}

pumps['pump1'](True)  # to turn pump on

或者如果您不想使用参数,只需:

pumps = {
    "pump1:on":  lambda: GPIO.output(pump1, False),
    "pump1:off": lambda: GPIO.output(pump1, True),
}

推荐阅读