Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Sistema de estacionamiento inteligente

Componentes y suministros

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

Aplicaciones y servicios en línea

Samsung ARTIK Cloud para IoT
Google Maps
Arduino IDE

Acerca de este proyecto

Encontrar un estacionamiento gratuito en una ciudad congestionada como Bangalore es muy difícil. Aquí, si alguien quiere salir de casa con coche personal, lo primero que se le viene a la cabeza es aparcar, donde aparcará el coche. La mayoría de los casos, las personas van a una estación de estacionamiento y descubren que todos los espacios de estacionamiento están llenos y luego tienen que buscar otro estacionamiento. Por lo tanto, es una gran molestia y muchas personas tienen miedo de estacionar su automóvil cuando sale con su automóvil.

Entonces, estaba pensando, cómo se puede resolver el problema y finalmente logré hacer un sistema de estacionamiento inteligente basado en la nube y espero que la implementación del sistema pueda eliminar el problema de estacionamiento de mi ciudad. ARTIK Cloud es realmente una plataforma agradable y apropiada para tal trabajo.

Con este sistema, un usuario podrá encontrar un estacionamiento disponible fácilmente usando una aplicación móvil o web desde cualquier lugar. El sistema actualiza los datos de estacionamiento cada 30 segundos.

En este proyecto, le mostraré cómo puede construir fácilmente un sistema tan inteligente. Definitivamente, usaré la plataforma ARTIK Cloud, la plataforma en la nube de IoT más genial. Antes de entrar en detalles, disfrute del video de demostración de mi proyecto de demostración.

Para este sistema de demostración, debe crear solo un dispositivo nuevo en la plataforma Samsung Artik Cloud. Lo mostraré aquí. Nombré a mis dispositivos como estacionamiento de arco iris y almaceno datos de estacionamiento, como espacios libres en un estacionamiento. Raspi envía información de estacionamiento de acuerdo con las reglas preestablecidas.

Pasos involucrados en este proyecto:

1. Hacer un dispositivo en Artik Cloud Platform

2. Hacer una aplicación en Artik Cloud

3. Hacer una regla en Artik Cloud

4. Preparando Arduino

5. Conexión de los sensores

6. Preparando Raspberry Pi

7. Desarrollo de aplicaciones web

Entonces, comencemos uno por uno. Primero lo primero. Comencemos con la creación de un nuevo dispositivo en la plataforma en la nube de Artik.

Paso 1:creación de un nuevo dispositivo en Artik Cloud Platform

A) Inicie sesión en su cuenta Samsung y haga clic en la opción DESARROLLADOR en la esquina superior derecha.

B) En el TABLERO, seleccione TIPOS DE DISPOSITIVOS y haga clic en NUEVO

C) En el NOMBRE DE LA PANTALLA DEL DISPOSITIVO, escriba un nombre para el dispositivo y proporcione un NOMBRE ÚNICO, luego haga clic en CREAR TIPO DE DISPOSITIVO.

D) Haga clic en + NUEVO MANIFIESTO

E) Escriba un NOMBRE DE CAMPO para los datos de su sensor que cargará y almacenará aquí y mencione el TIPO DE DATOS como un número entero. Luego haga clic para GUARDAR.

F) Luego haga clic en SIGUIENTE:ACCIONES DEL DISPOSITIVO

G) Realice una acción o seleccione una de las ACCIONES ESTÁNDAR. Haga clic para GUARDAR. Para nuestro proyecto no se requerirán acciones. Luego haga clic en SIGUIENTE:MANIFIESTO ACTIVO.

H) Eche un vistazo a Device Fields y nuevamente haga clic en NEXT:ACTIVE MANIFEST.

I) Enhorabuena ha creado con éxito su primer dispositivo. Ahora tienes que conectar el dispositivo a la nube Artik. Entonces, hagámoslo.

J) Vaya a MY ARTIK CLOUD desde la esquina superior derecha.

K) Haga clic en MY ARTIK CLOUD y seleccione DISPOSITIVOS.

