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

Componentes e suprimentos

Raspberry Pi 3 Modelo B
× 1
Arduino Mega 2560
× 1
Sensor ultrassônico - HC-SR04 (genérico)
× 3

Aplicativos e serviços online

Samsung ARTIK Cloud para IoT
Google Maps
Arduino IDE

Sobre este projeto


Encontrar um estacionamento gratuito em uma cidade congestionada como Bangalore é muito difícil. Aqui, se alguém quiser sair de casa com um carro particular, a primeira coisa que vem em sua mente é estacionar, onde ele estacionará seu carro. Na maioria dos casos, as pessoas vão a um estacionamento e descobrem que todas as vagas estão ocupadas e então ele tem que procurar outro estacionamento. Portanto, é um grande aborrecimento e muitas pessoas ficam com medo de estacionar o carro quando ele sai com o carro.

Então, eu estava pensando em como o problema pode ser resolvido e finalmente consegui fazer um sistema de estacionamento inteligente baseado em nuvem e espero que a implementação do sistema possa remover o problema de estacionamento da minha cidade. ARTIK Cloud é realmente uma plataforma boa e apropriada para esse trabalho.

Usando este sistema, o usuário será capaz de encontrar um estacionamento disponível facilmente usando o aplicativo móvel ou web de qualquer lugar. O sistema atualiza os dados de estacionamento a cada 30 segundos.

Neste projeto, vou mostrar como você pode construir facilmente esse sistema inteligente. Definitivamente, vou usar a plataforma ARTIK Cloud, a plataforma de nuvem IoT mais legal. Antes de entrar em detalhes, aproveite o vídeo de demonstração do meu projeto de demonstração.

Para este sistema de demonstração, você deve criar apenas um novo dispositivo na plataforma Samsung Artik Cloud. Vou mostrar aqui. Chamei meus dispositivos de estacionamento arco-íris e armazenei dados de estacionamento, como vagas gratuitas em um estacionamento. Raspi envia informações de estacionamento de acordo com as regras predefinidas.

Etapas envolvidas neste projeto:

1 Criação de um dispositivo no Artik Cloud Platform

2. Fazendo um aplicativo em Artik Cloud

3. Fazendo uma regra no Artik Cloud

4. Preparando o Arduino

5. Conexão dos sensores

6. Preparando Raspberry Pi

7. Desenvolvimento de aplicativo da web

Então, vamos começar um por um. As coisas importantes primeiro. Vamos começar criando um novo dispositivo na plataforma de nuvem Artik.





Etapa 1:fazer um novo dispositivo no Artik Cloud Platform


A) Faça login em sua conta Samsung e clique na opção DESENVOLVEDOR no canto superior direito.

B) No PAINEL, selecione TIPOS DE DISPOSITIVOS e clique em NOVO

C) No NOME DE EXIBIÇÃO DO DISPOSITIVO, digite um nome para o dispositivo e dê um NOME ÚNICO, a seguir clique para CRIAR TIPO DE DISPOSITIVO.

D) Clique em + NOVO MANIFESTO

E) Digite um NOME DE CAMPO para os dados do sensor que você enviará e armazenará aqui e mencione o TIPO DE DADOS como um número inteiro. Em seguida, clique em SALVAR.

F) Em seguida, clique em PRÓXIMO:AÇÕES DO DISPOSITIVO

G) Faça uma ação ou selecione uma das AÇÕES PADRÃO. Clique para SALVAR. Para o nosso projeto não serão necessárias ações. Em seguida, clique em PRÓXIMO:MANIFESTO ATIVO.

H) Dê uma olhada em Device Fields e clique novamente em PRÓXIMO:MANIFESTO ATIVO.

I) Parabéns! você criou com sucesso seu primeiro dispositivo. Agora você tem que conectar o dispositivo à nuvem Artik. Então, vamos fazê-lo.

J) Vá para MY ARTIK CLOUD do canto superior direito.

K) Clique em MY ARTIK CLOUD e selecione DEVICES.

L) Clique para + Adicionar outro dispositivo.

M) Digite o nome do dispositivo que você acabou de criar e clique nele.

N) Clique no botão CONECTAR DISPOSITIVO ....

O) Seu dispositivo está conectado ao CLOUD.

P) Clique nisso. Gere token, anote seu DEVICE ID e DEVICE TOKEN. Eles serão necessários posteriormente, toda vez que você quiser se conectar ao seu dispositivo a partir de dispositivos físicos, aplicativos da web ou aplicativos Android.





Etapa 2:Criar regra no Artik Cloud


