Smart Parking Counter: Pelacakan Kendaraan Real-Time dengan Arduino, Processing, dan PHP
Komponen dan Perlengkapan
Arduino UNO – 1 unit
Sensor Gerak PIR (generic) – 2 unit
LED (generic) – 1 unit
Kabel jumper (generic) – 1 set
Aplikasi dan Layanan Online
Arduino IDE
Samsung ARTIK Cloud for IoT
Processing
PHP
Tentang Proyek Ini
Pendahuluan
Proyek ini menunjukkan cara menggunakan Arduino untuk menghitung jumlah mobil yang masuk dan keluar dari sebuah mall menggunakan dua sensor, mengirim data ke cloud menggunakan Processing & PHP, dan nanti melihat jumlah slot parkir yang tersedia di area parkir. Anda tidak perlu shield Ethernet atau WiFi untuk proyek ini!
Cara Kerja
Sensor perlu ditempatkan di titik masuk dan keluar area parkir agar berfungsi sebagaimana mestinya. Secara dasar, Anda menambah count setiap kali mobil masuk dan mengurangi saat keluar. LED di sistem hanya menunjukkan bahwa kendaraan terhitung dengan benar karena menyala setiap kali mobil melewati sensor.
Processing
Processing adalah bahasa/alat pengembangan open source untuk menulis program di komputer lain. Berguna ketika Anda ingin komputer lain "berbicara" dengan Arduino, misalnya untuk menampilkan atau menyimpan data yang dikumpulkan oleh Arduino.
Untuk proyek ini, kami menggunakan Processing untuk menerima data (jumlah mobil) yang dikirim Arduino melalui port serial. Unduh dan instal IDE Processing di komputer Anda. Anda dapat melihat dalam skets Processing yang dilampirkan baris kode yang sangat sederhana dan mudah dipahami. Di sini, kami memanggil file PHP menggunakan metode loadStrings().
PHP
File PHP post-message.php adalah file yang sama dalam tutorial yang ditemukan di sini. Kami mengunduh seluruh file zip dari halaman Github dan mengedit beberapa baris kode dalam file asli sehingga kami dapat menggunakannya tanpa harus login ke akun Samsung kami. Untuk ini berfungsi, Anda perlu mengikuti petunjuk di sini tentang mengubah port server WAMP atau XAMP Anda dan menginstal sertifikat CA untuk ARTIK Cloud. Alternatifnya, Anda dapat menggunakan server remote atau hosted dengan sertifikat SSL yang terpasang.
Salin file ke sebuah folder, misalnya, acdemo sehingga dapat diakses menggunakan URL https://localhost:8000/acdemo/post-message.php atau https://www.yourwebsite.com/acdemo/post-message.php
Hanya ada dua file dalam SDK PHP yang perlu Anda edit: ArtikCloudProxy.php dan post-message.php. Anda dapat melihat client & device ID di sini.
Dalam file post-message.php, Anda perlu mendapatkan access token dan device ID Anda. Cara termudah untuk mendapatkan token adalah dengan mengikuti langkah di sini. Perhatikan bahwa satu-satunya data yang kami kirim ke cloud adalah jumlah mobil yang masuk dan keluar dari mall. Kami membuat sebuah device di Artik Cloud dan menamainya Car Counter dengan sebuah field yang disebut count yang menyimpan nilai ini.
Sekarang semua telah disiapkan, saatnya untuk memulai! Ikuti langkah-langkah sederhana di bawah ini:
Artik Cloud
1. Login ke akun Artik Cloud Anda dan pergi ke Aplikasi > Aplikasi Baru
2. Masukkan detail yang diperlukan untuk aplikasi Anda di layar berikutnya.
3. Setelah Anda selesai membuat aplikasi, itu akan ditampilkan di dashboard Anda. Klik nama aplikasi dan cari Tampilkan Client ID & Secret. Anda perlu kode-kode ini untuk file PHP.
4. Dari menu samping, pilih aplikasi Anda dan klik Izinkan. Tambahkan Car Counter dari daftar tipe device dan centang Baca & Tulis izin.
Pengkodean
1. Unggah skets ke Arduino UNO Anda. Ini adalah kali pertama Anda menggunakan Arduino, ikuti langkah-langkah ini untuk memahami cara melakukan prosedur ini.
2. Jalankan skets Processing di IDE Processing. Pastikan server WAMP Anda menyala pada titik ini jika Anda menggunakan komputer lokal Anda bukan server hosted.
3. Jika Anda telah berhasil menghubungkan bagian untuk sistem ini berdasarkan diagram koneksi di atas, lewati melalui sensor PIR untuk melihat apakah berfungsi.
4. Login ke akun Artik Cloud Anda untuk melihat apakah data terkirim dengan benar.
Pemecahan Masalah
1. Buka link di bawah ini untuk melihat apakah data terkirim dengan benar ke Artik Cloud. Jika tidak ada yang salah, ini akan menampilkan file Json. Jika Anda tidak melihat file Json, Anda mungkin tidak menginstal sertifikat SSL seperti yang dijelaskan di atas. Coba kembali dan pastikan untuk mengikuti arahan dengan benar.
Berdasarkan data jumlah mobil di atas, Anda dapat membuat aplikasi untuk mall sehingga pembeli dapat melihat jumlah slot yang tersedia di area parkir sebelum pergi ke mall. Anda juga dapat menambahkan indikator lampu lain yang menyala ketika parkir penuh atau tidak.
Kode
Kode Arduino
Skets Processing
post-message.php
ArtikCloudProxy.php
Kode Arduino
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); } }
Ini adalah kode yang menampilkan jumlah mobil ke serial dan menyalakan LED untuk menunjukkan bahwa mobil melewati sensor PIR.
Skets Processing
import processing.serial.*; Serial myPort; // Buat objek dari kelas Serial String val; // Data yang diterima dari port serial void setup() { // Saya tahu bahwa port pertama dalam daftar serial di mac saya // adalah Serial.list()[0]. // Di mesin Windows, ini biasanya membuka COM1. // Buka port mana pun yang Anda gunakan. String portName = Serial.list()[0]; //ubah 0 menjadi 1 atau 2 dst. untuk cocok dengan port Anda myPort = new Serial(this, portName, 9600); } void draw() { if ( myPort.available() > 0) { // Jika data tersedia, val = myPort.readStringUntil('\n'); // baca dan simpan di val int count = parseInt(val); if(count >= 0){ loadStrings("https://localhost:8000/acdemo/post-message.php?count="+val); } } println(val); //cetak di konsol }
Skets Processing ini membaca nilai masuk pada port analog dan kemudian menggunakan fungsi Komunikasi Serial untuk mengeluarkan nilai.
Kode ini GET nilai yang diteruskan oleh skets Processing dan POST count ke cloud.
ArtikCloudProxy.php
<?php /** * ARTIK Cloud helper class yang berkomunikasi dengan ARTIK Cloud * */ class ArtikCloudProxy { # Konfigurasi Umum const CLIENT_ID = "YOUR_CLIENT_ID"; const DEVICE_ID = "YOUR_DEVICE_ID"; const API_URL = "https://api.artik.cloud/v1.1"; # Jalur API const API_USERS_SELF = "/users/self"; const API_MESSAGES_LAST = "/messages/last?sdids=<DEVICES>&count=<COUNT>"; const API_MESSAGES_POST = "/messages"; # Anggota public $token = null; public $user = null; public function __construct(){ } /** * Mengatur access token dan mencari informasi profil pengguna */ public function setAccessToken($someToken){ $this->token = $someToken; $this->user = $this->getUsersSelf(); } /** * Panggilan API GET */ 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; } /** * Panggilan API POST */ 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; } /** * GET /users/self API */ public function getUsersSelf(){ return $this->getCall(ArtikCloudProxy::API_URL . ArtikCloudProxy::API_USERS_SELF); } /** * POST /message API */ public function sendMessage($payload){ return $this->postCall(ArtikCloudProxy::API_URL . ArtikCloudProxy::API_MESSAGES_POST, $payload); } /** * GET /historical/normalized/messages/last API */ 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); } }
Ini adalah kelas ArtikCloudProxy yang diperlukan untuk terhubung ke cloud Artik. Simpan di folder yang sama dengan post-message.php yang dapat diakses dari web. Lakukan perubahan yang diperlukan pada konfigurasi.