亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

智能停车系统

组件和用品

Raspberry Pi 3 B 型
× 1
Arduino Mega 2560
× 1
超声波传感器 - HC-SR04(通用)
× 3

应用和在线服务

Samsung ARTIK Cloud for IoT
谷歌地图
Arduino IDE

关于这个项目

在班加罗尔这样拥挤的城市找到一个免费停车场非常困难。在这里,如果有人想带着私家车出门,他首先想到的是停车,他会把车停在哪里。大多数情况下,人们去一个停车场,发现所有的车位都满了,然后他不得不寻找另一个停车场。所以,这是一个很大的麻烦,很多人在他下车时一直担心他的车停在那里。

所以,我在想,如何解决这个问题,最后我成功地做了一个基于云的智能停车系统,我希望这个系统的实施可以解决我所在城市的停车问题。 ARTIK Cloud 对于此类工作来说确实是一个不错且合适的平台。

使用该系统,用户将能够从任何地方使用移动或网络应用程序轻松找到可用的停车场。系统每30秒更新一次停车数据。

在这个项目中,我将向您展示如何轻松构建这样的智能系统。当然,我会使用最酷的物联网云平台 ARTIK Cloud 平台。在详细介绍之前,请欣赏我的演示项目的演示视频。

对于此演示系统,您只需在 Samsung Artik Cloud 平台中创建一个新设备。我会在这里展示它。我将我的设备命名为rainbow-parking,并存储停车数据,例如停车场的空闲位置。 Raspi根据预设规则发送停车信息。

本项目涉及的步骤:

1.在 Artik Cloud Platform 中制作一台设备

2.在 Artik Cloud 中制作一个应用程序

3.在 Artik Cloud 中制定一项规则

4.准备Arduino

5.连接传感器

6.准备树莓派

7.开发网络应用程序

那么,让我们一一开始吧。先说第一件事。让我们开始在Artik云平台上制作一个新设备。

第 1 步:在 Artik Cloud Platform 中制作新设备

A) 登录您的三星帐户,然后单击右上角的“开发人员”选项。

B) 从仪表板中选择设备类型并点击新建

C) 在 DEVICE DISPLAY NAME 上为设备输入一个名称并给出一个 UNIQUE NAME,然后点击 CREATE DEVICE TYPE。

D) 点击 + 新清单

E) 为您将在此处上传和存储的传感器数据键入字段名称,并将数据类型作为整数提及。然后点击保存。

F) 然后点击下一步:设备操作

G) 进行操作或从标准操作中进行选择。单击以保存。对于我们的项目,不需要采取行动。然后点击 NEXT:ACTIVE MANIFEST。

H) 查看设备字段,然后再次单击下一个:活动清单。

我) 恭喜!您成功创建了您的第一台设备。现在您必须将设备连接到 Artik 云。所以,让我们去做吧。

J) 从右上角转到 MY ARTIK CLOUD。

K) 单击我的 ARTIK CLOUD 并选择设备。

L) 单击以 + 添加另一台设备。

M) 输入您刚刚创建的设备名称并点击它。

N) 单击“连接设备...”按钮。

O) 您的设备已连接到 CLOUD。

P) 点击它。生成令牌,记下您的设备 ID 和设备令牌。每次您想从物理设备、网络应用或安卓应用连接到您的设备时,都需要这些。

第 2 步:在 Artik Cloud 中制定规则

这一步我们会制定一个规则,我们设置一些条件,当条件满足时Artik云会根据这些条件生成一个动作,订阅该动作的设备和应用程序会立即收到消息。

A) 从 MY ARTIK CLOUD 菜单中选择 RULES,然后单击 NEW RULE

B) 从 IF 选择框中为设备选择数据字段并设置值和条件。然后从 THEN 字段中选择特定设备的操作。您可以设置一个常量参数值,也可以从另一个设备数据中选择一个值。要从另一台设备定义数据字段,请单击红色框中显示的下载图标。

C) 从下拉列表中选择一个设备,然后选择数据字段。

D) 然后点击保存规则。

第 3 步。准备 Arduino

我项目中Arduino的主要工作是从连接到停车站的传感器收集数据,并使用串口将数据发送到Raspberry pi。在这里,我使用 Arduino Mega 实现了一个停车站。我们可以为不同的停车站连接更多的Arduino板。这里我使用了超声波传感器,可以在任何位置使用。

对于超声波传感器,使用了 Arduino 数字引脚。附上 Arduino 草图超声波传感器。将适当的草图上传到您的 Arduino 板。

可以在此处找到有关超声波传感器的详细信息。

第 4 步:连接传感器

要将所有传感器连接到 Arduino,请参阅原理图部分。

第 5 步:准备树莓派

