Sistema de aparcamiento inteligente: Solución eficiente para aparcamiento urbano
Componentes y suministros
| Raspberry Pi 3 Model B | ×1 |
| Arduino Mega 2560 | ×1 |
| Sensor ultrasónico HC-SR04 | ×3 |
Aplicaciones y servicios online
- Samsung ARTIK Cloud para IoT
- Google Maps API
- Arduino IDE
Sobre el proyecto
Encontrar plaza libre en una ciudad congestionada como Bangalore es muy difícil. La gente sale con el coche y lo primero que piensa es dónde aparcar. A menudo llegan a un parking y está completo, teniendo que buscar otro. Es un gran problema.
Desarrollé un sistema de aparcamiento inteligente basado en la nube usando Samsung ARTIK Cloud, una plataforma IoT ideal. Un usuario puede ver plazas libres desde móvil o app web desde cualquier lugar. El sistema actualiza los datos cada 30 segundos.
Pasos del proyecto
- Crear dispositivo en ARTIK Cloud
- Crear aplicación en ARTIK Cloud
- Crear regla en ARTIK Cloud
- Preparar Arduino
- Conectar sensores
- Preparar Raspberry Pi
- Desarrollar aplicación web
Paso 1: Crear dispositivo en ARTIK Cloud
Accede a tu cuenta Samsung → Developer → Device Types → New. Pon nombre y nombre único. Añade manifest con campo parking_slot (integer). Guarda, omite acciones, activa manifest. Luego ve a My ARTIK Cloud → Devices → Add another device → selecciona tu dispositivo → Connect Device → genera Token. Anota Device ID y Device Token.
Paso 2: Crear regla en ARTIK Cloud
En Rules → New Rule. Define condición (IF) sobre campo de datos del dispositivo y acción (THEN) para otro dispositivo/app. Guarda regla.
Paso 3: Preparar Arduino
El Arduino Mega lee 3 sensores ultrasónicos HC-SR04 (cada uno monitoriza una plaza) y envía el número de plazas libres por puerto serie a la Raspberry Pi cada 5 segundos (configurable a 30s). Sube el sketch sonar.ino.
Paso 4: Conectar sensores

Paso 5: Preparar Raspberry Pi
La Raspberry Pi actúa como cliente WebSocket hacia ARTIK Cloud. Usa Node.js.
# Instalar Node.js y npm
sudo apt-get update && sudo apt-get install nodejs npm
# Instalar cliente WebSocket y serialport
npm install --save ws
npm install serialport
Descarga staff-parking.js desde GitHub, sube a la Pi (ej. FileZilla), edita device_id y device_token. Ejecuta: sudo node staff-parking.js.
Paso 6: Desarrollar aplicación web
HTML + JavaScript + WebSocket + Google Maps API. Descarga carpeta web-app de GitHub, modifica Device ID/Token del dispositivo que genera la acción (en mi caso Edison). Abre websocket.html en navegador.
Código
Raspberry Pi (staff-parking.js) - Node.js
// staff-parking.js - Envía datos de plazas libres a ARTIK Cloud vía WebSocket
var webSocketUrl = "wss://api.artik.cloud/v1.1/websocket?ack=true";
var device_id = "TU_DEVICE_ID";
var device_token = "TU_DEVICE_TOKEN";
var WebSocket = require('ws');
var ws = null;
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 abierto");
register();
});
ws.on('message', handleRcvMsg);
ws.on('close', function() { console.log("WebSocket cerrado"); });
}
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;
// Procesar acciones si se reciben
}
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});
}
sp.on("open", function() {
sp.on('data', function(data) {
var slot = parseInt(data);
sendStateToArtikCloud(slot);
});
});
process.on('SIGINT', function() { process.exit(); });
start();
Arduino (sonar.ino) - C/C++
// sonar.ino - Lee 3 sensores HC-SR04 y envía plazas libres por Serial
#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 count=0, 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() {
// Sensor 1
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; // 1 = ocupado
// Sensor 2
digitalWrite(trigPin2, LOW); delayMicroseconds(2);
digitalWrite(trigPin2, HIGH); delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distance2 = duration2/58.2;
distance2 = (distance2 < 10) ? 1 : 0;
// Sensor 3
digitalWrite(trigPin3, LOW); delayMicroseconds(2);
digitalWrite(trigPin3, HIGH); delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
duration3 = pulseIn(echoPin3, HIGH);
distance3 = duration3/58.2;
distance3 = (distance3 < 10) ? 1 : 0;
count = distance1 + distance2 + distance3; // total coches
freeSlot = 3 - count; // plazas totales - ocupadas
Serial.println(freeSlot);
delay(5000); // actualizar cada 5s (cambiar a 30000 para 30s)
}
Aplicación Web (HTML + JavaScript)
Incluye websocket.html (frontend con Google Maps) y websocket_client.js (cliente WebSocket que recibe acciones de ARTIK Cloud y actualiza contadores de plazas libres en dos parkings: "Staff Parking" y "Student/Guest Parking").
Todo el código necesario está en el repositorio GitHub: https://github.com/husinul/Smart-Car-Parking
Esquemáticos



Proceso de manufactura
- Barman Inteligente: Construye tu Propia Estación de Cócteles con Raspberry Pi
- Sistemas de transporte explicados: Funcionamiento, tipos y beneficios clave
- Dominando tu gato hidráulico: Tipos, usos y consejos de seguridad
- Domina el Sistema de Suspensión de tu Vehículo: Protege tu Coche y Mejora la Comodidad
- ¿Por Qué el Calefactor del Coche Solo Funciona Conduciendo? Causas y Soluciones
- Cómo los sistemas de compresor inteligentes mejoran la eficiencia de la instalación
- Controles de Iluminación Inteligentes Reducen Facturas Energéticas de Invernaderos hasta 33%
- SensiCut: Plataforma Avanzada de Cortadora Láser Identifica Materiales con Precisión
- Sistemas de gestión de edificios: Impulsando ciudades inteligentes con IoT
- Constructores en C#: Tipos, ejemplos y patrones avanzados
- Dominando las Sentencias Using en C#: Importaciones, Alias y Directivas Estáticas