Python и PHP с использованием 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, которая будет в var/www/html каталог моей малины, и должен просто показать мне то же самое. Когда я нажимаю кнопку, я получаю простое эхо «Btn on» с отметкой времени, а если не нажата, просто еще одно эхо с «Ожиданием». Возможно ли это? Я пробовал напрямую exec скрипт Python на PHP следующим образом:

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

но это не работает Любая идея?

0

Решение

Это не работает, потому что shell_exec ожидает завершения сценария python, прежде чем он вернется. Тем не менее, скрипт Python явно не достигает конца из-за бесконечного цикла.
Простейшим решением было бы опросить состояние кнопки один раз с помощью скрипта Python и выполнить любой цикл в php. В качестве альтернативы питон может записывать в файл fifo, из которого может читать скрипт php, но тогда будьте осторожны, потому что, если вы оставите скрипт python запущенным, он заполнит память малины.

0

Другие решения

Вы должны создать простой веб-API из своего фрагмента Python и Flask например.
Единственный маршрут как:

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

Разместите этот простой веб-API на другом порту, чем ваш веб-сервер. Преимущество заключается в том, что вы можете отслеживать столько GPIO, сколько вам нужно, по отдельному или одному маршруту.

Теперь, чтобы получить информацию на вашей веб-странице, с помощью некоторого javascript / jquery (или чего-либо еще, что позволяет вам манипулировать вашей веб-страницей), получите только что созданный маршрут и получите результат.
Вы можете тогда с DOM манипулирование изменением содержимого части вашей веб-страницы, обновление статуса кнопки.

В противном случае вы можете открыть сокет из вашего javascript (на стороне клиента) и заставить ваш скрипт на python отправлять обновленные данные в режиме реального времени.
Для обновления содержимого веб-страницы применяется тот же метод, что и при предыдущей возможности. (что-то на основе getElementById() например манипулировать DOM).

Надеюсь, поможет.

0

По вопросам рекламы [email protected]