我假设您以前有使用 Raspberry pi 的经验。网上有很多初学者教程。

让我们从树莓派开始我们的工作。 Raspberry pi 用作 WebSocket 客户端,并使用 WebSocket 协议与 Artik 云通信。我使用 Node.js 进行编程。不像 Python Node 没有预装在树莓派上。

A). 在终端中使用以下命令在 Raspberry pi 上安装 Node 和 npm。

sudo apt-get updatesudo apt-get install nodejs npm 

B). 将 WebSocket 客户端 ws 安装到树莓派

npm install --save ws 

C). 安装串口到树莓派

npm install serialport 

如果您成功完成了所有三个步骤,那么您的 pi 就可以使用串口和 Artik 云使用 websocket 与 Arduino 通信了。正如我之前所说,两个停车站需要两个树莓派。所以,从 Github 下载 this 的源代码。您可以使用像 FileZilla 这样的 ftp 客户端在树莓派上上传代码。不要忘记更改源代码中的 DEVICE ID 和 DEVICE TOKEN。

D) 在树莓派上上传代码后,在终端窗口中输入以下命令来运行代码。

sudo node staff-parking.js 

步骤 6. 开发 Web 应用程序

使用 HTML 和 JavaScript 来开发 Web 应用程序。为了在这里与 Artik 云通信,我再次使用了 WebSocket 协议。为了将 Map 集成到我的应用程序中,我使用了 Google Map API。

从我的 Github 下载 web-app 文件夹并使用您自己的设备 ID 和令牌修改设备 ID 和设备令牌。使用对收到的新数据生成操作的设备的 ID(在我的例子中是 edison)。使用网络浏览器打开 websocket.html 并享受。观看演示视频...

代码

  • Raspberry Pi(员工停车场)
  • Arduino(声纳)
  • 网络应用 (HTML)
  • 网络应用(客户端)
