Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Slim parkeersysteem

Componenten en benodigdheden

Raspberry Pi 3 Model B
× 1
Arduino Mega 2560
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 3

Apps en online services

Samsung ARTIK Cloud voor IoT
Google Maps
Arduino IDE

Over dit project

Het vinden van een gratis parkeerplaats in een drukke stad als Bangalore is erg moeilijk. Hier, als iemand met een persoonlijke auto van huis naar buiten wil gaan, komt het eerste in hem op:parkeren, waar hij zijn auto zal parkeren. In de meeste gevallen gaan mensen naar een parkeerstation en ontdekken dat alle parkeerplaatsen vol zijn en dan moet hij een andere parkeerplaats zoeken. Het is dus een groot gedoe en veel mensen blijven bang om zijn auto te parkeren als hij uitstapt met zijn auto.

Dus ik zat te denken hoe het probleem kan worden opgelost en uiteindelijk ben ik erin geslaagd om een ​​op de cloud gebaseerd slim parkeersysteem te maken en ik hoop dat de implementatie van het systeem het parkeerprobleem van mijn stad kan oplossen. ARTIK Cloud is echt een mooi en geschikt platform voor zo'n klus.

Met dit systeem kan een gebruiker overal gemakkelijk een beschikbare parkeerplaats vinden met behulp van een mobiele of web-app. Het systeem werkt de parkeergegevens elke 30 seconden bij.

In dit project laat ik je zien hoe je eenvoudig zo'n slim systeem kunt bouwen. Ik zal zeker het ARTIK Cloud-platform gebruiken, het coolste IoT-cloudplatform. Voordat u naar de details gaat, kunt u eerst genieten van de demovideo van mijn demoproject.

Voor dit demosysteem hoeft u slechts één nieuw apparaat aan te maken in het Samsung Artik Cloud-platform. Ik zal het hier laten zien. Ik noemde mijn apparaten regenboogparkeren en sla parkeergegevens op, zoals vrije plaatsen op een parkeerplaats. Raspi verzendt parkeerinformatie volgens de vooraf ingestelde regels.

Stappen betrokken bij dit project:

1. Eén apparaat maken in Artik Cloud Platform

2. Eén applicatie maken in Artik Cloud

3. Eén regel maken in Artik Cloud

4. Arduino voorbereiden

5. De sensoren aansluiten

6. Raspberry Pi voorbereiden

7. Webapplicatie ontwikkelen

Dus laten we een voor een beginnen. Eerste ding eerst. Laten we beginnen met het maken van een nieuw apparaat in het Artik-cloudplatform.

Stap 1:Een nieuw apparaat maken in Artik Cloud Platform

A) Log in op uw Samsung-account en klik op de optie ONTWIKKELAAR in de rechterbovenhoek.

B) Selecteer op het DASHBOARD APPARAATTYPES en klik op NIEUW

C) Typ op de APPARAATSCHERMNAAM een naam voor het apparaat en geef een UNIEKE NAAM, en klik vervolgens op MAAK APPARAATTYPE.

D) Klik op + NIEUW MANIFEST

E) Typ een VELDNAAM voor uw sensorgegevens die u hier wilt uploaden en opslaan en vermeld het GEGEVENSTYPE als geheel getal. Klik vervolgens om op te slaan.

F) Klik vervolgens op VOLGENDE:APPARAATACTIES

G) Maak een actie of maak een keuze uit de STANDAARD ACTIES. Klik om op te slaan. Voor ons project zijn geen acties vereist. Klik vervolgens op VOLGENDE:ACTIEF MANIFEST.

H) Kijk naar Apparaatvelden en klik opnieuw op VOLGENDE:ACTIEF MANIFEST.

Ik) Gefeliciteerd! je hebt met succes je eerste apparaat gemaakt. Nu moet je het apparaat verbinden met de Artik cloud. Dus laten we het doen.

J) Ga naar MIJN ARTIK CLOUD vanuit de rechterbovenhoek.

