Wissen

Raspberry Pi-Relais über Web-Seite einschalten / ausschalten

In dieser kleinen Anleitung werde ich Euch heute zeigen, wie einfach es ist einen Ausgang des Raspberry Pis zu schalten, um damit z.B. ein Relais zu steuern. Das ganze realisieren wir über einen kleinen Webserver am Raspi auf dem die Steuerung von PHP ausgelöst wird. D.h. wir erstellen eine kleine Webseite mit zwei Button über die wir das Relais anschalten und ausschalten können. Was ihr dann hinter das Relais hängt bleibt Euch überlassen. Auf diese Art und Weise wäre es dann möglich bis zu 17 Relais zu steuern. Als Punkt zwei und drei zeige ich Euch dann wie man dieses kleine PHP Script noch erweitern kann um damit z.B. eine Art von Timer zu integrieren, welcher die Relais nur für eine bestimmte Zeit anziehen lässt. Das ganze können wir dann auch fest vorbelegen und so wäre es z.B. auch möglich nur Schaltimpulse zu geben. D.h. ihr könntet den Raspi in Eure Stromverteilung einbauen um darüber ein Stromstoß-Relais zu steuern wie sie oft in Treppenhäusern oder ähnlichen Örtlichkeiten verbaut sind. Letztendlich könnt ihr mit diesen „5“ Zeilen Code alles ansteuern, was sich auch über einen Schalter steuern lassen würde.

Die Umsetzung dafür ist ebenfalls recht einfach und ich möchte dafür primär auf zwei ältere Raspberry Pi Anleitungen zurück greifen.

Aber dazu gleich noch mehr!

Basis:
Ein installierter Raspberry Pi mit dem typischen Raspberry Pi Image!
Eine Relais-Platte oder zum testen nur eine kleine LED, welche die 3,3 Volt des Ausgangs ab kann.

Auf dieses System setzen wir dann einen Apache2 Server und die Programmiersprache PHP auf.
Wie dies funktioniert, könnt ihr auf folgender Seite nachlesen:

Apache2 und PHP Installation am Raspberry Pi

Ihr müsst dort natürlich nur die ersten beiden Schritte abarbeiten. Datenbanken und FTP Server werden für unser Beispiel nicht benötigt.

Als nächstes müssen wir nun die Eingänge und Ausgänge des Raspberrys konfigurieren. Hierzu bedienen wir uns folgender Anleitung:

Raspberry GPIO Modul konfigurieren – Eingänge und Ausgänge definieren 

Das wars dann auch schon!
Jetzt sind wir startklar für  den eigenlichen Code!

Halt bevor wir los legen, löschen wir noch schnell die Index Datei, welche uns der Apache Server automatisch angelegt hat!

cd /var/www
sudo rm index.html

Jetzt sollte sich keine weitere Datei mehr im /var/www Pfad befinden und wir können uns unsere eigene index.php anlegen:

rm sudo index.php

INFO:
Index Dateien werden immer zuerst vom Apache Server abgearbeitet! D.h. befindet sich eine Index Datei in einem Verzeichnis wird diese automatisch aufgerufen und man muss diese nicht über die URL direkt aufrufen!

