树莓派 + Arduino UNO + 三星 SAMI 极速构建火灾检测系统
教程概述
本教程指导你创建一个紧凑的物联网火灾检测系统,通过 WebSocket 将火焰传感器读数流式传输到三星 SAMI,使用 Arduino UNO 和树莓派。
我们将采用简单的现成红外火焰传感器,向 Arduino 上传轻量级草图,在树莓派上运行 Node.js 脚本将数据转发给 SAMI。
前置知识
本教程假设你熟悉基本 SAMI API。
系统架构
下图说明高层流程:
- 联网树莓派
- 带面包板的 Arduino UNO
- 红外火焰传感器
- USB、电源线及面包板接线
软件组件:
- 运行在 UNO 上的 Arduino 草图
- 运行在树莓派上的 Node.js 脚本
若无树莓派,也可照做。将 Arduino 连接到有网络的电脑,在该机器运行 Node.js 脚本即可。
步骤 1:创建并连接新设备类型
- 登录 SAMI 开发者门户。无三星账号请先注册。
- 点击 “+ New Device Type”。
- 命名设备类型为 “Flame Sensor”,分配唯一标识符如 “com.example.iot.flame”。
- 点击 “Create Device Type” 进入设备类型页面。
现在为 “Flame Sensor” 设备类型创建 Manifest。
- 左栏点击 “Flame Sensor”。
- 导航到 “Manifest” 点击 “+ New Version”。
- 字段名输入 onFire,数据类型选 Boolean。
- 点击 “Save” 然后 “Next: Actions”。
- 本教程跳过 Actions,点击 “Save New Manifest”。
Simple Manifest 自动批准。请勿发布此设备类型,仅供教程用途。
最后通过用户门户连接新 Flame Sensor 设备:
- 登录 SAMI 用户门户。
- 仪表盘点击连接新设备。
- 选择刚创建的 “Flame Sensor” 设备类型。
- 点击 “Connect Device…”,返回仪表盘。
- 点击新增设备的设置图标。弹窗中选 “GENERATE DEVICE TOKEN…”。
- 复制显示的设备 ID 和设备令牌——代码中需要。
步骤 2:配置 Arduino
按上图将红外火焰传感器接到 Arduino。然后用 Arduino IDE 上传以下草图(read_flame_sensor.ino)。草图每 5 秒(可调)读取传感器并将数字值发送到串口。在 SAMI 中,“0”表示检测到火焰;“1”表示无火焰。
/* read_flame_sensor.ino */
// 读取间隔
const int delayBetweenReads = 5000; // 5 秒
// 火焰探测器引脚
const int flameDigitalPinIn = 2;
void setup() {
// 初始化串口通信 9600 波特
Serial.begin(9600);
pinMode(flameDigitalPinIn, INPUT);
}
void loop() {
// HIGH (1) = 无火,LOW (0) = 检测到火
int flameDigitalReading = digitalRead(flameDigitalPinIn);
Serial.println(String(flameDigitalReading));
delay(delayBetweenReads);
}
步骤 3:配置树莓派
将树莓派连接显示器、鼠标、键盘。确保有可用以太网或 Wi‑Fi 且系统最新:
- $ sudo apt-get update
- $ sudo apt-get upgrade
若未装 Node.js,安装 ARM 兼容版并通过 npm 添加依赖:
- $ npm install serialport
- $ npm install ws
将 Arduino 串口通过 USB 连到树莓派。
下载 Node.js 脚本(send_data_to_sami.js),将 device_id 和 device_token 占位符替换为前面复制的凭据。
/* send_data_to_sami.js */
var webSocketUrl = "wss://api.samsungsami.io/v1.1/websocket?ack=true";
var device_id = "YOUR_DEVICE_ID";
var device_token = "YOUR_DEVICE_TOKEN";
var isWebSocketReady = false;
var ws = null;
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyACM0", {
baudrate: 9600,
parser: serialport.parsers.readline("\n")
});
var WebSocket = require('ws');
/** 获取当前毫秒时间戳 */
function getTimeMillis(){
return parseInt(Date.now().toString());
}
// 建立 WebSocket 连接并注册设备
ws = new WebSocket(webSocketUrl, {
headers: {
"Authorization": `Bearer ${device_token}`
}
});
ws.on("open", () => {
isWebSocketReady = true;
register();
});
function register() {
var registerMsg = {
"topic": "sami/device/register",
"data": { "deviceId": device_id }
};
ws.send(JSON.stringify(registerMsg));
}
sp.on("data", (data) => {
if (isWebSocketReady) {
var message = {
"topic": "sami/device/telemetry",
"data": {
"onFire": data.trim() === "0"
}
};
ws.send(JSON.stringify(message));
}
});
脚本运行后,火焰传感器读数将实时流式传输到 SAMI。
更多详情请参考完整教程:Make a fire detector in minutes with Samsung SAMIIO, Arduino UNO and Raspberry Pi。
制造工艺
- 树莓派低成本婴儿啼哭检测器 DIY 指南:Prota OS + Philips Hue + Volumio
- 树莓派自动化气雾栽培系统:湿度传感器智能控制
- 树莓派与Python构建机器人:完整指南
- Arduino与树莓派构建互联网控制视频流机器人完整指南
- 自制 Arduino 伊斯兰祷告时间实时时钟
- Arduino + Android 蓝牙控制 Roomba Create 2 扫地机器人完整指南
- Arduino UNO 驱动 1.17 英寸 TFT 屏显示图片 (SD 卡读取)
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- 在 Arduino Due 上实现语音识别与语音合成 - BitVoicer Server 方案
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目