Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| PIR-Bewegungsmelder (generisch) | 2 |
| LED (generisch) | 1 |
| Jumper-Kabel (generisch) | 1 |
Apps und Onlinedienste
- Arduino IDE
- Samsung ARTIK Cloud (IoT-Plattform, mittlerweile eingestellt – Alternativen: ThingSpeak, AWS IoT, MQTT-Broker)
- Processing (Desktop-Entwicklungsumgebung)
- PHP (Serverseitiges Skripting)
Projektbeschreibung
Einführung
Dieses Projekt zeigt, wie ein Arduino die Anzahl ein- und ausfahrender Fahrzeuge an einer Parkplatzeinfahrt/-ausfahrt zählt (zwei PIR-Sensoren), die Daten per Serial an einen PC sendet, wo ein Processing-Sketch sie empfängt und via PHP an eine Cloud-Plattform (hier ARTIK Cloud) übermittelt. Ein Ethernet- oder WLAN-Shield ist nicht nötig.
Funktionsweise
Die Sensoren werden an Ein- und Ausfahrt positioniert. Jedes passierende Fahrzeug inkrementiert (Einfahrt) oder dekrementiert (Ausfahrt) den Zähler. Eine LED blinkt kurz bei jedem Zählvorgang als Bestätigung.
Processing
Processing ist eine Open-Source-Entwicklungsumgebung für visuelle Programmierung und Kommunikation mit Arduino. Hier empfängt es die Zählerwerte über den Serial-Port und ruft per loadStrings() ein PHP-Skript auf dem Webserver auf.
PHP & ARTIK Cloud
Das PHP-Skript post-message.php empfängt den Zählerwert per GET und sendet ihn per POST an die ARTIK Cloud API. Dazu wird die Hilfsklasse ArtikCloudProxy.php benötigt. Sie müssen:
- Einen Webserver (WAMP/XAMPP oder Hosting) mit SSL-Zertifikat betreiben.
- In
ArtikCloudProxy.phpundpost-message.phpIhreCLIENT_ID,DEVICE_IDundACCESS_TOKENeintragen. - Einen Gerätetyp „Car Counter“ mit Feld „count“ in der ARTIK Cloud anlegen.
ARTIK Cloud Einrichtung
- In ARTIK Cloud anmelden → Applications → New Application.
- Details eingeben, Anwendung erstellen.
- Client ID & Secret notieren (für PHP-Dateien).
- Berechtigungen: Gerätetyp „Car Counter“ hinzufügen, Read & Write erlauben.
Inbetriebnahme
- Arduino-Sketch hochladen.
- Processing-Sketch in Processing IDE starten (WAMP/XAMPP muss laufen).
- Hardware gemäß Schaltplan verdrahten, PIR-Sensoren testen.
- In ARTIK Cloud prüfen, ob Daten ankommen.
Fehlerbehebung
Test-URL aufrufen: https://localhost:8000/acdemo/post-message.php?count=10. Erscheint JSON, funktioniert die PHP-Seite. Fehlt JSON, oft SSL-Zertifikatsproblem.
Weiterentwicklung
Basierend auf der Fahrzeuganzahl kann eine App für Einkaufszentrum-Besucher freie Parkplätze anzeigen. Zusätzliche LED-Anzeige bei vollem Parkplatz möglich.
Code
Arduino Code
int pirPinIN = 7, pirPinOUT = 10, led = 13;
static long counter = 0;
void setup() {
pinMode(pirPinIN, INPUT);
pinMode(pirPinOUT, INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
}
void loop() {
if (digitalRead(pirPinIN) == HIGH) {
counter++; Serial.println(counter);
digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW);
}
if (digitalRead(pirPinOUT) == HIGH) {
counter--; Serial.println(counter);
digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW);
}
}
Processing Sketch
import processing.serial.*;
Serial myPort;
String val;
void setup() {
String portName = Serial.list()[0]; // Anpassen: 0,1,2...
myPort = new Serial(this, portName, 9600);
}
void draw() {
if (myPort.available() > 0) {
val = myPort.readStringUntil('\n');
int count = parseInt(val);
if (count >= 0) {
loadStrings("https://localhost:8000/acdemo/post-message.php?count=" + val);
}
}
println(val);
}
post-message.php
<?php
$count = filter_input(INPUT_GET, 'count', FILTER_SANITIZE_NUMBER_INT);
require('ArtikCloudProxy.php');
$proxy = new ArtikCloudProxy();
$proxy->setAccessToken("YOUR_ACCESS_TOKEN");
$data = '{"count":' . $count . '}';
$payload = array("data" => $data, "sdid" => "YOUR_DEVICE_ID", "type" => "message");
$payload = json_encode($payload, JSON_HEX_QUOT | JSON_HEX_TAG);
$response = $proxy->sendMessage($payload);
header('Content-Type: application/json');
echo json_encode($response);
?>
ArtikCloudProxy.php
<?php
class ArtikCloudProxy {
const CLIENT_ID = "YOUR_CLIENT_ID";
const DEVICE_ID = "YOUR_DEVICE_ID";
const API_URL = "https://api.artik.cloud/v1.1";
const API_USERS_SELF = "/users/self";
const API_MESSAGES_POST = "/messages";
public $token = null, $user = null;
public function setAccessToken($someToken) {
$this->token = $someToken;
$this->user = $this->getUsersSelf();
}
public function getCall($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: bearer ' . $this->token));
$json = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status == 200) return json_decode($json);
else { var_dump($json); return $json; }
}
public function postCall($url, $payload) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, (string)$payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: bearer ' . $this->token));
$json = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status == 200) return json_decode($json);
else { var_dump($json); return $json; }
}
public function getUsersSelf() {
return $this->getCall(self::API_URL . self::API_USERS_SELF);
}
public function sendMessage($payload) {
return $this->postCall(self::API_URL . self::API_MESSAGES_POST, $payload);
}
}
?>
Schaltplan
Verdrahtung der 2 PIR-Sensoren und der LED:
Herstellungsprozess
- LED-Helligkeit per PWM und Taster am Arduino Mega steuern
- Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
- Smart IoT-Glas bauen: Füllstand überwachen mit ESP8266, Arduino & Ultraschall
- Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Erdmassen-Messung mit Arduino: Schritt-für-Schritt DIY-Anleitung
- DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- Valentinstags-Geschenk: DIY Tage-zusammen-Zähler
- Digitaler Kompass in Echtzeit mit Arduino & Processing bauen