In diese index.php fügen wir nun den ersten und einfachsten Code ein:

 

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Schalter</title>
</head>
GPIO 18 schalten:
<form method="get" action="index.php">
<input type=
<input type="submit" value="Licht ein" name="Lichtein">
<input type="submit" value="Licht aus" name="Lichtaus">
</form>
<?php
$modeon18 = trim(@shell_exec("/usr/local/bin/gpio -g mode 18 out"));
if(isset($_GET["Lichtein"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1"));
echo "Licht an";
}
else if(isset($_GET["Lichtaus"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
echo "Licht aus";
}
?>
</body>
</html>

 

Ruft ihr nun die IP-Adresse der Webservers auf bekommt ihr zwei Buttons mit der Bezeichnung „Licht ein“ und „Licht aus“ angezeigt. Drückt ihr nun auf den „Licht ein“ Button, wird der Port 18 des Raspberry Pis mit 3,3 Volt gespeist und eine angeschlossene LED würde zu leuchten beginnen. Ein angeschlossenes Relais würde nun anziehen.

Über den „Form-Bereich“ erstellen wir die Buttons.
Die erste Zeile im PHP Code definiert den Ausgang. Hier in unserem Fall wird der GPIO PIN 18 zum Ausgang definiert.
Dann überprüft das Script ob ein Button gedrückt wurde und wenn ja, was passieren soll.
Das was dann passiert ist ziemlich einfach gelöst – denn wir übergeben einfach den Code direkt an die Shell und diese schaltet und den PIN entweder auf aktiv und inaktiv!

D.h. würdet ihr z.B. auf der Konsole selbst folgenden Befehl ausführen:

/usr/local/bin/gpio -g write 18 1

So würde das Relais ebenfalls anziehen.

Mit den echo Befehlen geben wir dann nur den Status aus, was gerade gedrückt worden ist.

Im nächsten Code Schnipsel definieren wir ein zusätzliches Feld, in dem wir eine Zeit in Sekunden hinterlegen können.
Wird dieses Feld gesetzt, so zieht das Relais nur für diesen Zeitraum an und deaktiviert sich danach selbstständig wieder!

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Schalter</title>
</head>
GPIO 18 schalten:
<form method="get" action="index.php">
<input type="text" size="4" value="" name="Sekunden">
<input type="submit" value="Licht ein" name="Lichtein">
<input type="submit" value="Licht aus" name="Lichtaus">
</form>
<?php
$modeon18 = trim(@shell_exec("/usr/local/bin/gpio -g mode 18 out"));
if(isset($_GET["Lichtein"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1"));
$Sekunden = $_GET["Sekunden"];
if ($Sekunden > 0) {
sleep($Sekunden);
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
}
}
else if(isset($_GET["Lichtaus"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
}
?>
</body>
</html>

Wie ihr seht ist dies genauso einfach!

Jetzt gehen wir noch einen Schritt weiter und ich zeige Euch in der nächsten Variante wie man einen zweiten Schalter einbindet!

 

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Schalter</title>
</head>
Port 1 - GPIO 18 schalten:
<form method="get" action="index.php">
<input type="text" size="4" value="1" name="t1">
<input type="submit" value="P1 an" name="p1an">
<input type="submit" value="P1 aus" name="p1aus">
<br>
Port 2 - GPIO 23 schalten:
<br>
<input type="text" size="4" value"t2" name="t2">
<input type="submit" value="P2 an" name="p2an">
<input type="submit" value="P2 aus" name="p2aus">
</form>
<?php
$modeon18 = trim(@shell_exec("/usr/local/bin/gpio -g mode 18 out"));
$modeon23 = trim(@shell_exec("/usr/local/bin/gpio -g mode 23 out"));
if(isset($_GET["p1an"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1"));
$t1 = $_GET["t1"];
if ($t1 > 0) {
sleep($t1);
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
}
}
else if(isset($_GET["p1aus"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
}
if(isset($_GET["p2an"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 1"));
$t2 = $_GET["t2"];
if ($t2 > 0) {
sleep($t2);
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 0"));
}
}
else if(isset($_GET["p2aus"])){
$val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 0"));
}
?>
</body>
</html>

 

Raspberry Pi Relais über Webseite einschalten ausschalten schalten Anleitung

In diesem Beispiel schalten wir nun den Ausgang 18 und den Ausgang 23.
Den Ausgang 18 haben wir nun mit der „value 1“ definiert. D.h. drückt ihr nun den Button P1 an, so wird das Relais für eine Sekunde angezogen und schaltet sich danach wieder ab. Überschreibt ihr diesen Wert mit 0 -> ist ein Dauer-An möglich. Über den Button „P1 aus“ wird dieser Zustand dann wieder zurück gesetzt.
Der zweite Schalter funktioniert ganz normal über „P2 an“ und „P2 aus“ – wird im Textfeld davor eine Zeit gesetzt, wird der Timer aktiviert und der AN-Modul fällt nach „X“ Sekunden zurück.

So, ich hoffe ich konnte Euch nun ein paar Anregungen geben, wie ihr Euer Projekt umsetzen könnt!
Viel Spaß damit!


Tags:

  • raspi relais zum ein ausschalten
  • raspberry relais schalten html
  • raspberry relais schalten webserver
  • rasp relais php
  • raspberry relais per website schalten
Tags

Related Articles

4 Comments

  1. Hi EPICENTER

    Eine super Erklährung.

    Wie ist es möglich den Status nicht nur den aktuellen Schalter was gerade gedrückt wurde sondern auch den davor an zu zeigen?

    Da es ja über GET realesier ist, zeigt es ja den aktuellen Status an.
    Ich möchte aber die davor geschalteten GPIOs auch angezeigt haben.

    Liebe Grüße
    Alex

  2. Guten Abend,

    ein sehr tolles Tutorial wie ich finde… Es läuft bei mir auch soweit echt gut, nur bin ich leider wohl zu blöde den Code auf ein 8 channel Relais umzubasteln. Bekomme es zwar hin mir 8 Schalter anzeigen zu lassen, aber kann immer nur einen Schalter tatsächlich schalten! Wie müsste der Beispielcode für ein 8 Channel Relais ungefähr aussehen!?

    M.f.G

    Nx

  3. Hallo,

    danke für die verständliche Anleitung. Ich kann jetzt bei meinem Raspi problemlos die GPIOs schalten.
    Jetzt möchte ich über den Ausgang 17 per 433MHZ sender einen Code aussenden.

    Ich habe dazu die Anleitung von hier benutzt
    https://tutorials-raspberrypi.de/raspberry-pis-ueber-433mhz-funk-kommunizieren-lassen/

    wenn ich im Terminal sudo ./codesend 1234 eingeben, klappt es tadellos.
    Nur die Einbindung ins PHP Script will nicht funktionieren

    Ich habe

    if(isset($_GET[„Lichtein“])){
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 18 1“));

    ersetzt mit
    if(isset($_GET[„Lichtein“])){
    $val = trim(@shell_exec(„home/pi/433Utils/RPi_utils/sudo ./codesend 1234“));

    Was mache ich Falsch?

    Nochmals vielen Dank für die tolle Webseite!
    Marcus

  4. Hallo zusammen,

    Vielen Dank für die Anleitung.
    Leider komme ich nicht zum gewünschten Ergebniss –> die LED werden nicht geschalten.

    Wenn ich die Pins händisch (über die Konsole —- gpio -g write 18 1) schalt leuchtet bzw. erlischt die LED.

    Auch habe ich den Pin 18 an 12 und 18 probiert, da die Nummerierung ja nicht immer ganz eindeutig ist.
    Wenn ich es richtig verstanden habe: wenn gpio „-g“ dann ist der Pin 12 –> GPIO 18.

    Desweiteren wird mir auf der Website unter Port 1 und Port 2 schalten folgendes angezeigt:

    0) {
    sleep($t1);
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 18 0“));
    }
    }
    else if(isset($_GET[„p1aus“])){
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 18 0“));
    }
    if(isset($_GET[„p2an“])){
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 23 1“));
    $t2 = $_GET[„t2“];
    if ($t2 > 0) {
    sleep($t2);
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 23 0“));
    }
    }
    else if(isset($_GET[„p2aus“])){
    $val = trim(@shell_exec(„/usr/local/bin/gpio -g write 23 0“));
    }
    ?>

    Vielleicht könnt Ihr mir damit weiterhelfen.
    Danke Gruß Max

Kommentar verfassen

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Close

Send this to a friend