Sistema de Estacionamento Inteligente: Soluções Eficientes para Estacionamento Urbano
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Raspberry Pi 3 Model B | 1 |
| Arduino Mega 2560 | 1 |
| Sensor Ultrassônico HC-SR04 | 3 |
Aplicativos e Serviços Online
- Samsung ARTIK Cloud para IoT
- Google Maps API
- Arduino IDE
Sobre o Projeto
Encontrar uma vaga livre em uma cidade congestionada como Bangalore é muito difícil. A primeira coisa que vem à mente ao sair de carro é: onde vou estacionar? Muitas vezes, ao chegar ao estacionamento, todas as vagas estão ocupadas e precisa-se procurar outro local. Isso gera grande transtorno e medo na hora de sair com o carro.
Pensando em como resolver esse problema, desenvolvi um sistema de estacionamento inteligente baseado em nuvem e espero que sua implementação resolva o problema de estacionamento da minha cidade. O ARTIK Cloud é uma plataforma excelente e adequada para esse trabalho.
Com este sistema, o usuário poderá encontrar uma vaga disponível facilmente usando aplicativo móvel ou web de qualquer lugar. O sistema atualiza os dados de estacionamento a cada 30 segundos.
Etapas do Projeto:
- Criar dispositivo na plataforma ARTIK Cloud
- Criar aplicação no ARTIK Cloud
- Criar regra no ARTIK Cloud
- Preparar o Arduino
- Conectar os sensores
- Preparar o Raspberry Pi
- Desenvolver Aplicação Web
Passo 1: Criar Dispositivo no ARTIK Cloud
O processo envolve: login na conta Samsung → opção DEVELOPER → DASHBOARD → DEVICE TYPES → NEW → definir nome e nome único → CREATE DEVICE TYPE → + NEW MANIFEST → definir campo de dados (ex: parking_slot, tipo integer) → SAVE → NEXT: DEVICE ACTIONS → SAVE → NEXT: ACTIVE MANIFEST → conectar dispositivo → gerar token → anotar DEVICE ID e DEVICE TOKEN.
Passo 2: Criar Regra no ARTIK Cloud
Criar regra onde condições geram ações quando atendidas. Selecionar RULES → NEW RULE → no IF selecionar campo de dados do dispositivo e definir valor/condição → no THEN selecionar ação para dispositivo específico → SAVE RULE.
Passo 3: Preparar o Arduino
O Arduino coleta dados dos sensores nas vagas e envia ao Raspberry Pi via porta serial. Usei Arduino Mega para uma estação de estacionamento; pode-se conectar mais Arduinos para outras estações. Sensores ultrassônicos usam pinos digitais. O sketch para sensores ultrassônicos está na seção de código.
Passo 4: Conectar os Sensores
Passo 5: Preparar o Raspberry Pi
O Raspberry Pi atua como cliente WebSocket comunicando com ARTIK Cloud. Usei Node.js (não pré-instalado).
- Instalar Node e npm:
sudo apt-get update && sudo apt-get install nodejs npm - Instalar cliente WebSocket ws:
npm install --save ws - Instalar serialport:
npm install serialport
Baixe o código fonte do GitHub, carregue no Pi (ex: via FileZilla), altere DEVICE ID e DEVICE TOKEN no código. Execute: sudo node staff-parking.js
Passo 6: Desenvolver Aplicação Web
HTML e JavaScript com WebSocket para comunicação com ARTIK Cloud e Google Maps API para mapa. Baixe a pasta web-app do GitHub, modifique DEVICE ID e TOKEN, abra websocket.html no navegador.
Código
Raspberry Pi (staff-parking.js)
// Transferência de dados de estacionamento
var webSocketUrl = "wss://api.artik.cloud/v1.1/websocket?ack=true";
var device_id = "Seu Device ID"; // staff parking DEVICE ID
var device_token = "Seu Device Token"; // staff parking DEVICE TOKEN
var WebSocket = require('ws');
var isWebSocketReady = false;
var ws = null;
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyACM0", {
baudrate: 9600,
parser: serialport.parsers.readline("\n")
});
var parking_state = 0;
function getTimeMillis() { return parseInt(Date.now().toString()); }
function start() {
isWebSocketReady = false;
ws = new WebSocket(webSocketUrl);
ws.on('open', function() {
console.log("Conexão WebSocket aberta...");
register();
});
ws.on('message', function(data) { handleRcvMsg(data); });
ws.on('close', function() { console.log("Conexão WebSocket fechada..."); });
}
function register() {
console.log("Registrando dispositivo na conexão WebSocket");
try {
var registerMessage = '{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer ' + device_token + '", "cid":"' + getTimeMillis() + '"}';
console.log('Enviando mensagem de registro: ' + registerMessage + '\n');
ws.send(registerMessage, {mask: true});
isWebSocketReady = true;
} catch (e) {
console.error('Falha ao registrar: ' + e.toString());
}
}
function handleRcvMsg(msg) {
var msgObj = JSON.parse(msg);
if (msgObj.type != "action") return;
var actions = msgObj.data.actions;
var actionName = actions[0].name;
console.log("Ação recebida: " + actionName);
if (actionName.toLowerCase() == "settext") {
console.log('Ação reconhecida recebida: ' + actionName);
} else {
console.log('Ação não reconhecida: ' + actionName);
}
}
function sendStateToArtikCloud(parking_slot) {
try {
var ts = ', "ts": ' + getTimeMillis();
var data = { "parking_slot": parking_slot };
var payload = '{"sdid":"' + device_id + '"' + ts + ', "data": ' + JSON.stringify(data) + ', "cid":"' + getTimeMillis() + '"}';
console.log('Enviando payload: ' + payload + '\n');
ws.send(payload, {mask: true});
} catch (e) {
console.error('Erro ao enviar mensagem: ' + e.toString() + '\n');
}
}
function exitClosePins() {
console.log('Saindo e destruindo pinos!');
process.exit();
}
start();
sp.on("open", function() {
sp.on('data', function(data) {
console.log("Porta serial recebeu: " + data);
var parking_slot = parseInt(data);
sendStateToArtikCloud(parking_slot);
});
});
process.on('SIGINT', exitClosePins);
Arduino (sonar.ino)
#define echoPin1 2
#define trigPin1 3
#define echoPin2 4
#define trigPin2 5
#define echoPin3 6
#define trigPin3 7
long duration1, distance1;
long duration2, distance2;
long duration3, distance3;
int count = 0;
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() {
// Sensor 1
digitalWrite(trigPin1, LOW); delayMicroseconds(2);
digitalWrite(trigPin1, HIGH); delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
// Sensor 2
digitalWrite(trigPin2, LOW); delayMicroseconds(2);
digitalWrite(trigPin2, HIGH); delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
// Sensor 3
digitalWrite(trigPin3, LOW); delayMicroseconds(2);
digitalWrite(trigPin3, HIGH); delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
duration3 = pulseIn(echoPin3, HIGH);
// Calcular distâncias (cm)
distance1 = duration1 / 58.2;
distance1 = (distance1 < 10) ? 1 : 0;
distance2 = duration2 / 58.2;
distance2 = (distance2 < 10) ? 1 : 0;
distance3 = duration3 / 58.2;
distance3 = (distance3 < 10) ? 1 : 0;
count = distance1 + distance2 + distance3;
freeSlot = 3 - count; // Total de vagas = 3
Serial.println(freeSlot); // Enviar para Raspberry Pi via USB
delay(5000); // Atualizar a cada 5 segundos (original: 30 seg)
}
Aplicação Web (HTML + JavaScript)
O código front-end inclui:
websocket.html– Interface com Google Maps mostrando localização das vagaswebsocket_client.js– Cliente WebSocket que recebe ações do ARTIK Cloud e atualiza contadores de vagas livres
O JavaScript registra o dispositivo, escuta mensagens do tipo action e atualiza elementos rainbowParking e indigoParking com o número de vagas livres.
Código Fonte Completo
Todos os arquivos necessários estão no repositório GitHub: https://github.com/husinul/Smart-Car-Parking
Esquemáticos
Processo de manufatura
- Construtores em C#: Tipos, Exemplos e Padrões Avançados
- Dominando Declarações Using em C#: Imports, Aliases e Diretivas Estáticas
- Bartender Inteligente: Construa sua Própria Estação de Coquetéis com Raspberry Pi
- Sistemas de Gestão de Edifícios: Impulsionando Cidades Inteligentes com IoT
- Controles Inteligentes de Iluminação Reduzem Contas de Energia de Estufas em até 33%
- SensiCut: Plataforma Avançada de Cortadora a Laser Identifica Materiais com Precisão
- Sistemas Transportadores: Funcionamento, Tipos e Principais Benefícios
- Dominando o Macaco Hidráulico: Tipos, Usos e Dicas de Segurança
- Dominando o Sistema de Suspensão do Seu Veículo: Protegendo Seu Carro e Melhorando o Conforto
- Por Que o Aquecedor do Carro Só Funciona Andando? Descubra e Resolva