Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Système de stationnement intelligent

Composants et fournitures

Raspberry Pi 3 Modèle B
× 1
Arduino Mega 2560
× 1
Capteur à ultrasons - HC-SR04 (Générique)
× 3

Applications et services en ligne

Samsung ARTIK Cloud pour IoT
Google Maps
Arduino IDE

À propos de ce projet

Trouver un parking gratuit dans une ville congestionnée comme Bangalore est très difficile. Ici, si quelqu'un veut sortir de chez lui avec une voiture personnelle, la première chose qui lui vient à l'esprit est de se garer, où il garera sa voiture. Dans la plupart des cas, les gens se rendent à une station de stationnement et constatent que toutes les places de stationnement sont pleines et doivent ensuite chercher un autre parking. C'est donc un gros problème et beaucoup de gens craignent de garer leur voiture lorsqu'il sort avec sa voiture.

Donc, je pensais à la façon dont le problème peut être résolu et j'ai finalement réussi à créer un système de stationnement intelligent basé sur le cloud et j'espère que la mise en œuvre du système pourra résoudre le problème de stationnement de ma ville. ARTIK Cloud est vraiment une plate-forme agréable et appropriée pour un tel travail.

En utilisant ce système, un utilisateur sera en mesure de trouver facilement un parking disponible à l'aide d'une application mobile ou Web de n'importe où. Le système met à jour les données de stationnement toutes les 30 secondes.

Dans ce projet, je vais vous montrer comment vous pouvez facilement construire un tel système intelligent. Certainement, j'utiliserai la plate-forme ARTIK Cloud, la plate-forme cloud IoT la plus cool. Avant d'entrer dans les détails, profitez de la vidéo de démonstration de mon projet de démonstration.

Pour ce système de démonstration, vous ne devez créer qu'un seul nouvel appareil sur la plate-forme Samsung Artik Cloud. Je vais le montrer ici. J'ai nommé mes appareils arc-en-ciel de stationnement et stocké des données de stationnement telles que des emplacements libres dans un parking. Raspi envoie des informations de stationnement selon les règles prédéfinies.

Étapes de ce projet :

1. Créer un appareil dans Artik Cloud Platform

2. Faire une application dans Artik Cloud

3. Créer une règle dans Artik Cloud

4. Préparation de l'Arduino

5. Connexion des capteurs

6. Préparation du Raspberry Pi

7. Développement d'applications Web

Alors, commençons un par un. Commençons par le commencement. Commençons par créer un nouvel appareil sur la plate-forme cloud Artik.

Étape 1 :Créer un nouvel appareil dans Artik Cloud Platform

A) Connectez-vous à votre compte Samsung et cliquez sur l'option DÉVELOPPEUR dans le coin supérieur droit.

B) Depuis le TABLEAU DE BORD, sélectionnez TYPES D'APPAREILS et cliquez sur NOUVEAU

C) Sur le NOM D'AFFICHAGE DE L'APPAREIL, saisissez un nom pour l'appareil et donnez un NOM UNIQUE, puis cliquez sur CRÉER UN TYPE D'APPAREIL.

D) Cliquez sur + NOUVEAU MANIFESTE

E) Tapez un NOM DE CHAMP pour les données de votre capteur que vous téléchargerez et stockerez ici et mentionnez le TYPE DE DONNÉES sous forme d'entier. Cliquez ensuite pour ENREGISTRER.

F) Cliquez ensuite sur SUIVANT :ACTIONS DE L'APPAREIL

G) Effectuez une action ou sélectionnez parmi les ACTIONS STANDARD. Cliquez pour ENREGISTRER. Pour notre projet, des actions ne seront pas nécessaires. Cliquez ensuite sur SUIVANT :MANIFESTE ACTIF.

H) Jetez un œil à Champs de l'appareil et cliquez à nouveau sur SUIVANT :MANIFESTE ACTIF.

