【问题标题】:Raspberry Pi and Django - Background check GPIO ButtonRaspberry Pi 和 Django - 背景检查 GPIO 按钮
【发布时间】:2017-03-27 10:18:02
【问题描述】:

我很难让这个东西正常工作。 基本上我有我的树莓派,apache 和 django 运行良好,在我看来,我可以使用 gpiozero 打开和关闭 LED,我几乎可以做所有 输出 的事情想要用 gpio 引脚。

但有一点我不能做:如何从 gpio 引脚获取 输入

我尝试设置 Celery,但有 2 个问题,我无法让它按我想要的方式工作(经过 3 天的测试,寻找 10 个不同的指南,甚至是官方指南),而且它并没有完全符合我的要求。只有在 django 视图中调用 Celery 才能执行后台进程。

我想要做的是拥有一个 24/24 运行的后台进程来监视 pin 输入活动。简单的例子: 当按下 gpio 23 上连接的按钮时,更改 django 模型中的值或打开另一个 gpio 引脚。

有提示的人吗?谢谢大家!

【问题讨论】:

    标签: python django background raspberry-pi2 gpio


    【解决方案1】:

    我使用过 Django 和 Celery,但没有使用过 Raspberry Pi,因此这可能不是一个理想的解决方案。由于您尚未提供代码,因此我将尝试概述您将如何创建此功能。

    1. 设置您的 Django 应用程序和 Celery 集成

    2. 创建 Celery 任务以在调用时修改您的 django 模型值

    3. 创建一个新脚本并从您的 Django 项目中导入 celery 任务

    4. 在您的脚本中实现一个触发 Celery 作业的函数

    5. 创建一个按钮对象并将对您的函数的调用添加到 on_pressed 方法(见下文)

    6. 运行您的脚本

    基于来自this 文章的代码。

    from gpiozero import Button
    from signal import pause
    
    def trigger_celery_task():
        # Add the code to create a new task here
    
    button = Button(2)
    
    button.when_pressed = trigger_celery_task
    
    # Wait for events
    pause()
    

    【讨论】:

    • 那么,这个脚本会一直在后台运行吗?这似乎是一个很好的解决方案,我必须让芹菜工作。目前我真的不能让它工作
    • 正确。你需要这个脚本在后台运行,还有一个 celery worker 在后台运行。
    【解决方案2】:

    您可以使用GPIOZero Button Interface 来检查按钮何时被点击。在这里,每次单击按钮时,都会自动调用函数toggleLight。现在,在这个函数中,你可以操作你的 django 模型等。

    from gpiozero import LED, Button  #IMPORTS FOR GPIOZERO
    
    # ADD THIS CODE TO YOUR DJANGO APPLICATION OUTSIDE ANY FUNCTION
    
    state = 0
    
    led = LED(17) #LED TO GPIO17
    button = Button(23) #BUTTON TO GPIO23
    
    def toggleLight():
    
        # DO ANY DJANGO RELATED CHANGES HERE, CHANGE VARIABLES ETC.
    
        # TOGGLE THE LED CONNECTED TO GPIO17
        if (state == 0): #CURRENTLY OFF
            led.on()
            state = 1 
        else: #CURRENTLY ON
            led.off()
            state = 0
    
    button.when_pressed = toggleLight  #EACH TIME THE BUTTON IS PRESSED, THE FUNCTION TOGGLELIGHT IS CALLED
    
    #ENDS HERE
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      尝试使用“GPIO.add_event_detect”功能来定义输入更改时要调用的函数。见https://pypi.python.org/pypi/RPi.GPIO/0.5.1a

      初始化 add_event_detect 功能时要小心,因为如果您不能确保此功能仅在一个进程中初始化一次,您将对该函数进行多次调用(每个进程调用一次) https://raspberrypi.stackexchange.com/questions/8584/multiple-gpio-add-event-detect-one-callback-function

      问候,祝你好运!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多