Car Counter using Arduino + Processing + PHP
组件和用品
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
| ||||
| ||||
|
关于这个项目
简介
该项目演示了如何使用 Arduino 使用两个传感器计算进出商场的汽车数量,使用 Processing &PHP 将数据发送到云端,然后查看停车场的可用车位数量。此项目不需要以太网或 Wifi 屏蔽!
工作原理
传感器需要放置在停车场的入口和出口点,才能按预期工作。基本上,你增加 count 每次有车进来,出去时递减。每次汽车通过传感器时,系统中的 LED 灯只是指示车辆被正确计数。
处理中
处理 是一种用于在其他计算机上编写程序的开源语言/开发工具。当您希望其他计算机与 Arduino 进行“对话”时很有用,例如显示或保存 Arduino 收集的一些数据。
对于这个项目,我们使用 Processing 来接收数据(汽车数量) 由 Arduino 通过串口发送。将 Processing IDE 下载并安装到您的计算机上。您可以在随附的处理草图中看到非常简单直接的代码行。在这里,我们使用 loadStrings() 方法调用 PHP 文件 .
PHP
PHP 文件 post-message.php 与此处的教程中的文件相同。我们从 Github 页面下载了整个 zip 文件,并在原始文件中编辑了几行代码,以便我们无需登录三星帐户即可使用它。为此,您需要按照此处的说明更改 WAMP 或 XAMP 服务器的端口并为 ARTIK Cloud 安装 CA 证书。或者,您可以使用安装了 SSL 证书的远程或托管服务器。
将文件复制到一个文件夹,例如 acdemo 这样就可以使用 URL http://localhost:8000/acdemo/post-message.php 或 https://www.yourwebsite.com/acdemo/post-message.php
访问它PHP SDK 中只有两个文件需要编辑:ArtikCloudProxy.php 和 post-message.php .您可以在此处查看您的客户端和设备 ID。
在 post-message.php 文件,您需要获取访问令牌和设备 ID。获取令牌的最简单方法是按照此处的步骤操作。请注意,我们发送到云端的唯一数据是汽车数量 进出商场。我们在 Artik Cloud 中创建了一个设备并将其命名为Car Counter 带有一个名为 count 的字段 保存此值。
现在一切都设置好了,是时候开始了!请按照以下简单步骤操作:
Artik云
- 1.登录您的 Artik Cloud 帐户并转到应用程序> 新应用
- 2.在下一个屏幕中为您的应用程序输入必要的详细信息。
- 3.创建完应用程序后,如果将显示在您的仪表板中。单击应用程序名称并查找Show Client ID &Secret .您需要这些 PHP 文件的代码。
- 4.从侧边菜单中,选择您的应用程序并点击权限 .添加汽车柜台 从设备类型列表中查看阅读 &写 权限。
编码
- 1.将草图上传到您的 Arduino UNO。如果这是您第一次使用 Arduino,请按照以下步骤了解如何执行此过程。
- 2.运行处理 在处理 IDE 中绘制草图。确保您的 WAMP 服务器开启 此时,如果您使用的是本地计算机而不是托管服务器。
- 3.如果您根据上面的连接图成功连接了该系统的部件,请通过 PIR 传感器查看它是否工作。
- 4.登录您的 Artik Cloud 帐户,查看数据是否正确发送。
故障排除
- 1.打开下面的链接,查看数据是否正确发送到 Artik Cloud。如果没有任何问题,这将显示一个 Json 文件。如果您没有看到 Json 文件,则您可能没有安装上述 SSL 证书。尝试返回并确保正确遵循指示。
http://localhost:8000/acdemo/post-message.php?count=10
下一步做什么
根据以上的汽车数量数据,您可以为商场创建一个应用程序,让购物者在去商场之前可以查看停车位的可用车位数量。您还可以添加另一个指示灯,在停车位已满或未满时亮起。
代码
- Arduino 代码
- 处理草图
- post-message.php
- ArtikCloudProxy.php
Arduino 代码Arduino
这是向串行显示汽车计数并打开 LED 以指示汽车通过 PIR 传感器的代码。int pirPinIN =7;int pirPinOUT =10;int led =13;static long counter =0;无效设置(){ pinMode(pirPinIN,输入); pinMode(pirPinOUT,输入); pinMode(led,输出);数字写入(LED,低); Serial.begin(9600);} void loop(){ long now =millis(); if (digitalRead(pirPinIN) ==HIGH) { counter++; Serial.println(计数器);数字写入(LED,高);延迟(500);数字写入(LED,低); } if (digitalRead(pirPinOUT) ==HIGH) { counter--; Serial.println(计数器);数字写入(LED,高);延迟(500);数字写入(LED,低); }}
处理草图Java
此处理草图读取模拟端口上的传入值,然后使用串行通信功能输出值。import processing.serial.*;Serial myPort; // 从 Serial classString 创建对象 val; // 从串口接收到的数据无效 setup(){ // 我知道我的 mac 上串口列表中的第一个端口 // 是 Serial.list()[0]。 // 在 Windows 机器上,这通常会打开 COM1。 // 打开您正在使用的任何端口。 String portName =Serial.list()[0]; //将0更改为1或2等以匹配您的端口 myPort =new Serial(this, portName, 9600);}void draw(){ if ( myPort.available()> 0) { // 如果数据是可用,val =myPort.readStringUntil('\n'); // 读取它并将其存储在 val int count =parseInt(val); if(count>=0){ loadStrings("http://localhost:8000/acdemo/post-message.php?count="+val); } } 打印(val); //在控制台打印出来}
post-message.phpPHP
此代码获取处理草图传递的值并将计数发布到云端。setAccessToken("YOUR_ACCESS_TOKEN");$data ='{"count":'.$count.'}';$payload =array("data"=>$data,"sdid" =>"YOUR_DEVICE_ID","type"=>"message");$payload =json_encode($payload, JSON_HEX_QUOT | JSON_HEX_TAG);$response =$proxy->sendMessage($payload);header('Content-Type:application /json');echo json_encode($response);
ArtikCloudProxy.phpPHP
这是连接到 Artik 云所需的 ArtikCloudProxy 类。将它保存到与 post-message.php 相同的文件夹中,某个地方可以访问网络。对配置进行必要的更改。&count="; const API_MESSAGES_POST ="/messages"; # 成员 public $token =null;公共 $user =null; public function __construct(){ } /** * 设置访问令牌并查找用户个人资料信息 */ public function setAccessToken($someToken){ $this->token =$someToken; $this->user =$this->getUsersSelf(); } /** * API 调用 GET */ 公共函数 getCall($url){ $ch =curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization:bearer'.$this->token)); $json =curl_exec($ch); $status =curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($status ==200){ $response =json_decode($json); } else{ var_dump($json); $response =$json; } 返回 $response; } /** * API 调用POST */ 公共函数postCall($url, $payload){ $ch =curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, (String) $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization:Bearer '.$this->token)); $json =curl_exec($ch); $status =curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($status ==200){ $response =json_decode($json); } else{ var_dump($json); $response =$json; } 返回 $response; } /** * GET /users/self API */ public function getUsersSelf(){ return $this->getCall(ArtikCloudProxy::API_URL .ArtikCloudProxy::API_USERS_SELF); } /** * POST /message API */ public function sendMessage($payload){ return $this->postCall(ArtikCloudProxy::API_URL .ArtikCloudProxy::API_MESSAGES_POST, $payload); } /** * GET /historical/normalized/messages/last API */ public function getMessagesLast($deviceCommaSeparatedList, $countByDevice){ $apiPath =ArtikCloudProxy::API_MESSAGES_LAST; $apiPath =str_replace(" ", $deviceCommaSeparatedList, $apiPath); $apiPath =str_replace(" ", $countByDevice, $apiPath);返回 $this->getCall(ArtikCloudProxy::API_URL.$apiPath); }}
示意图
连接 2 个 PIR 传感器和 LED 的示意图制造工艺