Je) Félicitations ! vous avez créé avec succès votre premier appareil. Vous devez maintenant connecter l'appareil au cloud Artik. Alors, allons-y.

J) Accédez à MY ARTIK CLOUD dans le coin supérieur droit.

K) Cliquez sur MON CLOUD ARTIK et sélectionnez APPAREILS.

L) Cliquez pour +Ajouter un autre appareil.

M) Tapez le nom de l'appareil que vous venez de créer et cliquez dessus.

N) Cliquez sur le bouton CONNECTER L'APPAREIL....

O) Votre appareil est connecté au CLOUD.

P) Clique dessus. Générez un jeton, notez votre DEVICE ID et DEVICE TOKEN. Ces derniers seront requis chaque fois que vous souhaitez vous connecter à votre appareil à partir d'appareils physiques, d'applications Web ou d'applications Android.

Étape 2 :Créer une règle dans Artik Cloud

Dans cette étape, nous allons créer une règle dans laquelle nous définissons certaines conditions selon lesquelles Artik cloud générera une action lorsque la condition sera remplie et que les appareils et applications abonnés à l'action recevront un message instantanément.

A) Sélectionnez RÈGLES dans le menu MY ARTIK CLOUD et cliquez sur NOUVELLE RÈGLE

B) Dans la boîte de sélection IF, sélectionnez un champ de données pour un appareil et définissez une valeur et une condition. Sélectionnez ensuite une action pour un appareil spécifique dans le champ ALORS. Vous pouvez définir une valeur de paramètre constante ou sélectionner une valeur à partir d'autres données d'appareil. Pour définir un champ de données à partir d'un autre appareil, cliquez sur l'icône de téléchargement affichée dans la case rouge.

C) Sélectionnez un appareil dans la liste déroulante, puis sélectionnez le champ de données.

D) Cliquez ensuite sur ENREGISTRER LA RÈGLE.

Étape 3. Préparation d'Arduino

Le travail principal de l'Arduino dans mon projet est de collecter des données à partir de capteurs connectés aux stations de stationnement et d'envoyer les données à Raspberry pi à l'aide d'un port série. Ici, j'ai utilisé Arduino Mega est implémenté pour une station de stationnement. nous pouvons connecter plus de cartes Arduino pour différentes stations de stationnement. Ici, j'ai utilisé des capteurs à ultrasons et peut être utilisé dans n'importe quel endroit.

Pour les capteurs à ultrasons, des broches numériques Arduino ont été utilisées. Arduino sketch Des capteurs à ultrasons sont attachés. Téléchargez le croquis approprié sur votre carte Arduino.

Des détails sur le capteur à ultrasons peuvent être trouvés ici.

Étape 4 : Connecter les capteurs

Pour connecter tous les capteurs à Arduino, veuillez consulter la section schématique.

Étape 5 :Préparation du Raspberry Pi

Je suppose que vous avez déjà travaillé avec Raspberry pi. De nombreux tutoriels pour débutants sont disponibles sur Internet.

Commençons notre travail avec raspberry pi. Raspberry pi fonctionne comme un client WebSocket et communique avec le cloud Artik à l'aide du protocole WebSocket. J'ai utilisé Node.js pour la programmation. Contrairement à Python, Node n'est pas préinstallé sur Raspberry Pi.

A). Installez Node et npm sur Raspberry pi en utilisant les commandes suivantes dans le terminal.

sudo apt-get updatesudo apt-get install nodejs npm 

B). Installer le client WebSocket ws sur raspberry pi

npm install --save ws 

C). Installer le port série sur raspberry pi

npm installer le port série 

Si vous avez terminé avec succès les trois étapes, votre pi est prêt à communiquer avec Arduino en utilisant le port série et le cloud Artik en utilisant websocket. Comme je l'ai dit plus tôt, deux pis framboise sont nécessaires pour deux stations de stationnement. Alors, téléchargez le code source de this depuis le Github . Vous pouvez utiliser un client ftp comme FileZilla pour télécharger le code sur raspberry pi. N'oubliez pas de changer DEVICE ID &DEVICE TOKEN dans le code source.

