Slimme Parkeer Teller: Real-time Voertuigvolging met Arduino, Processing en PHP
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| PIR Bewegingssensor (generiek) | 2 |
| LED (generiek) | 1 |
| Draadjes (generiek) | 1 |
Apps en Online Services
- Arduino IDE
- Samsung ARTIK Cloud voor IoT
- Processing
- PHP
Over dit Project
Inleiding
Dit project demonstreert hoe je Arduino kunt gebruiken om het aantal auto's dat een winkelcentrum in- en uitrijdt te tellen met twee sensoren, de data naar de cloud te sturen via Processing & PHP, en later het aantal beschikbare parkeerplaatsen te bekijken. Je hebt geen Ethernet of WiFi shield nodig!
Hoe het Werkt
De sensoren moeten bij de in- en uitgang van de parkeerplaats geplaatst worden. Elke keer dat een auto binnenkomt, wordt de teller verhoogd; bij vertrek verlaagd. De LED in het systeem geeft aan dat het voertuig correct geteld is: hij brandt telkens wanneer een auto de sensor passeert.
Processing
Processing is een open-source taal/ontwikkeltool voor het schrijven van programma's op andere computers. Handig als je wilt dat die computers "praten" met een Arduino, bijvoorbeeld om data die de Arduino verzamelt weer te geven of op te slaan.
In dit project ontvangt Processing de data (aantal auto's) die Arduino via de seriële poort stuurt. Download en installeer de Processing IDE. In de bijgevoegde Processing-sketch zie je eenvoudige, duidelijke code. Hier roepen we het PHP-bestand aan met de methode loadStrings().

PHP
Het PHP-bestand post-message.php is hetzelfde als in de tutorial hier. We hebben de volledige zip van de GitHub-pagina gedownload en enkele regels code aangepast zodat het werkt zonder in te loggen op ons Samsung-account. Voor deze werking moet je de instructies volgen over het wijzigen van de poort van je WAMP of XAMPP server en het installeren van het CA-certificaat voor ARTIK Cloud. Alternatief kun je een externe of gehoste server met geïnstalleerd SSL-certificaat gebruiken.
Kopieer de bestanden naar een map, bijvoorbeeld acdemo, zodat deze bereikbaar is via https://localhost:8000/acdemo/post-message.php of https://www.jouwwwebsite.com/acdemo/post-message.php.
Er zijn slechts twee bestanden in de PHP SDK die je moet aanpassen: ArtikCloudProxy.php en post-message.php. Je vindt je client- & device-ID hier.

In post-message.php heb je je toegangstoken en device-ID nodig. De makkelijkste manier om het token te krijgen is door de stappen hier te volgen. Let op: de enige data die we naar de cloud sturen is het aantal auto's dat het winkelcentrum in- en uitrijdt. We maakten een device in Artik Cloud genaamd Auto Teller met een veld count dat deze waarde bevat.
Artik Cloud
- Log in op je Artik Cloud account en ga naar Toepassingen > Nieuwe Toepassing
- Vul de benodigde details in voor je toepassing.
- Na aanmaken wordt de app in je dashboard getoond. Klik op de app-naam en zoek Show Client ID & Secret. Je hebt deze codes nodig voor de PHP-bestanden.
- Selecteer in het zijmenu je toepassing en klik op Rechten. Voeg Auto Teller toe uit de lijst met apparaattypen en vink Lezen & Schrijven aan.



Coderen
- Upload de sketch naar je Arduino UNO. Als dit je eerste keer is, volg deze stappen om te begrijpen hoe dat werkt.
- Start de Processing sketch in de Processing IDE. Zorg dat je WAMP-server aan staat als je je lokale computer gebruikt in plaats van een gehoste server.
- Als je de onderdelen correct hebt aangesloten op basis van het verbindingsschema, loop langs de PIR-sensor om te testen of het werkt.
- Log in op je Artik Cloud account om te zien of de data correct wordt verzonden.

Probleemoplossing
- Open de onderstaande link om te controleren of de data correct naar Artik Cloud wordt gestuurd. Als alles goed gaat, verschijnt een JSON-bestand. Als je geen JSON ziet, heb je waarschijnlijk het SSL-certificaat niet geïnstalleerd zoals beschreven. Ga terug en volg de richtlijnen nauwkeurig.
https://localhost:8000/acdemo/post-message.php?count=10
Wat Volgende Stap
Op basis van de autoteldata kun je een app voor een winkelcentrum maken zodat bezoekers het aantal beschikbare parkeerplaatsen kunnen bekijken voordat ze aankomen. Je kunt ook een extra lichtindicator toevoegen die brandt wanneer de parkeerplaats vol is of niet.
Code
Arduino Code
int pirPinIN = 7;
int pirPinOUT = 10;
int 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() {
long now = millis();
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]; // verandering 0 naar 1 of 2 etc. voor je poort
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("JOUW_TOEGANGSTOKEN");
$data = '{ "count": ' . $count . ' }';
$payload = array("data" => $data, "sdid" => "JOUW_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 = "JOUW_CLIENT_ID";
const DEVICE_ID = "JOUW_DEVICE_ID";
const API_URL = "https://api.artik.cloud/v1.1";
const API_USERS_SELF = "/users/self";
const API_MESSAGES_LAST = "/messages/last?sdids=<DEVICES>&count=<COUNT>";
const API_MESSAGES_POST = "/messages";
public $token = null;
public $user = null;
public function __construct(){ }
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){
$response = json_decode($json);
} else{
var_dump($json);
$response = $json;
}
return $response;
}
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){
$response = json_decode($json);
} else{
var_dump($json);
$response = $json;
}
return $response;
}
public function getUsersSelf(){
return $this->getCall(ArtikCloudProxy::API_URL . ArtikCloudProxy::API_USERS_SELF);
}
public function sendMessage($payload){
return $this->postCall(ArtikCloudProxy::API_URL . ArtikCloudProxy::API_MESSAGES_POST, $payload);
}
public function getMessagesLast($deviceCommaSeparatedList, $countByDevice){
$apiPath = ArtikCloudProxy::API_MESSAGES_LAST;
$apiPath = str_replace("<DEVICES>", $deviceCommaSeparatedList, $apiPath);
$apiPath = str_replace("<COUNT>", $countByDevice, $apiPath);
return $this->getCall(ArtikCloudProxy::API_URL . $apiPath);
}
}
Schema's
Diagram voor het aansluiten van de 2 PIR-sensoren en de LED:


Productieproces
- LED helderheid regelen met PWM via drukknop op Arduino Mega
- Bouw een Ultrasonische Zweefapparaat met Arduino – Stap-voor-stap Handleiding
- Bouw een Slimme IoT Pot met ESP8266, Arduino & Ultrasonische Sensor – Real-time Monitoring
- Een Arduino Iron Man bouwen: onderdelen, sensoren en stapsgewijze handleiding
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- De massa van de aarde meten met Arduino: een stapsgewijze DIY-gids
- DIY Arduino Luchtbevochtiger Controller met Relais – Veilige Hoogspanningsopstelling
- Realtime afstandsmeting met Arduino Sonar & Processing visualisatie
- MAX30100 hartslagsensor integreren met Arduino: Stapsgewijze handleiding
- Valentijnscadeau: DIY Dagen-samen-teller
- Bouw een Real-time Digitale Kompas met Arduino & Processing