Nesta etapa faremos uma regra onde definimos algumas condições segundo as quais Artik cloud irá gerar uma ação quando a condição se cumprir e os dispositivos e aplicativos inscritos na ação receberão uma mensagem instantaneamente.

A) Selecione REGRAS no menu MY ARTIK CLOUD e clique em NOVA REGRA

B) Na caixa de seleção IF, selecione um campo de dados para um dispositivo e defina um valor e uma condição. Em seguida, selecione uma ação para um dispositivo específico no campo ENTÃO. Você pode definir um valor de parâmetro constante ou selecionar um valor de outros dados do dispositivo. Para definir um campo de dados de outro dispositivo, clique no ícone de download mostrado na caixa vermelha.

C) Selecione um dispositivo no menu suspenso e selecione o campo de dados.

D) Em seguida, clique em SALVAR REGRA.





Etapa 3. Preparando o Arduino


O principal trabalho do Arduino em meu projeto é coletar dados de sensores conectados a estações de estacionamento e enviar os dados para o Raspberry pi usando a porta serial. Aqui eu usei o Arduino Mega é implementado para uma estação de estacionamento. podemos conectar mais placas Arduino para diferentes estações de estacionamento. Aqui usei sensores ultrassônicos e podem ser usados ​​em qualquer local.

Para sensores ultrassônicos, pinos digitais Arduino foram usados. Sensores sônicos Ultra de esboço do Arduino estão conectados. Carregue o esboço apropriado para sua placa Arduino.

Detalhes sobre o sensor ultrassônico podem ser encontrados aqui.





Etapa 4:conexão dos sensores


Para conectar todos os sensores ao Arduino, consulte a seção esquemática.





Etapa 5:preparação de Raspberry Pi


Presumo que você tenha alguma experiência anterior no trabalho com Raspberry pi. Muitos tutoriais para iniciantes estão disponíveis na Internet.

Vamos começar nosso trabalho com raspberry pi. Raspberry pi está trabalhando como um cliente WebSocket e se comunica com a nuvem Artik usando o protocolo WebSocket. Usei Node.js para programação. Ao contrário do Python, o Node não vem pré-instalado no Raspberry Pi.

A). Instale o Node e o npm no Raspberry pi usando os seguintes comandos no terminal.
  sudo apt-get updatesudo apt-get install nodejs npm  

B). Instale o cliente WebSocket ws para raspberry pi
  npm install --save ws  

C). Instale serialport para raspberry pi
  npm install serialport  

Se você completou com sucesso todas as três etapas, então seu pi está pronto para se comunicar com o Arduino usando a porta serial e a nuvem Artik usando websocket. Como eu disse antes, dois framboesa pis são necessários para dois estacionamentos. Portanto, baixe o código-fonte para isso no Github. Você pode usar um cliente de ftp como o FileZilla para fazer o upload do código no raspberry pi. Não se esqueça de alterar DEVICE ID &DEVICE TOKEN no código-fonte.

D) Após fazer o upload do código no raspberry pi, execute o código digitando o seguinte comando na janela do terminal.
  sudo node staff-parking.js  





Etapa 6. Desenvolvimento de aplicativo da Web


Para o desenvolvimento de aplicativos da web foi usado HTML e JavaScript. Para me comunicar com a nuvem Artik, usei novamente o protocolo WebSocket. Para integrar o Map em meu aplicativo, usei a API do Google Map.

Baixe a pasta do aplicativo da web do meu Github e modifique o DEVICE ID e o DEVICE TOKEN com seu próprio código de dispositivo e token. Use o ID do dispositivo que gera a ação nos novos dados recebidos (edison no meu caso). Abra o websocket.html usando um navegador da web e divirta-se. Veja o vídeo de demonstração ...


Código

  • Raspberry Pi (estacionamento para funcionários)
  • Arduino (sonar)
  • Aplicativo da web (HTML)
  • Aplicativo da web (lado do cliente)
