智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
组件与材料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 主控,读取 PIR 并串口上传计数 |
| PIR 人体红外传感器 (通用) | 2 | 分别安装于入口/出口 |
| LED (指示灯) | 1 | 检测到车辆闪烁确认 |
| 杜邦线 | 1 |
应用与在线服务
- Arduino IDE
- Samsung ARTIK Cloud (已停止服务,建议迁移至 ThingsBoard/ThingSpeak/自建 MQTT)
- Processing IDE (桌面端串口网关)
- PHP (服务端 HTTP → 云 API 代理)
项目原理
计数逻辑
两个 PIR 传感器分别部署在停车场入口与出口。车辆驶入触发入口传感器 → 计数器 +1;驶出触发出口传感器 → 计数器 -1。LED 每次计数闪烁 500ms 指示。计数值通过 USB 串口实时发送给 PC 端的 Processing 程序。
数据上云链路
- Arduino → (USB/串口) → Processing (读取串口字符串)
- Processing → `loadStrings("https://localhost:8000/acdemo/post-message.php?count=" + val)` → PHP 代理
- PHP → HTTPS POST JSON → Samsung ARTIK Cloud (设备类型 Car Counter, 字段
count) - 前端/手机 App 可从云端读取实时剩余车位
软件架构图



核心代码
Arduino 端 (计数 + 串口输出)
int pirPinIN = 7; // 入口传感器
int pirPinOUT = 10; // 出口传感器
int led = 13; // 指示灯
static long counter = 0;
void setup() {
pinMode(pirPinIN, INPUT);
pinMode(pirPinOUT, INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
}
void loop() {
if (digitalRead(pirPinIN) == HIGH) {
counter++;
Serial.println(counter);
digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW);
}
if (digitalRead(pirPinOUT) == HIGH) {
counter--;
Serial.println(counter);
digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW);
}
}
Processing 端 (串口网关 → HTTP GET)
import processing.serial.*;
Serial myPort;
String val;
void setup() {
// 根据实际端口修改索引:Windows 通常 COM3=Serial.list()[0] 或 [1]
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw() {
if (myPort.available() > 0) {
val = myPort.readStringUntil('\n');
int count = parseInt(val);
if (count >= 0) {
// 调用本地 PHP 代理上传云端
loadStrings("https://localhost:8000/acdemo/post-message.php?count=" + val);
}
}
println(val); // 控制台打印
}
PHP 代理 (post-message.php)
<?php
$count = filter_input(INPUT_GET, 'count', FILTER_SANITIZE_NUMBER_INT);
require('ArtikCloudProxy.php');
$proxy = new ArtikCloudProxy();
$proxy->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);
PHP SDK 核心类 (ArtikCloudProxy.php)
<?php
class ArtikCloudProxy {
const CLIENT_ID = "YOUR_CLIENT_ID";
const DEVICE_ID = "YOUR_DEVICE_ID";
const API_URL = "https://api.artik.cloud/v1.1";
const API_MESSAGES_POST = "/messages";
public $token = null;
public $user = null;
public function setAccessToken($someToken) {
$this->token = $someToken;
$this->user = $this->getUsersSelf();
}
public function getCall($url) { /* cURL GET 实现 */ }
public function postCall($url, $payload) { /* cURL POST 实现 */ }
public function getUsersSelf() { return $this->getCall(API_URL . API_USERS_SELF); }
public function sendMessage($payload) { return $this->postCall(API_URL . API_MESSAGES_POST, $payload); }
}
部署步骤
- 搭建硬件:按原理图连接 2 路 PIR + LED
- 上传 Arduino 代码,打开串口监视器验证计数输出
- 本地搭建 WAMP/XAMPP,配置 HTTPS 端口 (如 8000) 并安装 CA 证书
- 将 `post-message.php` 与 `ArtikCloudProxy.php` 放入站点目录 (如 `acdemo`)
- 在 ARTIK Cloud 创建应用、设备类型 Car Counter、获取 Client ID/Secret/Device ID/Access Token 填入 PHP
- 运行 Processing 草图,确保串口端口正确
- 登录 ARTIK Cloud 仪表盘查看实时数据
故障排查
- 浏览器访问 `https://localhost:8000/acdemo/post-message.php?count=10` 应返回 JSON,否则检查 SSL 证书与 PHP 错误日志
- Processing 报串口错误 → 修正 `Serial.list()[n]` 索引
- 计数异常 → PIR 灵敏度/安装角度需调整,避免重复触发
现代化迁移建议 (ARTIK Cloud 已停服)
- 云端替换:ThingSpeak (免费)、ThingsBoard (开源自建)、MQTT Broker + InfluxDB + Grafana
- Processing 端直接 HTTP POST 到新云端 API,省去 PHP 代理层
- Arduino 端改用 ESP8266/ESP32 直连 WiFi/MQTT,彻底去 PC 依赖
- 前端开发:用 Vue/React + ECharts 展示实时/历史车位趋势
原理图

制造工艺
- Arduino Mega 按键 PWM 调光:三阶段渐变 LED 实战教程
- 用 Arduino 制作超声波悬浮装置:分步指南
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 用 Arduino 测量地球质量:DIY 分步指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino 声纳实时测距与 Processing 可视化
- MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
- 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
- 情人节礼物:DIY 恋爱天数计数器
- Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程