Raspberry Pi(员工停车场)JavaScript
树莓派源码
//员工停车数据传输var webSocketUrl ="wss://api.artik.cloud/v1.1/websocket?ack=true";var device_id ="Your Device id"; // 员工停车 DEVICE IDvar device_token ="Your Device Token"; //员工停车设备令牌//需要连接websocket模块//执行以下两个命令到你的pi终端// sudo apt-get update// npm install websocketvar WebSocket =require('ws');var isWebSocketReady =false;var data="";var ws =null;// 需要串口模块到树莓派 // 终端执行以下命令// npm install serialportvar serialport =require("serialport");var SerialPort =serialport.SerialPort;var sp =new SerialPort("/dev/ttyACM0", { // 与 arduino 的串行通信波特率:9600, // 我们使用的是 UNO,所以波特率为 9600,您可能需要根据您的模型解析器进行更改:serialport.parsers.readline(" \n")});varparking_state=0;//变量来检查停车 state_gate/** * 以毫秒为单位获取当前时间 */function getTimeMillis(){ return parseInt(Date.now().toString());}/** * 创建 /websocket 连接并设置 GPIO 引脚 */function start() { //创建 WebSocket 连接 isWebSocketReady =false; ws =new WebSocket(webSocketUrl); // 成功连接时调用此函数 ws.on('open', function() { console.log("WebSocket connection is open ...."); // 必须注册才能成功传输数据 // 注册是为了身份验证或安全数据传输 register(); }); ws.on('message', function(data) { //每当客户端发送一些消息handleRcvMsg(data); //数据被发送到函数handleRcvMsg() }); ws.on('close', function() { console.log("WebSocket 连接已关闭...."); }); }/** * 向/websocket 端点发送注册消息*///只有当设备从这里注册时,客户端才会工作function register(){ console.log("Registering device on the WebSocket connection"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; console.log('发送注册消息' + registerMessage + '\n'); ws.send(registerMessage, {mask:true}); isWebSocketReady =true; } catch (e) { console.error('注册消息失败。注册消息时出错:' + e.toString()); } }//接收后的数据发送到这里进行处理//在我们的例子中,这个函数不会被使用,因为我们不会在树莓派中接收任何动作//。这是为了将来修改。function handleRcvMsg(msg){ // 你必须解析接收到的字符串 var msgObj =JSON.parse(msg); if (msgObj.type !="action") 返回; //提前返回; var 动作 =msgObj.data.actions; var actionName =actions[0].name; console.log("接收到的动作是" + actionName); //你必须知道你注册的动作才能执行相应的动作 if (actionName.toLowerCase() =="settext") { // 在收到'parking_state'之后在这里做一些事情 console.log('receving Certified action' + actionName); } else { //如果接收到一些未注册的动作,则执行此循环 //因此您必须在云中注册每个动作 console.log('Do nothing since received unrecognized action ' + actionName);返回; } }/** * 向ARTIK Cloud 发送一条消息*///该函数负责向云端发送命令//函数sendStateToArtikCloud(parking) 发送空闲停车位数量给artik cloudfunction sendStateToArtikCloud(parking_slot){ try{ ts =', "ts":'+getTimeMillis(); var data ={ "parking_slot":parking_slot //设置停车值从参数到我们的云变量“parking_value”}; var payload ='{"sdid":"'+device_id+'"'+ts+', "data":'+JSON.stringify(data)+', "cid":"'+getTimeMillis()+'"}'; console.log('发送有效载荷' + 有效载荷 + '\n'); ws.send(payload, {mask:true}); } catch (e) { console.error('发送消息出错:' + e.toString() +'\n'); } }function exitClosePins() { console.log('退出并销毁所有引脚!'); process.exit(); }start();//每次从arduino接收数据时执行(arduino程序延迟30秒)sp.on("open", function () { sp.on('data', function(data) { console .log("串口收到数据:" + data); //sendStateToArtikCloud(data);//空闲停车位 var park_slot =parseInt(data); sendStateToArtikCloud(parking_slot); });});process.on(' SIGINT', exitClosePins);
Arduino(声纳)C/C++
使用 Arduino 的声纳传感器接口源代码
#define echoPin1 2 // 声纳 1 的回声引脚#define trigPin1 3 // 声纳 1 的触发引脚#define echoPin2 4 // 声纳 2 的回声引脚 #define trigPin2 5 //声纳触发引脚 2#define echoPin3 6 // 声纳回波引脚 3#define trigPin3 7 // 声纳触发引脚 3 //#define echoPin4 9 // 声纳回波引脚 4 //#define trigPin4 8 // 触发引脚声纳 4long duration1, distance1; // 用于计算距离的持续时间long duration2, distance2;long duration3, distance3;//long duration4, distance4; 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, 输出); pinMode(echoPin3, INPUT); //pinMode(trigPin4, OUTPUT); //pinMode(echoPin4, INPUT); }void loop() {/* 下面的trigPin/echoPin 循环用于通过将声波从对象上反弹来确定最近对象的距离。 */ /* 触发*引脚至少需要10微秒的高电平信号。 * _____ * | | * -------------! !--------- * .....|10us |........ * 模块产生8个40KHz脉冲信号并等待接收回波*/ digitalWrite(trigPin1, LOW);延迟微秒(2);数字写入(trigPin1,高);延迟微秒(10);数字写入(trigPin1,低); // pulseIn( ) 函数在时间上确定脉冲宽度 // 脉冲的持续时间与障碍物的距离成正比 duration1 =pulseIn(echoPin1, HIGH);数字写入(trigPin2,低);延迟微秒(2);数字写入(trigPin2,高);延迟微秒(10);数字写入(trigPin2,低);持续时间 2 =脉冲输入(echoPin2,高);数字写入(trigPin3,低);延迟微秒(2);数字写入(trigPin3,高);延迟微秒(10);数字写入(trigPin3,低);持续时间 3 =脉冲输入(echoPin3,高); //digitalWrite(trigPin4, LOW); //延迟微秒(2); //digitalWrite(trigPin4, HIGH); //延迟微秒(10); //digitalWrite(trigPin4, LOW); //duration4 =pulseIn(echoPin4, HIGH); // distance =(high level timevelocity of sound (340M/S) / 2, // in cm =uS/58 distance1 =duration1/58.2; if(distance1<10) distance1 =1; else distance1 =0; distance2 =duration2 /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 (distance4<10) //distance4 =1; //else distance4 =0; // 将所有传感器的结果相加 总车数 =distance1 + distance2 + distance3;; // free slot =total slot - total car freeSlot =3 - count; // 使用 USB 将总槽数发送到树莓派 Serial.println(freeSlot); // 状态每 30 秒更新一次 delay(5000); //freeSlot =0; //distance1 =0; //距离2 =0;//距离3 =0;//距离4 =0;}
Web 应用程序 (HTML)HTML
前端 Web 应用程序的源代码
   ARTIK 基于云的智能停车系统     

ARTIK 基于云的智能停车系统

员工停车

Near Main Cmapus

正在接收数据...

1

学生/客人停车

前门,近联合银行

正在接收数据...

输出控制台

