繁体   English   中英

使用Raspberry GPIO的Python和PHP

[英]Python and PHP using Raspberry GPIO

使用少量的Python脚本,我就能检测到连接在我的Raspberry板上的按钮状态。 这是脚本:

#!/usr/bin/env python

import os
import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        if(GPIO.input(12) == 1):
            print 'Btn on'
            os.system('date')
            time.sleep(5)
        else:
            os.system('clear')
            print 'Waiting'
    time.sleep(2)

except KeyboardInterrupt:
    GPIO.cleanup()  

这样,使用PuTTY或直接在Raspberry终端中,我可以轻松检测到此按钮的状态。

现在,我将用PHP创建相同的东西。 我需要创建一个PHP网页,该网页将位于我的Raspberry的var/www/html目录中,并且应该向我展示相同的内容。 当我按下按钮时,我将获得带有时间戳的简单回显“ Btn on”,如果未按下,则将获得带有“ Waiting”的另一个回显。 我以这种方式尝试直接exec PHP中的Python脚本:

$command = escapeshellcmd('sudo -u www-data python btn.py');
$output = shell_exec($command);
echo $output;

但它不起作用。 任何想法?

它不起作用,因为shell_exec在返回之前等待python脚本完成。 但是,由于无限循环,python脚本显然未到达末尾。 最简单的解决方法是使用python脚本轮询一次按钮状态,并在php中进行任何循环。 另外,python可以写入一个fifo文件,从该文件中可以读取php脚本-但是要小心,因为如果让python脚本运行,它将填充树莓派的内存。

例如,您必须从python代码段和Flask创建一个简单的Web API。
一条路线像:

@app.route('/')
def get_GPIO_state():
    # Your GPIO status verification code here
    return True  # return proper state here

在您的Web服务器以外的其他端口上公开此简单的Web API。 好处是您可以从单独或单个路由监视所需的GPIO。

现在,要使用一些javascript / jquery(或其他任何可以操纵您的网页的信息)来获取网页上的信息,请获取刚刚创建的路线并获取结果。
然后,您可以通过DOM操作更改网页的一部分内容,从而更新按钮状态。

否则,您可以从javascript(客户端这样)打开一个套接字,并使python脚本实时发送更新的数据。
要更新网页内容,采用与以前相同的方法。 (例如,基于getElementById()的操作DOM )。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM