
1. 从零开始为什么选择 Particle Photon 2 做温度监测如果你正在寻找一个能快速上手、稳定可靠并且能让你把数据轻松传到云端的物联网开发板那么 Particle Photon 2 绝对是一个绕不开的选择。我最初接触它就是为了解决一个很实际的问题远程监控几个不同地点的设备机柜内部温度。市面上的方案要么太“重”需要自己搭建服务器和通信协议要么太“轻”数据只能本地查看无法远程告警。Photon 2 恰好卡在了这个甜点上——它内置了 Wi-Fi 和蓝牙更重要的是它原生集成了 Particle 的云服务让你写几行代码就能把传感器读数发到网上通过手机 App 或者 Webhook 就能随时查看和接收通知。这次我们聚焦最基础也最实用的场景连接一个数字温度传感器。你别看这个项目听起来简单它几乎是所有物联网应用的“第一课”。从读取一个传感器的数据到处理它、上传它、并基于它做出反应这个完整链路里藏着硬件选型、电路连接、代码逻辑、云服务配置等一系列关键知识点。用 Photon 2 来做你能跳过很多底层通信的坑直接专注于应用逻辑本身。我将会手把手带你完成从开箱、焊接、编码到云端查看数据的全过程过程中我会穿插很多我实际踩过的坑和总结的技巧确保你一次就能跑通并且理解每一步背后的“为什么”。2. 硬件准备与连接不止是插上线那么简单动手之前我们得把家伙事儿备齐。核心就三样Particle Photon 2 开发板、一个温度传感器、以及连接它们的线材。但这里面的门道决定了你后续调试的难度。2.1 核心硬件选型与考量Particle Photon 2是主角它基于 Raspberry Pi RP2040 微控制器但比单纯的 RP2040 开发板多了 Wi-Fi/蓝牙模块和 Particle 云身份认证芯片这是它能“开箱即用”连云的关键。板载一个 RGB LED用户灯和一个复位按钮这些在调试时会很有用。温度传感器的选择是第一个决策点。最常见的有两类DS18B20单总线数字温度传感器。优点是精度较高±0.5°C抗干扰好支持一线多设备一根数据线可以挂多个传感器通过唯一地址区分。缺点是协议稍复杂需要对应的库支持。DHT11/DHT22温湿度一体传感器。DHT11 成本低但精度和范围较窄DHT22 精度和范围更好。它们使用单线双向通信也需要特定库。为了最直观地演示从传感器读取数据到上传云端的完整流程我选择DS18B20。因为它输出就是简单的数字值不需要复杂的校准而且其单总线特性在后续扩展多个传感器时非常方便。你还需要一个4.7kΩ 的上拉电阻这是 DS18B20 单总线通信稳定所必需的很多传感器模块已经集成如果买的是探头则需要自己准备。连接线建议使用杜邦线母对母方便插拔。如果准备长期使用可以考虑焊接在洞洞板或定制 PCB 上稳定性会高很多。2.2 电路连接详解与原理正确的物理连接是成功的一半。错误的连接轻则数据不准重则损坏传感器或开发板。下面是 Photon 2 与 DS18B20 的连接图以模块为例Particle Photon 2 DS18B20 模块 3V3 (VCC) ---- VCC (通常标为) GND ---- GND D2 (或其他任何GPIO) ---- DATA (或DQ)同时必须在 DATA 引脚和 3V3 之间连接一个 4.7kΩ 的上拉电阻。为什么需要这个上拉电阻这是理解单总线通信的关键。DS18B20 的数据线DQ在空闲时需要被拉至高电平3.3V。当 Photon 2 或传感器主动拉低数据线进行通信时才能产生明确的高低电平变化。如果没有这个上拉电阻数据线电平可能处于不确定的“浮空”状态导致通信失败或数据乱码。这个电阻的阻值在 4.7kΩ 到 10kΩ 之间4.7kΩ 是常用值能提供足够的驱动能力同时不过度耗电。注意务必确认你的 DS18B20 模块工作电压是 3.3V。Photon 2 的 GPIO 引脚是 3.3V 电平虽然很多 5V 模块也能工作但为安全起见使用 3.3V 模块是最稳妥的。如果模块只有 5V 版本数据线可以直连但 VCC 请接 Photon 2 的VUSB引脚当通过 USB 供电时该引脚为 5V切勿接 3V3。连接好后给 Photon 2 通过 USB 线供电。你会看到板子上的 RGB LED 开始闪烁蓝色呼吸灯模式这表示它正在尝试连接网络。第一次使用需要配置 Wi-Fi我们稍后通过手机 App 完成。3. 开发环境搭建与设备配置硬件连好了接下来就要让 Photon 2 “活”起来并告诉它我们的代码在哪里。3.1 三种开发方式对比Particle 为 Photon 2 提供了多种开发方式适合不同习惯的开发者Web IDE (Particle Build)最简单。直接在浏览器中编写、编译和推送代码。无需本地安装自动管理库依赖非常适合新手和快速原型开发。缺点是功能相对基础网络依赖强。VS Code Particle 插件最推荐。在强大的 VS Code 编辑器中使用提供代码补全、语法高亮、本地编译需安装工具链、设备日志流等高级功能。适合严肃的项目开发。Particle CLI (命令行工具)最灵活。通过命令行管理设备、编译和刷写固件。适合集成到自动化脚本或 CI/CD 流程中。对于本教程我强烈推荐使用VS Code Particle 插件的组合。它既提供了专业编辑器的便利又保留了 Particle 云编译的便捷性。下面是我的配置步骤首先在 VS Code 的扩展商店中搜索并安装 “Particle” 官方插件。安装后侧边栏会出现 Particle 的图标。点击它你需要登录你的 Particle 账户如果没有去 Particle.io 官网免费注册一个。登录后插件会列出你账户下的所有设备。如果是全新的 Photon 2它应该显示为 “未命名” 或一个 ID。现在先放一边我们需要先用手机 App 把设备配网。3.2 设备初次配网Claim Wi-Fi每个 Particle 设备都需要被“认领”到你的账户下并配置 Wi-Fi才能与 Particle 云通信。在手机应用商店下载 “Particle” App。打开 App用你的 Particle 账户登录。确保手机蓝牙已打开。点击 App 中的 “添加设备”。按照 App 提示操作长按 Photon 2 板上的 “SETUP” 按钮不是复位键直到 RGB LED 开始快速闪烁蓝光闪烁模式然后松开。App 会通过蓝牙发现设备并引导你选择家庭 Wi-Fi 网络、输入密码。配网成功后设备 LED 会开始缓慢闪烁蓝色呼吸模式表示正在连接云端。连接成功后LED 会变为“彩虹色呼吸”或你代码中设定的颜色。回到 VS Code 的 Particle 插件面板刷新设备列表。你应该能看到你的 Photon 2 出现了名字可能是 “photon2-xxxx”。右键点击设备可以将其重命名为一个有意义的名称比如 “lab-temperature-monitor”。实操心得配网时确保 Photon 2 离路由器不要太远。如果配网失败LED 会闪烁红色。最常见的错误是 Wi-Fi 密码输错或者网络是 5GHz 频段Photon 2 只支持 2.4GHz Wi-Fi。多试几次或者将手机热点设置为 2.4GHz 作为临时网络进行配置成功率很高。4. 编写第一个程序读取并打印温度值环境就绪设备在线现在可以开始写代码了。我们第一步的目标很简单在串口监视器中看到 DS18B20 读取的温度值。4.1 创建项目与库管理在 VS Code 的 Particle 插件面板点击 “创建新项目”。选择 “Firmware” 类型模板选 “空项目”输入项目名称例如TempSensor_Tutorial。插件会创建一个包含src目录的文件夹里面有两个核心文件project.properties和src/main.cpp。我们需要为 DS18B20 添加库。Particle 的库系统非常强大。打开project.properties文件你会看到依赖项部分。我们需要添加 OneWire 和 SparkFunDS18B20 库这是一个经过验证、易于使用的库。在 dependencies 部分添加dependencies.onewire* # 使用最新版本 dependencies.SparkFunDS18B20* # 使用最新版本保存文件。VS Code 会自动开始下载并安装这些库。你可以在左侧文件树的lib目录下看到它们。4.2 理解代码结构与单总线通信现在打开src/main.cpp。我们将编写完整的代码。我会逐段解释// 引入必要的头文件 #include Particle.h // Particle 固件核心库必须包含 #include OneWire.h // OneWire 单总线协议库 #include SparkFunDS18B20.h // DS18B20 传感器驱动库 // 初始化串口通信用于调试输出 SerialLogHandler logHandler; // 定义 DS18B20 数据线连接的引脚 const int ONE_WIRE_BUS D2; // 创建 OneWire 和 DS18B20 对象实例 OneWire oneWire(ONE_WIRE_BUS); DS18B20 sensor(oneWire); void setup() { // 初始化串口设置波特率 Serial.begin(9600); // 等待串口连接对于USB虚拟串口这行是必要的 waitFor(Serial.isConnected, 10000); // 最多等待10秒 Log.info(系统启动...); // 初始化温度传感器 if (sensor.begin()) { Log.info(DS18B20 传感器初始化成功); } else { Log.error(DS18B20 传感器初始化失败请检查连接。); // 失败后可以闪烁红灯报警 RGB.control(true); RGB.color(255, 0, 0); // 红色 delay(2000); RGB.control(false); } } void loop() { // 请求所有挂在总线上的 DS18B20 开始温度转换 sensor.requestTemperatures(); // 等待转换完成。对于12位精度最多需要750ms delay(750); // 读取第一个索引0传感器的温度值 float tempC sensor.getTempCByIndex(0); // 检查读数是否有效-127 通常是读取失败 if (tempC ! -127.0) { Log.info(当前温度: %.2f °C, tempC); // 也可以打印华氏度 // float tempF sensor.getTempFByIndex(0); // Log.info(当前温度: %.2f °F, tempF); } else { Log.warn(温度读取失败); } // 每5秒读取一次 delay(5000); }关键点解析SerialLogHandler与Log.info这是 Particle 推荐的日志输出方式比传统的Serial.println更强大可以分级info, warn, error并自动添加时间戳。waitFor(Serial.isConnected, 10000)这行代码在setup()中非常实用。它会让程序暂停直到电脑的串口监视器打开连接最多等待10秒。这确保了你在打开监视器前不会错过最初的启动日志。sensor.begin()这个初始化函数会尝试在单总线上搜索 DS18B20 设备。如果找到返回true。这是硬件连接是否正确的第一次检验。requestTemperatures()与delay(750)DS18B20 的温度转换需要时间。调用requestTemperatures()是命令所有传感器开始转换然后必须等待足够的时间对于默认的12位精度最大需要750毫秒才能读取准确的值。这是最容易忽略的步骤如果不等够就读会得到上一次的转换结果或错误值。getTempCByIndex(0)参数0表示总线上第一个被发现的传感器。如果你接了多个 DS18B20可以通过循环遍历索引来读取所有设备。4.3 编译、刷写与本地调试代码写好了接下来就是把它送到设备上运行。编译在 VS Code 中按CtrlShiftP打开命令面板输入 “Particle: Compile application (local)”。选择本地编译需要提前安装好 Particle 本地编译工具链或云编译。云编译更简单插件会自动处理。刷写编译成功后在命令面板选择 “Particle: Flash application (local)”。选择你的设备名称如lab-temperature-monitor。插件会将编译好的固件通过云端推送到你的设备。查看日志刷写完成后设备会自动重启运行新程序。在 VS Code 的 Particle 插件面板找到你的设备右键点击并选择 “Show Serial Monitor”。一个终端窗口会打开显示来自设备的串口日志。如果一切顺利你应该每隔5秒看到一行日志输出当前温度: xx.xx °C。用手捏住传感器温度应该会缓慢上升。恭喜你硬件和基础代码部分已经成功踩坑记录我第一次做的时候日志里一直输出-127.0。排查后发现两个问题一是忘了加delay(750)等待转换二是上拉电阻接触不良。对于通信问题一个有效的调试方法是在setup()里初始化后添加sensor.getAddress(deviceAddress, 0)来尝试获取第一个设备的64位地址如果成功打印出地址说明总线通信正常问题可能出在转换或读取环节。5. 将数据发布到 Particle 云本地读取成功只是第一步。Particle 的核心价值在于其云服务。接下来我们要把温度数据“发布”到云端这样无论你在哪里都能通过互联网获取它。5.1 理解 Particle 的事件系统Particle 设备与云端的通信基于一个“发布-订阅”事件模型。设备可以发布Publish一个带有名称和数据的“事件”到云端。云端可以将这个事件转发给其他设备、你的手机 App或者通过 Webhook 推送到你自己的服务器。我们将创建一个名为temp_reading的事件每次读取温度后将温度值作为数据发布出去。修改loop()函数中的成功读取部分if (tempC ! -127.0) { Log.info(当前温度: %.2f °C, tempC); // 将温度数据发布到 Particle 云 String eventData String::format(%.2f, tempC); bool published Particle.publish(temp_reading, eventData, PRIVATE); if (published) { Log.info(事件发布成功); } else { Log.warn(事件发布失败); } }Particle.publish()这是发布事件的核心函数。第一个参数temp_reading是事件名称你可以自定义。第二个参数eventData是事件数据这里是格式化为两位小数的温度字符串。第三个参数PRIVATE表示这是一个私有事件只有你的 Particle 账户下的设备和应用可以访问。如果设为PUBLIC则任何知道事件名的人都可以订阅通常用于公开数据。返回值函数返回一个布尔值表示发布是否成功。网络不稳定时可能会失败在实际项目中需要加入重试逻辑。5.2 在云端查看与验证数据代码修改后重新编译并刷写到设备。设备运行后你可以通过多种方式验证数据是否成功上传Particle Console (控制台)浏览器打开 console.particle.io 登录后进入你的设备页面。在 “Events” 标签页下你会看到实时流式的事件日志其中应该包含temp_reading事件及其数据。Particle Mobile App在手机 App 中进入你的设备页面同样可以看到事件流。设备日志在 VS Code 串口监视器中除了温度日志现在还会看到 “事件发布成功” 或 “失败” 的提示。注意事项Particle 云对免费账户的事件发布频率有限制。默认情况下设备每秒最多发布1个事件每分钟最多120个。我们的每5秒发布一次完全在限制内。但如果你的项目需要更高频率需要注意这个限制或者考虑升级账户。频繁发布失败也可能是网络信号弱导致的。6. 构建一个简单的温度监控仪表盘仅仅看到事件流还不够直观。我们可以利用 Particle 云的一个强大功能——集成Integrations来创建一个简单的网页仪表盘实时显示温度曲线。6.1 使用 Webhook 将数据转发到第三方服务Particle 本身不提供复杂的图表展示但可以通过 Webhook 将事件数据轻松转发到其他支持的服务比如ThingSpeak、Adafruit IO或者自定义的服务器。这里我以 ThingSpeak 为例因为它免费且易于设置。注册 ThingSpeak访问 thingspeak.com用 MathWorks 账户注册。创建频道Channel登录后点击 “New Channel”。填写名称如 “My Lab Temp”在 Field 1 标签处填写 “Temperature”。其他字段可选然后保存。获取 API 密钥频道创建后进入 “API Keys” 标签页。复制 “Write API Key”。这个密钥用于向你的频道写入数据。6.2 在 Particle Console 中配置 Webhook接下来我们告诉 Particle 云每当收到temp_reading事件时就将其数据转发到 ThingSpeak。在 Particle Console 中进入你的设备所属的产品或个人设备列表点击 “Integrations”。点击 “New Integration”选择 “Webhook”。配置 WebhookEvent Name: 输入temp_reading必须与代码中Particle.publish的事件名完全一致。URL: 填入 ThingSpeak 的更新 API 地址https://api.thingspeak.com/updateRequest Type:POSTRequest Format:Form在 “Advanced Settings” 中添加自定义表单数据Field:api_key,Value: 粘贴你复制的 ThingSpeak Write API Key。Field:field1,Value:{{{PARTICLE_EVENT_VALUE}}}。这是一个 Particle 的模板变量它会被自动替换为事件的数据即我们的温度字符串。保存 Webhook。现在你的 Photon 2 每次发布temp_reading事件Particle 云就会自动将其转发到 ThingSpeak并更新你频道的 Field 1。6.3 查看可视化结果回到 ThingSpeak 的频道页面点击 “Private View” 或 “Public View”。你会看到一个图表正在实时绘制你设备上传的温度数据。你可以调整图表的时间范围、添加数值显示等。这个流程的威力在于你几乎不需要写后端代码就建立了一个从传感器到云端存储再到可视化展示的完整物联网管道。你可以用同样的思路将数据转发到 Google Sheets 做记录或者通过 IFTTT 在温度超过阈值时给你发邮件。经验技巧Webhook 的{{{PARTICLE_EVENT_VALUE}}}变量非常有用。如果你的数据是 JSON 字符串比如{temp: 25.5, hum: 60}你还可以使用{{{temp}}}和{{{hum}}}来分别提取 JSON 对象内的字段并映射到 ThingSpeak 不同的 field 中。这为传输多个传感器数据提供了极大的灵活性。7. 项目优化与进阶思路基础功能跑通后我们可以从多个角度优化这个项目让它更健壮、更省电、功能更强大。7.1 增加温度阈值告警单纯的监控不够我们还需要在异常时得到通知。可以在设备端或云端实现告警。设备端实现简单但有限在loop()中判断温度如果超过阈值让板载 LED 闪烁红色或者发布一个单独的告警事件。float warningThreshold 30.0; if (tempC warningThreshold) { RGB.control(true); RGB.color(255, 0, 0); // 红色 Particle.publish(temp_alert, 温度过高当前值 eventData); delay(500); RGB.control(false); delay(500); // 可以持续闪烁直到温度下降 }云端实现更推荐利用 Particle 云的 Webhook 或第三方服务如 IFTTT实现更复杂的通知。例如配置一个 Webhook当收到temp_reading事件且数值大于30时触发 IFTTT 向你的手机发送推送通知。这种方式逻辑在云端不占用设备资源且规则修改更灵活。7.2 实现深度睡眠以节省电量如果你的设备是电池供电让 Photon 2 一直全速运行会很快耗光电量。一个常见的优化是让设备在大部分时间处于深度睡眠Deep Sleep状态定期醒来读数、上传然后继续睡。修改代码框架// 定义睡眠间隔秒 const int SLEEP_SECONDS 300; // 5分钟 void setup() { // ... 初始化代码串口、传感器... // 注意深度睡眠后唤醒setup()会再次运行 } void loop() { // 1. 执行测量和发布任务 readAndPublishTemperature(); // 2. 通知系统即将进入深度睡眠可选用于日志 Log.info(进入深度睡眠 %d 秒, SLEEP_SECONDS); delay(100); // 给日志发送一点时间 // 3. 进入深度睡眠 System.sleep(D2, RISING, SLEEP_SECONDS); // 也可以使用无唤醒源的睡眠 System.sleep(SLEEP_SECONDS); // 睡眠结束后设备会重启从 setup() 开始执行 } void readAndPublishTemperature() { // 将之前的读数发布逻辑移到这里 sensor.requestTemperatures(); delay(750); float tempC sensor.getTempCByIndex(0); if(tempC ! -127.0) { Particle.publish(temp_reading, String(tempC), PRIVATE); } }使用System.sleep()后设备功耗会从几十毫安降至几十微安非常适合电池长期供电。注意深度睡眠唤醒后相当于硬件复位程序从setup()重新开始。所有网络连接需要重新建立这可能会增加几秒的延迟和功耗。你需要根据对数据实时性和电池寿命的要求来权衡睡眠间隔。7.3 连接多个传感器与数据聚合单总线的好处是可以挂多个 DS18B20。首先你需要获取每个传感器的唯一64位地址。可以在setup()中遍历并打印void setup() { // ... 其他初始化 ... byte addr[8]; for(int i 0; oneWire.search(addr); i) { Log.info(传感器 %d 地址: %02X%02X%02X%02X%02X%02X%02X%02X, i, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]); } oneWire.reset_search(); }拿到地址后你可以用sensor.getTempC((uint8_t*)addr)来读取指定传感器的温度。在发布数据时可以将多个读数打包成一个 JSON 字符串这样一次事件发布就能上传所有数据更高效。// 假设有两个传感器地址已存入 addr1 和 addr2 数组 float temp1 sensor.getTempC(addr1); float temp2 sensor.getTempC(addr2); String jsonData String::format({\temp1\:%.2f,\temp2\:%.2f}, temp1, temp2); Particle.publish(multi_temp, jsonData, PRIVATE);在云端 Webhook 中就可以用{{{temp1}}}和{{{temp2}}}来解析这个 JSON并分别发送到不同的数据接收端。从连接一个简单的温度传感器开始我们一步步实现了数据读取、云端上传、可视化展示甚至探讨了低功耗和多传感器扩展。Particle Photon 2 的价值就在于它用一套高度集成的工具链把这些物联网开发中繁琐的环节变得异常简单让你能快速将想法变为现实。我建议你在完成这个基础项目后试着加入一个湿度传感器或者用继电器做一个简单的温度控制开关把学到的知识串联起来做出更有趣的东西。