L) Haga clic para + Agregar otro dispositivo.

M) Escriba el nombre del dispositivo que acaba de crear y haga clic en él.

N) Haga clic en el botón CONECTAR DISPOSITIVO ...

O) Su dispositivo está conectado a la NUBE.

P) Haz click en eso. Genere Token, anote su ID DE DISPOSITIVO y TOKEN DE DISPOSITIVO. Estos últimos serán necesarios cada vez que desee conectarse a su dispositivo desde dispositivos físicos, aplicaciones web o aplicaciones de Android.

Paso 2:creación de reglas en Artik Cloud

En este paso crearemos una regla donde establecemos unas condiciones según las cuales Artik Cloud generará una acción cuando la condición se cumpla y los dispositivos y aplicaciones suscritos a la acción reciban un mensaje instantáneamente.

A) Seleccione REGLAS del menú MY ARTIK CLOUD y haga clic en NUEVA REGLA

B) En el cuadro de selección IF, seleccione un campo de datos para un dispositivo y establezca un valor y una condición. Luego, seleccione una acción para un dispositivo específico del campo ENTONCES. Puede establecer un valor de parámetro constante o puede seleccionar un valor de los datos de otro dispositivo. Para definir un campo de datos de otro dispositivo, haga clic en el icono de descarga que se muestra en el cuadro rojo.

C) Seleccione un dispositivo del menú desplegable y luego seleccione el campo de datos.

D) Luego haga clic en GUARDAR REGLA.

Paso 3. Preparación de Arduino

El trabajo principal del Arduino en mi proyecto es recopilar datos de sensores conectados a estaciones de estacionamiento y enviar los datos a Raspberry pi mediante el puerto serie. Aquí utilicé Arduino Mega está implementado para una estación de estacionamiento. Podemos conectar más placas Arduino para diferentes Estaciones de estacionamiento. Aquí usé sensores ultrasónicos y se pueden usar en cualquier lugar.

Para los sensores ultrasónicos se utilizaron pines digitales Arduino. Se adjuntan los sensores ultrasónicos del bosquejo de Arduino. Sube el boceto apropiado a tu placa Arduino.

Los detalles sobre el sensor ultrasónico se pueden encontrar aquí.

Paso 4:Conexión de los sensores

Para conectar todos los sensores a Arduino, consulte la sección esquemática.

Paso 5:preparación de Raspberry Pi

Supongo que tienes alguna experiencia previa trabajando con Raspberry pi. Hay muchos tutoriales para principiantes disponibles en Internet.

Comencemos nuestro trabajo con Raspberry Pi. Raspberry pi funciona como cliente de WebSocket y se comunica con Artik Cloud mediante el protocolo WebSocket. Usé Node.js para programar. A diferencia de Python Node no está preinstalado en Raspberry Pi.

A). Instale Node y npm en Raspberry pi usando los siguientes comandos en la terminal.

  sudo apt-get updatesudo apt-get install nodejs npm  

B). Instale el cliente de WebSocket ws en raspberry pi

  npm install --save ws  

C). Instalar puerto serie en raspberry pi

  npm install serialport  

Si completó con éxito los tres pasos, entonces su pi está listo para comunicarse con Arduino usando el puerto serie y la nube Artik usando websocket. Como dije anteriormente, se requieren dos pis de frambuesa para dos estaciones de estacionamiento. Entonces, descargue el código fuente para esto desde Github. Puede usar un cliente ftp como FileZilla para cargar el código en raspberry pi. No olvide cambiar la ID DEL DISPOSITIVO Y EL TOKEN DEL DISPOSITIVO en el código fuente.

D) Después de cargar el código en raspberry pi, ejecute el código escribiendo el siguiente comando en la ventana de terminal.

  sudo node staff-parking.js  

Paso 6. Desarrollo de la aplicación web

Para el desarrollo de la aplicación web se utilizó HTML y JavaScript. Para comunicarme con Artik Cloud aquí, nuevamente usé el protocolo WebSocket. Para integrar Map en mi aplicación utilicé la API de Google Map.

