De GPIO poorten met PHP besturen

Het is erg leuk om de Raspberry Pi met een PHP script dat op een webserver staat te besturen. Oftewel GPIO van de Raspberry Pi via je smartphone te bedienen. Dit kan een lamp zijn, maar ook de pomp van de vijver of het openen van een deur. Het project komt erg in de buurt komt van het domotica principe. Omdat het een groot en complex project betreft, raad ik het project aan voor gevorderden.

First things first!
Voor deze tutorial heb je de installatie van WiringPi en een (Apache) webserver met een PHP bibliotheek nodig. Mocht je dit project willen doen, zal je eerst deze twee onderdelen moeten installeren. Je vindt de tutorials in de links of op deze website bij Projecten.

Let op! Om PHP te installeren moet de Raspberry Pi van Raspbian versie 10 (Buster) voorzien zijn!

Heb je nog geen buster? Kijk dan hier hoe je kunt upgraden naar Raspbian Buster

Een beetje theorie
Het uitvoeren van een PHP code kan met twee verschillende functies: exec (voor execute) en system.

Allereerst, de “system” functie. Het heeft twee parameters nodig: “system ( string $command, int $return_var )“, zoals verondersteld, de eerste parameter is het commando om uit te voeren en het tweede commando is de return status van het uitgevoerde commando. De tweede parameter is niet verplicht. Je kunt deze functie gebruiken als je geen antwoord verwacht van het uitvoerende commando. Je kunt deze gebruiken als je uit wilt voeren het commando: “gpio mode 0 out” of “gpio write 0 1

Voorbeeld:

<?php

     system ( “gpio mode 0 out” );

     system ( “gpio write 0 1” );

?>

Ten tweede, de “exec” functie. Deze functie doet exact hetzelfde als “system”, maar het leest en bewaart wat het commando afdrukt. Het heeft drie parameters nodig: “exec ( string $command, array $output, int $return_var )”.

$command en $return_var zijn dezelfde parameters. Het enige verschil is de $output reeks.

Zoals de naam al aangeeft zal “exec“de output van het commando in een reeks opslaan. Je kunt deze functie gebruiken als je behoefte hebt aan wat de opdracht afdrukt zoals met het “gpio read 0” commando.

In onderstaand voorbeeld wordt de status van GPIO 0 afgebeeld.

LEDs 0 tot 7 schakelen (zie WiringPi)
Je kunt nagenoeg alle commando’s uitvoeren die je maar wilt. Laten we een stukje PHP in praktijk brengen: We schakelen LEDs 0 tot 7 in zoals we deze bij de tutorial WiringPi aangesloten hebben, wachten een seconden en schakelen ze dan uit. Net zoals we dit deden met het bash script bij de tutorial van WiringPi. Bewerk met nano het index.php bestand met de volgende code:

Wil je de poorten apart in- en uitschakelen en de status uitlezen? Download dan hier het PHP pakket en zet deze in de directory /var/www/html/. Door in de browser ze apart op te roepen kun je de GPIO poorten HOOG of LAAG maken en ook nog eens de STATUS ervan uitlezen.

Het bouwen van de interface

Als het goed is kunnen we nu de Raspberry Pi met het PHP script besturen, maar het is nog niet mogelijk om een interactie met de gebruiker aan te gaan, we kunnen nog geen LEDs kiezen om in en uit te schakelen. De interface moet nog gemaakt worden!

De interface is samengesteld uit afbeeldingen die op internet te vinden te zijn, zoek in Google op “on/off button” en je zult mooie knoppen aantreffen. De een is rood en de andere is groen , met o.a. Gimp kun je een nummer toevoegen. Elke knop correspondeert met een betreffende LED die op de Raspberry Pi aangesloten is. Zodra je op een knop drukt, verandert de kleur ervan en is het de bedoeling dat de LED schakelt. Ik hoef vast niet uit te leggen dat i.p.v. een led je ook een relais kunt gebruiken.

Schematische voorstelling van de besturing

Het skelet van de pagina is HTML, de server interacties en het genereren van de pagina gebeurt met PHP. Javascript beheert de interacties met de gebruiker en de animatie op de pagina.

Mocht je het niet weten, JavaScript is taal voor de gebruikerskant en anders als PHP. Het voert het script niet eenmaal uit, maar het wordt continu door de browser uitgevoerd. Daarom kun het uiterlijk van de pagina wijzigen zonder het opnieuw te moeten laden of aan anderen toegang geven.

Mocht je je verwonderen waarom er niet over CSS gesproken werd, dit is slechts nodig voor de paginastijl en opmaak zoals de zwarte achtergrond. Er hoeft dus geen .css bestand aangemaakt te worden, daarvoor is de testpagina te beperkt.

Wat hebben we nodig
Als eerste hebben we een “index.php” bestand nodig (de extentie is .php en niet .html omdat we PHP code willen gebruiken), dan herkent de server dat er PHP is om uit te voeren voordat de gegenereerde pagina verzonden wordt.

De index.php-pagina is de hoofdpagina met de acht knoppen. Dit correspondeert met de tutorial van WiringPi waar we 8 LEDs gebruikt hebben. Deze knoppen zijn eerst gegenereerd met een “exec ( “gpio read “.$i, $output );” in een for-lus. Vervolgens moeten we detecteren als de gebruiker een van de knoppen gebruikt. Hier helpt het JavaScript, hier is het aparte bestandje “script.js” (zie ook in de afbeelding hieronder) voor, deze is ook opgenomen in de index.php.

Het script voegt een ‘event luisteraar’ aan iedere knop en elke keer als er op een knop gedrukt wordt, wordt er een functie gebruikt die om de gpio.php vraagt, het antwoord ontvangt en vervolgens terugstuurt. Uiteindelijk, als functie hiervan, wisselt het JavaScript de afbeelding van rood (UIT) naar groen (AAN).

Nu het laatste bestand: gpio.php. Deze bevat de PHP-code die de LEDs aan/uit zet, afhankelijk wat het JavaScript stuurt.  Normaliter vraagt een gebruiker niet om deze specifieke pagina, maar er is een gouden regel als websites gebouwd worden: “VERTROUW NOOIT DE GEBRUIKER”. Met andere woorden denk nooit dat de gebruiker doet wat je denkt dat hij doet of gaat doen. Daarom zijn er een paar veiligheden ingebouwd in de PHP-code, zoals het zekerstellen dat de juiste waarde ingevoerd is, dus bijvoorbeeld niet een letter. Er is een klein diagram gemaakt om al deze tekst op te sommen.

Je kunt het volledige project direct van de website downloaden. Hierin zit alles wat je nodig hebt voor deze tutorial.

Kopieer de gehele inhoud naar de directorie /var/www/html/. Lukt dit niet? Kijk dan bij de tutorial van de Apache server en ga naar stap 5.

Open nu de browser en geef het ipadres van de Raspberry Pi in. Als alles goed gegaan is zien je het volgende scherm.

Als je op een paar knoppen drukt zal je zien dat de LEDs in-uitschakelen.

Have A Nice Day!