Raspberry Pi (estacionamento para funcionários) JavaScript
Código-fonte do Raspberry Pi
 // staff parking data transfervar webSocketUrl ="wss://api.artik.cloud/v1.1/websocket? Ack =true"; var device_id ="Your Device id"; // estacionamento da equipe DEVICE IDvar device_token ="Your Device Token"; // staff parking DEVICE TOKEN // requer módulo websocket para conectar // execute dois comandos a seguir para o terminal do seu pi // sudo apt-get update // npm install websocketvar WebSocket =require ('ws'); var isWebSocketReady =false; var data =""; var ws =null; // requer módulo serialport para raspberry pi // execute o seguinte comando para terminal // npm install serialportvar serialport =require ("serialport"); var SerialPort =serialport.SerialPort; var sp =new SerialPort ("/ dev / ttyACM0", {// para comunicação serial com arduino baudrate:9600, // estamos usando UNO então baudrate é 9600, você pode precisar mudar de acordo com seu analisador de modelo:serialport.parsers.readline (" \ n ")}); var parking_state =0; // variável para verificar o estacionamento state_gate / ** * Obtém a hora atual em milis * / function getTimeMillis () {return parseInt (Date.now (). toString ());} / ** * Crie uma conexão / websocket e configure o pino GPIO * / function start () {// Crie a conexão WebSocket isWebSocketReady =false; ws =novo WebSocket (webSocketUrl); // esta função invocada em uma conexão bem-sucedida ws.on ('open', function () {console.log ("a conexão WebSocket está aberta ...."); // você deve se registrar para uma transmissão de dados bem-sucedida // o registro é para autenticação ou registro de transferência segura de dados ();}); ws.on ('mensagem', função (dados) {// este loop é chamado sempre que o cliente envia alguma mensagem handleRcvMsg (dados); // dados são enviados para a função handleRcvMsg ()}); ws.on ('fechar', function () {console.log ("Conexão WebSocket fechada ....");}); } / ** * Envia uma mensagem de registro para / websocket endpoint * /// O cliente só funcionará quando o dispositivo for registrado a partir daqui função register () {console.log ("Registrando dispositivo na conexão WebSocket"); tente {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 mensagens. Erro ao registrar mensagem:' + e.toString ()); }} // os dados após o recebimento são enviados aqui para processamento // em nosso caso, esta função não será usada, pois não receberemos nenhuma ação // no raspberry pi. Isto é para modificações futuras. Function handleRcvMsg (msg) {// você tem que analisar a string recebida var msgObj =JSON.parse (msg); if (msgObj.type! ="ação") return; // Retorno antecipado; var ações =msgObj.data.actions; var actionName =actions [0] .name; console.log ("A ação recebida é" + actionName); // você deve saber suas ações registradas a fim de realizar o acordo if (actionName.toLowerCase () =="settext") {// fazer algo aqui após receber 'parking_state' console.log ('receber ação reconhecida' + actionName); } else {// este loop é executado se alguma ação não registrada for recebida // então você deve registrar todas as ações no console.log da nuvem ('Não fazer nada desde o recebimento da ação não reconhecida' + actionName); Retorna; }} / ** * Enviar uma mensagem para ARTIK Cloud * /// Esta função é responsável por enviar comandos para nuvem // function sendStateToArtikCloud (parking) envia número de vaga de estacionamento grátis para artik cloudfunction sendStateToArtikCloud (parking_slot) {try {ts =', "ts":' + getTimeMillis (); var data ={"parking_slot":parking_slot // definindo o valor do estacionamento do argumento para nossa variável de nuvem "parking_value"}; var payload ='{"sdid":"' + device_id + '"' + ts + ', "data":' + JSON.stringify (data) + ', "cid":"' + getTimeMillis () + '"}'; console.log ('Enviando carga útil' + carga útil + '\ n'); ws.send (carga útil, {máscara:verdadeiro}); } catch (e) {console.error ('Erro ao enviar mensagem:' + e.toString () + '\ n'); }} function exitClosePins () {console.log ('Sair e destruir todos os pinos!'); process.exit (); } start (); // executa sempre que os dados são recebidos do arduino (atraso programado de 30 segundos do arduino) sp.on ("open", function () {sp.on ('data', function (data) {console .log ("Dados recebidos da porta serial:" + dados); // sendStateToArtikCloud (dados); // vaga de estacionamento grátis var parking_slot =parseInt (data); sendStateToArtikCloud (parking_slot);});}); process.on (' SIGINT ', exitClosePins); 
