Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

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

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:

  1. Criar dispositivo na plataforma ARTIK Cloud
  2. Criar aplicação no ARTIK Cloud
  3. Criar regra no ARTIK Cloud
  4. Preparar o Arduino
  5. Conectar os sensores
  6. Preparar o Raspberry Pi
  7. 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

Sistema de Estacionamento Inteligente: Soluções Eficientes para Estacionamento Urbano

Passo 5: Preparar o Raspberry Pi

O Raspberry Pi atua como cliente WebSocket comunicando com ARTIK Cloud. Usei Node.js (não pré-instalado).

  1. Instalar Node e npm: sudo apt-get update && sudo apt-get install nodejs npm
  2. Instalar cliente WebSocket ws: npm install --save ws
  3. 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:

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

Sistema de Estacionamento Inteligente: Soluções Eficientes para Estacionamento Urbano
Sistema de Estacionamento Inteligente: Soluções Eficientes para Estacionamento Urbano
Sistema de Estacionamento Inteligente: Soluções Eficientes para Estacionamento Urbano

Processo de manufatura

  1. Construtores em C#: Tipos, Exemplos e Padrões Avançados
  2. Dominando Declarações Using em C#: Imports, Aliases e Diretivas Estáticas
  3. Bartender Inteligente: Construa sua Própria Estação de Coquetéis com Raspberry Pi
  4. Sistemas de Gestão de Edifícios: Impulsionando Cidades Inteligentes com IoT
  5. Controles Inteligentes de Iluminação Reduzem Contas de Energia de Estufas em até 33%
  6. SensiCut: Plataforma Avançada de Cortadora a Laser Identifica Materiais com Precisão
  7. Sistemas Transportadores: Funcionamento, Tipos e Principais Benefícios
  8. Dominando o Macaco Hidráulico: Tipos, Usos e Dicas de Segurança
  9. Dominando o Sistema de Suspensão do Seu Veículo: Protegendo Seu Carro e Melhorando o Conforto
  10. Por Que o Aquecedor do Carro Só Funciona Andando? Descubra e Resolva