D) Après avoir téléchargé le code sur raspberry pi, exécutez le code en tapant la commande suivante dans la fenêtre du terminal.

sudo node staff-parking.js 

Étape 6. Développement d'une application Web

Pour développer l'application Web, HTML et JavaScript ont été utilisés. Pour communiquer avec Artik cloud, j'ai à nouveau utilisé le protocole WebSocket. Pour intégrer Map dans mon application, j'ai utilisé l'API Google Map.

Téléchargez le dossier de l'application Web à partir de mon Github et modifiez l'ID DE L'APPAREIL et le TOKEN DE L'APPAREIL avec votre propre identifiant et jeton d'appareil. Utilisez l'ID de l'appareil qui génère l'action sur les nouvelles données reçues (edison dans mon cas). Ouvrez le websocket.html à l'aide d'un navigateur Web et profitez-en. Voir la vidéo de démonstration...

Code

  • Raspberry Pi (stationnement du personnel)
  • Arduino (sonar)
  • Application Web (HTML)
  • Application Web (côté client)
Raspberry Pi (stationnement du personnel)JavaScript
Code source pour Raspberry Pi
//transfert de données de stationnement du personnelvar webSocketUrl ="wss://api.artik.cloud/v1.1/websocket?ack=true";var device_id ="Your Device id"; // parking du personnel DEVICE IDvar device_token ="Votre jeton de périphérique"; //parking du personnel DEVICE TOKEN// nécessite le module websocket pour se connecter // exécuter les deux commandes suivantes sur le terminal de votre pi// sudo apt-get update// npm install websocketvar WebSocket =require('ws');var isWebSocketReady =false;var data="";var ws =null;// nécessite le module de port série pour raspberry pi // exécute la commande suivante sur le terminal// npm install serialportvar serialport =require("serialport");var SerialPort =serialport.SerialPort;var sp =new SerialPort("/dev/ttyACM0", { //pour la communication série avec le débit en bauds arduino :9600, // nous utilisons UNO donc le débit en bauds est de 9600, vous devrez peut-être modifier en fonction de votre modèle d'analyseur :serialport.parsers.readline(" \n")});var parking_state=0;// variable pour vérifier le stationnement state_gate/** * Obtient l'heure actuelle en millis */function getTimeMillis(){ return parseInt(Date.now().toString());}/** * Créez une connexion /websocket et configurez la broche GPIO */function start() { //Créez la connexion WebSocket isWebSocketReady =false; ws =new WebSocket(webSocketUrl); // cette fonction est invoquée en cas de connexion réussie ws.on('open', function() { console.log("WebSocket connection is open ...."); // vous devez vous inscrire pour une transmission de données réussie // l'inscription est pour authentification ou registre de transfert de données sécurisé (); }); ws.on('message', function(data) { //cette boucle est appelée chaque fois que le client envoie un message handleRcvMsg(data); //les données sont envoyées à la fonction handleRcvMsg() }); ws.on('close', function() { console.log("La connexion WebSocket est fermée ...."); }); }/** * Envoie un message d'enregistrement au point de terminaison /websocket *///Le client ne fonctionnera que lorsque l'appareil est enregistré à partir d'icifunction register(){ console.log("Enregistrement de l'appareil sur la connexion WebSocket"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; console.log('Envoi du message de registre ' + registerMessage + '\n'); ws.send(registerMessage, {masque :vrai}); isWebSocketReady =vrai ; } catch (e) { console.error('Échec de l'enregistrement des messages. Erreur lors de l'enregistrement du message :' + e.toString()); } }//les données après réception sont envoyées ici pour traitement// dans notre cas, cette fonction ne sera pas utilisée car nous ne recevrons aucune action// dans raspberry pi. Ceci est pour une future modification.function handleRcvMsg(msg){ // vous devez analyser la chaîne reçue var msgObj =JSON.parse(msg); if (msgObj.type !="action") return ; //Retour anticipé ; var actions =msgObj.data.actions; var nom_action =actions[0].nom; console.log("L'action reçue est " + actionName); // vous devez connaître vos actions enregistrées afin d'effectuer en conséquence if (actionName.toLowerCase() =="settext") { // faire quelque chose ici après avoir reçu 'parking_state' console.log('receving Recognized action' + actionName); } else { // cette boucle s'exécute si une action non enregistrée est reçue // vous devez donc enregistrer chaque action dans le cloud console.log('Ne rien faire depuis la réception d'une action non reconnue ' + actionName); retourner; } }/** * Envoyer un message à ARTIK Cloud *///Cette fonction est responsable de l'envoi de commandes au cloud//fonction sendStateToArtikCloud(parking) envoie le nombre de places de parking gratuites à artik cloudfunction sendStateToArtikCloud(parking_slot){ try{ ts =', "ts":'+getTimeMillis(); var data ={ "parking_slot":parking_slot //définir la valeur de stationnement de l'argument à notre variable cloud "parking_value" } ; var payload ='{"sdid":"'+device_id+'"'+ts+', "data":'+JSON.stringify(data)+', "cid":"'+getTimeMillis()+'"}'; console.log('Envoi de la charge utile ' + charge utile + '\n'); ws.send(charge utile, {masque :vrai} ); } catch (e) { console.error('Erreur lors de l'envoi d'un message :' + e.toString() +'\n'); } }function exitClosePins() { console.log('Quittez et détruisez toutes les broches !'); processus.exit(); }start (); // s'exécute chaque fois que des données sont reçues d'arduino (délai programmé de 30 secondes d'arduino) sp.on ("open", function () { sp.on('data', function(data) { console .log("Port série reçu des données :" + données); //sendStateToArtikCloud(data);//emplacement de stationnement gratuit var parking_slot =parseInt(data); sendStateToArtikCloud(parking_slot); });});process.on(' SIGINT', exitClosePins);
Arduino (sonar)C/C++
Code source pour l'interfaçage du capteur sonar à l'aide d'Arduino
#define echoPin1 2 // Broche d'écho pour le sondeur 1#define trigPin1 3 // Broche de déclenchement pour le sondeur 1#define echoPin2 4 // Broche d'écho pour le sondeur 2 #define trigPin2 5 // Broche de déclenchement pour le sondeur 2#define echoPin3 6 // Broche d'écho pour le sondeur 3#define trigPin3 7 // Broche de déclenchement pour le sondeur 3//#define echoPin4 9 // Broche d'écho pour le sondeur 4//#define trigPin4 8 // Broche de déclenchement pour le sonar 4longue durée1, distance1 ; // Durée utilisée pour calculer la distancelong duration2, distance2;long duration3, distance3;//long duration4, distance4; int count=0;int freeSlot =0;void setup() { Serial.begin (9600); // initie la communication série avec raspberry pi pinMode(trigPin1, OUTPUT); // déclencher la broche comme sortie pinMode(echoPin1, INPUT); // echo pin comme input pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT); pinMode(trigPin3, SORTIE); pinMode(echoPin3, INPUT); //pinMode(trigPin4, SORTIE); //pinMode(echoPin4, INPUT); }void loop() {/* Le cycle trigPin/echoPin suivant est utilisé pour déterminer la distance de l'objet le plus proche en faisant rebondir des ondes sonores dessus. */ /* Un signal de haut niveau d'au moins 10 microsecondes est requis pour déclencher * la broche. * _____ * | | * -------------! !--------- * .....|10us |........ * le module produit alors huit signaux d'impulsion de 40 KHz et attend de recevoir l'écho */ digitalWrite(trigPin1, LOW); délaiMicrosecondes(2) ; digitalWrite(trigPin1, HAUT); délaiMicrosecondes(10) ; digitalWrite(trigPin1, LOW); // la fonction pulseIn( ) détermine une largeur d'impulsion dans le temps // la durée de l'impulsion est proportionnelle à la distance de l'obstacle duration1 =pulseIn(echoPin1, HIGH); digitalWrite(trigPin2, LOW); délaiMicrosecondes(2) ; digitalWrite(trigPin2, HAUT); délaiMicrosecondes(10) ; digitalWrite(trigPin2, LOW); durée2 =pulseIn(echoPin2, HIGH); digitalWrite(trigPin3, LOW); délaiMicrosecondes(2) ; digitalWrite(trigPin3, HAUT); délaiMicrosecondes(10) ; digitalWrite(trigPin3, LOW); durée3 =pulseIn(echoPin3, HIGH); //digitalWrite(trigPin4, LOW); //retardMicrosecondes(2) ; //digitalWrite(trigPin4, HIGH); //retardMicrosecondes(10) ; //digitalWrite(trigPin4, LOW); //duration4 =pulseIn(echoPin4, HIGH); // distance =(vitesse temporelle du son de haut niveau (340M/S) / 2, // en centimètre =uS/58 distance1 =durée1/58,2; if(distance1<10) distance1 =1; else distance1 =0; distance2 =durée2 /58,2; if(distance2<10) distance2 =1; else distance2 =0; distance3 =durée3/58,2; if(distance3<10) distance3 =1; else distance3 =0; //distance4 =durée4/58,2; //if (distance4<10) //distance4 =1; //autre distance4 =0; //ajoute le résultat de tous les capteurs pour compter le nombre total de voitures =distance1 + distance2 + distance3;; // emplacement libre =emplacement total - emplacement total de la voiture gratuite =3 - count; // le nombre total de slots est envoyé à raspberry pi en utilisant usb Serial.println (freeSlot); // le statut est mis à jour toutes les 30 secondes. delay (5000); // freeSlot =0; // distance1 =0; //distance2 =0;// distance3 =0;//distance4 =0;}
Application Web (HTML)HTML
Code source de l'application Web frontale
   Système de stationnement intelligent basé sur le cloud ARTIK     