Arduino (sonar) C / C ++
Código fonte para interface do sensor de sonar usando Arduino
 #define echoPin1 2 // Pino de eco para sonar 1 # define trigPin1 3 // Pino de gatilho para sonar 1 # define echoPin2 4 // Pino de eco para sonar 2 # define trigPin2 5 // Pino de gatilho para sonar 2 # define echoPin3 6 // Pino de eco para sonar 3 # define trigPin3 7 // Pino de gatilho para sonar 3 // # define echoPin4 9 // Pino de eco para sonar 4 // # define trigPin4 8 // Pino de gatilho para sonar 4 de longa duração1, distância1; // Duração usada para calcular a distância - duração longa2, distância2; longa duração3, distância3; // longa duração4, distância4; contagem interna =0; intervalo interno livre =0; configuração vazia () {Serial.begin (9600); // inicia a comunicação serial com raspberry pi pinMode (trigPin1, OUTPUT); // aciona o pino como saída pinMode (echoPin1, INPUT); // pino de eco como entrada pinMode (trigPin2, OUTPUT); pinMode (echoPin2, INPUT); pinMode (trigPin3, OUTPUT); pinMode (echoPin3, INPUT); // pinMode (trigPin4, OUTPUT); // pinMode (echoPin4, INPUT); } void loop () {/ * O ciclo trigPin / echoPin a seguir é usado para determinar a distância do objeto mais próximo refletindo as ondas sonoras dele. * / / * É necessário um sinal de nível alto de pelo menos 10 microssegundos para acionar o * pino. * _____ * | | * -------------! ! --------- * ..... | 10us | ........ * o módulo então produz oito sinais de pulso de 40KHz e espera para receber eco * / digitalWrite (trigPin1, LOW); atrasoMicrosegundos (2); digitalWrite (trigPin1, HIGH); atrasoMicrosegundos (10); digitalWrite (trigPin1, LOW); // a função pulseIn () determina a largura do pulso no tempo // a duração do pulso é proporcional à distância do obstáculo duration1 =pulseIn (echoPin1, HIGH); digitalWrite (trigPin2, LOW); atrasoMicrosegundos (2); digitalWrite (trigPin2, HIGH); atrasoMicrosegundos (10); digitalWrite (trigPin2, LOW); duração2 =pulseIn (echoPin2, HIGH); digitalWrite (trigPin3, LOW); atrasoMicrosegundos (2); digitalWrite (trigPin3, HIGH); atrasoMicrosegundos (10); digitalWrite (trigPin3, LOW); duração3 =pulseIn (echoPin3, HIGH); // digitalWrite (trigPin4, LOW); // delayMicroseconds (2); // digitalWrite (trigPin4, HIGH); // delayMicroseconds (10); // digitalWrite (trigPin4, LOW); // duração4 =pulseIn (echoPin4, HIGH); // distância =(timevelocidade do som de alto nível (340M / S) / 2, // em centímetros =uS / 58 distância1 =duração1 / 58,2; if (distância1 <10) distância1 =1; senão distância1 =0; distância2 =duração2 /58,2; if (distance2 <10) distance2 =1; else distance2 =0; distance3 =duration3 / 58.2; if (distance3 <10) distance3 =1; else distance3 =0; // distance4 =duration4 / 58.2; // if (distância4 <10) // distância4 =1; // else distância4 =0; // adicionar o resultado de todos os sensores para contar a contagem total de carros =distância1 + distância2 + distância3;; // espaço livre =espaço total - espaço livre total do carro =3 - contagem; // número total de slots é enviado para raspberry pi usando usb Serial.println (freeSlot); // o status é atualizado a cada 30 segundos. Delay (5000); // freeSlot =0; // distance1 =0; // distância2 =0; // distância3 =0; // distância4 =0;} 
Aplicativo da Web (HTML) HTML
Código-fonte do aplicativo da Web de front-end
      Sistema de estacionamento inteligente baseado em nuvem ARTIK      

Sistema de estacionamento inteligente baseado em nuvem ARTIK

Estacionamento para funcionários

Próximo ao Cmapus Principal

Recebendo dados ...

1

Estacionamento para alunos / visitantes

Front Gate, Near Union bank

Recebendo dados ...

Console de saída