K) Klik op MIJN ARTIK CLOUD en selecteer APPARATEN.

L) Klik om +Een ander apparaat toe te voegen.

M) Typ de naam van het apparaat dat u zojuist hebt gemaakt en klik erop.

N) Klik op de knop APPARAAT VERBINDEN....

O) Uw apparaat is verbonden met de CLOUD.

P) Klik erop. Genereer token, noteer uw DEVICE ID en DEVICE TOKEN. Deze zijn telkens vereist wanneer u verbinding wilt maken met uw apparaat vanaf fysieke apparaten, web-apps of Android-apps.

Stap 2:Regel maken in Artik Cloud

In deze stap zullen we een regel maken waarin we enkele voorwaarden stellen op basis waarvan Artik cloud een actie zal genereren wanneer aan de voorwaarde wordt voldaan en de apparaten en applicaties die zijn geabonneerd op de actie onmiddellijk een bericht ontvangen.

A) Selecteer REGELS in het menu MIJN ARTIK CLOUD en klik op NIEUWE REGEL

B) Selecteer in het IF-selectievak een gegevensveld voor een apparaat en stel een waarde en voorwaarde in. Selecteer vervolgens een actie voor een specifiek apparaat in het veld THEN. U kunt een constante parameterwaarde instellen of een waarde uit andere apparaatgegevens selecteren. Om een ​​gegevensveld van een ander apparaat te definiëren, klikt u op het downloadpictogram in het rode vak.

C) Selecteer een apparaat in de vervolgkeuzelijst en selecteer vervolgens het gegevensveld.

D) Klik vervolgens op REGEL OPSLAAN.

Stap 3. Arduino voorbereiden

Het belangrijkste werk van de Arduino in mijn project is het verzamelen van gegevens van sensoren die zijn aangesloten op parkeerstations en het verzenden van de gegevens naar de Raspberry pi via de seriële poort. Hier gebruikte ik Arduino Mega is geïmplementeerd voor één parkeerstations. we kunnen meer Arduino-kaarten aansluiten voor verschillende parkeerstations. Hier gebruikte ik ultrasone sensoren en kan op elke locatie worden gebruikt.

Voor ultrasone sensoren werden Arduino digitale pinnen gebruikt. Arduino-schets Ultrasonische sensoren zijn bevestigd. Upload de juiste schets naar je Arduino-bord.

Details over de ultrasone sensor vindt u hier.

Stap 4:De sensoren aansluiten

Zie de schematische sectie voor het aansluiten van alle sensoren op Arduino.

Stap 5:Raspberry Pi voorbereiden

Ik neem aan dat je enige eerdere ervaring hebt met het werken met Raspberry pi. Er zijn veel tutorials voor beginners beschikbaar op internet.

Laten we ons werk beginnen met Raspberry Pi. Raspberry pi werkt als een WebSocket-client en communiceert met Artik cloud met behulp van het WebSocket-protocol. Ik gebruikte Node.js voor het programmeren. In tegenstelling tot Python is Node niet vooraf geïnstalleerd op Raspberry Pi.

A). Installeer Node en npm op Raspberry pi met behulp van de volgende commando's in terminal.

sudo apt-get updatesudo apt-get install nodejs npm 

B). Installeer WebSocket-client ws op raspberry pi

npm install --save ws 

C). Installeer seriële poort naar raspberry pi

npm seriële poort installeren 

Als je alle drie de stappen met succes hebt voltooid, is je pi klaar om te communiceren met Arduino via seriële poort en Artik cloud met websocket. Zoals ik al eerder zei zijn er twee frambozenpis nodig voor twee parkeerstations. Download dus de broncode hiervoor van de Github . U kunt een ftp-client zoals FileZilla gebruiken om de code op raspberry pi te uploaden. Vergeet niet de DEVICE ID &DEVICE TOKEN in de broncode te wijzigen.

D) Nadat u de code op raspberry pi heeft geüpload, voert u de code uit door de volgende opdracht in het terminalvenster te typen.

