Умная парковка: IoT-система на Raspberry Pi и Arduino для городской среды
Компоненты и материалы
| Raspberry Pi 3 Model B | 1 |
| Arduino Mega 2560 | 1 |
| Ультразвуковой датчик HC-SR04 | 3 |
Приложения и сервисы
- Samsung ARTIK Cloud (IoT-платформа)
- Google Maps API
- Arduino IDE
О проекте
Поиск свободного парковочного места в загруженном городе (Бенгалуру) — настоящая проблема. Водители тратят время на поиск, часто приезжая на заполненные паркинги.
Решение — облачная система умной парковки на платформе Samsung ARTIK Cloud. Пользователь через веб/мобильное приложение видит свободные места в реальном времени. Данные обновляются каждые 30 секунд.
Этапы проекта
- Создание устройства в ARTIK Cloud
- Создание приложения в ARTIK Cloud
- Настройка правил (Rules) в ARTIK Cloud
- Подготовка Arduino (сбор данных с датчиков)
- Подключение ультразвуковых датчиков
- Настройка Raspberry Pi (WebSocket-клиент к ARTIK)
- Разработка веб-приложения (HTML/JS + Google Maps)
Шаг 1: Устройство в ARTIK Cloud
Войдите в Samsung Account → Developer Dashboard → Device Types → New.
- Device Display Name + Unique Name → Create Device Type
- + New Manifest → Field Name (например,
parking_slot), Type: Integer → Save - Next: Device Actions (можно пропустить) → Next: Active Manifest → Готово
- My ARTIK Cloud → Devices → +Add → выберите созданное устройство → Connect Device
- Сгенерируйте Token, сохраните Device ID и Device Token
Шаг 2: Правила (Rules) в ARTIK Cloud
Rules → New Rule. Условие (IF): поле данных устройства + условие. Действие (THEN): действие для устройства/приложения. Можно использовать данные другого устройства. Сохраните правило.
Шаг 3: Подготовка Arduino
Arduino Mega опрашивает 3 датчика HC-SR04 на парковочных местах, считает свободные слоты и отправляет число в Raspberry Pi по Serial (USB) каждые 5 секунд (в коде 5000 мс).
Шаг 4: Подключение датчиков

Шаг 5: Настройка Raspberry Pi
Raspberry Pi работает как WebSocket-клиент ARTIK Cloud. Нужен Node.js.
sudo apt-get update
sudo apt-get install nodejs npm
npm install --save ws
npm install serialport
Скачайте исходник staff-parking.js с GitHub, замените DEVICE_ID и DEVICE_TOKEN, загрузите на Pi (FileZilla), запустите:
sudo node staff-parking.js
Шаг 6: Веб-приложение
HTML/JS + WebSocket + Google Maps API. Скачайте папку web-app с GitHub, вставьте свои Device ID/Token, откройте websocket.html в браузере.
Код
Raspberry Pi (staff-parking.js) — Node.js
var webSocketUrl = "wss://api.artik.cloud/v1.1/websocket?ack=true";
var device_id = "Your Device ID";
var device_token = "Your Device Token";
var WebSocket = require('ws');
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyACM0", {
baudrate: 9600,
parser: serialport.parsers.readline("\n")
});
function getTimeMillis() { return parseInt(Date.now().toString()); }
function start() {
ws = new WebSocket(webSocketUrl);
ws.on('open', function() {
console.log("WebSocket open");
register();
});
ws.on('message', handleRcvMsg);
ws.on('close', function() { console.log("WebSocket closed"); });
}
function register() {
var msg = '{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+'"}';
ws.send(msg, {mask: true});
}
function handleRcvMsg(msg) {
var obj = JSON.parse(msg);
if (obj.type != "action") return;
// обработка действий, если нужны
}
function sendStateToArtikCloud(parking_slot) {
var payload = '{"sdid":"'+device_id+'", "ts":'+getTimeMillis()+', "data":'+JSON.stringify({parking_slot:parking_slot})+', "cid":"'+getTimeMillis()+'"}';
ws.send(payload, {mask: true});
}
start();
sp.on("open", function() {
sp.on('data', function(data) {
var slot = parseInt(data);
sendStateToArtikCloud(slot);
});
});
Arduino (sonar.ino) — опрос HC-SR04
#define echoPin1 2; #define trigPin1 3
#define echoPin2 4; #define trigPin2 5
#define echoPin3 6; #define trigPin3 7
long duration1, distance1, duration2, distance2, duration3, distance3;
int freeSlot = 0;
void setup() {
Serial.begin(9600);
pinMode(trigPin1, OUTPUT); pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT); pinMode(echoPin3, INPUT);
}
void loop() {
// Опрос 3 датчиков
digitalWrite(trigPin1, LOW); delayMicroseconds(2);
digitalWrite(trigPin1, HIGH); delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = duration1/58.2;
distance1 = (distance1 < 10) ? 1 : 0; // занято/свободно
// ... аналогично для датчиков 2 и 3 ...
int count = distance1 + distance2 + distance3; // занятые
freeSlot = 3 - count; // всего 3 места
Serial.println(freeSlot);
delay(5000); // обновление каждые 5 сек (в проекте 30 сек)
}
Веб-приложение (HTML + JS)
Файл websocket.html с подключением websocket_client.js, Google Maps, отображение свободных слотов для двух паркингов (Staff/Student).
Исходный код на GitHub
https://github.com/husinul/Smart-Car-Parking
Схемы



Производственный процесс
- Конструкторы в C#: виды, примеры и продвинутые паттерны
- Освоение операторов using в C#: импорт, псевдонимы и статические директивы
- Умный бармен: создайте свою Raspberry Pi-станцию для коктейлей
- Системы управления зданиями: питание умных городов с IoT
- Умное освещение теплиц снижает счета за электричество до 33%
- SensiCut: Продвинутая платформа лазерного резака точно идентифицирует материалы
- Конвейерные системы: принцип работы, виды и ключевые преимущества
- Автодомкраты: виды, применение и правила безопасности
- Подвеска автомобиля: функции, компоненты, типы, принцип работы и требования
- Почему печь автомобиля работает только на ходу: причины и устранение