我正在使用PIR传感器连接我的树莓派......我编写了Python脚本来获取传感器的输入...现在我希望PHP中的python脚本的输出在我的网站中进一步操作...我试过了以下代码:这是PHP代码:
<?php
$output=shell_exec('python/sense1.py');
echo $output;
?>
这是Python代码:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
PIR_PIN = 26
GPIO.setup(PIR_PIN, GPIO.IN)
while True:
time.sleep(1)
if GPIO.input(PIR_PIN):
print ("Human Moving")
else:
print ("No human moving")
我在python中尝试了单个print语句并在PHP中获得了输出...但是现在问题是Python脚本每1秒无限地返回输出...所以我无法从python脚本获取输出(无限循环的becoz)...但是我希望每秒输出一次来检查PIR传感器的状态......我怎么能这样做?请帮帮我...
答案 0 :(得分:0)
我正在使用Raspberry PI的温度传感器做类似的事情。 我通过调用我使用python flask创建的REST API来有争议地获得房间的温度水平。
这里我在做什么(您只需要用传感器代码替换温度传感器代码)
我的python烧瓶代码:
@app.route('/room-temp') //This is my get rest endpoint, i call from php
@requires_auth //You dont need authentication, so you should remove this
def room_temp():
pi = pigpio.pi()
pigpio.exceptions = False
c, files = pi.file_list("/sys/bus/w1/devices/28-00*/w1_slave")
pigpio.exceptions = True
if c >= 0:
for sensor in files[:-1].split("\n"):
devid = sensor.split("/")[5] # Fifth field is the device Id.
h = pi.file_open(sensor, pigpio.FILE_READ)
c, data = pi.file_read(h, 1000) # 1000 is plenty to read full file.
pi.file_close(h)
if "YES" in data:
#gc.collect()
(discard, sep, reading) = data.partition(' t=')
t = float(reading) / 1000.0
#print("{} {:.1f}".format(devid, t))
data5 = {'temp':"{} {:.1f}".format(devid, t)}
pi.stop()
return jsonify(data5)
else:
#print("999.9")
#gc.collect()
data6 = {'temp':"999.9"}
return jsonify(data6)
我正在我的Raspberry中运行这个烧瓶api,我从我的PHP应用程序进行ajax调用。我从PHP中对http://raspberryip:port/room-temp进行AJAX调用。
注意:您需要查看REST,使用Python Flask(Link)的REST和来自PHP的AJAX。
这是从传感器获取结果的非常简单的方法,但问题是需要几毫秒才能将AJAX请求发送到用python烧瓶编写的REST端点。因此,您需要通过连续运行python脚本将每个传感器活动存储到本地数据库,并且您可以从该轻量级数据库中获取值。从Raspberry获取后,您可以从Raspberry中删除记录以忽略开销。
适用于传感器上的所有活动。
我的建议:请将传感器结果存储到本地数据库,然后编写REST端点以从DB获取记录。将您的AJAX调用从您的PHP应用程序放到该REST端点,以从该Raspberry的本地数据库获取数据。
答案 1 :(得分:-2)
在你的python脚本中,你应该将传感器值写在文本文件上(而不是显示它)并在循环中用php读取它。
或者只是从python脚本中删除循环。然后,当你启动你的python脚本时,它只会输出一个值,你将在php中执行你的脚本。问题是PHP将生成一次页面而不重新加载值。然后,您可以每秒重新加载页面以实现该值。