sudo node staff-parking.js 

Stap 6. Webapplicatie ontwikkelen

Voor het ontwikkelen van webapplicaties is gebruik gemaakt van HTML en JavaScript. Voor de communicatie met Artik cloud heb ik hier opnieuw het WebSocket-protocol gebruikt. Voor het integreren van Map in mijn applicatie heb ik Google Map API gebruikt.

Download de web-app-map van mijn Github en wijzig de DEVICE ID en DEVICE TOKEN met uw eigen apparaat-id en token. Gebruik ID van het apparaat dat de actie genereert op nieuwe ontvangen gegevens (in mijn geval edison). Open de websocket.html met een webbrowser en geniet ervan. Bekijk de demovideo...

Code

  • Raspberry Pi (personeelsparking)
  • Arduino (sonar)
  • Web-app (HTML)
  • Web-app (clientzijde)
Raspberry Pi (personeel parkeren)JavaScript
Broncode voor Raspberry Pi
//personeel parkeergegevens transfervar webSocketUrl ="wss://api.artik.cloud/v1.1/websocket?ack=true";var device_id ="Uw apparaat-ID"; // personeel parkeren DEVICE IDvar device_token ="Your Device Token"; //personeel parkeren DEVICE TOKEN// vereist websocket-module om verbinding te maken // voer de volgende twee opdrachten uit naar de terminal van uw pi // sudo apt-get update// npm install websocketvar WebSocket =required('ws');var isWebSocketReady =false;var data="";var ws =null;// vereisen seriële poortmodule voor raspberry pi // voer het volgende commando uit naar terminal// npm install serialportvar serialport =required("serialport");var SerialPort =serialport.SerialPort;var sp =nieuw SerialPort ("/dev/ttyACM0", { //voor seriële communicatie met arduino-baudrate:9600, // we gebruiken UNO, dus de baudrate is 9600, mogelijk moet u deze wijzigen volgens uw modelparser:serialport.parsers.readline(" \n")});var parking_state=0;// variabele om te controleren op parking state_gate/** * Haalt de huidige tijd op in millis */function getTimeMillis(){ return parseInt(Date.now().toString());}/** * Maak een /websocket-verbinding en stel GPIO-pin in */function start() { //Maak de WebSocket-verbinding isWebSocketReady =false; ws =nieuwe WebSocket(webSocketUrl); // deze functie is aangeroepen bij succesvolle verbinding ws.on('open', function() { console.log("WebSocket-verbinding is open ...."); // u moet zich registreren voor succesvolle gegevensoverdracht // registratie is voor authenticatie of beveiligde gegevensoverdracht register(); }); ws.on('message', function(data) {//deze lus wordt aangeroepen wanneer de client een bericht verzendt handleRcvMsg(data); //data wordt verzonden naar de functie handleRcvMsg()}); ws.on('close', function() { console.log("WebSocket-verbinding is gesloten ..."); }); }/** * Stuurt een registratiebericht naar /websocket-eindpunt *///Client werkt alleen wanneer het apparaat wordt geregistreerd vanuit herefunction register(){ console.log("Apparaat registreren op de WebSocket-verbinding"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; console.log('Registerbericht wordt verzonden' + registerMessage + '\n'); ws.send(registerMessage, {mask:true}); isWebSocketReady =waar; } catch (e) { console.error('Kan berichten niet registreren. Fout bij het registreren van bericht:' + e.toString()); } }//data na ontvangst wordt hierheen gestuurd voor verwerking// in ons geval zal deze functie niet worden gebruikt omdat we geen actie zullen ontvangen// in raspberry pi. Dit is voor toekomstige modificatie. function handleRcvMsg (msg) {// je moet de ontvangen string ontleden var msgObj =JSON.parse (msg); if (msgObj.type !="action") return; //Vroege terugkeer; var acties =msgObj.data.actions; var actionName =acties[0].name; console.log("De ontvangen actie is " + actionName); // je moet je geregistreerde acties kennen om te kunnen uitvoeren volgens if (actionName.toLowerCase() =="settext") { // doe hier iets na ontvangst van 'parking_state' console.log ('receving erkende actie' + actionName); } else { //deze lus wordt uitgevoerd als een niet-geregistreerde actie wordt ontvangen // dus je moet elke actie registreren in cloud console.log ('Niets doen sinds het ontvangen van niet-herkende actie' + actionName); opbrengst; } }/** * Stuur één bericht naar ARTIK Cloud *///Deze functie is verantwoordelijk voor het verzenden van commando's naar cloud//functie sendStateToArtikCloud(parkeren) stuurt aantal vrije parkeerplaatsen naar artik cloudfunctie sendStateToArtikCloud(parking_slot){ try{ ts =', "ts":'+getTimeMillis(); var data ={ "parking_slot":parking_slot // instellen van de parkeerwaarde van argument naar onze cloudvariabele "parking_waarde"}; var payload ='{"sdid":"'+device_id+'"'+ts+', "data":'+JSON.stringify(data)+', "cid":"'+getTimeMillis()+'"}'; console.log('Belasting wordt verzonden' + lading + '\n'); ws.send(payload, {masker:true}); } catch (e) { console.error('Fout bij het verzenden van een bericht:' + e.toString() +'\n'); } }function exitClosePins() { console.log('Verlaat en vernietig alle pinnen!'); proces.exit(); }start();//executes elke keer wanneer gegevens worden ontvangen van arduino (30 sec geprogrammeerde vertraging van arduino)sp.on("open", functie () { sp.on('data', functie(data) { console .log("Seriële poort ontvangen data:" + data); //sendStateToArtikCloud(data);//free parking slot var parking_slot =parseInt(data); sendStateToArtikCloud(parking_slot); });});process.on(' SIGINT', exitClosePins);
Arduino (sonar)C/C++
Broncode voor sonarsensor-interface met Arduino
#define echoPin1 2 // Echo Pin voor sonar 1#define trigPin1 3 // Triggerpin voor sonar 1#define echoPin2 4 // Echo Pin voor sonar 2 #define trigPin2 5 // Triggerpin voor sonar 2#define echoPin3 6 // Echopin voor sonar 3#define trigPin3 7 // Triggerpin voor sonar 3//#define echoPin4 9 // Echopin voor sonar 4//#define trigPin4 8 // Triggerpin voor sonar 4lange duur1, afstand1; // Duur die wordt gebruikt om afstand te berekenenlange duur2, afstand2;lange duur3, afstand3;//lange duur4, afstand4; int count=0;int freeSlot =0;void setup() {Serial.begin (9600); // initieer seriële communicatie naar raspberry pi pinMode (trigPin1, OUTPUT); // trigger pin als output pinMode (echoPin1, INPUT); // echo pin als input pinMode (trigPin2, OUTPUT); pinMode (echoPin2, INPUT); pinMode (trigPin3, UITGANG); pinMode (echoPin3, INPUT); //pinMode (trigPin4, UITGANG); //pinMode (echoPin4, INPUT); }void loop() {/* De volgende trigPin/echoPin-cyclus wordt gebruikt om de afstand van het dichtstbijzijnde object te bepalen door er geluidsgolven vanaf te laten stuiteren. */ /* Ten minste 10 microseconden hoog niveau signaal is vereist om * pin te activeren. * _____ * | | * -------------! !--------- * .....|10us |........ * de module produceert dan acht 40KHz pulssignalen en wacht op echo */digitalWrite(trigPin1, LOW); vertragingMicroseconden(2); digitalWrite(trigPin1, HIGH); vertraging Microseconden (10); digitalWrite(trigPin1, LAAG); // pulseIn() functie bepaalt een pulsduur in de tijd // duur van de puls is evenredig met de afstand van het obstakel duur1 =pulseIn(echoPin1, HIGH); digitalWrite(trigPin2, LAAG); vertragingMicroseconden(2); digitalWrite(trigPin2, HOOG); vertraging Microseconden (10); digitalWrite(trigPin2, LAAG); duur2 =pulseIn(echoPin2, HOOG); digitalWrite(trigPin3, LAAG); vertragingMicroseconden(2); digitalWrite(trigPin3, HOOG); vertraging Microseconden (10); digitalWrite(trigPin3, LAAG); duur3 =pulseIn(echoPin3, HOOG); //digitalWrite (trigPin4, LAAG); //vertraging Microseconden (2); //digitalWrite(trigPin4, HOOG); //vertraging Microseconden (10); //digitalWrite (trigPin4, LAAG); // duur4 =pulseIn (echoPin4, HOOG); // afstand =(hoge tijdsnelheid van geluid (340M/S) / 2, // in centimeter =uS/58 afstand1 =duur1/58,2; if(distance1<10) distance1 =1; else distance1 =0; distance2 =duration2 /58.2; if(distance2<10) distance2 =1; else distance2 =0; distance3 =duur3/58,2; if(distance3<10) distance3 =1; else distance3 =0; //distance4 =duur4/58,2; //if (distance4<10) //distance4 =1; //else distance4 =0; // voeg het resultaat van alle sensoren toe om het totale aantal auto's te tellen =afstand1 + afstand2 + afstand3;; // vrij slot =totaal slot - totaal autovrij slot =3 - count; // het totale aantal slots wordt naar de raspberry pi gestuurd met behulp van usb Serial.println (freeSlot); // de status wordt elke 30 seconden bijgewerkt. delay (5000); //freeSlot =0; //distance1 =0; //distance2 =0;// distance3 =0;//distance4 =0;}
Web-app (HTML)HTML
Broncode voor Front End Web Application
   ARTIK Cloudgebaseerd Smart Parking System     

