CENTRODIGRAVITA.it
Raspberry-Pi pagina WEB per gestione GPIO (PIN entrate e uscite) con PHP
Il Raspberry è un micro computer a scheda singola sviluppato nel Regno Unito dalla Raspberry Pi Foundation per ospitare sistemi operativi basati sul kernel Linux o RISC OS. Per questo sistema è sviluppato un sistema operativo appositamente dedicato chiamato Raspberry Pi OS (https://www.raspberrypi.com/software/) scaricabile gratuitamente e basato sulle distribuzioni ufficiali di Debian di Linux.
La particolarià di questa scheda è quella di avere, oltre alle porte standard di un PC come le USB, Ethernet, HDMI etc.., anche una serie di PIN digitali (due stati ON e OFF) gestibili con comandi Python che vengon chiamate linee GPIO (general purpose Input/Output).
Utilizzando script Python, Html e PHP è possibile creare interfacce web che permettono la gestione degli stati dei GPIO permettendo così di creare un pannello WEB di DOMOTICA che permette di pilotare con dei pulsanti a automatismi apparati gli elettrici.
Partiamo dalla preparazione di Raspberry con l'installazione del sistema operativo Raspberry PI e le necessarie librerie.
INSTALLAZIONE E PREPARAZIONE Raspberry con S.O. Raspberry-Pi
Dall'acquisto del Raspberry al suo utilizzo i passaggi necessari da eseguire sono i seguenti:
- Utilizzare un pc per installare il sistema operativo di base (https://www.raspberrypi.com/software/) sulla Micro SD che andrà inserita nel Raspberry. Si può utilizzare il software Win32DiskImager (https://raspberry-projects.com/pi/pi-operating-systems/win32diskimager)
- Inserire la memoria nel Raspberry, collegarlo e avviarlo seguendo le istruzioni a schermo per l'avvio.
- Attivare l'accesso SSH o VNC se usati (da interfaccia grafica o da console)
- Fissare l'indirizzo IP Statico modificano il file con il comando: sudo nano /etc/dhcpcd.conf
abilitando e modificando le righe: interface eth0 static ip_address=192.168.100.100/24
static routers=192.168.100.254
effettuare poi un riavvio del sistema: reboot
- Installiamo i pacchetti necessari per l'interfaccia WEB eseguendo i comandi:
sudo apt-get update
sudo apt-get install apache2
sudo apt-get install php
Ora sul Raspberry abbiamo a disposizione il server WEB e il linguaggio di programmazione PHP.
I PIN GPIO E I COMANDI BASE IN PYTHON PER IL LORO UTILIZZO
Come prima cosa apriamo la console SSH e digitiamo il comando : pinout
In questo modo ci vengono mostrate le dislocazioni delle porte sulla scheda Raspberry su cui stiamo operando e nella pagina successiva:
un dettaglio dei PIN GPIO disponibil sul Raspberry con il numero corrispondente della piedinatura e le caratteristiche del sistema.
I comandi Python per gestire le basi dei GPIO sono:
- Impostare il PIN ad un livello basso: GPIO.output(PIN, GPIO.LOW)
- Impostare il PIN ad un livello alto: GPIO.output(PIN, GPIO.HIGH)
- Leggere lo stato del PIN: GPIO.input(PIN)
Dove PIN è una variabile che contiene il numero corrispondente del GPIO.
Iniziamo a creare uno script in Python editando il file con il comando: nano test.py
e inseriamo il testo dello script completo di richiami alle librerie, configurazione delle GPIO e i comandi:
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
#il numero del PIN è passato tramite parametro allo script Python
args = sys.argv
PIN = int(args[1])
GPIO.setmode(GPIO.BCM) #Imposto la modalita dei nomi dei PIN
GPIO.setup(PIN, GPIO.OUT)
GPIO.output(PIN, GPIO.HIGH) #Imposto il piedino come livello ALTO
#GPIO.output(PIN, GPIO.LOW)
#Stampo in console lo stato del GPIO scelto
if GPIO.input(PIN):
print ('1')
else:
print ('0')
GPIO.cleanup()
Salviamo il file con nome ad esempio "test.py" e poi possiamo subito provarlo eseguendo il comando:
python /home/utente/Documents/test.py 3
Il numero "3" dopo il nome del file passa il parametro del PIN allo script (GPIO3).
In questo esempio operiamo sul piedino GPIO3 portandolo a livello alto e stampiamo in uscita dello script lo stato del PIN.
N.B. eseguiamo un file che abbiamo creato nella cartella /home/utente/Documents/ cioè la cartella documenti dell'utente "utente" e quindi solo l'utente "utente" avrà i diritti di modifica e accesso al file (ad eccezione di Root)
INTERFACCIA WEB IN HTML E PHP (CON ESECUZIONE DI SCRIPT IN PYTHON) PER UN PANNELLO DOMOTICO
Se vogliamo implementare una pagina WEB con cui controllare gli stati dei piedini GPIO dobbiamo accedere alla cartella apposita del server WEB (/var/www/html).
Dobbiamo come prima cosa elevare i diritti con il comando: sudo su
in questo modo operiamo come ROOT e con il comando: cd /var/www/html ci posizioniamo nella cartella dove troveremo il file index.html che conterrà la paginia iniziale standard di Apache. Se apriamo un browser puntando sull'indirizzo IP del Raspberry (http://192.168.100.100) la vedremo.
Per editarla lanciamo il comando: nano index.html
Nel nostro caso cancelliamo il file e editiamo index.php: nano index.php
Inseriamo questo codice Html e PHP:
<html>
<head>
<title>Pannello RPi-WEB</title>
</head>
<body>
<form method="POST" action="">
<input type="submit" name="GPIO3" value="GPIO3">
<?php if ( isset( $_POST["GPIO3"] ) )
$str = "sudo python /home/utente/Documents/test.py 3";
$result=exec($str);
if ($result=='0') {
?> <br> <font color="grey">GPIO3 livello basso</font><?php
} else{
?> <br> <font color="red">GPIO3 livello ALTO</font><?php }
endif ?>
</body>
</html>
Aprendo http://IP-DEL-RASPBERRY/index.php (Es. http://192.168.100.100/index.php) con un browser si aprirà la pagina WEB appena creata con un pulsante "GPIO3" che premuto eseguirà lo script test.py (precedentemente creato).
Lo script Python imposterà il PIN del GPIO3 a livello alto e poi restituirà lo stato del pin che verrà passato al linguaggio PHP con la variabile "$result" che farà apparire la scritta dello stato sulla pagina web.
N.B. Per come è costruito il file test.py lo stato del GPIO3 non cambierà mai in quanto si forza l'uscita sempre a livello alto.
Se si vuole far cabiare lo stato del pin ad ogni pressione del pulsante si può modificare il file "test.py" in questo modo:
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import sys
#il numero del PIN è passato tramite parametro allo script Python
args = sys.argv
PIN = int(args[1])
GPIO.setmode(GPIO.BCM) #Imposto la modalita dei nomi dei PIN
GPIO.setup(PIN, GPIO.OUT)
#Si testa lo stato e lo si cambia con l'opposto
if GPIO.input(PIN):
GPIO.output(PIN, GPIO.LOW)
else:
GPIO.output(PIN, GPIO.HIGH)
#Stampo in console lo stato del GPIO scelto
if GPIO.input(PIN):
print ('1')
else:
print ('0')
GPIO.cleanup()
Modificando ulteriormente i due file è possibile creare un pannello WEB DOMOTICO dove con i vari pulsanti si attivano e disattivano i pin GPIO a cui ci si può collegare dei relè che pilotano elettrodomestici o altri dispositivi elettronici.
Con il feedback dello stato del GPIO sulla pagina web possiamo anche pensare di pubblicare in internet l'accesso alla pagina e in quel caso dopo il click sul pulsante avremmo la sicurezza che l'apparecchio si sia acceso o spento.
Se apriamo l'accesso alla pagina web del Raspberry all'esterno dobbiamo pensare anche a garantire la sicurezza sull'uso del pannello e quindi sarà necessario introdurre una richiesta di credenziali per accedere al pannello domotico.
Questo è il codice PHP di esempio che permette di gestire l'autenticazione alla pagina web dove possiamo inserire del codice per chi è autenticato e chi no:
<?php
// enable PHP session che utilizza i cookie per salvare la sessione e passare le variabili impostate come utente e password
sessionsession_start();
if (isset($_SESSION['username'])) { // test se è già stato inserito un username nella variabile della sessione
// print "session exists";
$username = $_SESSION['username'];
$password = $_SESSION['password'];
$ok = 'Benvenuto';//print $username;
//echo $_SESSION['username'];
} else {
// print "username in session NOT exists";
$username = $_POST['username'];
$password = $_POST['password'];
$username = filter_var($username,FILTER_SANITIZE_STRING);
$password = filter_var($password,FILTER_SANITIZE_STRING);
if ($username =='UTENTE-DI-ACCESSO' and $password =='PASSWORD-DI-ACCESSO') { //CREDENZIALI DI ACCESSO
$ok = 'Benvenuto'; $_SESSION['username'] = $username;
$_SESSION['password'] = $password;
}else{
$error = 'Utenza o password errata.';
}}
?>
<html>
<head>
<title>Pannello RPi-WEB</title>
</head>
<body>
<?php if ($error)://AUTENTICAZIONE NON CORRETTA (richieste credenziali)
?>
<p style="color: red"><?php echo $error ?></p>
<form method="post" action="">
<input type="text" name="username" placeholder="Inserisci lo username" />
<br>
<input type="password" name="password" placeholder="Inserisci la password"/>
<br>
<input type="submit" value="Accedi" />
Quì è possibile inserire il codice che verrà visualizzato solo se l'utente NON ha inserito le credenziali corrette
<?php else: ?>
<?php if ($ok): //AUTENTICAZIONE CORRETTA
?>
<p style="color: black"><?php echo $ok ?></p>
Quì è possibile inserire il codice che verrà visualizzato solo se l'utente ha inserito le credenziali corrette
<?php endif ?>
<?php endif ?>
</body>
</html>
Tutto il materiale (testo, grafica e immagini) presente in questo sito è di proprietà di CENTRODIGRAVITA.it, pubblicato su concessione degli autori. Ne è vietata la riproduzione, anche parziale, senza il consenso scritto da parte dello staff CENTRODIGRAVITA.it. Eventuale materiale erroneamente pubblicato e soggetto a copyright verrà immediatamente rimosso su segnalazione del titolare dei diritti. CENTRODIGRAVITA.it non si assume nessuna responsabilità per danni che derivino dall'utilizzo delle informazioni, consigli e file scaricati dal sito. Per info o problemi cliccate qui per contattarci. o qui per accedere all'informativa sui cookie