Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

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.

Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP

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:

  1. Einen Webserver (WAMP/XAMPP oder Hosting) mit SSL-Zertifikat betreiben.
  2. In ArtikCloudProxy.php und post-message.php Ihre CLIENT_ID, DEVICE_ID und ACCESS_TOKEN eintragen.
  3. Einen Gerätetyp „Car Counter“ mit Feld „count“ in der ARTIK Cloud anlegen.
Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP

ARTIK Cloud Einrichtung

  1. In ARTIK Cloud anmelden → Applications → New Application.
  2. Details eingeben, Anwendung erstellen.
  3. Client ID & Secret notieren (für PHP-Dateien).
  4. Berechtigungen: Gerätetyp „Car Counter“ hinzufügen, Read & Write erlauben.
Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP

Inbetriebnahme

  1. Arduino-Sketch hochladen.
  2. Processing-Sketch in Processing IDE starten (WAMP/XAMPP muss laufen).
  3. Hardware gemäß Schaltplan verdrahten, PIR-Sensoren testen.
  4. In ARTIK Cloud prüfen, ob Daten ankommen.
Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP

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:

Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP

Herstellungsprozess

  1. LED-Helligkeit per PWM und Taster am Arduino Mega steuern
  2. Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
  3. Smart IoT-Glas bauen: Füllstand überwachen mit ESP8266, Arduino & Ultraschall
  4. Arduino Iron Man bauen: Komponenten, Sensoren & Schritt-für-Schritt-Anleitung
  5. Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
  6. Erdmassen-Messung mit Arduino: Schritt-für-Schritt DIY-Anleitung
  7. DIY Arduino Luftbefeuchter-Steuerung mit Relais – Sichere Hochspannungs-Installation
  8. Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
  9. Valentinstags-Geschenk: DIY Tage-zusammen-Zähler
  10. Digitaler Kompass in Echtzeit mit Arduino & Processing bauen