Descargue la carpeta de la aplicación web de mi Github y modifique el ID DEL DISPOSITIVO y el TOKEN DEL DISPOSITIVO con su propio ID y token de dispositivo. Use el ID del dispositivo que genera la acción sobre los nuevos datos recibidos (edison en mi caso). Abra websocket.html con un navegador web y disfrute. Vea el video de demostración ...

Código

  • Raspberry Pi (estacionamiento para el personal)
  • Arduino (sonar)
  • Aplicación web (HTML)
  • Aplicación web (lado del cliente)
Raspberry Pi (estacionamiento de personal) JavaScript
Código fuente para Raspberry Pi
 // transferencia de datos de estacionamiento del personal var webSocketUrl ="wss://api.artik.cloud/v1.1/websocket? Ack =true"; var device_id ="ID de su dispositivo"; // personal de estacionamiento DEVICE IDvar device_token ="El token de su dispositivo"; // personal de estacionamiento DEVICE TOKEN // requiere el módulo websocket para conectarse // ejecutar los siguientes dos comandos a la terminal de su pi // sudo apt-get update // npm install websocketvar WebSocket =require ('ws'); var isWebSocketReady =false; var data =""; var ws =null; // requiere el módulo serialport para raspberry pi // ejecuta el siguiente comando en la terminal // npm install serialportvar serialport =require ("serialport"); var SerialPort =serialport.SerialPort; var sp =new SerialPort ("/ dev / ttyACM0", {// para la comunicación en serie con arduino baudrate:9600, // estamos usando UNO, por lo que la velocidad en baudios es 9600, es posible que deba cambiar de acuerdo con el analizador de su modelo:serialport.parsers.readline (" \ n ")}); var parking_state =0; // variable para comprobar si hay estacionamiento state_gate / ** * Obtiene la hora actual en milis * / function getTimeMillis () {return parseInt (Date.now (). toString ());} / ** * Crea una conexión / websocket y configura el pin GPIO * / function start () {// Crea la conexión WebSocket isWebSocketReady =false; ws =nuevo WebSocket (webSocketUrl); // esta función se invoca en una conexión exitosa ws.on ('open', function () {console.log ("La conexión WebSocket está abierta ...."); // debe registrarse para la transmisión de datos exitosa // el registro es para registro de autenticación o transferencia segura de datos ();}); ws.on ('mensaje', función (datos) {// este bucle se llama siempre que el cliente envía algún mensaje handleRcvMsg (datos); // los datos se envían a la función handleRcvMsg ()}); ws.on ('cerrar', function () {console.log ("La conexión WebSocket está cerrada ....");}); } / ** * Envía un mensaje de registro a / websocket endpoint * /// El cliente solo funcionará cuando el dispositivo se registre desde aquí función register () {console.log ("Registrando dispositivo en la conexión WebSocket"); prueba {var registerMessage ='{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer' + device_token + '", "cid":"' + getTimeMillis () + ' "} '; console.log ('Enviando mensaje de registro' + registerMessage + '\ n'); ws.send (registerMessage, {máscara:verdadero}); isWebSocketReady =true; } catch (e) {console.error ('No se pudieron registrar los mensajes. Error al registrar el mensaje:' + e.toString ()); }} // los datos después de recibirlos se envían aquí para su procesamiento // en nuestro caso esta función no se utilizará ya que no recibiremos ninguna acción // en raspberry pi. Esto es para modificaciones futuras. Función handleRcvMsg (msg) {// tienes que analizar la cadena recibida var msgObj =JSON.parse (msg); if (msgObj.type! ="action") return; // Regreso anticipado; var acciones =msgObj.data.actions; var actionName =actions [0] .name; console.log ("La acción recibida es" + actionName); // debe conocer sus acciones registradas para poder realizar de acuerdo con if (actionName.toLowerCase () =="settext") {// hacer algo aquí después de recibir 'parking_state' console.log ('recibir acción reconocida' + actionName); } else {// este bucle se ejecuta si se recibe alguna acción no registrada // por lo que debe registrar cada acción en la nube console.log ('No hacer nada desde que recibió una acción no reconocida' + actionName); regreso; }} / ** * Enviar un mensaje a ARTIK Cloud * /// Esta función es responsable de enviar comandos a la nube // función sendStateToArtikCloud (estacionamiento) envía el número de espacio libre de estacionamiento a artik cloudfunction sendStateToArtikCloud (estacionamiento_slot) {try {ts =', "ts":' + getTimeMillis (); var data ={"parking_slot":parking_slot // estableciendo el valor de estacionamiento del argumento a nuestra variable de nube "parking_value"}; var payload ='{"sdid":"' + id_dispositivo + '"' + ts + ', "datos":' + JSON.stringify (datos) + ', "cid":"' + getTimeMillis () + '"}'; console.log ('Envío de carga útil' + carga útil + '\ n'); ws.send (carga útil, {máscara:verdadera}); } catch (e) {console.error ('Error al enviar un mensaje:' + e.toString () + '\ n'); }} function exitClosePins () {console.log ('¡Salir y destruir todos los pines!'); process.exit (); } start (); // ejecuta cada vez que se reciben datos de arduino (30 segundos de retraso programado desde arduino) sp.on ("open", function () {sp.on ('data', function (data) {console .log ("Puerto serie recibió datos:" + datos); // sendStateToArtikCloud (datos); // espacio de estacionamiento libre var parking_slot =parseInt (datos); sendStateToArtikCloud (parking_slot);});}); process.on (' SIGINT ', exitClosePins); 
