PHP-Webinterface zur Steuerung des Arduino Uno – Komplettanleitung
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| Arduino Ethernet Shield 2 | × | 1 |
| DHT11 Temperatur- & Feuchtesensor (4 Pin) | × | 1 |
| 2-Kanal-Relais-Modul | × | 4 |
| Mini-Breadboard | × | 1 |
| Flammsensor | × | 1 |
| MQ4 Gassensor (Methan) | × | 1 |
| LDR (Fotowiderstand) | × | 1 |
| Bodenfeuchtesensor (Hygrometer) | × | 3 |
| ADSL-Routerkabel (LAN) | × | 1 |
| Netzstecker (1-fach) | × | 7 |
| Netzdose (1-fach) | × | 7 |
| 9 V Blockbatterie + Klinkenkabel | × | 1 |
Werkzeuge
- Heißklebepistole
Apps & Online-Dienste
- Apache HTTP Server (lokal, z. B. AppServ / XAMPP)
- Notepad++ (Editor)
- Arduino IDE
Projektbeschreibung
Ziel: Professionelles Webinterface zur Fernsteuerung von Aquarium & Bewässerung sowie Überwachung von Umgebungswerten (Temp, Feuchte, Gas, Flamme, Licht, Bodenfeuchte) über LAN/WLAN. Entstanden aus dem Bedarf, während Abwesenheit (Urlaub) Aquarium-Filter, Fütterung, Belüftung steuern zu können.
Architektur
- Server-Seite (Apache/Localhost): 4 PHP-Seiten
Arduinautomotion.php– Hauptseite (Dashboard, Steuerung, Anzeige)Arduinautomotioncontrol.php– Session-Daten zwischenspeichernArduinautomotionformvalue.php– Formulardaten empfangen & an Arduino weiterleitenArduinautomotioncommunication.php– Sensordaten vom Arduino empfangen & in Session schreiben
- Client-Seite (Arduino + Ethernet Shield): Hostet
ArduinoSide.php(einfacher Webserver auf fester IP, z. B. 192.168.1.21).
Kommunikationsfluss
- User klickt auf
Arduinautomotion.phpButtons (Formular → POST anformvalue.php). formvalue.phpspeichert in$_SESSION& leitet per GET anArduinoSide.php(IP des Shields) weiter.- Arduino empfängt Parameter, schaltet Relais, liest Sensoren.
- Arduino sendet Sensordaten per GET an
communication.php(Server). communication.phpschreibt in$_SESSION.control.phpliest Session & stellt Daten fürArduinautomotion.phpbereit.- Seite neu laden (oder Auto-Refresh) → aktuelle Werte sichtbar.
Hinweis: POST für Server-intern (sicherer), GET für Arduino→Server (einfacher auf Arduino).
Apache-Server einrichten (Localhost)
z. B. AppServ → www/Arduinautomotion.php. Zugriff im LAN: https://192.168.1.20/Arduinautomotion.php (eigene IP verwenden).
- Anleitung: PHP unter Apache/Windows
- Android-Zugriff im selben WLAN: StackOverflow
- Externer Zugriff (Port Forwarding nötig): StackOverflow + Port Forwarding
Arduinautomotion.php – Hauptdashboard
Vier Bereiche (Tabs via JS):
- Room: Temperatur (°C/°F), Luftfeuchte, Flamme, Gas, Licht – als farbige Kreise (Grün=OK, Orange=Grenze, Rot=Alarm + Audio/Video-Alert „Spidey-Sense“).
- Aquarium: 6 Relais steuern: Luftpumpe, Lampe, Fütterung, Heizer, Außenfilter, Innenfilter.
- Plant: 3 Bodenfeuchtesensoren + Bewässerungspumpe (Relais).
- Guide: Erklärungen, Kommunikationsdiagramm, Link zu Formvalue-Seite.
SVG-Grafik verbindet Sensoren/Objekte mit Zentralpunkt – farbige Linien zeigen Status an. Footer mit Animation.
Arduinautomotioncontrol.php
Liest alle $_SESSION-Werte (Sensoren + Relais-Stati) und stellt sie als PHP-Variablen für Arduinautomotion.php bereit.
Arduinautomotionformvalue.php
Empfängt POST vom Hauptformular, speichert Relais-Befehle in Session, zeigt Empfangsbestätigung & leitet per verstecktem Formular (GET) an ArduinoSide.php (192.168.1.21) weiter.
Arduinautomotioncommunication.php
Empfängt GET vom Arduino (Sensordaten), schreibt in Session. Wird vom Arduino per Communication-Button aufgerufen.
ArduinoSide (auf Ethernet Shield)
Einfacher Webserver (Port 80). Zeigt Sensordaten in versteckten Formularfeldern + „Communication“-Button. Bei Klick → Daten an Server. Gleichzeitig prüft Arduino URL-Parameter (?airpump=pumpIsOn&...) und schaltet Relais.
Verdrahtung (Arduino Uno + Ethernet Shield)
Wichtig: Pins 10–13 durch Ethernet Shield belegt → Analogpins für Sensoren nutzen!
| Komponente | Pin |
|---|---|
| DHT11 | Digital 2 |
| Relais 1 (Pumpe/Lampe) | Digital 3 / 4 |
| Relais 2 (Futter/Heizer) | Digital 5 / 6 |
| Relais 3 (Filter ext/int) | Digital 7 / 8 |
| Relais 4 (Bewässerung) | Digital 9 |
| Ethernet Shield | Pins 10–13 (SPI) |
| LDR | A0 |
| Flammsensor | A1 |
| MQ4 | A2 |
| Hygrometer 1 | A3 |
| Hygrometer 2 | A4 |
| Hygrometer 3 | A5 |
Arduino-Sketch (Auszug)
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
DHT dht;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 21); // Feste IP des Shields
EthernetServer server(80);
int pump=3, lamp=4, feed=5, heater=6, filterex=7, filterin=8, irrigation=9;
String readString;
void setup() {
Serial.begin(9600);
pinMode(pump,OUTPUT); pinMode(lamp,OUTPUT); pinMode(feed,OUTPUT);
pinMode(heater,OUTPUT); pinMode(filterex,OUTPUT); pinMode(filterin,OUTPUT); pinMode(irrigation,OUTPUT);
digitalWrite(pump,HIGH); digitalWrite(lamp,HIGH); digitalWrite(feed,HIGH);
digitalWrite(heater,HIGH); digitalWrite(filterex,HIGH); digitalWrite(filterin,HIGH); digitalWrite(irrigation,HIGH);
dht.setup(2);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server at "); Serial.println(Ethernet.localIP());
}
void loop() {
delay(dht.getMinimumSamplingPeriod());
float h = dht.getHumidity();
float t = dht.getTemperature();
float f = dht.toFahrenheit(t);
int ldr = analogRead(A0);
int flame = analogRead(A1);
int mq4 = analogRead(A2);
int hygA = analogRead(A3);
int hygB = analogRead(A4);
int hygC = analogRead(A5);
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 135) readString += c;
if (c == '\n') {
// HTTP Header senden
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("ArduinoSide ");
client.println("");
client.println("");
break;
}
}
}
delay(1); client.stop();
// Relais aus URL-Parametern steuern
if (readString.indexOf("?airpump=pumpIsOn") > 0) digitalWrite(pump, LOW);
else if (readString.indexOf("?airpump=pumpIsOff") > 0) digitalWrite(pump, HIGH);
if (readString.indexOf("&lamp=lampIsOn") > 0) digitalWrite(lamp, LOW);
else if (readString.indexOf("&lamp=lampIsOff") > 0) digitalWrite(lamp, HIGH);
if (readString.indexOf("&feed=feedIsOn") > 0) digitalWrite(feed, LOW);
else if (readString.indexOf("&feed=feedIsOff") > 0) digitalWrite(feed, HIGH);
if (readString.indexOf("&heater=heaterIsOn") > 0) digitalWrite(heater, LOW);
else if (readString.indexOf("&heater=heaterIsOff") > 0) digitalWrite(heater, HIGH);
if (readString.indexOf("&filterex=exIsOn") > 0) digitalWrite(filterex, LOW);
else if (readString.indexOf("&filterex=exIsOff") > 0) digitalWrite(filterex, HIGH);
if (readString.indexOf("&filterin=inIsOn") > 0) digitalWrite(filterin, LOW);
else if (readString.indexOf("&filterin=inIsOff") > 0) digitalWrite(filterin, HIGH);
if (readString.indexOf("&irrigation=start") > 0) digitalWrite(irrigation, LOW);
else if (readString.indexOf("&irrigation=stop") > 0) digitalWrite(irrigation, HIGH);
readString = "";
Serial.println("client disconnected");
}
}
Test & Ergebnis
Projekt getestet mit echtem Aquarium & Bewässerungspumpe – funktioniert zuverlässig. Zugriff per Browser (PC & Android) im lokalen Netzwerk. Video-Demo im Originalartikel.
Erweiterungsidee
Statt lokalem Apache: Cloud-Hosting (z. B. TheAmplituhedron.com) für weltweiten Zugriff ohne Port-Forwarding. Projekt offen für Weiterentwicklung.
Herstellungsprozess
- Ihr erstes AWS CloudFormation Template erstellen – Ein praktischer Leitfaden
- LED mit PIR-Bewegungsmelder am Raspberry Pi steuern
- Temperatur- und Luftfeuchtedaten zwischen zwei Arduinos via Firebase übertragen
- Universelle IR-Fernbedienung mit Arduino bauen: Schritt-für-Schritt-Anleitung
- Arduino-Uno-Roboter zur Personenerkennung – Sensorintegration Schritt für Schritt
- DIY Infrarot-Herzschlag-Sensor mit Arduino: Schritt-für-Schritt-Anleitung
- Digitales Stadiometer bauen: Körpergröße messen mit Arduino & Lasersensor VL53L0X
- Smart IoT-Glas bauen: Füllstand überwachen mit ESP8266, Arduino & Ultraschall
- Erdmassen-Messung mit Arduino: Schritt-für-Schritt DIY-Anleitung
- Digitaler Kompass in Echtzeit mit Arduino & Processing bauen