Raspberry GPIOs mit PHP schalten

Die einfachste Methode ist die, dass wir dem www-data User (unter welchem der Apache und auch die PHP Skripte laufen in die GPIO gruppe aufnehmen. Dabei ist zu beachten, dass dies ggf. ein Sicherheitsrisiko darstellt.

[sourcecode language=“plain“]sudo usermod -aG gpio www-data
sudo usermod -aG gpio pi
sudo /etc/init.d/apache2 restart[/sourcecode]

PHP Beispiel für REST mit Json response

[sourcecode language=“php“]<?php
// Valid GPIOS
$C["GPIOS"] = Array(17,22);

$mode = @$_GET["mode"];
switch($mode){
case "SWGPIO": $on = intval(@$_GET["on"]);
$id = intval(@$_GET["id"]);
SwitchGPIO($id, $on);
break;

case "GETGPIO": $id = intval(@$_GET["id"]);
GetGPIO($id);
break;
}

function GetGPIO($id){
global $C;
if(!in_array($id, $C["GPIOS"])){
Status(false, "GPIO $id not allowed.");
}
if(!is_dir("/sys/class/gpio/gpio$id/")){
Status(false,"GPIO $id not active.");
}
$fn = "/sys/class/gpio/gpio$id/value";
if(!file_exists($fn)){
Status(false, "GPIO $id Valuefile does not exist.");
}
$val = trim(file_get_contents($fn));
Status(true,$val);
}
function SwitchGPIO($id, $on){
// Vorher beim Booten Berechtigungen setzen!
// sudo usermod -aG sudo usermod -aG gpio www-data

global $C;
if(!in_array($id, $C["GPIOS"])){
Status(false, "GPIO $id not allowed.");
}
if(!in_array($on, Array(0,1))){
Status(false, "GPIO status $on not allowed.");
}
// check if GPIO is open
if(!is_dir("/sys/class/gpio/gpio$id/")){
file_put_contents("/sys/class/gpio/export",$id);
sleep(1);
file_put_contents("/sys/class/gpio/gpio$id/direction","out");
}
if(!is_dir("/sys/class/gpio/gpio$id/")){
Status(false,"Cannot access GPIO $id");
}

// Set correct status
$fn = ‚/sys/class/gpio/gpio‘.$id.’/value‘;
$val = file_get_contents($fn);
if($val == $on){
Status(true, "Switch status already $on");
}
file_put_contents($fn,$on);
usleep(250000);
// Check status
$val = file_get_contents($fn);
if($val == $on){
Status(true, "Switch status now: $on");
} else {
Status(false, "Switch status wrong");
}
}

Status(false,"Wrong Parameters");

function Status($stat, $txt){
$ret["STATUS"] = ($stat)? "OK" : "ERROR";
$ret["MSG"] = $txt;
echo json_encode ($ret);
die;
}

function warning_handler($errno, $errstr) {
echo $errno;
return false;
}
?>
[/sourcecode]

GPIOs sollten jedoch bereits beim Neustart des Raspberry initialisiert werden
dazu ein Script anlegen und ggf. anpassen: im pi home:

[sourcecode language=“plain“]nano ~/init_gpio[/sourcecode]

Inhalt:

[sourcecode language=“plain“]#!/bin/bash

#Init GPIOS on Startup with Script
#Ohne SUDO gehen die Befehle nur wenn pi Mitglied der Gruppe gpio ist.
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "0" > /sys/class/gpio/gpio17/value[/sourcecode]

Script Berechtigungen:

[sourcecode language=“plain“]sudo chmod u+x ~/init_gpio[/sourcecode]

Autostart mit der crontab des pi

[sourcecode language=“plain“]crontab -e -u pi[/sourcecode]

letzte Zeile anfügen:

[sourcecode language=“plain“]@reboot ~/init_gpio[/sourcecode]

Prüfen ob alles OK:

[sourcecode language=“plain“]crontab -l -u pi[/sourcecode]

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.