Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)
Компоненты и материалы
- Arduino UNO — 1 шт.
- PIR-датчики движения — 2 шт. (на въезде и выезде)
- Светодиод — 1 шт. (индикация срабатывания)
- Провода-перемычки — 1 набор
Программное обеспечение и сервисы
- Arduino IDE
- Processing — среда для ПК (прием данных по Serial)
- PHP — серверный скрипт для отправки в облако
- Samsung ARTIK Cloud (устарел) — облачная платформа IoT (можно заменить на ThingSpeak, Blynk, Firebase и др.)
Описание проекта
Введение
Проект демонстрирует подсчет машин на парковке с помощью двух PIR-датчиков на входе и выходе. Arduino отправляет счетчик на ПК через Serial. Приложение на Processing читает данные и через PHP-скрипт передает их в облако. Не требуется Ethernet/WiFi-шилд — используется USB-соединение с компьютером.
Принцип работы
Датчики устанавливаются на въезде и выезде. При проезде машины счетчик инкрементируется (въезд) или декрементируется (выезд). Светодиод мигает при каждом срабатывании, подтверждая учет.
Processing (ПК)
Processing — открытый инструмент для взаимодействия ПК с Arduino. Скетч Processing открывает Serial-порт, читает значение счетчика и вызывает PHP-скрипт функцией loadStrings() для отправки в облако.

PHP (Сервер)
PHP-скрипт post-message.php принимает параметр count от Processing и POST-запросом отправляет в ARTIK Cloud (или другой бэкенд). Требуется веб-сервер (WAMP/XAMPP или хостинг) с SSL. Необходимо отредактировать ArtikCloudProxy.php и post-message.php, вставив свои CLIENT_ID, DEVICE_ID, ACCESS_TOKEN.

Настройка ARTIK Cloud (исторически)
- Создать приложение в ARTIK Cloud, получить Client ID / Secret.
- Добавить тип устройства "Car Counter" с полем
count(integer). - Выдать права Read/Write приложению.

Запуск
- Загрузить скетч в Arduino UNO.
- Запустить WAMP/XAMPP (если локально) и скетч Processing.
- Проверить срабатывание PIR-датчиков (светодиод должен мигать).
- Проверить приход данных в облако (дашборд ARTIK / ThingSpeak).

Устранение неполадок
Проверьте PHP-скрипт напрямую в браузере: https://localhost:8000/acdemo/post-message.php?count=10. Должен вернуть JSON. Если нет — проблема в SSL-сертификате или настройках сервера.
Дальнейшее развитие
На основе данных о заполненности можно сделать приложение для покупателей: свободные места до приезда в ТЦ. Добавить индикатор "Парковка заполнена".
Код
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() {
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]; // на Windows обычно COM1, COM3 и т.д.
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; 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) 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); }
public function getMessagesLast($devices, $count){
$apiPath = str_replace("<DEVICES>", $devices, self::API_MESSAGES_LAST);
$apiPath = str_replace("<COUNT>", $count, $apiPath);
return $this->getCall(self::API_URL.$apiPath);
}
}
?>
Схемы подключения
Подключение 2 PIR-датчиков и светодиода к Arduino UNO:

Производственный процесс
- Управление яркостью LED с ШИМ через кнопку на Arduino Mega
- Создание ультразвукового левитатора на Arduino: пошаговое руководство
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Измерение массы Земли с Arduino: пошаговое руководство по DIY
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- Подарок на День святого Валентина: Счетчик дней вместе своими руками
- Цифровой компас в реальном времени на Arduino и Processing