ARTIK Cloudgebaseerd slim parkeersysteem

Personeel parkeren

In de buurt van Main Cmapus

Gegevens ontvangen...

1

Studenten-/gastenparkeerplaats

Voorpoort, nabij Union bank

Gegevens ontvangen...

Uitvoerconsole

Web-app (clientzijde)JavaScript
// real-time interacties zijn mogelijk met websocket// Let op de ws:. Dit is het nieuwe URL-schema voor WebSocket-verbindingen. // Er is ook wss:voor een veilige WebSocket-verbinding op dezelfde manier // https:wordt gebruikt voor veilige HTTP-verbindingen.// je kunt het krijgen van de Artik-clouddocumentatie pagevar wsUri ="wss://api.artik.cloud/v1 .1/websocket?ack=true";var device_id ="Uw apparaat-ID"; // raspi3 DEVICE IDvar device_token ="Uw apparaattoken"; //raspi3 DEVICE TOKENvar output;var attributes_log;var websocket;function init() {// document.getElementById() schrijf iets naar html pagina output =document.getElementById("output"); attributes_log =document.getElementById("attributes_log"); if (browserSupportsWebSockets() ===false) { // controleer browserondersteuning websocket-protocol of niet writeToScreen("Sorry! uw webbrowser ondersteunt WebSockets niet. Probeer Google Chrome of Firefox nieuwste versies te gebruiken"); var element =document.getElementById("websocketelements"); element.parentNode.removeChild(element); opbrengst; // } //U opent een WebSocket-verbinding door simpelweg de WebSocket-constructor websocket =new WebSocket(wsUri) aan te roepen; // Wanneer de verbinding open is, wordt de functie automatisch aangeroepen websocket.onopen =function() { //writeAttributeValues('onOpen Event Fired'); writeToScreen("Succesvol verbonden met parkeersysteem"); // nadat de verbinding is geopend, is registratie vereist voor beveiligde gegevensoverdracht register(); }; // aangeroepen wanneer een nieuw bericht is ontvangen websocket.onmessage =function(evt) {onMessage(evt); }; // wanneer een fout wordt ontvangen // U kunt eventuele fouten afhandelen door te luisteren naar de foutgebeurtenis. websocket.onerror =function(evt) { onError(evt); };}function onClose(evt) { // Als u klaar bent met uw WebSocket, kunt u de verbinding beëindigen met de methode close(). websocket.close(); //writeAttributeValues('onClose Event Fired'); writeToScreen("DISCONNECTED");}// Wanneer een bericht wordt ontvangen, wordt de berichtgebeurtenis geactiveerd. function onMessage(evt) {writeToScreen('RESPONSE:' + evt.data + ''); //writeAttributeValues('onMessage Event Fired'); handleRcvMsg(evt.data); // data wordt verzonden naar de functie handleRcvMsg()}function onError(evt) {writeToScreen('ERROR: ' + evt.data); //writeAttributeValues('onError Event Fired');}function doSend(message) { // Om een ​​bericht via de WebSocket-verbinding te verzenden, roept u de methode send() aan op uw WebSocket-instantie websocket.send(message); //writeAttributeValues('onSend Event Fired'); writeToScreen("SENT:" + bericht);}functie writeAttributeValues(prefix) { var pre =document.createElement("p"); pre.style.wordWrap ="breekwoord"; pre.innerHTML ="INFO " + getCurrentDate() + " " + prefix + " readyState:" + websocket.readyState + " bufferedAmount:" + websocket.bufferedAmount + "";; attributes_log.appendChild(pre);}function writeToScreen(message) { var pre =document.createElement("p"); pre.style.wordWrap ="breekwoord"; pre.innerHTML =bericht; output.appendChild(pre);}functie getCurrentDate() { var now =new Date(); var datetime =now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate(); datetime +=' ' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds(); return datetime;}function browserSupportsWebSockets() { if ("WebSocket" in venster) { return true; } else { return false; }}function getTimeMillis(){ return parseInt(Date.now().toString());}function register(){ writeToScreen("Apparaat registreren op de WebSocket-verbinding"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; writeToScreen('Registerbericht wordt verzonden' + registerMessage + '\n'); websocket.send(registerMessage, {mask:true}); isWebSocketReady =waar; //document.getElementById("regenboog").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capaciteit:"+'50 '+"Gratis slot:"+''+"50"; //document.getElementById("indigo").innerHTML ="Capaciteit:60, vrij slot:5"; } catch (e) { writeToScreen('Kan berichten niet registreren. Fout bij het registreren van bericht:' + e.toString()); } }//data na ontvangst wordt hierheen gestuurd voor verwerkingsfunctie handleRcvMsg(msg){ // bericht wordt ontvangen als volgende string // {"actions":[{"name":"setText","parameters":{"text" :"4", "text2":"5"}}]} // je moet het ontleden var msgObj =JSON.parse(msg); if (msgObj.type !="action") return; //Vroege terugkeer; var acties =msgObj.data.actions; var regenboogData =acties[0].parameters.tekst; var indigoData =acties[0].parameters.text2; console.log("De ontvangen actie is " + acties); document.getElementById("rainbow").innerHTML ="Capaciteit:50, vrij slot:"+rainbowData; document.getElementById("indigo").innerHTML ="Capaciteit:60, gratis slot:"+indigoData; }
Sucre-code voor slim parkeersysteem
Alle benodigde code en bestanden zijn opgenomen in deze Github-repository.https://github.com/husinul/Smart-Car-Parking

Schema's


Productieproces

  1. C# Constructor
  2. C# met behulp van
  3. Slimme barman
  4. Gebouwbeheersysteem:uw ticket naar een slimme stad
  5. Slimme lichtregelingen voor kassen Lagere kosten
  6. Slim lasersnijsysteem detecteert verschillende materialen
  7. Transportsysteem begrijpen
  8. Het autokriksysteem begrijpen
  9. Ophangsysteem begrijpen
  10. Waarom werkt mijn autoverwarming alleen tijdens het rijden?
  11. Wat doet een slim compressorsysteem?