Web 应用程序(客户端)JavaScript
// 可以使用 websocket 进行实时交互// 注意 ws:.这是 WebSocket 连接的新 URL 模式。 // 还有 wss:用于安全的 WebSocket 连接 // https:用于安全的 HTTP 连接。// 你可以从 Artik 云文档 pagevar wsUri ="wss://api.artik.cloud/v1 .1/websocket?ack=true";var device_id ="你的设备ID"; // raspi3 DEVICE IDvar device_token ="你的设备令牌"; //raspi3 DEVICE TOKENvar output;var attributes_log;var websocket;function init() { // document.getElementById() 向 html 页面写一些东西 output =document.getElementById("output"); attributes_log =document.getElementById("attributes_log"); if (browserSupportsWebSockets() ===false) { // 检查浏览器是否支持 websocket 协议 writeToScreen("抱歉!您的网络浏览器不支持 WebSockets。尝试使用 Google Chrome 或 Firefox 最新版本"); var element =document.getElementById("websocketelements"); element.parentNode.removeChild(元素);返回; // } //您只需调用 WebSocket 构造函数即可打开 WebSocket 连接 websocket =new WebSocket(wsUri); //当连接打开时,函数自动调用 websocket.onopen =function() { //writeAttributeValues('onOpen Event Fired'); writeToScreen("成功连接到停车系统"); // 连接打开后,安全数据传输需要注册 register(); }; // 当收到新消息时调用 websocket.onmessage =function(evt) { onMessage(evt); }; // 当收到错误时 // 您可以通过侦听错误事件来处理发生的任何错误。 websocket.onerror =function(evt) { onError(evt); };}function onClose(evt) { // 使用完 WebSocket 后,您可以使用 close() 方法终止连接。 websocket.close(); //writeAttributeValues('onClose Event Fired'); writeToScreen("DISCONNECTED");}// 当收到消息时,将触发消息事件。 function onMessage(evt) { writeToScreen('RESPONSE:' + evt.data + ''); //writeAttributeValues('onMessage Event Fired'); handleRcvMsg(evt.data); //数据发送到函数handleRcvMsg()}function onError(evt) { writeToScreen('ERROR: ' + evt.data); //writeAttributeValues('onError Event Fired');}function doSend(message) { // 要通过 WebSocket 连接发送消息,请调用 WebSocket 实例上的 send() 方法 websocket.send(message); //writeAttributeValues('onSend Event Fired'); writeToScreen("SENT:" + message);}function writeAttributeValues(prefix) { var pre =document.createElement("p"); pre.style.wordWrap ="断字"; pre.innerHTML ="INFO " + getCurrentDate() + " " + 前缀 + " readyState:" + websocket.readyState + " bufferedAmount:" + websocket.bufferedAmount + "";; attributes_log.appendChild(pre);}function writeToScreen(message) { var pre =document.createElement("p"); pre.style.wordWrap ="断字"; pre.innerHTML =消息; output.appendChild(pre);}function getCurrentDate() { var now =new Date(); var datetime =now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate();日期时间 +='' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds(); return datetime;}function browserSupportsWebSockets() { if ("WebSocket" in window) { return true; } else { 返回假; }}function getTimeMillis(){ return parseInt(Date.now().toString());}function register(){ writeToScreen("Registering device on the WebSocket connection"); try{ var registerMessage ='{"type":"register", "sdid":"'+device_id+'", "Authorization":"bearer '+device_token+'", "cid":"'+getTimeMillis()+' "}'; writeToScreen('发送注册消息' + registerMessage + '\n'); websocket.send(registerMessage, {mask:true}); isWebSocketReady =true; //document.getElementById("rainbow").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capacity:"+'50 '+"Free Slot:"+''+"50"; //document.getElementById("indigo").innerHTML ="Capacity:60, Free Slot:5"; } catch (e) { writeToScreen('注册消息失败。注册消息时出错:' + e.toString()); } }//接收后的数据发送到这里进行处理function handleRcvMsg(msg){ // 接收到的消息如下字符串 // {"actions":[{"name":"setText","parameters":{"text" :"4", "text2":"5"}}]} // 你必须解析它 var msgObj =JSON.parse(msg); if (msgObj.type !="action") 返回; //提前返回; var 动作 =msgObj.data.actions; var RainbowData =actions[0].parameters.text; var indigoData =actions[0].parameters.text2; console.log("接收到的动作是" + actions); document.getElementById("rainbow").innerHTML ="容量:50,空闲插槽:"+rainbowData; document.getElementById("indigo").innerHTML ="容量:60,空闲插槽:"+indigoData; }
智能停车系统源码
所有必要的代码和文件都包含在这个 Github 存储库中。https://github.com/husinul/Smart-Car-Parking

示意图


制造工艺

  1. C# 构造函数
  2. C# 使用
  3. 最常见的汽车冷却系统问题
  4. Smart Bartender
  5. 建筑管理系统:通往智慧城市的门票
  6. 温室智能照明控制降低成本
  7. 智能激光切割系统检测不同材料
  8. 了解输送系统
  9. 了解汽车千斤顶系统
  10. 了解悬挂系统
  11. 为什么我的汽车加热器只在行驶时工作?
  12. 智能压缩机系统有什么作用?