Arduino (sonar) C / C ++
Código fuente para la interfaz del sensor de la sonda usando Arduino
 #define echoPin1 2 // Pin de eco para la sonda 1 # define trigPin1 3 // Pin de disparo para la sonda 1 # define echoPin2 4 // Pin de eco para la sonda 2 #define trigPin2 5 // Pin de disparo para la sonda 2 # define echoPin3 6 // Pin de eco para la sonda 3 # define trigPin3 7 // Pin de disparo para la sonda 3 // # define echoPin4 9 // Pin de eco para la sonda 4 // # define trigPin4 8 // Pin de disparo para sonar 4 de larga duración1, distancia1; // Duración utilizada para calcular la distancialong duración2, distancia2; larga duración3, distancia3; // larga duración4, distancia4; int count =0; int freeSlot =0; void setup () {Serial.begin (9600); // iniciar la comunicación en serie con raspberry pi pinMode (trigPin1, OUTPUT); // disparar pin como salida pinMode (echoPin1, INPUT); // pin de eco como entrada pinMode (trigPin2, OUTPUT); pinMode (echoPin2, ENTRADA); pinMode (trigPin3, SALIDA); pinMode (echoPin3, ENTRADA); // pinMode (trigPin4, SALIDA); // pinMode (echoPin4, INPUT); } void loop () {/ * El siguiente ciclo trigPin / echoPin se usa para determinar la distancia del objeto más cercano rebotando ondas sonoras fuera de él. * / / * Se requiere una señal de alto nivel de al menos 10 microsegundos para disparar * pin. * _____ * | | * -------------! ! --------- * ..... | 10us | ........ * el módulo produce ocho señales de pulso de 40KHz y espera recibir eco * / digitalWrite (trigPin1, LOW); delayMicroseconds (2); digitalWrite (trigPin1, HIGH); delayMicroseconds (10); digitalWrite (trigPin1, BAJO); // La función pulseIn () determina un ancho de pulso en el tiempo // la duración del pulso es proporcional a la distancia del obstáculo duration1 =pulseIn (echoPin1, HIGH); digitalWrite (trigPin2, BAJO); delayMicroseconds (2); escritura digital (trigPin2, ALTA); delayMicroseconds (10); digitalWrite (trigPin2, BAJO); duration2 =pulseIn (echoPin2, HIGH); digitalWrite (trigPin3, BAJO); delayMicroseconds (2); escritura digital (trigPin3, ALTA); delayMicroseconds (10); digitalWrite (trigPin3, BAJO); duration3 =pulseIn (echoPin3, HIGH); // digitalWrite (trigPin4, LOW); // delayMicroseconds (2); // digitalWrite (trigPin4, HIGH); // delayMicroseconds (10); // digitalWrite (trigPin4, LOW); // duration4 =pulseIn (echoPin4, HIGH); // distancia =(alto nivel de velocidad de tiempo del sonido (340M / S) / 2, // en centímetros =uS / 58 distancia1 =duración1 / 58.2; si (distancia1 <10) distancia1 =1; si no distancia1 =0; distancia2 =duración2 /58.2; if (distancia2 <10) distancia2 =1; si no distancia2 =0; distancia3 =duración3 / 58.2; if (distancia3 <10) distancia3 =1; si no distancia3 =0; // distancia4 =duración4 / 58.2; // si (distancia4 <10) // distancia4 =1; // si no distancia4 =0; // suma el resultado de todos los sensores para contar el recuento total de vehículos =distancia1 + distancia2 + distancia3;; // espacio libre =espacio total - espacio total libre =3 - count; // el número total de ranuras se envía a raspberry pi usando usb Serial.println (freeSlot); // el estado se actualiza cada 30 segundos. Delay (5000); // freeSlot =0; // distancia1 =0; // distancia2 =0; // distancia3 =0; // distancia4 =0;} 