Aplicativo da Web (lado do cliente) JavaScript
 // interações em tempo real são possíveis usando websocket // Observe o ws :. Este é o novo esquema de URL para conexões WebSocket. // Também há wss:para conexão WebSocket segura da mesma maneira // https:é usado para conexões HTTP seguras.// você pode obtê-lo na documentação da nuvem Artik pagevar wsUri ="wss://api.artik.cloud/v1 .1 / websocket? Ack =true "; var device_id =" ID do seu dispositivo "; // raspi3 DEVICE IDvar device_token ="Seu token de dispositivo"; // raspi3 DEVICE TOKENvar output; var attribute_log; var websocket; function init () {// document.getElementById () escrever algo na página html output =document.getElementById ("output"); atributos_log =document.getElementById ("atributos_log"); if (browserSupportsWebSockets () ===false) {// verifique se o navegador suporta protocolo websocket ou não writeToScreen ("Desculpe! seu navegador não suporta WebSockets. Tente usar as últimas versões do Google Chrome ou Firefox"); var element =document.getElementById ("websocketelements"); element.parentNode.removeChild (elemento); Retorna; //} // Você abre uma conexão WebSocket simplesmente chamando o construtor WebSocket websocket =new WebSocket (wsUri); // Quando a conexão é aberta, função invocada automaticamente websocket.onopen =function () {// writeAttributeValues ​​('onOpen Event Fired'); writeToScreen ("Conexão com sucesso ao sistema de estacionamento"); // após a conexão ser aberta, o registro é necessário para a transmissão segura de dados register (); }; // invocado quando uma nova mensagem é recebida websocket.onmessage =function (evt) {onMessage (evt); }; // quando o erro é recebido // Você pode lidar com quaisquer erros que ocorram ouvindo o evento de erro. websocket.onerror =function (evt) {onError (evt); };} function onClose (evt) {// Depois de terminar com seu WebSocket, você pode encerrar a conexão usando o método close (). websocket.close (); // writeAttributeValues ​​('onClose Event Fired'); writeToScreen ("DISCONNECTED");} // Quando uma mensagem é recebida, o evento de mensagem é disparado. function onMessage (evt) {writeToScreen (' RESPONSE:' + evt.data + ''); // writeAttributeValues ​​('onMessage Event Fired'); handleRcvMsg (evt.data); // os dados são enviados para a função handleRcvMsg ()} function onError (evt) {writeToScreen (' ERROR:' + evt.data); // writeAttributeValues ​​('onError Event Fired');} function doSend (message) {// Para enviar uma mensagem por meio da conexão WebSocket, você chama o método send () em sua instância WebSocket websocket.send (message); // writeAttributeValues ​​('onSend Event Fired'); writeToScreen ("SENT:" + mensagem);} função writeAttributeValues ​​(prefixo) {var pre =document.createElement ("p"); pre.style.wordWrap ="quebra de palavra"; pre.innerHTML ="INFO" + getCurrentDate () + "" + prefixo + " readyState:" + websocket.readyState + "bufferedAmount:" + websocket.bufferedAmount + "";; atributos_log.appendChild (pre);} função writeToScreen (mensagem) {var pre =document.createElement ("p"); pre.style.wordWrap ="quebra de palavra"; pre.innerHTML =mensagem; output.appendChild (pre);} function getCurrentDate () {var now =new Date (); var datetime =now.getFullYear () + '/' + (now.getMonth () + 1) + '/' + now.getDate (); datetime + ='' + now.getHours () + ':' + now.getMinutes () + ':' + now.getSeconds (); return datetime;} função browserSupportsWebSockets () {if ("WebSocket" na janela) {return true; } else {return false; }} function getTimeMillis () {return parseInt (Date.now (). toString ());} function register () {writeToScreen ("Registrando dispositivo na conexão WebSocket"); tente {var registerMessage ='{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer' + device_token + '", "cid":"' + getTimeMillis () + ' "} '; writeToScreen ('Enviando mensagem de registro' + registerMessage + '\ n'); websocket.send (registerMessage, {mask:true}); isWebSocketReady =true; //document.getElementById("rainbow").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capacity:" + ' 50 ' + "Slot livre:" + '  '+" 50 "; //document.getElementById("indigo").innerHTML ="Capacidade:60, Slot Livre:5"; } catch (e) {writeToScreen ('Falha ao registrar mensagens. Erro ao registrar mensagem:' + e.toString ()); }} // os dados após o recebimento são enviados aqui para a função de processamento handleRcvMsg (msg) {// a mensagem é recebida como a seguinte string // {"ações":[{"nome":"setText", "parâmetros":{"texto" :"4", "text2":"5"}}]} // você deve analisá-lo var msgObj =JSON.parse (msg); if (msgObj.type! ="ação") return; // Retorno antecipado; var ações =msgObj.data.actions; var rainbowData =ações [0] .parameters.text; var indigoData =ações [0] .parameters.text2; console.log ("A ação recebida é" + ações); document.getElementById ("rainbow"). innerHTML ="Capacidade:50, Slot Livre:" + rainbowData; document.getElementById ("indigo"). innerHTML ="Capacidade:60, Slot Livre:" + indigoData; } 
Código Soucre para Sistema de Estacionamento Inteligente
Todo o código e arquivos necessários estão incluídos neste repositório Github.https://github.com/husinul/Smart-Car-Parking

Esquemas


Processo de manufatura

  1. Construtor C#
  2. C# usando
  3. Bartender inteligente
  4. Sistema de gerenciamento de edifícios:sua passagem para uma cidade inteligente
  5. Controles inteligentes de iluminação para estufas reduzem custos
  6. Sistema de corte a laser inteligente detecta materiais diferentes
  7. Entendendo o sistema de transporte
  8. Entendendo o sistema de macacos automotivos
  9. Entendendo o Sistema de Suspensão
  10. Por que o aquecedor do meu carro só funciona quando estou dirigindo?