智能停车系统:树莓派 + Arduino Mega + 超声波传感器云端方案
系统架构概览
本项目构建一套基于 Samsung ARTIK Cloud(现已停止服务,建议迁移至 AWS IoT / Azure IoT / EMQX 等)的云端智能停车演示系统,逻辑拓扑如下:
[超声波传感器×3] → [Arduino Mega 串口] → [树莓派 3B USB/串口] → [WebSocket] → [ARTIK Cloud] ← [Web App / 手机端]
硬件清单
| 元器件 | 数量 | 角色 |
|---|---|---|
| 树莓派 3 Model B | 1 | 边缘网关,运行 Node.js WebSocket 客户端 |
| Arduino Mega 2560 | 1 | 采集 3 路 HC-SR04 超声波数据,串口上报 |
| HC-SR04 超声波模块 | 3 | 分别监测 3 个车位占用状态 |
云平台配置步骤(以 ARTIK 为例,通用于 MQTT/HTTP 平台)
- 创建设备类型:定义字段
parking_slot(Integer),表示空闲车位数 - 注册设备实例:获取
Device ID与Device Token - 创建规则:当
parking_slot变化时触发 Action,推送给订阅端 - 开发 Web App:建立 WebSocket 连接,实时渲染车位数与 Google Maps 标注
Arduino 端:超声波采集与串口上报
#define TRIG1 2 #define ECHO1 3
#define TRIG2 4 #define ECHO2 5
#define TRIG3 6 #define ECHO3 7
long d1, d2, d3;
int freeSlots = 0;
void setup() {
Serial.begin(9600);
pinMode(TRIG1, OUTPUT); pinMode(ECHO1, INPUT);
pinMode(TRIG2, OUTPUT); pinMode(ECHO2, INPUT);
pinMode(TRIG3, OUTPUT); pinMode(ECHO3, INPUT);
}
void loop() {
d1 = readDist(TRIG1, ECHO1);
d2 = readDist(TRIG2, ECHO2);
d3 = readDist(TRIG3, ECHO3);
// 距离 < 10cm 判定有车
int occupied = (d1<10) + (d2<10) + (d3<10);
freeSlots = 3 - occupied;
Serial.println(freeSlots); // 每 5 秒上报一次
delay(5000);
}
long readDist(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long dur = pulseIn(echo, HIGH, 30000); // 30ms 超时
return dur / 58.2; // cm
}
树莓派端:Node.js WebSocket 网关
// staff-parking.js
const WebSocket = require('ws');
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const DEVICE_ID = 'YOUR_DEVICE_ID';
const DEVICE_TOKEN = 'YOUR_DEVICE_TOKEN';
const WS_URL = `wss://api.artik.cloud/v1.1/websocket?ack=true`;
const port = new SerialPort('/dev/ttyACM0', { baudRate: 9600 });
const parser = port.pipe(new Readline({ delimiter: '\n' }));
const ws = new WebSocket(WS_URL);
ws.on('open', () => {
ws.send(JSON.stringify({
type: 'register', sdid: DEVICE_ID,
Authorization: 'bearer ' + DEVICE_TOKEN,
cid: Date.now()
}));
});
parser.on('data', line => {
const slots = parseInt(line.trim());
if (!isNaN(slots)) {
ws.send(JSON.stringify({
sdid: DEVICE_ID,
ts: Date.now(),
data: { parking_slot: slots },
cid: Date.now()
}));
}
});
Web 前端:实时车位看板 + 地图
// websocket_client.js 关键片段
const ws = new WebSocket('wss://api.artik.cloud/v1.1/websocket?ack=true');
ws.onopen = () => ws.send(registerMsg);
ws.onmessage = evt => {
const msg = JSON.parse(evt.data);
if (msg.type === 'action') {
const free = msg.data.actions[0].parameters.text;
document.getElementById('rainbow').innerText = `空闲车位: ${free}`;
}
};
// Google Maps 初始化标记两个停车场位置
原理图与实物



迁移建议(ARTIK Cloud 已下线)
- 协议层:WebSocket → MQTT (TLS) / HTTPS REST
- 云端:AWS IoT Core / Azure IoT Hub / EMQX Cloud / ThingsBoard
- 设备侧:树莓派运行
mosquitto_pub/sub或 SDK,Arduino 端不变 - 前端:MQTT over WebSocket 直连浏览器,或通过后端转发
扩展方向
- 增加车牌识别(OpenCV + 树莓派摄像头)
- 接入 NB-IoT / LoRa 远程部署无需 WiFi
- 增加红外/雷达融合提高检测鲁棒性
- 开发微信小程序 / App 预约车位、导航引导
完整代码仓库
https://github.com/husinul/Smart-Car-Parking
制造工艺