Aplicación web (HTML) HTML
Código fuente para la aplicación web front-end
      Sistema de estacionamiento inteligente basado en la nube ARTIK      

Sistema de estacionamiento inteligente basado en la nube ARTIK

Estacionamiento para el personal

Cerca de Cmapus principal

Recibiendo datos ...

1

Estacionamiento para estudiantes / invitados

Front Gate, Near Union Bank

Recibiendo datos ...

Consola de salida

Aplicación web (lado del cliente) JavaScript
 // las interacciones en tiempo real son posibles usando websocket // Note el ws :. Este es el nuevo esquema de URL para las conexiones WebSocket. // También hay wss:para una conexión WebSocket segura de la misma manera // https:se usa para conexiones HTTP seguras .// Puede obtenerlo en la página de documentación de la nube de Artik .var wsUri ="wss://api.artik.cloud/v1 .1 / websocket? Ack =true "; var device_id =" ID de su dispositivo "; // raspi3 DEVICE IDvar device_token ="Su token de dispositivo"; // raspi3 DEVICE TOKENvar salida; var atributos_log; var websocket; función init () {// document.getElementById () escribir algo en la página html salida =document.getElementById ("salida"); atributos_log =document.getElementById ("atributos_log"); if (browserSupportsWebSockets () ===false) {// verifique que el navegador sea compatible con el protocolo websocket o no escriba en la pantalla ("Lo sentimos, su navegador web no es compatible con WebSockets. Intente usar las últimas versiones de Google Chrome o Firefox"); var element =document.getElementById ("websocketelements"); element.parentNode.removeChild (elemento); regreso; //} // Abre una conexión WebSocket simplemente llamando al constructor WebSocket websocket =new WebSocket (wsUri); // Cuando la conexión está abierta, la función se invoca automáticamente websocket.onopen =function () {// writeAttributeValues ​​('onOpen Event Fired'); writeToScreen ("Conectado con éxito al sistema de estacionamiento"); // una vez abierta la conexión, es necesario registrarse para la transmisión segura de datos register (); }; // invoca cuando se recibe un nuevo mensaje websocket.onmessage =function (evt) {onMessage (evt); }; // cuando se recibe el error // Puede manejar cualquier error que ocurra escuchando el evento de error. websocket.onerror =function (evt) {onError (evt); };} function onClose (evt) {// Una vez que haya terminado con su WebSocket, puede terminar la conexión usando el método close (). websocket.close (); // writeAttributeValues ​​('OnClose Event Fired'); writeToScreen ("DISCONNECTED");} // Cuando se recibe un mensaje, se dispara el evento del mensaje. function onMessage (evt) {writeToScreen (' RESPUESTA:' + evt.data + ''); // writeAttributeValues ​​('OnMessage Event Fired'); handleRcvMsg (evt.data); // los datos se envían a la función handleRcvMsg ()} function onError (evt) {writeToScreen (' ERROR:' + evt.data); // writeAttributeValues ​​('onError Event Fired');} function doSend (message) {// Para enviar un mensaje a través de la conexión WebSocket, llame al método send () en su instancia WebSocket websocket.send (mensaje); // writeAttributeValues ​​('OnSend Event Fired'); writeToScreen ("ENVIADO:" + mensaje);} función writeAttributeValues ​​(prefijo) {var pre =document.createElement ("p"); pre.style.wordWrap ="palabra de ruptura"; pre.innerHTML ="INFO" + getCurrentDate () + "" + prefijo + " readyState:" + websocket.readyState + "bufferAmount:" + websocket.bufferedAmount + "";; attribute_log.appendChild (pre);} función writeToScreen (mensaje) {var pre =document.createElement ("p"); pre.style.wordWrap ="palabra de ruptura"; pre.innerHTML =mensaje; output.appendChild (pre);} function getCurrentDate () {var ahora =nueva fecha (); var datetime =now.getFullYear () + '/' + (ahora.getMonth () + 1) + '/' + ahora.getDate (); datetime + ='' + ahora.getHours () + ':' + ahora.getMinutes () + ':' + ahora.getSeconds (); return datetime;} función browserSupportsWebSockets () {if ("WebSocket" en la ventana) {return true; } else {devolver falso; }} function getTimeMillis () {return parseInt (Date.now (). toString ());} function register () {writeToScreen ("Registrando dispositivo en la conexión WebSocket"); prueba {var registerMessage ='{"type":"register", "sdid":"' + device_id + '", "Authorization":"bearer' + device_token + '", "cid":"' + getTimeMillis () + ' "} '; writeToScreen ('Enviando mensaje de registro' + registerMessage + '\ n'); websocket.send (registerMessage, {máscara:verdadero}); isWebSocketReady =true; //document.getElementById("rainbow").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capacity:" + ' 50 ' + "Free Slot:" + '  '+" 50 "; //document.getElementById("indigo").innerHTML ="Capacidad:60, Espacio libre:5"; } catch (e) {writeToScreen ('No se pudieron registrar los mensajes. Error al registrar el mensaje:' + e.toString ()); }} // los datos después de recibirlos se envían aquí para procesarlos función handleRcvMsg (msg) {// el mensaje se recibe como la siguiente cadena // {"actions":[{"name":"setText", "parameters":{"text" :"4", "text2":"5"}}]} // tienes que analizarlo var msgObj =JSON.parse (msg); if (msgObj.type! ="action") return; // Regreso anticipado; var acciones =msgObj.data.actions; var rainbowData =actions [0] .parameters.text; var indigoData =actions [0] .parameters.text2; console.log ("La acción recibida es" + acciones); document.getElementById ("arco iris"). innerHTML ="Capacidad:50, Espacio libre:" + rainbowData; document.getElementById ("indigo"). innerHTML ="Capacidad:60, Espacio libre:" + indigoData; } 
Código Soucre para el sistema de estacionamiento inteligente
Todo el código y los archivos necesarios están incluidos en este repositorio de Github.https://github.com/husinul/Smart-Car-Parking

Esquemas


Proceso de manufactura

  1. Constructor C#
  2. C # usando
  3. Smart Bartender
  4. Sistema de gestión de edificios:su boleto a una ciudad inteligente
  5. Los controles de iluminación inteligentes para invernaderos reducen los costos
  6. El sistema de corte láser inteligente detecta diferentes materiales
  7. Comprender el sistema de transporte
  8. Comprender el sistema de gato del automóvil
  9. Comprender el sistema de suspensión
  10. ¿Por qué la calefacción de mi coche solo funciona cuando estoy conduciendo?
  11. ¿Qué hace un sistema de compresor inteligente?