Système de stationnement intelligent basé sur le cloud ARTIK

Stationnement du personnel

Près du Cmapus principal

Réception de données...

1

Stationnement étudiant/invité

Porte avant, près de la banque Union

Réception de données...

Console de sortie

Application Web (côté client)JavaScript
// les interactions en temps réel sont possibles en utilisant websocket// Notez le ws :. Il s'agit du nouveau schéma d'URL pour les connexions WebSocket. // Il existe également wss :pour une connexion WebSocket sécurisée de la même manière // https :est utilisé pour les connexions HTTP sécurisées.// vous pouvez l'obtenir à partir de la page de documentation du cloud Artik wsUri ="wss://api.artik.cloud/v1 .1/websocket?ack=true";var device_id ="Votre identifiant de périphérique"; // raspi3 DEVICE IDvar device_token ="Votre jeton de périphérique"; //raspi3 DEVICE TOKENvar output;var attribute_log;var websocket;function init() { // document.getElementById() écrit quelque chose sur la page html output =document.getElementById("output"); attribute_log =document.getElementById("attributes_log"); if (browserSupportsWebSockets() ===false) { // vérifier le protocole de prise en charge du navigateur Websocket ou non writeToScreen("Désolé ! votre navigateur Web ne prend pas en charge les WebSockets. Essayez d'utiliser les dernières versions de Google Chrome ou Firefox"); élément var =document.getElementById("websocketelements"); element.parentNode.removeChild(element); retourner; // } //Vous ouvrez une connexion WebSocket simplement en appelant le constructeur WebSocket websocket =new WebSocket(wsUri); //Lorsque la connexion est ouverte, la fonction est invoquée automatiquement websocket.onopen =function() { //writeAttributeValues('onOpen Event Fired'); writeToScreen("Connecté avec succès au système de stationnement"); // une fois la connexion ouverte, l'enregistrement est requis pour la transmission sécurisée des données register(); } ; // invoqué lors de la réception d'un nouveau message websocket.onmessage =function(evt) { onMessage(evt); } ; // lors de la réception d'une erreur // Vous pouvez gérer toutes les erreurs qui se produisent en écoutant l'événement d'erreur. websocket.onerror =function(evt) { onError(evt); };}function onClose(evt) { // Une fois que vous avez terminé avec votre WebSocket, vous pouvez terminer la connexion en utilisant la méthode close(). websocket.close(); //writeAttributeValues('onClose Event Fired'); writeToScreen("DISCONNECTED");}// Lorsqu'un message est reçu, l'événement de message est déclenché. function onMessage(evt) { writeToScreen('RESPONSE:' + evt.data + ''); //writeAttributeValues('onMessage Event Fired'); handleRcvMsg(evt.data); //les données sont envoyées à la fonction handleRcvMsg()}function onError(evt) { writeToScreen('ERROR: ' + evt.data); //writeAttributeValues('onError Event Fired');}function doSend(message) { // Pour envoyer un message via la connexion WebSocket, vous appelez la méthode send() sur votre instance WebSocket websocket.send(message); //writeAttributeValues('onSend Event Fired'); writeToScreen("SENT:" + message);}function writeAttributeValues(prefix) { var pre =document.createElement("p"); pre.style.wordWrap ="break-word"; pre.innerHTML ="INFO " + getCurrentDate() + " " + préfixe + " readyState:" + websocket.readyState + " bufferedAmount:" + websocket.bufferedAmount + "" ;; attribute_log.appendChild(pre);}function writeToScreen(message) { var pre =document.createElement("p"); pre.style.wordWrap ="break-word"; pre.innerHTML =message ; 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;}fonction browserSupportsWebSockets() { if ("WebSocket" dans la fenêtre) { return true; } else { return false; }}function getTimeMillis(){ return parseInt(Date.now().toString());}function register(){ writeToScreen("Enregistrement du périphérique sur la connexion WebSocket"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; writeToScreen('Envoi du message de registre ' + registerMessage + '\n'); websocket.send(registerMessage, {mask :true}); isWebSocketReady =vrai ; //document.getElementById("arc-en-ciel").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capacity:"+'50 '+"Free Slot:"+''+"50"; //document.getElementById("indigo").innerHTML ="Capacité :60, emplacement libre :5" ; } catch (e) { writeToScreen('Impossible d'enregistrer les messages. Erreur lors de l'enregistrement du message :' + e.toString()); } }//les données après réception sont envoyées ici pour la fonction de traitement handleRcvMsg(msg){ // le message est reçu comme la chaîne suivante // {"actions":[{"name":"setText","parameters":{"text" :"4", "text2":"5"}}]} // vous devez l'analyser var msgObj =JSON.parse(msg); if (msgObj.type !="action") return ; //Retour anticipé ; var actions =msgObj.data.actions; var rainbowData =actions[0].parameters.text; var indigoData =actions[0].parameters.text2; console.log("L'action reçue est " + actions); document.getElementById("rainbow").innerHTML ="Capacité : 50, emplacement libre : "+rainbowData; document.getElementById("indigo").innerHTML ="Capacité : 60, emplacement libre : "+indigoData; }
Code source pour le système de stationnement intelligent
Tout le code et les fichiers nécessaires sont inclus dans ce référentiel Github.https://github.com/husinul/Smart-Car-Parking

Schémas


Processus de fabrication

  1. Constructeur C#
  2. C# en utilisant
  3. Système de gestion des bâtiments :votre billet pour une ville intelligente
  4. Les commandes d'éclairage intelligentes pour les serres réduisent les coûts
  5. Le système de découpe laser intelligent détecte différents matériaux
  6. Comprendre le système de convoyeur
  7. Comprendre le système de cric automobile
  8. Comprendre le système de suspension
  9. Pourquoi mon chauffage de voiture ne fonctionne-t-il que lorsque je conduis ?