Arduino per Web-Pattern-Entsperrung sichern – Einfache Einrichtung & Fernsteuerung
Komponenten und Materialien
- Arduino UNO (×1)
- PHPoC WiFi Shield für Arduino (×1)
- Seeed Servo Motor SG92R (×1)
- Jumper-Kabel (×1)
Projektübersicht
Dieses Projekt implementiert ein Smartphone-ähnliches Entsperrmuster für Arduino-Geräte, um unbefugten Zugriff zu verhindern. Als Demonstrationsanwendung dient die Steuerung eines Servomotors. Die Idee basiert auf zwei PHPoC-Projekten, die für Arduino adaptiert wurden.
Warum PHPoC WiFi Shield?
- Unterstützt WebSocket – ideal für Echtzeitkommunikation.
- Verfügt über einen eingebetteten Webserver, auf dem die Webanwendung gespeichert wird.
- Bietet fertige Webanwendungen zur Steuerung/Überwachung ohne Webprogrammierkenntnisse.
- Ermöglicht die Entwicklung eigener Webanwendungen.
Funktionsweise
Datenfluss
Webbrowser ←→ PHPoC WiFi Shield ←→ Arduino
Authentifizierungsprozess
- Der Nutzer zeichnet ein Muster im Browser.
- Das Muster wird in einen String umgewandelt (z. B.
1,4,8,6,3) und per WebSocket an den Arduino gesendet. - Arduino vergleicht den empfangenen String mit dem fest hinterlegten Muster.
- Bei Übereinstimmung:
202 (ACCEPTED), Authentifizierungsvariable =true. - Bei Abweichung:
401 (DENIED), Authentifizierungsvariable =false.
Steuerbefehle werden nur ausgeführt, wenn die Authentifizierungsvariable true ist. Nach einem konfigurierbaren Timeout (Standard 10 s) erlischt die Authentifizierung automatisch.
Muster-Mapping
Die 3×3-Punkte werden zeilenweise von 1 bis 9 nummeriert. Die Verbindungsreihenfolge ergibt den Muster-String.
Installation & Einrichtung
1. WLAN-Konfiguration des PHPoC Shields
Siehe offizielle Anleitung.
2. Web-UI auf den PHPoC Shield hochladen
- Datei
unlock.phpherunterladen (siehe Code-Bereich). - Bilder
servo_body.pngundservo_bracket.pngherunterladen. - Mit PHPoC Debugger auf den Shield hochladen (bestehende Dateien nicht löschen).
3. Arduino-Code schreiben
- PHPoC-Bibliothek in der Arduino IDE installieren.
- Quellcode
ArduinoUnlockExample.inokompilieren und hochladen.
Testen
- Seriellen Monitor öffnen → IP-Adresse notieren.
- Browser:
https://<IP-Adresse>/unlock.php - „Connect“ klicken und Muster zeichnen.
Code
unlock.php (Web-UI)
<!DOCTYPE html>
<html>
<head>
<title>Arduino - PHPoC Shield</title>
<meta name="viewport" content="width=device-width, initial-scale=0.7, maximum-scale=0.7">
<meta charset="utf-8">
<style>
body { text-align: center; font-size: width/2pt; }
h1, h2, button { font-weight: bold; font-size: width/2pt; }
</style>
<script>
// ... (JavaScript-Code für Pattern-Unlock & Servo-Steuerung via WebSocket)
// Vollständiger Code im Originalprojekt verfügbar.
</script>
</head>
<body>
<h1>Arduino - Web Pattern Unlock</h1>
<div id="unlock_area" style="display:block;">
<canvas id="unlock"></canvas>
</div>
<div id="control_area" style="display:none;">
<canvas id="servo"></canvas>
<p>Winkel: <span id="debug">0</span></p>
</div>
<h2>
<p>WebSocket: <span id="ws_state">null</span></p>
<button id="bt_connect" onclick="connect_onclick()">Connect</button>
</h2>
</body>
</html>
ArduinoUnlockExample.ino
/* Arduino Webserver - Pattern Unlock */
#include <SPI.h>
#include <Phpoc.h>
#include <Servo.h>
#define CMD_AUTH 0
#define CMD_CTRL 1
#define ACCEPTED "202"
#define UNAUTHORIZED "401"
PhpocServer server(80);
Servo servo;
String pattern;
bool authenticated;
unsigned long timeout;
unsigned long lastActiveTime;
void setup() {
Serial.begin(9600);
while(!Serial);
Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
server.beginWebSocket("web_pattern");
Serial.print("WebSocket Server Adresse: ");
Serial.println(Phpoc.localIP());
servo.attach(8);
servo.write(90);
pattern = String("1,4,8,6,3");
authenticated = false;
timeout = 10000; // 10 s
lastActiveTime = 0;
}
void loop() {
PhpocClient client = server.available();
if (client) {
String data = client.readLine();
if (data) {
int pos = data.indexOf(':');
int cmd = data.substring(0, pos).toInt();
if (cmd == CMD_AUTH) {
String reqPattern = data.substring(pos+1);
reqPattern.remove(reqPattern.indexOf(13));
reqPattern.remove(reqPattern.indexOf(10));
if (pattern.equals(reqPattern)) {
authenticated = true;
sendResponse(ACCEPTED, 3);
lastActiveTime = millis();
} else {
authenticated = false;
sendResponse(UNAUTHORIZED, 3);
}
} else if (cmd == CMD_CTRL) {
if (authenticated) {
int angle = data.substring(pos+1).toInt();
angle = map(angle, 90, -90, 0, 180);
servo.write(angle);
lastActiveTime = millis();
} else {
sendResponse(UNAUTHORIZED, 3);
}
}
}
}
// Timeout-Prüfung
if (authenticated && ((millis() - lastActiveTime) > timeout)) {
authenticated = false;
sendResponse(UNAUTHORIZED, 3);
}
}
void sendResponse(char *data, int len) {
server.write(data, len);
}
Schaltplan
Weiterführende Links
Herstellungsprozess
- Die Entwicklung und Produktion massengefertigter Kleidungsschnitte
- Web-gesteuertes DMX-Lichtsystem – Arduino Master Controller
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Optimierte Stromversorgungslösungen für Arduino-Projekte
- Arduino Tic Tac Toe mit MAX7219 LED-Matrix und Karton-Gehäuse
- Intelligenten Arduino-Vierbeiner-Roboter bauen: Schritt-für-Schritt-Anleitung