Arduino-物联网云开发-全-
Arduino 物联网云开发(全)
原文:
zh.annas-archive.org/md5/f5337e3359094ebdd2f1eb17cb0356ba译者:飞龙
前言
欢迎来到 Arduino IoT Cloud for Developers。在一个日益通过 物联网(IoT)相互连接的世界中,本书作为您掌握使用多才多艺的 Arduino 平台进行物联网开发的全面指南。无论您是物联网的新手还是希望扩展技能的资深开发者,本书都提供了一种动手、分步的方法,以 Arduino IoT Cloud 构建有意义的物联网项目。
物联网(IoT)彻底改变了我们与世界互动的方式。从家用电器到工业机械,日常物品现在都能够连接到互联网并交换数据。这种变革为创新和效率提供了无限的机会。
以其简单性和灵活性著称的 Arduino 已成为物联网爱好者和专业人士的首选平台。Arduino IoT Cloud,Arduino 生态系统的重要组成部分,提供了一个强大且用户友好的平台来构建和管理物联网项目。本书是您开启 Arduino IoT Cloud 全部潜能的门户。
通过理论与实践的结合,您将开始一段旅程,从物联网基础开始,最终达到高级物联网应用。我们将探索 Arduino IoT Cloud 的核心功能,深入研究各种通信技术,并创建实际的物联网解决方案。
本书旨在让所有人都能轻松阅读,无论是刚开始接触物联网还是希望深化知识。每一章都提供了清晰的解释、代码片段和动手项目,以巩固您的学习。
在这段旅程结束时,您不仅将牢固掌握物联网概念,还将具备使用 Arduino IoT Cloud 设计和定制物联网解决方案的能力。让我们共同踏上这个激动人心的物联网开发之旅。
本书面向对象
Arduino IoT Cloud for Developers 面向多样化的受众,包括使用 Arduino 进入物联网的物联网和 Arduino 爱好者,以及那些希望深入了解物联网应用的具有先前 Arduino 经验的开发者。对于追求电子学、计算机科学或工程学位的学生和学者,本书也很有价值,他们寻求实际的物联网知识和项目灵感。此外,热衷于为个人实验制作实际物联网项目的创客、业余爱好者和 DIY 爱好者会发现这本书很有益。对于物联网专家、工程师和开发者等专业人士,本书提供了一条途径,以创建高质量、商业级解决方案。
本书适合初学者和有经验的读者,提供从物联网基础到使用 Arduino IoT Cloud 进行高级物联网开发的逐步学习路径。无论您的背景如何,本书都为您提供了设计和实施创新物联网解决方案的技能。
本书涵盖内容
第一章, 物联网和 Arduino 简介,涵盖了物联网架构、安全和 Arduino。
第二章, 初探 Arduino IoT 云平台,通过 MKR Wi-Fi 1010 和 Node-RED 的实际演示,探讨了如何将旧设备(较老/不兼容的设备)连接到 Arduino IoT 云平台。
第三章, Arduino IoT 云平台和云编辑器的见解,提供了 Arduino IoT 云平台功能的概述,包括事物、设备和仪表板小部件,最后,我们将更深入地探讨云编辑器。
第四章, 项目 #1 – 为环境感知设置更智能的方案,提供了一个项目,将实际演示如何使用 WeMos D1 Mini、DHT22 和 MQ-135 部署智能感应节点,并将环境数据发送到 Arduino IoT 云平台,并通过令人惊叹的小部件进行可视化。
第五章, 项目 #2 – 使用 MKR GSM 1400 创建便携式物品追踪器,考察了资产追踪,并演示了如何使用 MKR GSM 1400 和 GPS 模块追踪资产,并通过 Arduino IoT 云平台中的地图小部件可视化数据。
第六章, 项目 #3 – 使用 LoRaWAN 的远程资产追踪应用,探讨了使用 LoRaWAN 技术的远程通信。我们将设置 LoRaWAN 节点,包括 LoRaWAN 网关,使用 MKR WAN 1300 和 GPS 模块追踪资产。
第七章, 实现不同设备之间的通信,提供了一个实际演示,说明如何设置跨多个事物的云变量同步,通过简单的图形用户界面实现设备之间的通信,无需任何编码。
第八章, 使用 Arduino IoT Cloud SDK 和 JavaScript 进行操作,探讨了开发者如何使用 JavaScript SDK 与 Arduino IoT 云平台交互,该 SDK 包括 API 密钥设置,并使用 JavaScript 对事物、设备、云变量和仪表板进行操作。
第九章, 项目 #4 – 通过土壤和环境收集数据以实现智能农业,专注于智能农业。我们将探讨如何感知土壤湿度、土壤温度等,使我们的农业更智能、更稳健。
第十章, 项目 #5 – 通过语音助手使您的家更智能,深入探讨了智能家居。我们将使用 WS2812 RGB 环和 XIAO ESP32C3 创建一个智能灯,并将其连接到 Arduino IoT 云平台,同时将 Arduino IoT 云平台与 Amazon Alexa 集成,以获得语音助手体验。
第十一章,实现 Arduino IoT Cloud 调度器和空中更新功能,提供了一个如何在 Arduino IoT Cloud 中使用云调度器来自动化依赖时间的操作的实用演示。在第二部分中,我们将探讨空中更新(OTA)功能,这些功能帮助我们通过空中发送更新,而不需要任何物理连接到设备。
第十二章,项目#6 – 跟踪和通知心率,提供了一个智能健康项目的实际演示,我们将使用 XIAO ESP32C3 和心率监测传感器来构建一个可穿戴产品,该产品将数据发送到 Arduino IoT Cloud。然后,我们将使用 Webhooks 将我们的每分钟心跳次数(BPM)发送到 Zapier 进行通知警报。
第十三章,使用 Cloud CLI 编写 Arduino IoT Cloud 脚本,教您如何使用命令行工具在 Arduino IoT Cloud 上执行操作,包括对设备、事物和仪表板的操作,以及 OTA。这一章将帮助您学习命令,并为您创建自己的批处理脚本以实现自动化操作做好准备。
第十四章,在 Arduino IoT Cloud 中前进,提供了有关不同 Arduino IoT Cloud 定价计划的详细信息,包括每个计划的特性。它还探讨了 Arduino PRO 硬件和软件在工业物联网中的应用,并提供了进一步探索的完整资源列表。
为了充分利用这本书
在开始这本书之前,您应该拥有以下软件和开发板,包括完整的传感器列表,以充分利用这本书:
| 书中涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Arduino IDE 桌面版 | Windows、macOS 或 Linux |
| Fritzing 原理图设计软件 | Windows、macOS 或 Linux |
| 一个 Arduino IoT Cloud 账户或一个 Zapier 账户 | N/A |
| Amazon Alexa 语音助手 | N/A |
开发板:
-
MKR Wi-Fi 1010
-
MKR GSM 1400
-
MKR WAN 1300
-
WeMos D1 Mini ESP8266
-
XIAO ESP32C3
-
ESP32 Dev Kit V1
-
Things Indoor Gateway for LoRaWAN
传感器:
-
DHT22/DHT11
-
MQT-135
-
The NEO 6-M u-blox GPS module
-
电容式土壤湿度传感器
-
DS18B20 防水探头,带长线
-
WS2812 RGB 环形灯
-
脉搏传感器
如果您使用的是这本书的数字版,我们建议您自己输入代码或从书的 GitHub 仓库(下一节中有一个链接)获取代码。这样做将帮助您避免与代码复制和粘贴相关的任何潜在错误。
下载示例代码文件
您可以从 GitHub 下载本书的示例代码文件:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers。如果代码有更新,它将在 GitHub 仓库中更新。
我们还有其他来自我们丰富图书和视频目录的代码包,可在github.com/PacktPublishing/找到。查看它们!
使用的约定
本书使用了多种文本约定。
文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。以下是一个示例:“这个云变量声明在thingProperties.h文件中可用。”
代码块应如下设置:
TinyGPSPlus gps;
unsigned long previousMillis = 0;
const long interval = 30000; //milliseconds
任何命令行输入或输出都应如下编写:
npm install @arduino/arduino-iot-client
npm i request-promise
粗体:表示新术语、重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词以粗体显示。以下是一个示例:“设置配置后,点击获取新访问****令牌按钮。”
小贴士或重要注意事项
看起来是这样的。
联系我们
我们读者提供的反馈总是受欢迎的。
一般反馈:如果您对本书的任何方面有疑问,请通过 customercare@packtpub.com 给我们发邮件,并在邮件主题中提及书名。
勘误:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将非常感激您向我们报告。请访问www.packtpub.com/support/errata并填写表格。
盗版:如果您在互联网上以任何形式遇到我们作品的非法副本,我们将非常感激您提供位置地址或网站名称。请通过 copyright@packtpub.com 与我们联系,并提供材料的链接。
如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为本书做出贡献,请访问authors.packtpub.com。
分享您的想法
读完《Arduino IoT Cloud for Developers》后,我们非常乐意听到您的想法!请点击此处直接进入本书的亚马逊评论页面并分享您的反馈。
您的评论对我们和科技社区非常重要,并将帮助我们确保我们提供高质量的内容。
下载本书的免费 PDF 副本
感谢您购买本书!
您喜欢在路上阅读,但又无法携带您的印刷书籍到处走吗?
您选择的电子书购买是否与设备不兼容?
别担心,现在,随着每本 Packt 书籍,您都可以免费获得该书的 DRM 免费 PDF 版本。
在任何地方、任何设备上阅读。直接从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。
优惠远不止于此,您还可以获得独家折扣、新闻通讯以及每天收件箱中的优质免费内容。
按照以下简单步骤获取福利:
- 扫描二维码或访问以下链接

packt.link/free-ebook/9781837637171
-
提交您的购买证明
-
就这些!我们将直接将您的免费 PDF 和其他福利发送到您的电子邮件。
第一部分:物联网和通信技术及 Arduino IoT Cloud 简介
第一部分介绍了物联网(IoT)的原则,概述了 Arduino IoT Cloud 平台,并展示了如何首次使用它。然后提供了其功能的详细描述。
本部分包含以下章节:
-
第一章,物联网和 Arduino 简介
-
第二章,初探 Arduino IoT Cloud
-
第三章,深入了解 Arduino IoT Cloud 平台和云编辑器
第一章:物联网和 Arduino 简介
将任何设备或机械连接到世界上最先进的通信网络——互联网,为人类进步开辟了无限可能。
实现一个互联互通的世界涉及许多不同的技术和技术方面、法规,甚至伦理原则。
在本章中,你将了解端到端物联网(IoT)应用的整个架构,包括其不同软件层以及其各个组件之间所需的通信渠道。我们还将分析物联网与其工业版本——工业物联网(IIoT)之间的相似之处和不同之处,并探讨工业 4.0概念以及工业数字化转型意味着什么。
这条信息对于理解物联网、工业物联网(IIoT)和 I4,以及评估其对我们日常生活的影响是基本性的。
最后,我们将介绍 Arduino 采用的开放源代码许可模型背后的原则和好处,以及一些保护项目源代码中知识产权的方法。
到本章结束时,你将能够指定一个商业物联网应用的技术要求,该应用实现了由物联网启用的新的数字商业模式模式,并基于Arduino IoT Cloud平台构建,考虑到 Arduino 商标。
在本章中,我们将涵盖以下主要主题:
-
物联网是什么?
-
用户的好处
-
不同的商业模式得以实现
-
端到端物联网应用的架构
-
通信技术和协议
-
安全方面和设备配置
-
开源
物联网是什么?
物联网没有单一的官方定义,但以下句子涵盖了这一概念的全部内容:
物联网,简称 IoT,是将物理对象连接到网络,并将其他设备连接到网络,以便它们能够相互交互并与人类交互,通过互联网共享信息和采取行动的概念。
这些物理对象是使用不同的电信技术连接到网络的电子设备。选择互联网作为网络并不令人惊讶,这不仅是因为这种技术的名称,还因为互联网本身的特性:
-
数字网络
-
全球覆盖
-
标准化规范
-
广泛用于个人和职业通讯
物联网设备通常被称为物联网节点,因为它们是这个网络的一部分。
它们配备了传感器来检测或测量物理属性,例如环境的温度或车辆的行驶速度。在其他情况下,它们连接到外部机械、设备或家用电器,始终具有相同的目的:收集物理属性的值,通常称为遥测元素,并将它们传输到互联网。一旦这些值到达互联网,它们几乎可以在世界上的任何地方在几百分之一秒内到达。
您可以考虑将物联网节点连接到工业机器,以远程传输其运行状态的信息,并在出现故障时通知维护操作员。或者,将节点连接到您的咖啡机,以测量咖啡粉的水平,并有可能在您在超市时远程检查它,这样您只有在需要时才购买另一包。
实际上,物联网开辟了几乎无限的应用可能性,因为将设备连接到互联网意味着可以远程监控环境和向节点发送命令。
事实上,物联网中使用的电信技术是双向的,信息可以从物联网节点流向互联网,反之亦然。物联网节点之间的交互主要与通过互联网作为通信媒体交换数字信息有关。
边缘智能与云智能
重要的是要强调,物联网节点也具有不同程度的处理能力;它们可以被编程以从互联网接收信息并相应地执行一些逻辑。
另一个例子可能有助于说明。您可以将物联网节点 #1连接到气象站,收集关于预报的信息,并将其传输到连接到您自动灌溉单元的物联网节点 #2。您可能编程节点 #2以防止在接下来的几小时内下雨时浪费水。另一个节点,节点 #3,可以嵌入传感器,并通过互联网与节点 #2共享土壤湿度值,以便在预报良好且土壤需要水分时,必要时激活灌溉。
这可能对我的小花园来说并不相关,但您可能考虑在广阔的田野中的好处,因为不同的区域可能根据作物的需求进行灌溉。
当控制逻辑直接在节点上编程时,我们说它在边缘,指的是物理世界和数字世界之间的边缘。
逻辑也可以在云端进行编程。在这种情况下,有一个运行在连接到互联网的计算机上的应用程序。实际上,云端使大量连接在一起并连接到互联网的计算机获得力量,目的是共享计算和存储能力,以及在多个系统之间平衡计算负载。采用云端方法时,云上的应用程序从一个或多个物联网节点接收遥测元素,汇总信息,并定义发送回相同或其他物联网节点的命令。
我提到命令,因为物联网节点还可以与执行器接口,例如电机、泵、电磁阀、电气继电器以及任何其他负责移动和控制机械的设备。这意味着物联网节点可以通过执行物理、编程动作作为对某些措施的响应来与物理世界交互。
以灌溉为例,物联网节点通过电气连接到液压伺服阀,并驱动它来控制水流到喷嘴。
即使应用的智能位于云端,物联网节点也总是在一定程度上实现嵌入式控制逻辑。这是为了接收、解释和响应来自云端应用服务器的命令。
边缘 和 云端 之间的区别主要与应用的真正智能相关,例如基于预测和土壤湿度来理解何时需要灌溉的能力。
因此,边缘的智能完全通过在节点上用结构化语言(如 C++或 MicroPython)编写软件代码或采用基于神经网络的智能模型来实现。采用云端方法时,由运行在云服务器上的应用程序软件负责决定自动触发阀门。
在边缘和云端实现之间的选择主要是由应用和所需响应时间驱动的。云端的实现允许在可编程功能方面有更多的自由度。这是因为云由多个协同工作的服务器组成,它几乎没有内存和计算能力的限制。另一方面,边缘的部署消除了与通信网络延迟相关的某些瓶颈,减少了物联网节点的响应时间,并允许它实时与物理世界交互。
值得注意的是,在边缘的部署并不排除在自动控制之外还实施手动远程控制节点的好处。例如,操作员可以通过网页上可视化的图形用户界面(称为仪表板)与现场设备进行交互。他们会看到环境条件的实际值,并可以按自己的意愿触发阀门。
应用程序的程序员负责定义和配置仪表板,仪表板可以像所需的那样复杂,带有用于可视化并插入数据(如图表和文本框)的小部件,以及触发开关、滑块、按钮等命令。
市场上出现了越来越多的边缘应用,适用于各种用例,在这些用例中,微控制器设备可以作为物联网节点的控制单元成功采用。这一趋势导致了硬件组件的持续、快速改进,计算能力增强,成本随之降低,以及无线电信技术的广泛应用,这些技术以非常低的功耗和长距离传输范围为特点。
当我们考虑在偏远且不易到达的地区安装物联网节点时,能源自给自足是一个非常重要的方面:我们希望尽可能减少对电池充电的需求,以降低人工干预的成本。理想情况下,一个好的物联网应用应该是完全自足的!
当你采用低功耗广域网(LPWAN)技术之一时,你需要考虑的是,降低功耗是以减少单条消息可以传输的数据量以及消息之间的更高间隔为代价的。这就像将数据视为一种能量形式,并应用能量守恒定律:如果你降低功率,你减少的不仅是传输范围,还有数据量。
每条消息的数据量减少以及两次传输之间的间隔变长意味着你需要减少与云交换的信息,这样云就需要更少的时间来收集所有值以进行处理。
当这个持续时间,我们可能称之为云延迟时间,过长时,那么在边缘实现智能就值得考虑了。
Arduino 生态系统
不可能以相同的方式将单个设备连接到每种传感器、执行器、外部机械和设备,因为每个元素都实现了不同的电气接口和通信方式。
制造商生产物联网节点或适合构建物联网节点的组件,专注于定义的使用案例和技术,并采用市场上可用的各种标准。每个开发物联网项目的人都有责任选择最适合其应用的节点。当市场上没有现成的具有所需功能的产品时,你可以使用电子模块按需构建你的物联网节点。这就是 Arduino 派上用场的时候。
由于您正在阅读这本书,我们假设您已经了解 Arduino 是什么。无论如何,我认为值得提一下的是,Arduino 不仅仅是一种技术,而是一个由同名商业业务维护的生态系统。这个模块化生态系统由基于电子微控制器的开发板、固件、软件库以及用于编程板和本书中描述的云平台的工具组成。
Arduino 团队工程师对每个组件都进行了特别关注,以确保其可用性和用户体验,这符合公司的使命,即“通过使复杂技术开放和易于使用,让每个人都能创新。”(M. Banzi,Arduino 联合创始人)。
Arduino Cloud 也遵循同样的方法,您将看到如何轻松地使用 Arduino Cloud 开发物联网云应用,无需编程,只需配置即可。Arduino Cloud 的易用性与本地的边缘模型有关:Arduino 遵循在节点上实现智能的技术趋势,将数据存储和可视化任务留给云。
当您将 Arduino Cloud 与第三方服务接口时,其中应用程序逻辑和智能在第三方服务中实现,您仍然可以使用 Arduino Cloud 在云上部署物联网解决方案。
除了官方的 Arduino 兼容开发板外,您还可以使用 ESP32 & ESP8266 系列等流行的开发板,通过 Arduino IoT Cloud 来使用。这一特性帮助开发者使用现有的硬件解决方案将产品迁移到 Arduino IoT Cloud,而无需更改现有的硬件技术。
Arduino 生态系统中的另一个重要方面与使技术开放相关。Arduino 生产的大部分硬件和软件都公开发布在开源许可下,到本章结束时,您将了解与开源许可相关的利益和义务,以及如何保护您的知识产权。Arduino 还为工业应用提供专业硬件设备,例如Portenta系列,该系列专为物联网和人工智能解决方案设计。Arduino Opta 可编程逻辑控制器(PLCs)是 PRO 系列中的新产品线,专为工业部署设计。有关 PRO 系列的更多详细信息,请访问store-usa.arduino.cc/collections/pro-family。
物联网、大数据、人工智能和机器学习
我们已经看到,物联网应用涉及物理世界和数字世界之间的连接,以创建某种形式的物理过程数字化自动化。结果是以下内容的综合:
-
将设备连接到互联网
-
允许设备共享信息以交互和协作
-
实现能够采取智能行动的智能应用
当我们谈论数字化时,其他热门词汇经常与物联网一起使用:大数据、人工智能和机器学习。这些是互补的科学,可以用来实现复杂的数字项目。我们将描述它们是什么以及它们如何与物联网结合使用。
大数据指的是极其庞大且复杂的数据集以及研究如何处理这些数据科学的领域。由于数据集的大小以及它们的非结构化和非聚合性质,传统的数据处理软件无法在合理的时间内处理大数据,因此需要专门的技术来提取有价值的信息和知识,这些信息用于支持决策和战略规划。
当我们考虑数百或数千个物联网节点实时共享来自物理世界的不同值时,你可能理解到数据的大小和种类需要比传统的数据库更多。
大数据涉及在云上实现逻辑。即使在物理世界中使用边缘模型以实现快速响应时间,数据也可以发送到云中进行无时间限制的长期处理。在这里,大数据可以提供支持。
例如,以我们智能灌溉的例子为例,一个节点可以使用土壤湿度传感器的值来控制边缘的水压阀,并与使用来自多个节点的数据来调整考虑天气预测模型的云应用共享信息,同时还包括来自国家气象站的其他信息。
你可以将大数据视为云应用处理原始数据以提取和存储有价值信息的应用。
人工智能和机器学习通常被称作是同一科学,但实际上它们不是。人工智能(AI)是一个广泛的领域,包括许多不同的子学科,其中机器学习(ML)是其中之一。
人工智能是一个更广泛的概念,指的是机器能够以通常需要人类智能的方式进行任务,例如视觉感知、语音识别、决策、语言翻译等。
机器学习是人工智能的一个特定子领域,专注于使计算机能够从数据中学习并做出预测或决策,而不需要明确编程来实现这一点。通常,机器学习涉及在数据集上训练一个模型,并使用训练好的模型对新数据进行预测或决策。
总结来说,人工智能是机器模仿人类智能的更广泛概念,而机器学习是实现人工智能的特定方法/技术,它允许机器从数据中学习,而不是被明确编程。
人工智能和机器学习模型可以通过使用大数据工具收集的数据进行训练,并用于解释来自同一或另一个大数据平台的新数据。
一旦训练完成,模型可以根据其大小和节点的技术特性部署在云上和边缘上。
当大数据工具直接使用分析模型处理数据时,AI/ML 则专注于数据中的模式,以识别情况和趋势。
例如,您可以使用大数据提取广泛区域土壤湿度的趋势,该区域每小时有数千个传感器收集值,大数据可以帮助您在数年的时间里区分日、月和季节性的变化。
机器学习(ML)的工作方式不同;它摄入不同类型的数据值,例如天气预报参数,并识别影响您观察到的模式。您可以通过训练一个神经网络,使用温度、大气压力、湿度、风速和土壤湿度值在一段时间内创建一个 ML 模型。然后您提供另一组来自不同时期的数据,没有土壤湿度值,该模型能够提出关于灌溉需求的指示。
参考以下图表,您可以看到一个复杂应用的完整数据流,其中物联网感知物理世界,在需要时立即在边缘做出反应,并将值转发到大数据进行离线或批量处理(非实时):

图 1.1 – 与其他技术的数据集成
大数据存储和汇总用于训练和运行 AI/ML 模型的值。这些模型做出决策,并将命令发送回与物理世界交互的物联网节点。
物联网(IoT)、工业物联网(IIoT)和工业 4.0
物联网概念已被广泛应用于我们生活的各个方面,一些应用已经成为我们日常生活的常规部分。
例如,您可能只需花费几十美元在线购买一个智能门铃。该设备集成了麦克风和扬声器,并连接到您的 Wi-Fi。当有人按门铃时,这个物联网节点会通过您的手机远程提醒您,并允许您与门前的访客进行对话,即使您在家外数英里处。某些型号甚至可以解锁门。
您是否曾经通过要求 Alexa®、Google Assistant™或 Apple 的 Siri 打开家中的灯光?所有这些物联网节点都是智能建筑和家居垂直领域应用的例子。
高级解决方案根据环境情况(通过存在检测、温度和阳光传感器测量)来管理空调、窗户和窗帘。
我们已经在农业市场介绍了一个应用,其他相关应用包括通过 GPS 技术定位活体动物及其状况,并测量其生命体征参数。例如,快速心率可能是由于过热或捕食者存在而导致的压力症状。
我们都喜欢收到关于我们最近一次在线购买的频繁更新的跟踪信息。对于货运公司来说,在线跟踪交付也有助于减少投诉和相关的运营成本。所有这一切都得益于使用连接到互联网的手持设备和附着在贵重商品上的小型物联网节点,它们能够无线地将它们的位置发送到云端应用程序。物流无疑是物联网成功应用的领域之一,但医疗保健、零售、智能基础设施、安全和监控市场也提供了许多物联网应用的例子。
在工业环境中部署物联网应用通常被称为 IIoT。
工业物联网(IIoT)应用主要关注从物理世界收集数据,以更好地理解如何改进工业流程,更好地利用工厂,并优化能源、水、人力和其他参与活动的资源消耗。
主要目标是提高所有部门的性能并降低成本。
重要提示
这里不是讨论劳动力影响的地方,但我想说的是,IIoT 并不直接意味着操作员的减少,但他们的培训和技能增长可以在采用良好的公平就业政策时从成本节约的角度进行管理。
在工业环境中采用物联网原则需要特别注意节点的实施和部署,因为环境在温度、振动和电磁污染方面可能更为恶劣。
某些工业环境中由于温度较高而引起的过热会导致节点电子组件的故障,并缩短其使用寿命。
振动疲劳是电子设备故障的另一个主要原因。当节点安装在接触机器时,振动会传递到电子板上,并给组件施加应力,导致早期故障。
工业环境非常密集,机器中有工业电机,有电力电缆,有操作员的蜂窝设备,以及其他电磁场来源。
前述方面仅影响 IIoT 节点,而物联网在工业环境中的应用对云方面有其他影响:
-
可扩展性:工业物联网的云基础设施通常需要能够轻松处理和存储来自大量物联网设备的大量数据
-
数据安全:工业市场需要改进云安全措施,以保护云应用程序和 IIoT 设备免受网络威胁
-
数据本地化:工业市场的一个常见要求是所有数据都保持机密并限制在本国境内
几个原因可以证明请求云数据留在本地国家的合理性。当你考虑到将数据保留在某个国家可以确保其受到当地法律管辖和保护时,数据隐私和安全问题就显而易见了。
此外,一些国家在存储和处理敏感数据方面有严格的规定,将数据保留在本国有助于组织遵守这些规定。
最后但同样重要的是,与性能和成本效益相关的考虑:访问存储在远程位置的数据和应用可能会导致性能降低和更高的延迟。同样,跨国界传输数据可能既昂贵又复杂,因此在国家内部存储数据更具成本效益。
工业 4.0,也被称为第四次工业革命,是一个比 IIoT 更广泛的概念,它特指在智能工厂中应用 IIoT 技术以生产消费品。
以这种方式,生产过程得到实时控制和监控,数字化赋予机器和设备做出决策的能力,从而释放人力资源从事更高层次的任务。这是一个去中心化的决策方法,生产由机器和设备收集和分析的数据驱动,以加快生产过程的持续改进。
灵活的制造流程允许以单个客户在在线购物时定义的特征进行批量生产定制产品。
工业 4.0 意味着将一个完全自动化的工厂连接到互联网,以提升客户体验并优化整体业务性能。
客户可以前往他们偏好的在线商店购买一双运动鞋,选择型号,选择材料,配置不同部件的颜色,并下订单。通过信用卡支付后,订单以数字形式到达工厂,那里的机器和设备会实时配置,从仓库获取材料,生产定制的鞋子,包括在鞋子和盒子上打印你的名字,然后将盒子返回仓库,准备发货。
整个过程中没有打印出任何一张纸。设施管理人员可以在线咨询有关工厂性能的指标,而客户则在家中收到他们定制的鞋子。
这不是梦想,制造商耐克®(Nike®)已经在全球范围内实现了这一点。
工业 4.0 需要比 IIoT 云更广泛的软件架构。
你可能会认为 IIoT 云已经与 IIoT 应用中生产工厂的机器和设备接口。工业 4.0 还连接了企业不同部门的数字系统,包括以下内容:
-
企业资源规划(ERP):自动化和管理核心业务流程以实现最佳性能
-
计算机化维护管理系统(CMMS):管理资产、安排维护和跟踪工作订单
-
仓储管理系统(WMSs):支持库存和管理供应链履行操作
在这里,我们详细讨论了物联网(IoT),以及云与边缘处理和人工智能的实施。我们涵盖了一些关于 Arduino 生态系统的细节,包括他们的 PRO 产品线。稍后,我们讨论了物联网、大数据、人工智能和机器学习,包括工业物联网(IIoT),因为它们都是高级项目中非常重要的支柱。在下一节中,我们将讨论在日常生活和工业中实施物联网对用户有哪些好处。
用户的好处
基于这些智能技术的应用为最终用户提供了巨大好处,例如自动化任务和使事物能够远程控制和监控。
物联网和工业物联网通过让物联网应用程序优化资源使用并允许我们降低成本来提高我们的效率。它们还增强了我们的安全和安保,因为物联网设备可以提供实时监控和警报。
物联网节点收集和分析数据可以用于个性化我们的体验,物联网解决方案提供的增强连接性创造了新的沟通和协作可能性。
最后,物联网和工业物联网通过下一节将要展示的新颖和现代商业模式,使企业能够实现新的发展。
你可能会问为什么这一切现在才发生,以及它是否没有代价。
物联网的历史可以追溯到 20 世纪 80 年代,当时英国技术先驱凯文·阿什顿(Kevin Ashton)在关于互联设备潜力的演示中首次使用了这个术语。
在 2000 年代初,无线网络标准如蓝牙和 Wi-Fi 的发展使得将设备连接到互联网变得更加容易,而蜂窝连接也成为了消费市场。
十年后,像微软、谷歌和亚马逊这样的主要科技公司开始投资物联网云平台。
今天,经过 40 年,软件技术的进步使得大数据、数据分析工具和云平台对大多数人来说变得可访问和负担得起。互联网是主要的通信媒介,电子设备的成本降低,以及 Arduino 等生态系统,使得技术易于使用。
物联网间接地为各个规模的企业带来成本,因为它们需要抓住时机,采用这些技术,并跟上进步以在市场上保持竞争力。
物联网的社会影响与引入不同的行为以及人类失去一些手动和实用能力风险相关。例如,在手机上可使用导航应用程序之前,人们开车旅行时有一定的方向感;如今,这种技能几乎消失了。
工业物联网引入了误导管理者认为这些技术通过减少劳动力来支持成本节约的风险,因为一切都被自动化了。实际上,人员需要培训来维护、故障排除和改进新系统,而且重要的是商业管理者要理解这一点。
最后,参与物联网项目的每个人都必须考虑应用并妥善管理社会影响。这意味着这也是读者的责任。
不同商业模式的实现
宾夕法尼亚大学安南伯格传播学院的罗伯特·刘易斯·谢扬通信学教授约瑟夫·图罗说:“尽管存在黑客攻击和隐私问题,但人们仍会感到需要保持联系,部分原因是公司会为此奖励他们(或者如果他们不这样做,会使生活变得困难)。”
事物与人们之间这种改进的连通性对数字商业模式模式的演变有直接的影响。
下图来自博世物联网实验室的白色纸张《商业模式与物联网》,展示了网络技术的演变以及在各个阶段启用了哪些商业模式:

图 1.2 – 网络技术演变
我们现在完全处于 Web 3.0 阶段,物联网在创造和获取商业价值方面需要心态上的巨大转变。哈佛大学商学院注意到了这种变化,并强调了这一系列影响。
首先,客户要求他们的需求得到实时解决。物联网甚至允许企业以预测的方式解决突发需求。
物联网提供的可能性改变了产品在其生命周期中的管理流程。产品的过时性减少,并且发生的时间更长,因为产品的新版本是通过考虑从产品本身自动收集的关于使用情况的聚合信息来评估的,并进行分析以确定有效需求。此外,提出的使用体验明确基于产品与其他产品的协作,最终由第三方制造。
这改变了产品的价值,使得客户在产品的个性化和其功能方面感知到的利益,比在商品优势(如低成本、高质量和即时可用性)方面感知到的利益更多。或者,在专业和工业产品的案例中,品牌和知识产权的所有权。
对物联网产品协作能力的欣赏也表明,制造商应该投资资源来了解其他生态系统如何运作和盈利,目的是开发一定程度的兼容性,而不仅仅是努力利用内部核心能力和现有资源及流程。
一旦确定了新版本的特性并实施,制造商通常可以同时更新许多产品,并且通过远程空中进行更新。这是可以作为产品内在价值或为订阅者提供的付费服务提供的一项吸引人的服务。
提供额外服务的可能性增加,将业务战略中的盈利途径转向。新的方法是在即时收入和持续收入之间寻找最佳平衡。与传统的核心业务相关的即时收入通常需要大量努力和大量投资来扩大销售产品的数量。另一方面,基于物联网能力建立和维护良好服务所需的行动,保证了在一段时间内持续的收入。
物联网推动的商业模式
当你从两个或三个主要制造商之一购买一部手机时,通常情况下,你并不支付设备的真实价值,而是产品的感知价值。许多人热衷于在代表地位象征的手机上花费更多,而不是在匿名型号上,即使它们具有相同的功能。地位象征被视为产品价值的一种利益。
以类似的方式,我们可以根据物联网解决方案提供的效益来计算其价格,而不是其成本。例如,我们可以考虑一个智能建筑项目以提高能源效率:物联网系统跟踪和分析能源使用情况,自动控制公共区域的照明,并允许建筑物的所有者确定需要改进的区域并降低其能源成本。
根据这个被称为基于结果的模型,解决方案提供商可能会提出一个系统,该系统占客户能源账单节省额的一定比例,加上安装和拆除成本。他们使用自己的物联网硬件维护财产,而不出售它,但在关闭合同时,他们为一定时间创造了一个持续收入的来源。在合同期满时,他们拆除并重复使用物联网产品进行另一项安装。这样,物联网硬件的成本是解决方案提供商的投资,考虑到之前提到的产品生命周期和这些设备的低磨损水平,它可以产生良好的回报。
为提供的好处付费并不隐含地意味着支付超过产品的价值,但它仍然对双方都方便。这就是按使用付费模式的情况。回到智能灌溉的例子,农民可以使用水公司提供的物联网应用来灌溉作物,费用基于使用的水量。目标不是从物联网设备本身赚钱,而是利用节点产生的数据来跟踪使用情况。
资产共享模式是一种按使用付费的商业模式,其特点是物联网节点监控的资产被多个客户共享。例如,在过去的几年里,许多企业在世界各地的许多城市购买了并出租了电动滑板车。用户在提供商的平台上注册,并使用他们的手机(连接到互联网)来启动和停止租赁,并相应地启用滑板车。这是一个物联网在智能城市垂直领域的很好应用例子:用户的手机和滑板车都连接到互联网,并通过互联网进行交互。在这种情况下,用户为在特定地区骑行的便利付费,比他们购买自己的滑板车要少,因为他们与当地社区共享物联网产品——滑板车。资产共享模式基于向市场销售额外容量的概念,并解决了人们在购买昂贵设备时普遍关心的问题:我能否充分利用它?
当我们谈论与服务销售相关的商业模式时,订阅模式是最为人所知的:用户不需要支付拥有解决方案的费用,而是定期支付一定金额来使用它。这种模式通常被提供智能家居设备(如智能恒温器、安全摄像头和智能锁)的公司采用。客户支付每月或年度费用以获取设备的访问权限,以及通过移动应用控制和监控设备的能力。
在采用趋势日益增长的一种物联网订阅商业模式是资产追踪。随着功耗和尺寸的降低,以及物联网节点尺寸和成本的降低,使得逐步采用本地化不同资产成为可能。在这种情况下,订阅者不需要为物联网节点付费,而是为定期访问定位数据和资产的移动付费。
物联网支持其他类型服务的提案;例如,一个预测性维护的物联网解决方案可以提供便捷的维护服务,这种合同对承包商和客户都有吸引力。承包商可以保持较低的费率,因为他们不需要定期安排到客户那里进行访问:系统会提前通知他们,以便在紧急之前计划干预。同时,他们可以扩大客户群,以证明安装解决方案的成本是合理的。
咨询公司可以安装物联网解决方案来测量生产工厂中机械的性能,而无需停止任何机器,因为所有数据都是由不需要与现有工厂接口的自主物联网节点收集的。数据用于衡量总体设备效率(OEE)并建议如何优化工厂的使用。在这种情况下,公司的核心业务不是销售物联网解决方案,而是从物联网应用收集的数据中衍生出的服务。
物联网中的剃须刀-刀片商业模式与传统模式相似,但增加了物联网技术的便利性和定制化。目标是让产品以成本或更低的价格进入客户手中,开始销售您的其他产品。这个名称来源于公司吉列®,它是发明者和第一个采用者:其主要收入来自刀片的销售,而剃须刀只是带来刀片销售的主要手段,因为每卖出一把剃须刀就会产生多把刀片的购买。以类似的方式,惠普®以非常低的价格销售喷墨打印机,目的是从墨盒的销售中获得收入。物联网可以监控客户的习惯并建议最佳的消耗品模型。它还可以增加重新订购的可能性,因为设备可以自动下单。
有一些情况下,企业免费提供物联网应用硬件,因为其目的是通过收集和转售用户数据来盈利。这与涉及驾驶习惯监控设备的情况有关。虽然这些设备为用户提供有价值的见解,但保险公司通过分析大量个人的驾驶模式获得了显著的好处。引入这种模式可以被视为你主要业务的扩展,你最初专注于满足最终用户的需求,随后探索从他们的数据中产生收入的机会。这两种方法可以和谐共存,只要你优先考虑向客户透明地说明数据使用情况,并采取必要措施保护他们的隐私。
在上一节中,我们讨论了由于智能产品而受益的创新和改进。物联网不仅改善了最终用户的生活方式,还帮助新的商业模式出现,并帮助行业向工业 4.0 转型,这有助于行业安全、快速且经济高效地运行生产线。
物联网端到端应用架构
现在我们对物联网有了更多的了解,我们看到了其原理和一些不同应用的例子,现在是时候深入探讨技术方面,通过分析物联网应用架构来进行分析了。
我们已经介绍了物联网节点、云平台和应用。一图胜千言,以下图表展示了物联网解决方案的整体架构:

图 1.3 – 物联网系统的高级架构
云平台和云应用之间存在一个重要的区别。云平台实现通信、用户和设备管理、数据存储和安全等基本服务;云应用实现应用程序的逻辑、仪表板以及应用程序的所有具体方面。
在这种意义上,Arduino IoT Cloud 可以被视为运行在 AWS 云平台上的云应用。
多亏了互联网提供的连接性,您只需利用第三方已经实施并通过互联网相互连接的多个云应用、框架和服务,就可以设置一个具有许多不同功能的复杂物联网解决方案。这意味着您不需要从头开始开发或配置一切,您可以节省时间和精力;这也解释了为什么多个云平台和云应用在前面的图中被可视化。
这些功能的例子可以是单点登录(SSO),一种用户身份验证服务,允许用户使用一组登录凭证(例如,用户名和密码)访问多个应用程序——例如社交媒体平台和其他大量应用程序。您只需决定您需要什么,在互联网上搜索首选提供商,然后轻松地将这些功能集成到您的应用程序中,而无需编程。这也适用于 Arduino Cloud 平台,该平台提供了几种与第三方应用程序接口的不同方式,正如我们将在第十二章中看到的那样。
网关是我们需要讨论的最后一种模块。网关支持节点和云平台之间的连接。或者更准确地说,它们是连接节点到互联网并允许节点和云应用之间交换数据的桥梁。存在许多不同类型的网关,它们的特点是它们实现的通信技术。
您的 Wi-Fi 路由器是网关的一个完美例子:它连接到互联网,并通过 Wi-Fi 接受来自其他设备的连接。它将 Wi-Fi 设备转换为您的互联网提供商的数据传输技术(有线、以太网或光纤电缆)。
网关还可以实现其他功能,例如数据过滤、协议转换和安全。每个物联网应用都包括网关在架构中,即使它们不是由您或解决方案的程序员直接管理。
让我们考虑一个使用蜂窝连接的节点应用。它可能看起来节点是直接连接到互联网的,但实际上并非如此。实际上,节点既连接到蜂窝网络,也连接到由网络提供商管理的专用网关。清楚地了解架构中所有组件的存在非常重要,因为每个部分在出现问题时都可能成为弱点,并可能使故障排除变得更加漫长和复杂。
通信技术和协议
数据在物联网节点和云应用之间的往返过程中通过多个不同的设备流动。这些设备实现了各种通信技术和协议,以下图表显示了最常见的选项:

图 1.4 – 通信技术和协议
在整个链中的四个主要通信路径中,主要区别与通信的无线或有线性质相关。
根据前面的图示,现场到设备路径通常是线性的:传感器、执行器和设备通过电线连接到物联网节点。它们根据图示中显示的有线接口标准之一打包和交换数据。
设备到网关路径可以是有线或无线,具体取决于节点对每个特定应用的技术要求。与有线物联网节点相比,无线物联网节点提供以下好处:
-
移动性:无线物联网节点不受物理连接的限制,可以轻松移动或重新定位,提供更大的灵活性和自由度
-
安装简便性:无线节点不需要布线,可以更快、更轻松地安装,从而降低安装成本和时间
-
可扩展性:向无线物联网网络添加新节点或设备比添加有线节点更容易且成本更低
-
无基础设施需求:无线物联网节点不需要现有的有线基础设施,这使得它们非常适合偏远或难以到达的地方
-
提高可靠性:无线节点不太可能因电缆的物理损坏而失效,这使得它们对于许多物联网应用来说更加可靠。
然而,值得注意的是,无线物联网节点可能会受到其他无线设备的干扰,范围有限,以及潜在的安全问题,因此在选择有线和无线物联网节点时,考虑这些限制是很重要的。
例如,对于河流上桥梁的负载、振动和结构监测的物联网节点,它们分别提供有关维护、交通平衡和改进需求的有用信息,这些节点不需要无线连接。另一方面,许多智能农业应用得益于长距离无线技术,因为这些技术在覆盖广阔区域的有线网络中存在困难和安装成本。
考虑到儿童公园有很多物联网节点,我们可以将不同市场垂直领域的应用大致分为四个主要组:
-
传输范围非常短的消费设备:可穿戴设备、安全设备、遥控器和玩具通常使用蓝牙或蓝牙低功耗(BLE)连接到一部手机,该手机共享互联网连接。这种方法展示了使用不同技术的多个网关级联以实现所需连接的可能性。
-
传输范围较短的消费设备:这是家庭自动化设备的情况,例如你家的恒温器或家用电器,娱乐设备、个人乐器和通过有线 Wi-Fi 接入点连接到互联网的医疗保健设备。
-
无线专业设备:汽车、智能农业、采矿以及一些物流和户外工业应用需要最新的蜂窝技术提供的非常长的传输距离,这包括 3G/4G/5G 或 LPWAN。
-
有线专业设备:一些基础设施项目,如桥梁和水库的监控或室内工业项目,需要有线节点来提高可靠性、增加传输的数据吞吐量、减少电池更换的维护需求,并提高数据安全性。
在大多数物联网应用中,网关到云的连接是有线的,最终网关提供回程无线连接到互联网。这是专业 Wi-Fi 和 LoRa 网关实现以太网接口和蜂窝调制解调器的情况:如果以太网连接失败,网关会自动切换到蜂窝网络。
定义云到云通信路径的性质有点棘手,因为我们需要考虑云应用运行在云平台上,这些平台由相互连接的服务器组成。服务器之间的物理连接肯定是线性的,但我们可以将云应用之间的逻辑连接视为无线,因为与安装在互联网上单个服务器上的应用相比,无线和有线物联网节点提供相同的优势。

图 1.5 – 有线/无线通信技术
在本节中,我们讨论了具有多个节点、网关和云的端到端物联网应用的高级架构。在本节的第二部分,我们讨论了通信技术和协议,我们将不同的通信技术分为无线和有线介质,以便更好地理解。在下一节中,我们将详细讨论物联网解决方案的安全性以及设备配置服务。
安全方面和设备配置
在许多应用中,物联网设备收集和传输敏感数据,如个人信息或财务数据,如果数据没有得到适当的保护,这些数据可能会面临被盗或未经授权访问的风险。在任何物联网应用的设计和实施中,安全必须是首要任务,以确保通过系统传输的数据的安全性和隐私性。
在物联网架构的安全链中,最薄弱的环节是物联网节点以及物联网设备和云之间的接口。
我知道我们说过物联网节点和云之间总是有一个网关。事实上,网关实现了设备与云之间可靠端到端通信通道的所有通信层。节点和云是这个通道的两端,主要在这一层,数据可能容易受到黑客攻击、篡改或未经授权的访问,从而可能损害其安全性和隐私。
硬件安全
攻击者可以利用过时或未打补丁的软件中的安全漏洞,当节点基于运行常见操作系统的微计算机时,这种情况更为可能。当节点具有运行在裸机上的微控制器作为固件时,如 Arduino 生态系统中的情况,这种可能性会显著降低。这是因为设备上运行的软件减少到仅严格必要的最小值以运行设备。
在节点上采用强大的数据加密算法可以保护通过网络传输的数据,使其更不易受到窃听或篡改。在这种情况下,Arduino 生态系统也证明了它是实现物联网应用的不错选择:用于物联网的 Arduino 设备嵌入称为加密芯片的安全元素,能够在硬件级别生成和管理安全密钥,无需在节点应用程序的源代码中包含密码。我们将在本节末尾看到这意味着什么以及它是如何工作的,但现在有必要讨论与物联网节点相关的另一个安全风险。
这是不充分的访问控制:一些访问控制不充分的物联网设备可能允许未经授权的个人访问或控制设备,从而可能危及整个系统的安全性。
访问可以是远程的,甚至可以直接访问设备以提取原始固件并将其覆盖为黑客编写的不同版本。固件的提取也可以仅用于在兼容但复制的硬件上复制原始设备的功能,从而威胁到物联网业务的成果。
Arduino 为其传统的引导加载程序(bootloader)设计了一个安全版本,以防止这些风险。引导加载程序是设备上首先执行的软件,负责加载固件并初始化设备的硬件。
Arduino 安全引导加载程序通过实现固件故障安全认证和安全更新的机制,在传统的引导加载程序中添加了一个安全环境。这些机制防止了对设备固件的未经授权访问,并确保只有授权的固件可以在设备上执行。
固件的真实性检查基于数字签名并保证安全性:引导加载程序在将固件加载到设备内存之前检查其数字签名,并在遇到未经授权或错误签名的固件时不继续执行,从而防止设备启动。同样,安全引导加载程序可以防止篡改、数据损坏和逆向工程:它在覆盖旧版本之前验证新版本的固件,并且可以配置为防止从设备读取实际固件。
物联网节点(IoT node)的程序员生成并管理他们的数字签名,保持对设备的完全控制,但同时也排除了其他人。
我建议在任何物联网项目中采用安全的引导加载程序,因为实现它的最小努力立即在设备和数据的安全性和完整性方面得到回报。
基于微控制器的节点,具有强大的硬件加密能力和安全启动机制,解决了节点上的大部分安全担忧。定期的安全审计确保物联网设备和后端系统之间交换的数据得到保护,而云平台和云应用提供商负责通过实施安全数据存储实践和定期备份,以及定期监控系统以检测和及时响应潜在的安全事件,来保护云上处理和存储数据的后端系统。
安全通信的加密
Arduino 将其物联网云和基于 Arduino 的物联网节点的安全性视为首要任务。Arduino 物联网云需要使用 SSL/TLS 加密进行连接,未实现该加密的设备无法配置到云中。Arduino 物联网云定期更新其安全措施以应对新的威胁和漏洞,并运行在 Amazon AWS 平台上,该平台拥有符合最安全敏感组织需求的数据中心和网络架构。
物联网节点的配置是指配置和设置设备以进行操作,并将其连接到网络或平台的过程,以便它可以与它交换数据并与其他设备交互。在此过程中,设备应配置为建立与云的安全连接的信息,云应配置为接受来自已注册的知名设备的连接,并管理与其交换的数据。
一旦设备配置完成,它就可以在需要时连接到云,并以安全的方式交换数据。
SSL/TLS 安全协议是互联网上用于安全通信最广泛采用的协议,并使用对称加密和非对称加密的组合:
-
非对称加密:公钥密码学,也称为非对称加密,使用一对公钥和私钥来对数据进行加密和解密。在此方法中,公钥用于加密数据,而私钥用于解密数据。
-
对称加密,另一方面,使用单个共享密钥来加密和解密数据。它比非对称加密更快、更高效,但需要在客户端和服务器之间安全地交换密钥。
在 SSL/TLS 中,客户端和服务器之间的初始握手使用非对称加密执行。客户端和服务器同意一个共享密钥,然后使用该密钥对它们之间传输的数据进行对称加密。这种方法既提供安全性又提供性能,使其成为物联网环境中保护通信的加密协议。
最后,设备需要知道 SSL/TLS 握手的公钥,而云需要知道一个唯一的设备密钥或设备标识以识别来自合法设备的连接。这些数据应在为我们的应用程序部署的每个物联网设备配置阶段进行配置。
对于有限数量的设备配置通常是手动或半自动化的,并在每个单独设备的编程过程中执行。在这个阶段,程序员定义他们设备的唯一标识符,并在云上注册它,然后生成云上的安全密钥,并将其复制到设备上。这不是一个困难的过程,但它可能会变得复杂,因为不同的云有不同的架构和执行方式。
批量设备配置
需要中等或大量部署节点的物联网解决方案通常采用从电子产品生产开始的完全自动化流程。物联网解决方案的所有者将唯一设备标识符列表和安全证书提供给设备制造商。制造商从列表中为每个设备分配一个设备标识符,存储证书,并最终在设备上刷写应用程序固件,使每个节点准备好从工厂运行。
Arduino IoT Cloud 主要提供半自动化的配置,我们将在下一章中详细看到。用户将设备连接到编程 PC 的 USB 端口,而向导负责剩余的工作。向导识别 Arduino 板型号,并在其上刷写负责在加密芯片上生成和存储安全密钥的固件。最后,它完成在 Arduino IoT Cloud 上设备的注册。
尽管向导会完成所有工作,但我仍然认为这个过程是半自动化的;实际上,如果您有多个设备,您需要逐个将它们连接到 USB 端口。实际上,您可以通过为 Arduino CLI 编写一个良好的脚本,并使用一个可以灵活地在端口之间切换主机连接性的智能 USB 集线器,在 Arduino IoT Cloud 上实现更自动化的 Arduino 板配置,但这超出了本书的范围。
Arduino PRO 适用于商业用途案例
Arduino PRO 可以通过在生产过程中预先配置设备来支持企业在大量部署方面的需求,当涉及数百或数千台设备时。您可以通过 Arduino 网站联系 Arduino PRO 团队,与他们讨论您的项目。
我们已经多次提到加密芯片,因此我们将以此部分结束,讨论这个组件。加密芯片,也称为安全元素或可信平台模块(TPM),是一种用于安全存储和管理加密密钥以及执行加密操作的硬件组件。它拥有自己的安全处理器和内存,提供了一个信任的根,这意味着它作为设备上安全操作的基础。
将设备的唯一标识符或安全证书存储在安全元件中,以及用于加密和解密数据的任何其他加密密钥,比将它们写入设备的固件或软件代码中要安全得多。这是因为加密芯片在硬件级别执行加密操作,密钥不会存储在硬件上。即使逆向工程活动也无法揭示设备上包含的敏感信息。
在本节中,我们详细讨论了安全方面和设备配置。为了解决安全问题,Arduino 物联网设备嵌入称为加密芯片的安全元件。建议在物联网项目中采用安全引导加载程序以获得更好的安全性。使用 SSL/TLS 进行设备到云的通信,这将为您设备的进出操作提供安全通道。接下来,我们将随着本章的进行讨论开源。
开源
开源软件和开源许可证的概念最早在 20 世纪 60 年代末和 70 年代初由计算机科学家和程序员提出,他们认为软件代码的共享和协作将导致更好的、更可靠的、更具创新性的软件。
Arduino 被认为是世界上最早采用开源许可证进行硬件工程的公司之一。该公司于 2005 年发布了 Arduino 板的第一版,包括板子的原理图和核心固件的源代码,均以开源许可证发布。
这使得任何人都可以自由地使用、修改和重新分发设计,这对 Arduino 平台的成功和普及做出了巨大贡献。开源方法还使得一群开发者和制造商能够协作并改进平台,创建了今天仍在使用的广泛库、教程和项目。
不同开源许可证的权益和义务
开源许可证是法律协议,定义了许可软件或硬件可以使用、修改和分发的条款和条件。有几种不同类型的开源许可证,每种许可证都有自己的条款和条件,但主要概念通常是相同的。
开源许可证通常保留软件或硬件的版权,但它们允许用户在特定条件下自由使用、修改和分发代码或设计。用户可以根据原始软件或硬件创建衍生作品(修改),但这些衍生作品也必须以相同的开源许可证提供,并且必须与产品一起分发许可证副本。
大多数许可证要求在使用或分发软件或硬件时给予原始作者信用,并接受免责声明,排除作者和分销商对使用受许可软件或硬件可能产生的任何损害或问题的任何责任。
在物联网项目中,您可能会发现以下一些主要的开源许可证:
-
MIT 许可证:这是最宽松的开源许可证之一,允许用户为任何目的使用、修改和分发软件或硬件,包括商业目的,无需署名。
-
GNU 通用公共许可证(GPL):这是第一个被广泛认可的开放源代码软件许可证,由自由软件基金会于 1989 年发布。
-
GNU Lesser 通用公共许可证(LGPL):LGPL 主要用于软件库,尽管它也被一些独立应用程序使用。LGPL 是在 GNU GPL 的强 copyleft 和更宽松的许可证(如 BSD 许可证和 MIT 许可证)之间的一种折衷方案。
-
自由软件基金会(FSF):其设计目的是确保软件或硬件保持开源和免费。
-
Apache 许可证:这是一种宽松的开源许可证,允许用户为任何目的使用、修改和分发软件或硬件,包括商业目的。然而,用户必须提供署名,并且不得使用原始作者的姓名或商标来推广他们的产品。
-
BSD 许可证,包括新 BSD 许可证和简化 BSD 许可证:这些是宽松的开源许可证,允许用户为任何目的使用、修改和分发软件或硬件,包括商业目的,无需署名。
-
Mozilla 公共许可证(MPL):MPL 是一种 copyleft 许可证,要求用户将软件或硬件的任何修改以相同的许可证提供,但允许他们向软件或硬件添加专有扩展。
开源许可模式提供了几个好处。
开源许可证鼓励协作和共享,这可能导致创新更快,软件或硬件质量更好。开源软件或硬件工程通常是免费的,这可以为用户带来显著的成本节约:他们可以修改工程和产品以满足他们的特定需求,而无需担心专有限制。开源提高了透明度和安全性,因为受许可的产品由许多人审查和审计,而不仅仅是少数专有开发者。
Arduino 以组合开源许可证发布软件和硬件。Arduino 的集成开发环境(IDE)软件是在 GPL v2 许可证下发布的;硬件设计,包括原理图和板布局,是在创意共享署名共享相同许可下发布的;而软件库是在 GPL v2、LGPL v2.1 和 MIT 许可证等下发布的。
保护你的知识产权
Arduino 用户的社区欣赏开源许可模式,因为之前已经提到的利益,而专业人士仍然对出于商业目的采用开源持一些犹豫态度。
他们可能对与其他专有产品相比所能获得的较低或不同级别的支持和维护有所顾虑,但在许多情况下,他们采购开源产品是因为开源带来的成本节约补偿了那种感觉。然而,在发布自己的产品时考虑知识产权是另一回事:这是一个关键的障碍,而且大多数时候,专业人士更倾向于采用专有许可证。
在我看来,更好地了解许可证的条款和条件以及可用的技术,将使所有专业人士都能选择加入开源,从而在获得它提供的利益的同时,不会失去对未经授权使用或侵犯其专有解决方案的某些保护。
例如,正如我们所见,你不仅可以通过采用安全的引导加载程序来保护你的开源物联网节点的复制,而且你还可以利用开源软件库,而不必发布你项目的源代码,同时遵守开源许可证。
为了做到这一点,你需要进行轻微的思维转变,将你的软件视为由两部分组成:主软件,它调用第三方库提供的功能,以及你的专有库,其中包含你的专有技术和知识。
如果你通过将设备的智能从主应用程序移动到专有库来构建你的项目,而开源库将它们的函数提供给主应用程序而不是直接提供给你的专有库,那么游戏就结束了。实际上,你的专有库可以保持为二进制库,无需发布其源代码,而你只需要发布主应用程序和库的二进制代码。你的主应用程序不包含任何战略或有价值的知识,只是对调用和回调你的专有和第三方库的封装。
现在,这种方法需要一些编程技能,但您可以从 Arduino 及其系统集成合作伙伴网络获得付费支持。这些是加入合作伙伴计划并正式由 Arduino 认可的工业系统集成商。这个网络还解决了基于 Arduino 的物联网节点和应用的售后服务支持问题。
在商业应用中尊重 Arduino 商标
我们已经看到,Arduino 生态系统在技术和许可要求方面满足了物联网应用的所有要求。现在,我们需要了解您是否可以在不侵犯任何商标、不引起法律纠纷的情况下,甚至将其用于商业应用。
Arduino 技术是开源的,您可以复制 Arduino 开源硬件设计以进一步开发成您自己的产品,但您必须使用自己的品牌名称和标志。
您可以免费使用 Arduino 软件工具,如 IDE,按原样编程硬件,甚至用于商业目的。
如果您想修改和进一步开发它们,您可以根据包含的开源软件许可证重新分发它们。因此,销售衍生工具或将其包含在商业软件产品中并不被禁止,但可能需要修改才能在相同许可证下开源。
使用 Arduino 商标来识别非 Arduino 生产和维护的硬件或软件产品始终是禁止的。如果您愿意,可以称它们为Arduino 兼容,并使用您自己的标志进行品牌化。
您可以在互联网和 Arduino 网站上找到许多不同的成功案例,这些案例展示了不同垂直领域的商业企业如何成功采用该生态系统用于商业物联网解决方案,并尊重这里提到的原则。
一些拥有大量项目的公司也成功地向 Arduino 寻求联合品牌或定制生产许可。
在上一节中,我们讨论了开源概念,并讨论了在使用这些工具和相关代码时不同开源许可证的细节以及责任。我们还讨论了知识产权,它与商业使用和防止您的产品成为复制或克隆产品密切相关。这是本书的第一章,我们深入讨论了物联网(IoT)是什么,它的好处,通信协议和技术,以及许多其他主题,在开始本书剩余部分之前,为您提供了一个物联网架构的广泛概述。
摘要
我们已经看到,两个电子设备可以通过互联网相互交互并交换信息,而无需它们之间有直接的物理连接。节点可以与其他对象和云应用进行接口,这种架构允许在不同市场和为用户提供巨大利益的情况下实现智能解决方案。
我们已经看到了物联网解决方案的架构、不同的电信技术以及涉及的安全方面。
我们已经讨论了如何保护您的知识产权免受产品复制的侵害,以及如何在无需发布源代码的情况下采用开源库。
最后,在基于 Arduino 生态系统实现商业解决方案时,请尊重 Arduino 商标。
所有这些信息都是理解物联网应用背后的工作原理以及您考虑您下一个物联网解决方案的正确方法所必需的。
在进入下一章之前,基于 Arduino IoT Cloud 的第一个物联网项目示例,回顾一下构建良好物联网解决方案的主要步骤是值得的:
-
确定应用并定义商业模式。
-
确定物联网应用的需求和目标。
-
区分边缘计算与云计算,以及结构化代码与 AI/ML 模型需求。
-
选择最合适的电信技术。
-
选择适合物联网节点的适当硬件。
-
根据项目规模选择相应的配置模式。
-
为节点开发软件并配置云,正如我们将在以下章节中看到的。
-
部署应用并定期监控性能和安全。
第二章:初识 Arduino IoT Cloud
每个开发者/程序员/云工程师,当他们开始他们的编码/云之旅时,都非常渴望立即开始使用这个平台。好吧,伙计们,你们的等待结束了,我们以一个Hello World问候语欢迎你们进入这一章。这一章不仅提供了一个Hello World示例,还包含了Arduino IoT Cloud如何工作的许多重要核心概念。这是对所有读者来说最重要的章节,因为这一章将为您概述如何开始使用 Arduino IoT Cloud,因为 Arduino IoT Cloud 平台与其他平台相比有显著的不同。这一章分为两部分;在第一部分,您将学习如何使用Arduino MKR Wi-Fi 1010板与 Arduino IoT Cloud 平台交互,在第二部分,您将学习如何使用Node-RED的API与云平台进行通信。
除了这些示例,您还将了解实体和设备之间的区别,什么是变量,以及实体的不同属性。您还将体验Arduino Web Editor,这是一个具有有趣功能的出色特性。之后,我们将转向仪表板,它帮助用户控制实体并可视化传感器数据。所以,伙计们,准备好开始这段有趣的旅程吧。
本章将涵盖以下主题:
-
理解 Arduino IoT Cloud 的工作原理
-
Arduino IoT Cloud 和 MKR1010 的 Hello World 示例
-
Node-RED 简介
-
Arduino IoT Cloud 和 Node-RED 的 Hello World 示例
技术要求
在我们开始之前,我们首先需要设置一个与 Arduino IoT Cloud 兼容的板子。我推荐 Arduino MKR Wi-Fi 1010,但您可以在docs.arduino.cc/arduino-cloud/getting-started/technical-reference#compatible-hardware找到完整的兼容板子列表,您可以根据您的需求进行选择。
第二,您应该有一个 Arduino IoT Cloud 账户。如果没有,请在cloud.arduino.cc/注册并根据自己的需求选择一个计划。
第三,我们需要下载并安装Arduino Create Agent。Arduino 为安装创建了一个美丽的基于 Web 的指南,您可以在create.arduino.cc/getting-started/plugin/welcome找到。
本章的第二部分与 Node-RED 相关,它将用于那些未由 Arduino IoT Cloud 官方支持的设备,例如 Raspberry Pi 和较老的 Arduino 开发板版本。请根据您的操作系统从nodered.org/docs/getting-started/local下载并安装 Node-RED。
重要提示
所有 Arduino IoT Cloud 计划都在 Arduino IoT Cloud 网站上提供。你可以访问以下链接获取最新的计划、定价和功能:cloud.arduino.cc/plans/。如果你来自教育机构,那么有大量的学生和教师计划。Arduino 还根据其需求为商业组织提供定制计划。
理解 Arduino IoT Cloud 的工作原理
因此,在我们开始 Arduino IoT Cloud 之旅之前,我们需要了解它是如何运作的,因为它与传统物联网云平台略有不同。结果,Arduino IoT Cloud 是一个更灵活、更安全、更适合行业部署的物联网解决方案。首先,我们将通过以下图表了解 Arduino IoT Cloud 的设计,这将帮助你理解 Arduino IoT Cloud 的关键支柱:

图 2.1 – Arduino IoT Cloud 架构
大多数云平台与设备和传感器的概念一起工作,但在 Arduino IoT Cloud 中,我们有“物”的概念,它包括设备和称为传感器/执行器的变量。你可能认为“物”和“设备”是相同的;实际上,它们并不相同。做出这种区分很重要,因为如果我们不理解它,那么在未来的发展中将会产生更多的复杂性。
为了理解“物”和设备之间的区别,我将从现实生活中举一个例子。假设我们有一个空盒子。如果我们把一些东西放进这个盒子,它就会变成一个装满东西的盒子。然而,如果我们在这个盒子上贴上运输标签呢?它还是盒子吗?不,现在它成了一件包裹。因此,我们可以理解包裹只是一个逻辑容器,它由盒子、盒子里的东西以及运输标签组成。
就像前面的例子一样,一个“物”是一个逻辑容器,它由一个开发板、作为云与传感器/执行器之间桥梁的变量以及使“物”在生态系统中活跃的网络连接组成(这就像盒子中的运输标签类比)。
接下来,我们需要了解设备配置在 Arduino IoT Cloud 中的工作方式。在这里,我们讨论的不是网络连接,而是设备配置。一些云平台为设备配置提供Arduino IDE库或软件开发工具包(SDKs),但 Arduino 有一个不同且更为严格的系统。首先,Arduino IoT Cloud 有两种设备配置方式;第一种是通过 Arduino Create Agent 使用兼容的板(在下一节中,你将深入了解 Arduino Create Agent),第二种是通过 API,用于非兼容设备。
那么,为什么 Arduino 对设备连接有这种限制呢?Arduino 关心物联网设备的安全性,安全性与水对生物的重要性一样重要。此外,并非所有官方 Arduino 开发板都与 Arduino IoT Cloud 兼容。你可以在docs.arduino.cc/arduino-cloud/getting-started/technical-reference#compatible-hardware找到 Arduino IoT Cloud 兼容设备的完整列表。Arduino IoT Cloud 除了直接支持 Arduino 官方兼容板之外,还支持一些著名的板,包括ESP8266 系列、ESP32 系列和LoRaWAN 节点。对于其他开发板,提供了一个 API,可以通过任何编程语言使用。在本章的后面部分,我们将解释如何使用 API 与 Node-RED 通信 Arduino IoT Cloud。
最后,对于数据可视化和数据提取有哪些选项可用?Arduino IoT Cloud 平台提供了各种选项。对于数据可视化,平台为网页和移动设备提供了灵活的仪表板选项,以及大量的小部件功能和共享功能。对于第三方应用程序集成,提供了表示状态转移(REST)API和webhooks。对于自定义应用程序开发或自定义集成,Arduino 提供了JavaScript和Python SDKs,这些 SDK 丰富了平台的可扩展性。组织可以通过使用这些 SDK 创建自定义仪表板可视化控件面板。
我们已经讨论了 Arduino IoT Cloud 的主要支柱;现在是时候通过实现基本示例来探索 Arduino IoT Cloud 了,这些示例将帮助你开始使用 Arduino MKR Wi-Fi 1010 开发板和 Arduino IoT Cloud。
Arduino IoT Cloud 和 MKR1010 Hello World 示例
Hello World 程序是每个程序员在学习任何编程技术时第一次使用的程序,以了解平台。然而,当涉及到物联网方面时,情况就不同了;你将处理硬件和软件,这意味着Hello World示例将与传统的屏幕外观不同。在本节中,我们将演示如何使用 Arduino IoT Cloud 仪表板打开/关闭 Arduino MKR Wi-Fi 1010 开发板上的内置 LED,这是一个 Arduino IoT Cloud 的Hello World示例。
通过一系列步骤,你将学习如何使用与 Arduino IoT Cloud 兼容的板。这部分对于理解事物如何在 Arduino IoT Cloud 平台上工作非常重要。首先,你需要获取所需的硬件、软件和账户,如技术要求部分所述。
因此,在本节中,我们将使用 MKR Wi-Fi 1010 开始 Arduino IoT Cloud 的Hello World项目。在下一小节中,我们将介绍 Arduino Create Agent。接下来,我们将创建一个设备和一个云变量,将 MKR Wi-Fi 1010 设备与设备关联起来,并为设备提供网络配置。稍后,我们将讨论开发板的草图/编码。
什么是 Arduino Create Agent?
Arduino IoT Cloud 提供了一种不同的方式将设备连接到其云。出于安全原因,Arduino 没有公开其云连接技术。这就是为什么我们只有两种方式将设备与 Arduino IoT Cloud 连接 – 使用 Arduino Cloud IDE 或 API。此外,对于 Arduino Cloud IDE,必须在您的机器上安装 Arduino Create Agent。图 2.2展示了 Create Agent 帮助设备与 Arduino Web Editor 交互的完整过程。

图 2.2 – Arduino Create Agent 流程
由于 Arduino Web Editor 是一个基于 Web 的工具,无法通过浏览器与开发板进行通信。这就是为什么 Arduino 团队为包括 Windows、Linux 和 macOS 在内的所有主要操作系统开发了软件,称为 Arduino Create Agent。Create Agent 充当设备与 Arduino Web Editor 之间的桥梁。前面的图示详细解释了该过程。
要在您的机器上获取 Create Agent,请访问create.arduino.cc/getting-started/plugin/welcome并按照步骤操作。安装后,启动 Create Agent,因为仅仅安装它并不足以实现连接。Create Agent 将作为一个后台进程运行,以提供设备与浏览器之间的持续集成。以下是一个描述 Arduino Create Agent 所有选项的图示:

图 2.3 – Arduino Create Agent 菜单
当我们点击 Create Agent 图标时,它会显示 Create Agent 版本、一个转到 Arduino Create选项和一个打开调试控制台选项,这就像一个串行监视器,您可以在其中执行不同的命令以获取当前过程、设备和端口的状况和信息。此外,从这个菜单中,您可以暂停/恢复 Create Agent,或者如果您想正常关闭它,则点击退出代理。
设置设备、变量
在本节中,我们将创建一个设备并为其命名。我们还将学习如何添加设备,包括网络配置和云变量。
创建设备
当您首次打开 Arduino IoT 云平台的仪表板(图 2.4)时,您将看到事物、仪表板、设备、集成和模板等菜单链接,以及创建您的第一个事物的消息。只需点击创建事物按钮,您的旅程就开始了。

图 2.4 – 事物仪表板
添加事物与其他物联网云平台相比完全不同,因为事物是多个成分的组合。以下图示描述了事物的所有成分,例如名称、云变量、设备、网络设置、代码和事物元数据:

图 2.5 – 事物创建
上一张截图中的所有方面将按以下步骤逐一解释:
-
为事物分配一个名称;名称应与设备的位置和功能相关,这将帮助您在以下向导中轻松找到事物。
-
点击选择设备将显示一个弹出窗口,您可以在其中选择旧设备或设置新设备,如稍后详细讨论的那样。
-
在连接设备后,我们需要通过提供 Wi-Fi SSID 和密码使设备网络就绪。只需点击配置按钮,您将看到网络设置的弹出窗口。
-
最后,我们需要为传感器/执行器添加一个变量以执行读写操作。Arduino IoT 云平台提供了不同类型的变量,就像 Arduino IDE 一样;唯一的区别在于在 Arduino IDE 中,我们声明变量,而在这里,我们需要通过界面创建变量。
在本节中,我们已经创建了事物并为其命名。还需要三个进一步步骤:添加设备、网络配置和添加云变量。我们将在以下子节中介绍剩余的步骤。
添加设备
在为事物分配名称后,我们需要将其与设备关联。当您点击选择设备按钮时,您将看到一个弹出窗口,显示可用的设备以及添加新设备的选项。如果没有设备,您将看到以下图示以设置新设备:

图 2.6 – 关联设备
在我们的情况下,我们在门户中没有任何设备,因此我们将点击设置新设备以在帐户中配置新设备。
接下来,您将在弹出窗口中看到两个选项。第一个选项是Arduino 板,第二个选项是第三方设备。在这里,您将在两个名称前面看到一个图标,这意味着您需要使用与 Arduino IoT 云平台兼容的设备。接下来,您将看到两个选项:一个是 Arduino 官方开发板,另一个是第三方开发板。

图 2.7 – 选择开发设备
根据可用的设备选择一个选项。在本章中,我们将点击Arduino 板,因为在本章中,我们将使用 MKR Wi-Fi 1010 板。在添加设备之前,请确保 Arduino Create Agent 在你的机器上运行。
重要提示
你可以在store-usa.arduino.cc/pages/cloud-compatible-boards找到 Arduino IoT Cloud 兼容的板,对于第三方设备,我们有三种选项,分别是ESP8266、ESP32和LoRaWAN设备。对于某些设备,我们有 API 访问权限,这将在本章的第二部分讨论。
接下来,你将看到设置设备弹出窗口,它将开始搜索你的设备。所以,确保设备已经正确连接到你的机器。当 Arduino Create Agent 检测到兼容的开发板设备时,将显示以下弹出窗口:

图 2.8 – 设置设备
向导将找到并列出所有连接的板及其名称和端口详情。点击配置按钮继续。如果向导在搜索后没有显示设备,尝试插入不同的端口并点击底部位置的刷新链接。在 Arduino IoT Cloud 处理开发板配置后,你将看到一个弹出窗口,需要提供你的设备名称:
在下一个配置向导中,提供设备的名称(注意设备名称中不允许有空格和特殊字符),然后点击下一步按钮。

图 2.9 – 设备配置名称
之后,向导将开始设备配置过程,这个过程可能需要五分钟。但在大多数情况下,配置设备只需要一分钟。
最终,你将看到一个弹出窗口,显示恭喜!你已经设置好了的消息。点击完成按钮,设备将被连接到你的“物”。
在“物”页面上,你会看到设备详情,如下图中红色方框所示:

图 2.10 – 连接到“物”的设备
页面显示了设备名称、设备 ID、其类型、其状态(可以是在线或离线),以及两个按钮,更改和断开连接:
-
更改用于在设备之间切换 – 例如,如果你选择了错误的设备,那么你可以通过此选项选择不同的设备。
-
断开连接意味着将设备从“物”中移除。为什么我们可能需要断开连接?例如,你可能已经创建了一个“物”并将设备与之关联,但现在你不再使用那个“物”。如果你想用那个设备设置一个新的“物”,如果它已经与旧“物”关联,平台将不允许你这样做。
重要提示
设备和“设备”之间存在一对一的关系。如果您想使用一个新“设备”的设备,请确保它没有与另一个设备关联。
既然我们已经添加了设备,让我们转向网络配置。
配置网络
将设备连接到“设备”后,我们可以看到设备处于离线状态。要将其上线,我们需要提供 Wi-Fi 详细信息。以下图表示网络配置弹出窗口,它仅包含两个字段:

图 2.11 – 网络配置
在 图 2**.5 所示的“设备”页面中,在 网络 选项卡下,点击 配置 按钮,这将带您进入包含两个字段 Wi-Fi 名称 和 密码 的 配置网络 弹出窗口。输入 Wi-Fi SSID 和密码,然后点击 保存 按钮。
在本节中,我们已经为我们的设备配置了网络,该设备是 MKR Wi-Fi 1010,在下一小节中,我们将创建云变量。
添加云变量
最后的部分是添加云变量。在添加变量之前,您必须对您项目所需的变量类型有一个概念,包括 变量类型、变量权限 和 变量更新策略。
对于当前示例,我们需要一个变量来控制内置 LED,因此变量类型将是 布尔(开/关):

图 2.12 – 添加变量
这样,我们将通过仪表板控制 LED:
-
为变量分配一个有意义的名称,与传感器/执行器类型相关。请记住,名称中不允许使用空格和特殊字符。
-
如果您想将变量与其他设备的变量同步,请点击 与其他设备同步选项。如果您想在其他设备之间共享数据,同步选项非常有用。同步将在后续章节中与实际演示一起解释。
-
从下拉菜单中选择变量类型;平台提供了数十种变量类型。对于本例,我们需要一个 布尔 类型的变量来控制 LED。
-
选择变量类型后,您将看到变量
LED,但系统已将第一个字母转换为小写,其余字符保持不变,使名称变为 lED。这部分声明非常重要;您可以根据您的需求更改声明,但请记住声明,因为它将在编码中使用。 -
变量权限提供了两个选项,读写和只读。权限为设备的控制提供了额外的安全层。如果传感器仅感应数据,如温度/湿度,则选择只读选项。如果您想控制继电器和 LED 等执行器,则选择读写选项。对于我们的示例,我们需要将数据写入变量以控制 LED,因此我们将简单地选择读和写。
-
最后,我们需要根据我们的需求选择一个更新策略。一个选项是事件驱动(在屏幕上显示为更改时),它仅在发生变化时才工作。当接收到如开启/关闭继电器或 LED 的命令时,它才会工作。第二个选项是周期性,这意味着在特定时间后从变量(如温度、湿度、空气压力或光敏电阻(LDR)值)中获取数据。当您将选项更改为周期性时,它将要求您输入以秒为单位的时间,而对于更改时,有一个阈值选项。
添加变量后,我们的设备现在拥有了所有必需的成分。以下图示描述了完成云变量、设备和网络设置后所有的设置和配置。接下来,我们需要跳转到草图选项卡进行编码:

图 2.13 – 配置后的设备
上述截图说明了设备关联、网络配置和变量设置,这些都是设备的基本组件。接下来,点击草图选项卡,您将打开 Arduino Web Editor 进行编码。在这里,我们将添加与 LED 变量关联的代码。在本节中,我们已通过拖放完成了所有任务,但现在我们需要通过在开发板上编写一些代码来做一些工作。在下一节中,我们将探讨草图。
编写草图
大多数设备都是通过图形用户界面(GUI)在云中设置的,但我们仍然需要进行一些编码。以下图示描述了小型网页编辑器的所有选项,例如验证和上传代码、在特定端口选择开发板,以及编写和编辑代码的区域。

图 2.14 – 小型网页编辑器
代码将关联一个变量与物理传感器/执行器,以使其正常工作。请参阅以下步骤:
-
在这里,您将看到两个按钮,就像在 Arduino IDE 中一样。勾选按钮用于验证代码,而箭头图标按钮用于将代码上传到开发板。
-
这一部分显示了您的设备是否连接到您的机器。如果开发板已连接,则将显示带有端口的设备名称。
-
Arduino 云编辑器有两种版本——一个是基础版,另一个是完整版。在图 2.14中显示的“事物”标签页中,我们可以看到编辑器的迷你版,但如果你想要移动到完整版以安装库或其他内容,那么请点击</>按钮。
-
滚动编辑器,在底部,你会看到与LED变量关联的
OnLEDChange()函数。在这个函数中,我们需要编写代码以提供与开发板传感器/物理引脚的连接。
根据我们当前的示例项目,我们只需要一个开/关的内置 LED 用于开发板。以下是在函数中使用的代码:
if(lED==1)
{
digitalWrite(LED_BUILTIN,1);
}else{
digitalWrite(LED_BUILTIN,0);
}
首先,让我们回顾一下在变量创建期间使用的声明,如图图 2.12所示。代码的作用是,如果LED变量包含一个 true 值,则打开内置 LED;否则,关闭内置 LED。
要在开发板的引脚上写入布尔值,我们有一个名为digitalWrite的方法,它接受两个参数。第一个参数是引脚号,在第二个参数中我们将放置true/false或1/0,而当我们使用LED_BUILTIN时,它是一个常量,包含PIN #13。第二个参数是值,可以是1或0。此参数根据LED变量的状态而变化。现在我们已经完成了我们的编码练习。现在是时候创建一个图形用户界面,从那里我们可以打开/关闭 LED。在下一节中,我们将设置仪表盘以控制 LED。
创建带有交互式小部件的 Web 和移动仪表盘
在设置好一个完整的“事物”之后,我们就完成了设备设置、网络设置、变量和变量编码。接下来要问的问题是,我们如何打开/关闭 LED?为此,我们需要创建一个仪表盘。图 2.15展示了仪表盘。点击顶部菜单中的仪表盘链接。首次加载仪表盘页面时,你将看到一个底部有一个绿色按钮的空白页面——构建仪表盘。

图 2.15 – Things 仪表盘
点击按钮,你将被带到仪表盘构建页面,以创建一个用于设备控制的新颖仪表盘,如下所示:
-
仪表盘有两种模式,查看和编辑。默认情况下,它是编辑模式,这由一个编辑图标表示,我们可以通过点击眼睛图标切换到查看模式。在查看模式下,我们无法修改小部件的设置和对齐。
-
要在仪表盘上添加控件,请点击绿色添加按钮,将出现一个下拉菜单,其中包含各种小部件。在这里,你可以通过滚动或搜索来选择一个小部件。
-
此按钮用于排列小部件。在编辑过程中,你无法导航、调整大小或移动小部件控件。
-
如移动图标所示,它通过其图标表示其工作状态,这意味着通过点击此图标,你可以调整移动设备的仪表盘。Arduino 为桌面和移动设备提供了仪表盘的两种视图。你可以通过点击移动/桌面图标在它们之间切换。
-
在文本框中输入仪表盘名称。
现在我们已经创建了仪表盘,是时候在上面放置一个小部件了。小部件将帮助我们控制/查看传感器/执行器。当你点击添加按钮时,你会看到小部件列表。在这里,你可以通过滚动列表或通过搜索栏搜索小部件来选择小部件,如下所示:

图 2.16 – 小部件列表
为当前示例项目选择开关小部件控制。选择小部件控制后,将出现一个弹出窗口,我们需要将事物变量与小部件控制链接起来以读取/写入设备传感器的数据。这是因为变量是仪表盘小部件控制与事物传感器之间读取和写入数据的桥梁。
在小部件弹出窗口中,我们有不同的设置,如下所示:

图 2.17 – 小部件设置
小部件设置如下详细说明:
-
首先,我们需要为我们的小部件分配一个名称。确保给它一个合适的名称,以表示传感器的名称。在这里,我使用了名称LED-Switch。
-
隐藏或显示小部件框架内容,该内容位于小部件的顶部和底部。
-
点击链接变量将事物变量附加到小部件控制,这将在下一图中解释。
-
隐藏/显示小部件标签以隐藏覆盖小部件控制的文本。在先前的图中,它切换了开/关按钮文本。
是时候将小部件控制附加到变量上了。请注意,我们可以在同一仪表盘上添加多个控制,这些控制与不同事物的变量链接,这显示了 Arduino IoT Cloud 仪表盘的通用性,如下所示:

图 2.18 – 将事物变量链接到小部件控制
如图 2.18所示,我们将以下步骤分配给小部件控制以将云变量分配给小部件控制:
-
从事物列表中选择一个事物。选择事物后,它将显示与该事物关联的变量。
-
从变量列表中选择一个变量。
-
在这里,你可以看到变量的所有详细信息,例如事物名称、类型、最后值、权限、更新策略和最后更新。此详细摘要的目的是确保验证你是否已将正确的变量附加到小部件控制。
在从特定设备中选择变量后,点击链接变量按钮,你将在小部件控制弹出窗口中看到变量详情。从那里,你可以更改或断开变量。最后,点击完成按钮;现在,我们的仪表板已经准备好了,有一个小部件控制可以发送命令到设备。只需点击仪表板上的眼睛图标使其可用。之后,开始测试仪表板控制。
在这里,我们完成了使用 Arduino MKR1010 和 Arduino IoT Cloud 的第一个示例项目。接下来,你需要解决本节中的作业 1。之后,你将进入本章的第二部分,在那里你将学习如何通过 Node-RED 使用与 Arduino IoT Cloud 不兼容的设备,例如 Arduino Uno、Raspberry Pi 等。
作业 1
恭喜!你已经成功完成了本章的第一部分,希望你喜欢这段旅程。现在,是时候通过给你一个小作业来验证你所学的内容了:
-
将三种不同颜色的 LED 灯(最好是红色、黄色和绿色)分别连接到 Arduino MKR1010 开发板的 1 号、2 号和 3 号引脚。
-
设置一个名为
基于物联网的交通灯控制的新设备。 -
将设备关联起来,配置其网络设置,并根据 LED 灯的数量创建变量。变量名称应基于 LED 颜色,例如
LED_Red。 -
编写代码,根据变量值来开关 LED 灯。在为每个 LED 编写代码后,验证并上传代码到开发板。
-
最后,设置名为
交通灯控制仪表板的仪表板。 -
根据 LED 灯的数量添加开关按钮,并将它们与相应的变量链接。
-
通过仪表盘开关来测试 LED 灯。
重要提示
尝试使用按钮小部件控制和开关按钮小部件控制。验证一个变量是否允许你连接到多个小部件。此外,通过开关开关按钮来验证按钮小部件控制的行为。
我们的世界充满了各种类型的技术。每当市场上出现一项新的创新时,它总是与旧设备保持兼容。在 Arduino IoT Cloud 中,我们有一个当前支持的设备列表,但还有数百万个设备与 Arduino IoT Cloud 不兼容。因此,在上一章节的上一部分,我们使用与 Arduino IoT Cloud 兼容的开发板进行了示例练习,接下来,我们将探讨如何将非兼容设备连接/使用到 Arduino IoT Cloud 中,例如 Arduino UNO、Raspberry Pi、BeagleBone 等。
介绍 Node-RED
Node-RED 是一个免费的开源物联网和其他应用的视觉编程工具。它由 IBM 新兴技术部门开发,并于 2013 年首次发布。Node-RED 提供了一个基于网页的界面,以新颖有趣的方式连接硬件设备、API 和在线服务。该工具使用基于图形流程的编程语言,使得编程经验很少或没有的用户也能轻松构建复杂的物联网系统。Node-RED 因其易用性和能够与广泛设备和服务集成而受到物联网和智能家居社区的欢迎。
Node-RED 是一个基于流程的物联网和其他应用的开发工具。它提供了一个视觉拖放界面,用于连接不同的设备、API 和在线服务。使用 Node-RED,用户可以将输入、输出和功能连接起来,以创建复杂的物联网解决方案。除了开源和免费使用外,Node-RED 还拥有庞大的用户社区和预构建组件库。
在所有 Node-RED 的上述优点的基础上,以下问题随之而来:为什么我们需要使用 Arduino IoT Cloud?在章节的开头,我提到 Arduino IoT Cloud 仅原生支持少数几款开发板。即使是 Arduino,也不支持它们所有的开发板,尤其是 Arduino UNO、Arduino Mega 以及来自树莓派基金会的树莓派,这些在创客和爱好者中非常著名,并被工业界所使用。Node-RED 就是解决这个问题的方案,它与大多数开发板兼容,并拥有 Arduino IoT Cloud 模块,这使得开发者更容易将不兼容的设备集成到 Arduino IoT Cloud 中。
Node-RED 与 Arduino IoT Cloud 结合使用,具有以下好处:
-
开发简便:Node-RED 的视觉拖放界面使得用户能够轻松地将 Arduino 板连接到云端并快速构建物联网应用。
-
与 Arduino IoT Cloud 集成:Node-RED 内置了对 Arduino IoT Cloud 的支持,使用户能够轻松地将他们的 Arduino 板以及其他开发板连接起来,并将数据发送到云端。
-
灵活性:Node-RED 的基于流程的编程模型使得构建和修改复杂系统变得容易。
-
基于流程的编程:Node-RED 的基于流程的编程模型非常适合构建物联网应用,因为它允许用户快速连接输入、输出和功能,以创建复杂的系统。
-
开源:Node-RED 是开源的,允许用户访问源代码并在必要时进行修改。
-
庞大的用户社区:Node-RED 拥有庞大且活跃的用户社区,提供丰富的信息和预构建组件。
这些优势使 Node-RED 成为开发基于 Arduino 的物联网应用并将其连接到云端的良好选择。通过使用 Node-RED,用户可以利用云的力量来存储、分析和可视化其物联网系统中的数据。在本节中,我们讨论了 Node-RED 的功能和优势。现在,是时候通过实现示例项目来实际看看了。接下来的几节将逐步引导您完成项目的实现。
Arduino IoT Cloud 和 Node-RED Hello World 示例
在本节中,我们将通过 Node-RED 向我们的系统添加一些额外的功能,以扩展我们的项目。这将帮助您了解如何使用 Node-RED 将不兼容的设备与 Arduino IoT Cloud 集成。
Node-RED 将根据一个值监控 LED 状态,该值可以是LEDStatus,它将链接到状态小部件,显示 LED 是开启还是关闭。通过这个示例,您将学习如何从设备属性/变量中读取数据以及如何将数据写入设备属性/变量。
Node-RED 有一个由 Arduino 官方开发的模块,用于与 Arduino IoT Cloud 连接。它提供了五个节点来执行不同类型的操作。有关更多详细信息,请访问flows.nodered.org/node/@arduino/node-red-contrib-arduino-iot-cloud。
Node-RED 编辑器的游览
在继续之前,我想首先提醒您,您需要在您的机器上设置 Node-RED。如果您已经设置好了,那太好了;否则,您需要通过访问nodered.org/docs/getting-started/local在本地机器上设置。如果您正在寻找更多云/开发板选项,请访问nodered.org/docs/getting-started/。
安装完成后,启动 Node-RED,并在浏览器地址栏中输入127.0.0.1:1880或localhost:1880。之后,您将看到一个界面,其中包含一个空白区域和左侧边栏上的几个不同颜色的盒子;在这里,我已经用不同的编号标记了以下图中的盒子,这些盒子将在图后详细解释:

图 2.19 – Node-RED 界面概览
前图的各种部分解释如下:
-
这些彩色盒子被称为节点。Node-RED 将不同类型的节点分为不同的组,例如常用和函数。
-
这是工作区域,或画布区域,您将在这里拖放和放置节点。
-
调试区域用于调试不同操作的输出和输入,以验证一切是否运行正常。
-
就像在其他开发环境中一样,我们可以使用 部署 选项执行/运行程序。部署 有不同的选项;如果您点击小向下箭头图标,您将获得一个选项列表,例如 全部、修改的流程、修改的节点 和 重启流程。
-
顶部右边的汉堡图标是主要导航按钮,在这里你可以找到所有控制 Node-RED 配置的选项,特别是模块的安装选项。在我们的例子中,我们将安装 Arduino IoT Cloud 模块。
在这里,我们已经讨论了 Node-RED 与所有主要选项的接口。在下一节中,我们将探讨如何安装 Node-RED 的 Arduino IoT Cloud 模块,在随后的章节中,我们将看到其实现。
安装 Node-RED 的 Arduino IoT Cloud 模块
为了让 Node-RED 与 Arduino IoT Cloud 通信,我们需要安装由 Arduino 团队官方开发的 Arduino IoT Cloud 模块。
点击应用右上角的导航图标,然后点击 管理调色板。之后,您将看到一个类似于以下图的弹出窗口:

图 2.20 – Arduino IoT Cloud 模块安装
从那个弹出窗口中,我们将安装一个模块:
-
要安装一个模块,请点击 调色板。
-
接下来,选择 安装 选项卡。
-
初始时,您将看到一个空白区域。在搜索栏中输入
Arduino,这将显示不同的模块。 -
找到 @arduino/node-red-contrib-arduinio-iot-cloud 模块,并点击 安装。在之前的图中,你可以看到我已经安装了该模块。
现在我们已经安装了模块,是时候看看 Arduino IoT Cloud 模块中可用的节点类型了。关闭安装调色板,滚动节点到底部,您将到达 Arduino IoT Cloud 部分,如图所示:

图 2.21 – Arduino IoT Cloud 节点
下面是 图 2**.21 中显示的节点的分解:
-
第一个是一个 IN 节点(在 Node-RED 中,我们有节点;这就是我为什么用 node 而不是 property 来从 Thing 属性/变量中获取值的原因)。
-
第二个是一个 OUT 节点,用于将值写入 Thing 属性/变量。
-
第三个是 历史 节点,用于从特定属性获取数据直到特定时间。当您想要获取特定传感器的值集,例如温度/湿度时,此节点非常有用。
-
第四个是 周期性 的,当您想要在特定时间段后获取特定属性的值时非常有用,例如在特定时间间隔后获取土壤湿度的值。
-
第五个,也就是我们的最后一个节点,是注入。这个节点用于在接收到某种输入后向 Arduino IoT Cloud 变量的流程中添加值。"OUT"不同,因为它只发送数据,但这个节点将值注入到 Arduino IoT Cloud 变量中。
在本节中,我们讨论了与 Arduino IoT Cloud 一起工作的节点,这些节点可供开发者在 Arduino IoT Cloud 模块中使用。接下来,我们将设置 API、云变量和仪表板,以便进一步操作。
设置 API、变量和仪表板小部件
安装 Arduino IoT Cloud 模块后,是时候在 Arduino IoT Cloud 中设置 API 了。在 Arduino IoT Cloud 的旧界面中,在集成选项卡下有 API 选项,但现在,Arduino 团队已将 API 选项移动到 Arduino IoT Cloud,可在cloud.arduino.cc/home/找到。
点击API 密钥。之后,您将被带到 API 页面;点击创建 API 密钥。将出现一个弹出窗口;输入 API 名称并点击继续按钮。以下向导将花费几秒钟生成密钥,然后会出现一个新的弹出窗口显示它们:

图 2.22 – API 密钥
通过点击复制图标复制客户端 ID 和客户端密钥;永远不要尝试通过选择它来复制密钥名称,因为它太长了。将客户端 ID 和客户端密钥保存在安全的位置,然后点击我已经保存我的客户端 ID 和密钥旁边的复选框以确认您已保存您的密钥。最后,点击完成按钮,您将在面板中看到您的 API 密钥,准备使用。
重要提示
一个 API 密钥可以访问所有设备和它们的变量。因此,使用一个 API 密钥来访问所有设备而不是为每个设备创建单独的 API 密钥是很好的。另一方面,请注意您的密钥,因为丢失它们可能是一个很大的安全风险。
在生成 API 密钥后,我们需要设置一个额外的变量,该变量将接收 Node-RED 的值,以及一个根据变量值进行操作的状态小部件。
对于变量创建,返回到图 2.12所示的 IoT Cloud 仪表板。选择所需的设备,创建一个名为LEDStatus的新变量,并选择我们之前为 LED 创建的布尔类型。然后,返回到仪表板并选择我们为之前练习开发的仪表板。点击带有状态小部件的LEDStatus变量。
在这里,我们已经在 Arduino IoT Cloud 中为 Node-RED 创建了 API 密钥,以及一个新的带有云变量和仪表板的新设备。接下来,我们将配置 Node-RED 中的 API 密钥,以便与 Arduino IoT Cloud 进行适当的通信。
使用 Node-RED 创建第一个项目
我们已经完成了迄今为止旅程中所需的所有强制性内容。返回到图 2.19中显示的 Node-RED 仪表板,向下滚动左侧,并将您的节点移动到 Arduino IoT Cloud。
点击第一个节点,即IN节点,将其拖动到流程区域。双击节点,您将看到以下节点配置的弹出窗口:

图 2.23 – Arduino IN 节点配置
要编辑属性节点,请按照以下步骤操作:
-
从下拉菜单中选择 Arduino 连接(如果您的 Arduino IoT Cloud 连接有多个,下拉菜单才会出现)。
-
如果您没有连接,点击铅笔图标,它将带您到一个新的弹出窗口,在那里您需要提供连接的名称,以及在前一节图 2.22中生成的客户端 ID 和客户端密钥。当您保存连接时,它将出现在连接下拉菜单下。
-
在成功创建并选择连接后,将出现与该连接关联的物件的列表。从物件下拉菜单中选择您将在流程中使用的目标物件。如果您在下拉菜单中没有看到任何内容,这意味着连接存在问题。
-
在选择物件后,属性下拉菜单将列出与所选物件关联的所有变量。选择一个您想要感知的变量;在我们的练习中,我选择了LED变量以获取其状态。
-
为节点分配一个名称,点击完成按钮,然后您就完成了配置。
以下是一个完整的节点流程。它显示了整个工作流程,从获取变量值到最后一个节点,该节点根据输入将值发送到云中:

图 2.24 – Node-RED 项目的完整流程
节点工作流程分解如下:
-
第一个节点是IN节点。选择您想要读取的变量;我选择了LED变量。
-
添加switch节点(页面左侧侧边栏的函数选项卡上的节点。此节点负责从节点1获取值,并根据该值选择3或4中的特定节点。将 Arduino IN节点链接到switch节点。链接后,双击switch节点,我们需要指定开关情况。

图 2.25 – Switch 节点选项
要编辑switch节点,请按照以下步骤操作:
-
首先,为节点分配一个名称,然后添加开关情况。
-
在我们当前的练习中,我们有两个 switch 语句:LED 是true或false,这意味着开或关。默认情况下,只有一个选项 – 点击小的
1和0,然后我们将有两个流程。
更改节点(True/1/On值。双击此节点。现在,点击下拉图标,如图中红色方框所示,选择布尔类型,然后选择true。

图 2.26 – 更改节点配置
要编辑更改节点,请按照以下步骤操作:
-
再次,插入更改节点并将其与开关节点(节点
False/0/Off值)连接。双击更改节点,选择布尔数据类型,并选择false值。 -
现在一切准备就绪。我们只需要添加一个节点,该节点将数据发送到特定的 Arduino IoT Cloud 事物变量。要发送数据,我们需要 Arduino OUT节点,这是在图 2**.21中 Arduino IoT Cloud 标签下的第二个节点。拖动此节点,并将其连接到两个更改节点(
LEDStatus变量)。
最后,我们完成了所有节点配置和链接。根据 Node-RED 的LED变量,点击LEDStatus Arduino IoT Cloud 变量,状态小部件将相应地更改。
本章的第二部分,我们探讨了如何使用 Node-RED 和 Arduino API 接口将不兼容的物联网开发板与 Arduino IoT Cloud 连接。接下来是练习 2,这个练习专门为你设计,以便进行不同的实验。
练习 2
继续上一个练习,其中你将三个 LED 连接到 MKR Wi-Fi 1010 和 Arduino IoT Cloud 设置:
-
在事物中创建三个状态变量,根据 LED 名称(如红色、黄色和绿色)到之前设置的 Thing。
-
在之前设置的仪表板上添加三个状态小部件,并将新创建的状态变量附加到它们上。
-
为每个 LED 设置三个不同的流程并部署这些流程。
-
通过使用开关按钮小部件打开/关闭 LED 来验证状态小部件。
摘要
本章是第一章节,我们通过一个基本的 LED 开关示例探讨了如何使用 Arduino IoT Cloud 连接设备。在第一部分,我们使用了一个与 Arduino IoT Cloud 兼容的开发板,即 MKR Wi-Fi 1010 板,在那里我们学习了如何创建事物和云变量,如何关联设备,如何配置网络,以及如何创建草图。在该部分的结尾,有一个练习任务供你实践。
在本章的第二部分,我们探讨了如何使用 Node-RED 和 Arduino API 接口将不兼容的开发板,如 Arduino UNO、Arduino Mega 和 Raspberry Pi,与 Arduino IoT Cloud 连接。在这里,我们探讨了 Node-RED、Arduino IoT Cloud 的 Node-RED 模块以及如何在云中生成 API 密钥。这一章节的部分内容帮助你学习如何使用不兼容的现有技术与 Arduino IoT Cloud。
Arduino 在 Arduino IoT Cloud 中提供了许多选项,例如事物、设备、仪表盘以及大量用于仪表盘和 Arduino Web 编辑器的部件。因此,在下一章中,我们将在继续前进之前详细探讨所有这些选项。第三章 对于您更好地理解所有 Arduino IoT Cloud 选项非常重要。
第三章:Arduino IoT Cloud 平台和 Web 编辑器的见解
在开始任何开发或云平台之前,了解该平台的功能非常重要,包括其功能、控制、小部件等。这些平台就像一个装满了香料、蔬菜、肉类和其他成分的厨房。要在新的厨房里做出美味的饭菜,你需要了解厨房里有什么——有什么类型的工具、成分、香料和其他物品可用。产品开发就像烹饪一样——如果你对平台提供的内容有很好的了解,那么你将能够开发出令人惊叹的项目。了解平台概述的另一个好处是,它将节省你长远的时间,并增强你对产品设计的信心,因为你已经对平台有了很好的理解,可以逻辑地组合不同的事物,根据你的需求开发新的东西。
因此,在本章中,我们将首先详细介绍 Arduino IoT Cloud 的主要组成部分,即事物、设备、仪表板、集成和模板。在下一部分,我们将查看所有仪表板输入/输出小部件,并详细了解它们的目的、使用位置以及它们支持的变量类型。我们还将简要比较一些相似的控制小部件。
在最后一部分,我们将涵盖完整的Arduino Web 编辑器功能,学习如何导入新的库、Web 编辑器的存储和内存限制是什么、如何与他人分享代码以及如何使用基于云的****串行监视器进行代码调试。
在本章中,我们将涵盖以下主题:
-
介绍 Arduino IoT Cloud 界面
-
输入控制
-
输出控制
-
Arduino Web 编辑器
-
一个任务
技术要求
仅对本章而言,需要 Arduino IoT Cloud 访问权限来探索本章中我们将涵盖的不同功能性和仪表板控制小部件。
介绍 Arduino IoT Cloud 界面
Arduino IoT Cloud 的主界面由五个主要组件组成——事物、设备、仪表板、集成和模板,如图 3.1所示。每个组件都有其自身的属性,这些属性将在本节中详细讨论。

图 3.1 – Arduino IoT Cloud 组件
在每个项目中,事物、设备和仪表板都高度耦合。例如,即使是小型项目,我们也需要一个事物和一个设备来连接到云平台。仅仅配置一个事物和一个设备就足够了吗?不——仪表板也是必需的,用户可以通过仪表板向事物输入,系统也可以通过仪表板向用户展示事物数据以供可视化。
然而,集成是一个更可选的组件,其用例因项目而异,只有当开发者想要将任何不兼容的设备连接到 Arduino IoT 云平台、构建自定义界面以从 Arduino IoT 云平台获取数据或与第三方服务(如Zapier和AWS 服务)集成时才会使用。
模板对初学者和专家都很好,提供现成的通用项目,包括文档、代码、云模板以及给定项目中使用的硬件列表。通过使用这些模板,你可以接触新事物,这对学习很有帮助。
在这里,我们讨论了 Arduino IoT 云平台的关键界面组件。在下一节中,我们将逐步详细讨论所有组件。本章对于所有 Arduino IoT 云平台功能来说非常重要。
设备和事物
在第二章中,我们探讨了hello world示例,其中我们使用了设备、事物和其他东西来完成示例。在本节中,我们将更详细地讨论设备和事物。
设备是一种Wi-Fi/LoRa启用型微控制器,它充当 Arduino IoT 云平台和传感器之间的桥梁。Arduino IoT 云平台有一个非常具体的兼容开发板列表。遵循support.arduino.cc/hc/en-us/articles/360016077320-What-devices-can-be-used-with-Arduino-IoT-Cloud查看完整的兼容板列表。除了这些官方板子之外,ESP8266和ESP32板也与物联网云平台兼容,它们是非常低成本且广泛使用的开发板。对于LoRaWAN爱好者来说有好消息——任何品牌的 LoRaWAN 节点都与 Arduino IoT 云平台兼容。
现在,是时候查看设备页面了。在仪表板上点击设备菜单。在这个页面上,我们有三个主要部分。第一个是搜索栏,我们可以通过名称搜索设备,也可以使用四个可用的设备过滤器——设备类型、序列号、设备状态或事物。搜索过滤器为那些连接到平台上的设备数量众多的情况提供了出色的功能。第二个值得注意的部分是这个页面上的添加按钮,通过它我们将新设备附加到 Arduino IoT 云平台。第三个是设备列表表,它显示了连接到 Arduino IoT 云平台的设备及其状态,无论是在线还是离线。
从设备列表表中,我们可以看到给定设备与事物之间的关系。设备要么连接到事物,要么仍然可以与其他事物连接。一个设备一次只能连接到一个事物。除此之外,设备列表还显示了其他重要的属性,这些属性可以通过表格设置图标根据您的需求显示/隐藏。当设置为显示时,您可以在表格设置下看到许多新的属性,例如 ID、类型、完全限定板名(FQBN)、序列号、连接模块固件、最后活动时间和设备添加日期。
您也可以通过点击设备来获取所有设备属性。在上述所有设备属性中,最后活动是最重要的之一,因为它有助于衡量设备停机时间。您可以逐个删除设备,或者使用复选框选项批量删除设备。在表格设置图标下方还有一个更新图标,用于刷新设备表格列表。
重要提示
一个设备在一个一对一的关系中只能连接到一个事物。如果您想使用与任何其他事物关联的设备,那么在将其与新事物关联之前,必须先从先前关联的事物中分离该设备。
事物的概念有点像包含牛排、蔬菜、土豆泥等食材的菜肴。事物包含云变量、网络连接和设备,并负责管理代码和元数据,例如设备时区和事物的元标签。
现在,是时候在 Arduino IoT Cloud 中更深入地探索事物了。以下图表总结了整个事物界面:

图 3.2 – 事物界面
让我们从点击事物菜单开始,探索事物主页面(如第二章中图 2.4所示),这与设备菜单非常相似,但在搜索和事物表格列表中有一些不同。我们可以看到一个用于事物创建的创建按钮,而不是设备中的添加按钮。与设备相比,事物的搜索功能有完全不同的过滤器,允许我们通过设备、设备类型和时区来过滤事物。
由于设备和 Things 之间是一对一的关系,它只会显示一个 Things,但设备类型是一个很好的功能,可以显示具有特定设备类型的所有 Things。例如,假设我们部署了两个不同的项目,每个项目包含 25 个节点。一个项目是由MKR Wi-Fi 1010开发的,而另一个是由ESP32开发的。设备类型过滤器为您提供选项,仅筛选使用 ESP32 板型的 Things。第三个过滤器是时区,如果您在世界不同地区部署了项目,这将非常有用。要返回特定地区的设备,您只需使用这个时区过滤器即可。
默认情况下,Things 列表表为我们提供了一个包含设备、变量和最后修改属性的 Things 列表。我们可以通过点击属性列按任何属性以升序或降序重新排列列表。Things选项菜单提供了删除 Things 的选项。在设备属性中,它显示关联的设备或为您提供关联设备的选项。最后修改属性对于审计目的很有用,指示您的 Things 上次修改的时间。
除了所有这些属性之外,我们还有一些隐藏的属性,创建日期和时区,可以通过页面右侧的表格设置图标启用。如果我们为 Things 添加元标签,那么它也会出现在表格设置下。元标签将在接下来的几段中详细介绍。
是时候探索 Things 的内部选项了(图 2.5来自第二章)。点击创建按钮或点击表格中的任何 Things。在出现的页面上,您将看到三个不同的标签,设置、草图和元数据,以及以粗体字显示的 Things 名称。您也可以通过点击它来修改 Things 的名称。
设置标签用于创建云变量并将设备与 Things 关联(如果尚未链接)。对于与 Things 关联的设备,有更改/断开设备选项。最后,还有配置开发板 Wi-Fi 网络设置的选项。
第二个标签是草图,它提供了一个 Arduino Web 编辑器的迷你版本,从这里我们可以编写/修改代码,以及验证和上传到相关设备。我喜欢草图选项用于 Things,因为它帮助我们为每个设备在单独的 Thing 容器中维护代码,无需进行本地备份或代码管理。迷你云编辑器还提供了打开完整编辑器的选项。旁边是搜索图标,它打开基于 Web 的串行监视器以验证您的设备是否正常工作。
第三个标签用于事物元数据。通常,人们不会关注这些设置,但当你拥有数十个事物时,它们被用来分类并提供便于管理。在这里,我们可以添加标签来分类我们的事物。标签也出现在事物表格列表中,以及搜索栏中的过滤器选项。那么,让我们看看标签是如何工作的。一个标签由两部分组成——一部分是键,另一部分是值。键用于搜索过滤器。例如,如果你有数十个属于不同组织的设备,并且每个组织包含多个设备,那么你如何过滤特定组织的设备?答案是使用标签;你创建一个标签,其中键将是组织名称,值将是设备类型。当你输入组织名称到搜索栏时,你会看到所有与这些元标签相关联的设备。下一个选项是时区,这是根据其原生地区的时区获取事物数据的完美选项。默认情况下,它显示根据你所在位置的时间区,但你可以手动覆盖时间区。重置它将显示一些关于事物的详细信息,例如事物 ID、最后修改、最后同步和创建时间。
到目前为止,以下问题出现了:“最后修改”和“最后同步”之间有什么区别?
我建议你在继续之前先思考一下,并找到解决方案。
重要提示
让我们假设你已经为事物编写了代码,并且它与 MKR Wi-Fi 1010 设备相关联,但你已经将设备的关联更改为Arduino Nano RP2040或任何其他开发板。在这种情况下,你将获得为 RP2040 预写的代码。你将获得此代码,因为代码属于事物,而不是设备。然而,可能需要对代码进行一些小的修改,因为引脚和库在不同开发板之间是不同的。
在本节中,我们详细讨论了设备和事物页面,包括页面上的搜索选项、创建和其他选项。现在,我们将讨论仪表板,它将帮助我们创建美丽的图形用户界面来控制和显示设备数据。
仪表板
Arduino IoT Cloud 提供了非常灵活的仪表板,具有许多选项,为用户提供极佳的体验。仪表板由不同的功能组成,包括小部件,它们被分类为输入和输出,移动和网页的响应式设计选项,以及许多其他功能。以下图总结了仪表板的所有功能,这些功能将在以下章节中逐步详细讨论:

图 3.3 – Arduino IoT Cloud 仪表板
仪表盘界面与物和设备界面非常相似,但在搜索和表格方面更简单。现在让我们在物联网云的背景下检查输入/输出小部件,而不是从设备的角度来看(尽管设备是相关的,因为如果我们向物联网云提供输入,它将反过来向物提供输入,如果设备向物联网云发送输出数据,它将在仪表盘上显示)。
Arduino 物联网仪表盘提供了丰富的输入/输出小部件控制。我们将在稍后详细检查所有的小部件,而在这里,我们将讨论一些其他主要功能,例如响应式设计和数据共享和下载。
仪表盘为移动端和网页端提供响应式网格设计系统。要进入编辑模式,首先在仪表盘页面点击编辑图标(见第二章中的图 2.15),然后点击导航图标,也称为排列小部件。你可以通过调整小部件的大小或拖动它们到画布上的任何位置来修改设计。你还会在每个小部件控制上看到锁定图标,它允许你固定它们的位置。将小部件放置在适当的位置后,点击该锁定图标以固定位置。在靠近添加按钮的顶部菜单中,有一个用于移动/桌面模式的图标,用于对齐小部件。
将来会有需要与利益相关者共享这些仪表盘的时候,以便他们可以轻松地监控系统。Arduino 物联网云提供了一个安全的方式来与他人共享你的仪表盘。只需点击共享图标 - 从那里,我们可以与其他用户共享我们的仪表盘(尽管请注意,所有用户的电子邮件必须注册到 Arduino 物联网云才能参与共享)。
从云中获取传感器数据是物联网云平台的一个基本要素,因为研究人员在多种应用中使用数据,包括训练机器学习/人工智能(ML/AI)模型或在不同的平台上可视化数据,例如Google Looker和Tableau。Arduino 提供了一个功能强大的向导,可以下载所有数据或特定云变量的数据。点击下载图标,你会得到很多选项。从那里,你可以选择变量(根据你的需求,可以是单个、多个或全部)并指定日期范围。Arduino 将根据你的查询处理数据,并以 CSV 格式通过你注册的电子邮件与你共享。
在这里,我们讨论了仪表盘的不同功能,例如小部件的对齐、移动和网页仪表盘的响应式设计,以及如何下载传感器数据。在下一节中,我们将介绍集成和模板。
集成和模板
模板页面包含用于学习和实践目的的示例项目,非常适合初学者尝试不同层次的项目,从入门级到高级。每个项目都附有项目描述、硬件清单、代码和导入的云模板。在模板页面,您最初会看到一个非常小的项目列表,但更多项目可以在projecthub.arduino.cc/找到,全球的创客/专业人士在此上传他们创建的项目,并附带完整文档。
集成提供了将 Arduino IoT Cloud 与其他第三方服务以及自定义开发的应用程序连接起来的互操作性。Arduino 提供了三种与不同平台交互的方式,应用程序编程接口(API)、Webhooks和软件开发工具包(SDKs),如图所示:

图 3.4 – Arduino IoT 云集成
首先,让我们谈谈 API,因为这种技术被开发者广泛用于与不同平台交互。在 Arduino IoT Cloud 中,API 用于两个目的——第一个目的是将不兼容的设备与物联网云连接起来,包括树莓派和贝格尔骨,而第二个目的是使用不同的预定义 API 从物联网云中获取数据。这些 API 将在第八章中详细讨论。
当事物中发生指定事件时,例如云变量的更新,Webhooks 用作触发器。要设置 Webhook,您需要访问特定事物的页面,点击带有大量详细信息的JSON格式,这将在第十二章中进一步讨论。
理解 API 和 Webhooks 背后的概念非常重要。第三方应用程序使用 API 的接口从云中请求数据,但使用 Webhooks,当事物内部发生任何预定事件时,Arduino IoT Cloud 会将数据发送到特定的平台。因此,如果您开发一个警报系统,那么 Webhooks 是首选选择,因为它们在检测到事物内部任何变化时立即发送数据。相反,如果您开发的应用程序只需要定期获取数据,那么 API 是最佳解决方案。简单来说,Webhooks 就像推送请求,而 API 就像拉取请求。
Arduino IoT Cloud 团队还发布了针对不同编程语言的官方 SDK,例如JavaScript(Node.js)、Python和GoLang。SDK 通过允许开发者使用预定义函数从云中获取数据,而不是与原始 API 打交道,使开发变得简单。出于认证目的,SDK 使用 API 密钥进行访问和认证。Node.js SDK 将在第八章中详细讨论。
在本节中,我们讨论了 API、SDK 和 Webhooks。现在,我们将探索仪表板的控件。我们将 Arduino 仪表板控件分为两类,输入和输出。在下一节中,我们将首先探索完整的输入控件范围,在随后的章节中,我们将探索完整的输出控件范围。
探索输入控件
输入控件在物联网产品开发中非常重要,用户根据指标控制操作流程。用户界面/用户体验(UI/UX)领域的最新趋势和技术带来了许多不同尺寸、形状和设计的输入控件,从而提供了更好的终端用户体验。
Arduino 物联网云团队考虑了市场上的最新趋势,并提供了九种不同、令人惊叹的输入小部件,每个小部件都为用户提供以各种方式向设备输入的能力。每个小部件都链接到单个云变量;您可以将多个小部件链接到单个云变量,但数据类型必须是控件指定的类型。在以下小节中,我已经根据它们之间的相似性将输入小部件分为不同的组。
开关、按钮、滑块和步进器
让我们从最基本的输入控件小部件开始——开关、按钮、滑块和步进器。这些小部件允许用户以有效和高效的方式控制他们的设备。所有小部件均显示在图 3.5中:

图 3.5 – 开关、按钮、滑块和步进器
(on/off)并消耗布尔类型云变量。这两个控件之间的唯一区别是 UI/UX 设计。当用户点击开关控件时,它会滑动开/关并保持在同一状态,直到再次点击。按钮也保留其状态,但通过按下或释放来在开/关状态之间切换。
重要提示
要理解开关和按钮的正确工作原理,只需将这两个控件放置在仪表板上并将它们链接到相同的云变量。之后,点击按钮并释放它,然后尝试点击开关。
integer或float类型的云变量。这些控件可用于控制步进电机角度、电机速度、光强度,甚至为温度和湿度监控系统设置警报系统的阈值。例如,假设您想设置温度和湿度值的警报阈值,以及天气。这些控件将帮助您通过仪表板从利益相关者那里获取值,并在设备中处理它们,而无需修改设备代码。
在这里,我们探讨了四种不同的输入小部件控件——开关、按钮、滑块和步进器,以及它们的具体用途。现在,我们将介绍与灯光控制相关的输入小部件控件。
颜色、昏暗的光和彩色光
Arduino 引入了三个针对灯光颜色和强度控制的新小部件,开发者可以在构建智能家居的实物产品时使用。图 3.6展示了这三个小部件,它们可以帮助您控制您的智能灯泡/灯光解决方案:

图 3.6 – 颜色和灯光小部件
在这里,我们已经看到了所有关于灯光/灯泡控制的小部件控制;现在,我们将逐步讨论所有小部件,在接下来的小节中。首先,我们将从颜色小部件控制开始。
颜色
我们在这里的第一个小部件是Color类型的云变量,我们使用 Arduino 代码从最终设备输入中获取红绿蓝(RGB)颜色值。颜色小部件提供了一个 RGB 滑块来调整颜色,或者可以直接以 RGB 或十六进制格式输入所需值。这个小部件对于控制 RGB LED 颜色、RGB 灯和WS18B20模块非常有用。
以下 Arduino IDE 或 Web 编辑器的代码片段展示了如何将颜色类型云变量转换为 RGB 变量:
int red, green, blue;
RGBVariable.getValue().getRGB(red, green, blue);
RGBVariable是Color类型的一个云变量。我们必须使用 RGB 格式将我们的颜色代码输入到 RGB LED 中,因此我们将声明三个整型变量red、green和blue,并使用RGBVariable.getValue().getRGB(red, green, blue);将我们的单个云变量值转换为RGB格式。
暗淡灯光
包含开关状态和亮度值的Dimmed Light云变量。
在转向代码之前,我们首先需要了解开发板需要哪些值。这里需要两个值——开关状态和亮度级别。以下代码展示了如何从Dimmed Light云变量中获取亮度级别和开关状态:
//retrieve and map brightness value from cloud variable
int brightness = map(dimmedLightVariable.getBrightness(), 0, 100, 0, 255);
//then check if switch is on/off
if (dimmedLightVariable.getSwitch()) {
analogWrite(5, brightness); //write brightness value to pin 5
}
else{
analogWrite(5, LOW); //turn off lamp
}
要获取亮度,我们需要使用map函数将dimmedLightVariable亮度属性值转换为0至255的范围。然后,我们需要通过调用该云变量的getSwitch属性来获取开关状态。如果它是开启的,那么我们将使用引脚#5上的analogWrite函数来调整亮度;如果开关是关闭的,LED/灯将被关闭。
彩色灯光
最后,是时候使用Colored Light云变量类型来玩多彩的条带了。
以下 Arduino IDE/Web 编辑器的代码用于从Colored Light变量类型获取值。在深入代码之前,请注意,我们需要从该云变量中获取三个值——RGB 颜色、亮度级别和开关状态:
//retrieve RGB color values from cloud variable
int red, green, blue;
ColoredLightVariable.getValue().getRGB(red, green, blue);
//retrieve and map brightness value from cloud variable
int brightness = map(ColoredLightVariable.getBrightness(), 0, 100, 0, 255);
//then check if switch is on/off
bool switch= ColoredLightVariable.getSwitch();
首先,我们使用ColoredLightVariable.getValue().getRGB方法以int格式获取 RGB 颜色值。其次,我们使用ColoredLightVariable.getBrightness()方法获取亮度,并使用map方法转换值。最后,我们使用ColoredLightVariable.getSwitch()方法获取开关状态。所有这些值都存储在三个不同的变量中,可用于控制 LED/灯或 RGB 灯带功能。
在这里,我们详细讨论了智能灯/灯泡控件,包括颜色、调暗 灯光和彩色灯光小部件控件,以及它们的代码来从它们中获取和设置值。现在,我们将讨论另一个重要的输入控件,即时间选择器,它用于配置。
时间选择器(配置)
时间选择器小部件是一个非常重要的配置小部件控件,用于在设备上设置/获取时间,而无需修改设备上的代码。有了这个功能,无需实时时钟(RTC)模块就可以轻松维护设备时间。每当一个设备开启时,它将自动将设备时间与时间云变量同步。
以下截图显示了带有日期和时间的时间选择器小部件,您可以选择设置日期、时间或两者。小部件还允许您根据您的地区更改日期和时间格式。

图 3.7 – 时间选择器小部件
时间选择器小部件与Time类型云变量链接,并将所有日期和时间数据存储为秒格式。以下代码从 Arduino 云获取本地时间并将其存储在一个变量中:
CloudTimeVariable = ArduinoCloud.getLocalTime();
在获取本地时间后,您可以使用CloudTimeVariable来同步您的设备操作。在setup方法中使用前面的代码。
在本节中,我们讨论了时间选择器小部件,包括如何通过使用Time云变量类型来设置此小部件控件的时间。现在,我们将讨论另一个配置小部件控件,即调度器小部件控件,它可以帮助您设置时间来自动化物联网设备上的操作。
调度器(配置)
调度器是 Arduino 物联网云中的另一个重要实用工具,用于自动化流程。使用此小部件,我们可以自动化许多操作,无需人工干预,就像在特定时间执行进程/方法的cron 作业一样。
那么,我们可以在我们的物联网解决方案中何处使用这个调度器功能?有许多用例,包括户外灯光自动化、农业灌溉系统和家禽养殖场的动物喂食器。
以下调度器小部件的截图显示了安排我们的进程/方法的许多选项:

图 3.8 – 调度器小部件
调度器小部件使用Schedule云变量类型。在配置时,我们指定进程开始和结束的时间和日期。
以下代码片段非常简单,使用true/false接口分别启动/停止操作,而不是进入复杂的内容:
if (scheduleVariable.isActive()) {
digitalWrite(LED, HIGH); // whenever the job is "active", turn on the LED
}
else{
digitalWrite(LED, LOW); // whenever the job is "not active", turn off the LED
}
我们可以通过访问其isActive()方法来获取每个Schedule云变量的活动/非活动状态。在设备循环中使用上述代码 – 如果Schedule云变量是活动的,则执行给定的过程/方法;否则,停止它们。为什么我们需要在循环中执行前面的代码片段?因为loop()方法是 Arduino 的主要方法,它总是执行。
在本节中,我们详细讨论了调度器,讨论了此小部件使用的云变量类型,以及如何访问调度器状态以执行特定任务。这是输入小部件中的最后一个控制。现在,我们将查看输出控制小部件。在下一节中,将详细讨论所有输出控制,以便您更好地了解如何在您的专业项目中实现这些控制。
深入探讨输出控制
在前面的章节中,我们讨论了输入小部件控制。Arduino IoT Cloud 仪表板还具备令人惊叹的输出控制。这里有九个小部件(尽管有两个是非设备小部件 – 消息传递和便签)。
值、状态、仪表、百分比和 LED
让我们从开发者几乎在每种解决方案中都常用的基本输出小部件开始。这些输出小部件用于以数值或图形格式显示单个值。图 3.9显示了所有主要和基本输出控制小部件:

图 3.9 – 值、状态、LED、仪表和百分比小部件
在本节中,我们将详细讨论五个不同的输出小部件控制,分别在不同的部分进行。首先,我们将从值小部件控制开始。
值
integer类型变量,但我还用time变量测试过,它工作得很好,因为time变量以秒为单位存储所有信息。您还可以使用值小部件控制为传感器设置阈值,自动化流程。
以下简单的代码片段从模拟引脚#0 读取值并将其存储在valueCloudVariable中:
valueCloudVariable = analogRead(A0);
在这里,我们讨论了值小部件控制,它用于输入和输出目的。现在,我们将探索状态和 LED 控制小部件。
状态和 LED
我们接下来的小部件是true或false。这些小部件仅显示状态;它们不提供任何控制选项,并且它们都与bool类型云变量一起工作。这些小部件的用例包括指示事物状态(开/关) – 例如,在智能农业中水泵的状态,或者在家居智能中门是打开还是关闭。只需将true/false分配给与状态小部件链接的bool云变量类型,在执行特定任务后即可。
以下示例代码演示了如何更改 statusCloudVariable 的值以更改状态/LED 小部件的外观:
Void loop(){
digitalWrite(1,HIGH);
statusCloudVariable=true; //Assign true to Status Widget
delay(5000);
digitalWrite(1,LOW);
statusCloudVariable=false;//Assign false to Status Widget
delay(500);
}
上一段代码展示了在执行 digitalWrite 操作后,我们如何根据当前条件更改 statusCloudVariable 的值以更新状态小部件。
仪表和百分比
最后,我们有 整数 或 浮点 云变量类型。比较仪表和百分比小部件,我们可以看到 UI/UX 设计上的明显差异 – 仪表使用半圆来显示传感器读数,而百分比小部件使用带有图标的完整圆圈,你可以指定当值低于或高于给定阈值时的颜色。然而,这两个小部件的工作原理本质上是一样的。仪表可以用来显示与气体相关的读数,例如空气质量、二氧化碳水平、温度等,而百分比小部件最适合显示湿度、电池水平、光敏电阻 (LDR) 值等。
这里,我没有提供仪表和百分比小部件的示例代码,因为它们与前面的例子非常相似 – 只需将传感器的值分配给仪表和百分比关联的云变量。
重要提示
作为一个小练习,创建一个名为 MultiDimmVariable 的整型变量,并在仪表板上放置一个仪表、百分比和滑动条小部件。将这些三个小部件与您创建的相同 MultiDimmVariable 云变量链接。现在,您可以有点乐趣;只需改变滑动条的位置,看看仪表和百分比小部件如何反应。
在本节中,我们逐步讨论了所有主要输出控制,包括值、状态、仪表、百分比和 LED,以及它们的用法和代码。现在,我们将查看地图和图表小部件,这些是显示位置和时间序列数据最重要的两个小部件。
地图和图表
我们接下来的两个小部件非常有趣 – 一个用于显示具有特定坐标的地图,另一个用于以图表格式显示 整数/浮点 类型传感器的读数。图 3.10 展示了 地图 和 图表 小部件的控制界面。地图小部件用于使用坐标显示设备的位置,而图表小部件用于以时间序列方式显示数值。

图 3.10 – 地图和图表小部件
首先,我们将从地图小部件开始,讨论如何显示位置,然后我们将探索图表小部件来显示传感器的历史数据。
地图
有许多用例需要我们在地图上显示对象的位置,这比简单的坐标值更容易直观理解。Arduino IoT 云为我们提供了一个 location 云变量类型,它由纬度和经度值组成。对象可以是孩子、动物,也可以是送餐自行车、快递卡车,甚至是食品/蔬菜包裹。
以下代码演示了如何将纬度和经度值分配给 location 云变量:
location=Location(32.045948421308715, 72.72505696868048);
上述代码用于在您的设备从 GPS 模块 接收数据时分配位置。此地图小部件一次只能显示一个位置。如果您有多个对象需要显示跟踪,则每个对象都需要自己的地图小部件。
图表
因此,我们可以使用仪表或百分比小部件来显示传感器的当前值,但如果我们想同时显示当前值和历史数据呢?为此,图表 是您最佳的选择,它用于显示当前读数和历史读数,以便更好地可视化和比较。
integer 或 float 云变量类型,如前所述,适用于监控温度、湿度、空气质量等。只需将任何云变量与图表小部件链接即可进行数据可视化。其他用例包括光照水平、能耗以及工业中不同气体的水平。
重要提示
为了快速测试,只需将滑块和小部件图表拖放到仪表板上,并将它们与相同的 integer 云变量类型链接。之后,只需更改滑块的值,您就可以观察图表是如何工作的。
在这里,我们详细讨论了地图和图表小部件的控制面板。现在,我们将探索消息和粘性便签的控制面板。
消息传递者和粘性便签
我们最后两个小部件是 消息传递者 和 粘性便签。这两个小部件都不是必需的元素,但确实有助于使您的仪表板更具交互性。图 3**.11 展示了这两个小部件的控制面板:

图 3.11 – 消息和粘性便签小部件
在图中,第一个小部件是 消息传递者,第二个小部件是粘性便签。这两个小部件将在以下章节中讨论。
消息传递者
消息传递者 小部件的工作方式类似于任何传统的消息应用。但问题来了,为什么我们需要在仪表板上使用这个小部件呢?在我看来,它目前在任何仪表板上都不是必需的,但将来它可能成为一个很棒的部件,并激发人们开发与事物进行文本交流的产品,就像我们已经有 Amazon Echo Dot 和 Google Assistant 设备,用户可以通过语音与之交互,向设备提问,设备会以声音做出回应。
在未来,您可能会看到许多与您的设备链接的信使应用程序,您可以提出诸如“我的孩子在哪里?”等问题,与您的孩子连接的设备会向您提供其确切位置。或者,您也可以询问有关您房间内温度/湿度条件的问题,设备会提供所需的答案。
您还可以使用信使小部件为您的设备创建某种小型搜索引擎,该搜索引擎理解一些关键词并响应用户的查询。记住,早起的鸟儿有虫吃。
信使小部件与 string 云变量类型一起工作。以下简单的代码片段演示了您如何从设备端写入信使小部件:
stringMessengerVariable = "Hello Sir, My name is Arduino MKR1010 and I will be your host. How may I help you Sir?";
当您为字符串变量分配新值时,信使会将新内容附加到小部件上。以下代码用于在设备端清除整个小部件:
stringMessengerVariable = PropertyActions::CLEAR;
您还可以通过 API 或 Zapier 集成将信使小部件与第三方工具如 Slack 和 Discord 集成。
便签
便签小部件的工作方式与简单的 Windows 操作系统便签类似。它帮助您记录项目进度,或者您可以在便签上写下任何内容以维护仪表板。在您有数十个仪表板且希望对特定仪表板添加一些评论的情况下,它可以帮助您。
如需获取有关仪表板小部件控制的最新更新和详细信息,请访问 docs.arduino.cc/arduino-cloud/getting-started/dashboard-widgets。
在本节中,我们讨论了信使和便签小部件。便签小部件使得维护项目和记录项目进度或维护的评论变得容易,而信使小部件有更广泛的应用。我们还讨论了传感器数据与人工智能的关系。我们现在已经完成了所有输入和输出小部件的控制,现在,我们将深入探讨 Arduino Web 编辑器,我们将逐步探索所有选项。
理解 Arduino Web 编辑器
Arduino 还推出了一种基于 Web 的编辑器,它独立于 Arduino IoT Cloud 和桌面 IDE。它适用于与 Arduino IDE 兼容的任何板,无需通过板管理器安装板。Web 编辑器与大多数网络浏览器兼容,包括 Chrome、Firefox、Microsoft Edge 和 Safari。要使用 Web 编辑器,您的机器应安装有 Arduino Create Agent,它作为设备与 Web 编辑器之间的桥梁。所有代码都存储在云端,因此不会丢失代码或需要备份。
要访问 Arduino Web 编辑器,请访问 create.arduino.cc/editor,您将看到如下内容:

图 3.12 – Arduino Web 编辑器
上一张截图中的数字对应 Web 编辑器以下元素:
-
这是 Web 编辑器的主菜单,您将在这里找到所有导航链接,例如草图簿、示例、库和监视器。
-
此选项卡是子菜单,根据当前主菜单选择显示选项/内容。在截图中,此选项卡显示与草图簿相关的内容。
-
此区域是编码/草图区域,您可以在此找到所有与代码相关的选项,例如代码验证/上传、板选择和代码编辑器。
-
此选项卡是输出终端,它为您提供有关代码上传状态、代码中发现的任何错误等信息。
在这里,我们讨论了 Arduino Web 编辑器界面。现在,我们将详细讨论草图簿、示例、库、监视器、参考和帮助菜单,以及首选项和功能菜单。我们将深入讨论所有选项,以便您对 Arduino Web 编辑器有一个更全面的了解,让您在开发过程中充分利用其功能。
草图簿
此菜单选项负责草图组织、创建、代码下载和上传等。

图 3.13 – Arduino Web 编辑器草图簿
上一张截图中的数字对应草图簿屏幕上的以下元素:
-
新建草图按钮用于为新的项目初始化一组新文件。此按钮右侧有两个图标 – 第一个用于创建项目组织文件夹,第二个用于在需要时将任何现有的 Arduino IDE 代码/库导入 Web 编辑器。
-
这里您可以找到所有您的草图/文件夹,您还可以使用搜索栏帮助搜索您的草图簿。
-
用于验证代码的图标是滴答图标,而用于将代码上传到开发板的图标是箭头图标。从这些图标右侧的下拉菜单中,您可以选择开发板和端口。最后,省略号按钮包含一系列关于草图的操作选项,例如保存、另存为、重命名草图和下载草图。
-
此区域是开发者的游乐场,用于编写设备代码。在这里,您可以在屏幕右侧找到两个图标,第一个用于使代码编辑器全屏,而第二个用于代码缩进。
-
这是输出终端,您可以在此获取有关代码编译进度和代码中发现的任何错误的所有信息。
示例
Arduino IDE 的顶级功能之一是 示例,这是初学者的一大资源,他们可以从库和传感器开发者提供的示例中受益。这在 Arduino Web 编辑器中作为一个独立的菜单呈现。图 3**.14 展示了 示例 菜单,其中有两个不同的标签页。第一个标签页显示 内置 示例,而第二个标签页显示 来自库 的示例。

图 3.14 – Arduino Web 编辑器示例
当你点击 示例 菜单时,下一个标签页将显示,显示内置或来自库的示例选项。所有示例都组织在不同的类别中,就像在 Arduino IDE 中一样。你还可以使用搜索栏查找来自特定库的示例。默认情况下,Arduino Web 编辑器仅显示特定开发板的示例和库。前面的截图仅显示与 MKR Wi-Fi 1010 兼容的示例,但你可以点击 MKR WIFI 1010 链接切换到 所有板,反之亦然。
库和库管理器
Arduino 平台上有成千上万的库,由世界各地的开发者和传感器及模块制造商开发。这些库为 Arduino IDE 中的传感器/模块提供了广泛的集成可能性,默认情况下还提供了示例代码。库是初学者和专业开发人员学习的主要来源。图 3**.15 展示了 库 菜单,其中包括不同的选项,如 库管理器,它帮助我们安装库,以及 默认、收藏和自定义标签页,这些将在逐步讨论中详细介绍:

图 3.15 – Arduino Web 编辑器库
在 Arduino Web 编辑器中,我们可以访问大量预安装的库,并且可以将库标记为收藏并包含在我们的代码中。当我们打开 库 菜单选项时,我们将看到上述三个主要标签页 – 默认、收藏和自定义。默认标签页显示由 Arduino 团队和验证合作伙伴开发的库。收藏标签页包含你在库管理器中标记为收藏的库。如果你找不到特定于你工作的库,那么你可以通过点击 自定义 标签将你自己的库导入 Arduino Web 编辑器。
库管理器包含来自世界各地的库的完整列表。要将库添加到你的项目中,而这些库在 默认 标签页中找不到,只需点击 库管理器,就会弹出一个新窗口,你可以通过库的名称或公司名称搜索库。找到后,通过点击星形图标将其标记为收藏。
监视器,又称串行监视器
串行监控器在过程执行、传感器测试和代码调试的验证中起着至关重要的作用。它的工作方式类似于网络浏览器中的控制台,开发者根据他们的需求打印消息以验证过程。在 Arduino Web 编辑器中,它已被重命名为监控器。

图 3.16 – Arduino Web 编辑器 | 监控器
点击监控器链接仅在系统连接了板子时才会激活监控器。确保您的 Arduino Create Agent 也正在后台运行。在监控器屏幕的顶部,您将看到开发板的名称以及它连接的端口名称/编号。
接下来,设置Serial.begin()方法。开发者通常使用 9600 波特率进行串行通信。监控器下半部分的较大文本区域显示了设备与开发者之间的所有通信。默认情况下,此窗口中启用了自动滚动,因此新消息将自动显示。
参考、帮助和偏好设置
Delay函数;只需找到并点击Delay()方法,它将显示描述,包括示例语法和代码,以便更好地理解。
帮助菜单提供了关于产品更新和其他许多新信息。信息分为三个标签页,信息、教程和词汇表。信息标签页提供了有关版本、兼容性和错误修复的最新更新。教程标签页包含链接到小型项目,帮助初学者学习新知识。词汇表就像一本书中的词汇表一样,但在这里,您将获得与 Arduino、电子、传感器等相关特定列表。
最后,我们来到了偏好设置菜单,从这里我们可以修改 Web 编辑器的主题和字体大小,显示/隐藏输出面板,以及设置代码自动保存或手动保存。
Arduino IoT Web 编辑器功能
在 Arduino IDE 中,我们没有关于草图创建、编译或存储的限制,但在 Arduino Web 编辑器中,我们确实遇到了一些限制。这是因为,在桌面机器上的 Arduino IDE 中,我们使用自己的资源,但与 Web 编辑器相关的所有内容都托管在云端。在云端,所有东西都必须付费,包括代码验证和编译的存储、处理器和内存使用。
因此,Arduino Web 编辑器在存储大小、草图和编译方面有一些限制和限制。Arduino 为不同类型的订阅者提供了不同的资源配额,购买前应与其他计划进行比较。访问cloud.arduino.cc/plans获取完整详情和计划比较。

图 3.17 – Arduino Web 编辑器限制和用法
上一张截图显示了 Web Editor 功能的相关统计数据。首先,我们可以看到从订阅计划中提供的总存储空间中使用了多少。我的 Maker Pro 计划总共有 1,000 MB 的存储空间。截图还显示了可以创建多少个草图,以及最后允许进行多少次编译。在我的情况下,我拥有无限量,但免费计划只允许每天存储 100 MB 的草图空间,并且每天限制 25 次编译。
重要提示
Arduino Web Editor 的功能可能会随时间而变化,请访问官方网站获取最新信息:cloud.arduino.cc/plans。
在这里,我们深入讨论了新 Arduino Web Editor 中的不同选项,这将帮助您在开发项目中有效地使用编辑器,提高您的生产力。接下来的“任务”部分涵盖了不同的问题,这将帮助您测试在本章和通过互联网搜索中学到的知识,并帮助您有效地利用您的新技能。
任务
与前几章相比,本章篇幅更长,因为我们希望为您提供 Arduino IoT Cloud 及其主要支柱的深入概述,包括事物、设备、仪表板、集成和模板,进而过渡到后续章节。在本章中,我们详细讨论了仪表板、输入和输出控件以及 Arduino Web Editor。为了巩固您在本章学到的知识,我们为您创建了三个不同的任务。这些任务将帮助您理解继续阅读本书以及您在专业项目中所需的核心理念。
确保尝试所有给出的任务。
任务 1
ASNA 集团是巴基斯坦领先的 ISO 认证盐供应商组织。该组织根据国际标准加工盐,但他们面临着仓库监控的问题,他们希望保持温度/湿度符合标准,以避免成品出现质量问题。目前,他们有五个仓库需要监控。他们希望有多个视图进行数据监控和分析。在为 ASNA 集团开发解决方案时,您需要牢记以下问题:
-
首先,确定需要哪些类型的工业级传感器/开发板来满足这种监控场景。
-
是否需要对传感器进行校准?如果是,您将如何校准传感器?如果不是,请提供不强制校准的理由。
-
需要哪些类型的控件来在仪表板上可视化信息?
-
您如何在一个仪表板上可视化五个仓库的读数?
-
在仪表板上,将使用哪些类型的控件来允许用户分析覆盖长时间段的读数?
-
您将通过什么方式为公司提供对仪表板的访问?
任务 2
Imzlab Technologies Private Limited 是一家领先的智能农业解决方案提供商。该公司已在田间部署了定制设计的传感器,使用 ESP32 和 Arduino IoT Cloud 来测量土壤湿度、土壤温度和室外温度/湿度。在仪表板上,他们有不同的数据可视化小部件。他们现在有一个新的客户需求,需要集成水泵控制和显示其状态历史(开启/关闭)。客户还要求在星期一和星期四,水泵将在下午 5:00 到 7:00 之间运行,在星期日,从凌晨 4:00 到 6:00,在 GMT+5 时区。在其他日子里,水泵状态将由人工控制。在为 Imzlab Technologies Private Limited 开发解决方案时,你需要牢记以下问题:
-
需要哪些控制小部件来显示和控制水泵状态?
-
你如何为特定日期和特定时间提供自动泵控制解决方案?
-
是否可以使用图表可视化水泵的开启/关闭状态历史?如果是这样,如何?如果不是,请提供一个替代方案以满足客户的需求。
作业 3
Imzlab Technologies Private Limited 的一组研究人员正在开发一个监控系统来监测二氧化碳水平。他们正在使用 MKR 1010 和 Arduino IoT Cloud,但他们正在尝试使用由 Tingstack LLC 开发的定制传感器。在 Arduino Web 编辑器中,没有这个传感器的库,但 Tingstack LLC 为 Arduino 平台开发了一个内部库。研究人员还希望与 Tingstack LLC 团队分享他们的代码以供审查。
从上一段中识别问题,并写下它们的解决方案。
摘要
这一章就像在我们开始烹饪之前理解我们拥有的成分和厨房工具一样。首先,我们学习了 Arduino IoT Cloud 组件的工作原理,包括事物、设备、仪表板、集成和模板。然后,我们研究了所有输入/输出小部件控制,以获得它们潜在用法的适当概念,包括一些示例代码和云变量类型。在下一节中,我们检查了 Arduino Web 编辑器是什么以及其不同功能的工作方式,包括示例、库和串行监视器。你现在应该对 Arduino IoT Cloud 和 Web 编辑器的所有不同成分以及如何适当使用它们有一个很好的理解。
在开始下一章之前,这一章非常重要,因为它为你提供了 Arduino IoT Cloud 所有主要支柱的深入概述以及它们如何实时工作,这将帮助你理解 Arduino IoT Cloud 是如何工作的。Arduino 仪表板小部件对我们来说也非常重要,因为我们将在这本书的不同项目中使用不同的小部件,所以在这里提供一个概述已经为你即将到来的章节做好了准备,帮助你了解专业项目中哪些类型的事物是强制性的,以及哪些类型的控制可以使你的项目更加稳健和专业。
在下一章中,我们将开始我们的第一个项目,我们将从头开始构建一个空气质量监控系统,直到部署。你将了解为什么空气质量监测是必要的,以及需要哪些类型的开发板/传感器。我们还将使用一个印刷电路板(PCB)进行适当的部署,这将在深度解释。在必要的硬件部分之后,我们将设置 Things、云变量、设备和网络配置以及为设备编写代码,以及用于适当数据可视化的仪表板。所以,准备好即将到来的章节,这将让你们所有人都感到有趣。
第二部分:亲身体验不同的通信技术
书的第二部分描述了物联网项目中涉及的不同通信技术,并提供了四个不同的实际项目来展示它们的用法以及如何结合 Arduino IoT Cloud 采用第三方组件。
本部分包含以下章节:
-
第四章,项目#1 – 为环境感知创建一个更智能的设置
-
第五章,项目#2 – 使用 MKR GSM 1400 创建一个便携式物品追踪器
-
第六章,项目#3 – 使用 LoRaWAN 的远程警报应用
第四章:项目#1 - 智能化环境感知设置
本章将指导您了解为什么清洁的环境对人类来说是必要的,以及如何通过使用低成本ESP 系列板、不同的开源传感器和Arduino IoT Cloud来实现空气质量、温度和湿度监测。此外,您还将学习如何可视化相关数据,并使用 Arduino IoT Cloud 功能来扩展您应用程序/项目的功能。
在本章中,我们将通过展示印刷电路板(PCB)设计、其实施和在现实世界中的应用来展示如何构建实际解决方案。我们将涵盖以下主题:
-
为什么空气质量监测是必要的?
-
硬件组件 - 传感器和开发板
-
项目架构
-
设置Thing、网络凭据、云变量和代码
-
设置网页和移动端仪表板
-
接下来是什么?
技术要求
以下硬件组件是理解本章所必需的:
-
WeMos D1 MINI ESP8266
-
DHT11/DHT22传感器/模块
-
MQ-135空气质量模块
-
PCB(在PCB 设计和组装硬件 组件部分有链接)
-
女性端子
-
跳线
对于编码,我们将使用Arduino Web Editor,它包含大量开发板和传感器库,以及Arduino IoT Cloud用于 Thing 和仪表板设置。为了开发硬件和传感器设计,我们需要Fritzing桌面软件。
本章的代码可在本书的官方 GitHub 仓库中找到,或者您可以通过以下链接直接下载代码:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers/tree/main/Chapter%234%20Project%231%20Sensing%20and%20Monitoring%20the%20Air%20for%20Clean%20Environment.
为什么空气质量监测是必要的?
空气质量监测对人类来说是必要的,因为空气污染可能对我们的健康和福祉产生重大的负面影响。糟糕的空气质量可能导致各种呼吸和心血管问题,如哮喘、慢性支气管炎、肺癌和心脏病。它还可能加剧现有的健康问题,并降低我们抵抗感染和疾病的能力。
空气污染也可能影响环境,包括生态系统、野生动物和植物。受污染的空气可能导致酸雨,损害农作物、森林和水源,并危害野生动物。它还可能导致臭氧层的耗尽,这层臭氧层保护我们免受有害的紫外线辐射。
通过监测空气质量,我们可以确定污染水平高的区域,并采取措施减少暴露。这包括减少工厂、发电厂和交通部门的排放,以及鼓励使用清洁能源和交通替代方案。通过改善空气质量,我们可以帮助保护我们的健康,支持环境,并促进可持续发展。
空气质量监测是评估我们呼吸的空气中污染物水平所必需的。它有助于确定污染源,并跟踪空气质量随时间的变化。空气质量监测之所以重要,有几个原因:
-
合规性要求:许多国家已经制定了法规,限制可以排放到空气中的污染物数量。空气质量监测是确保这些法规得到遵守并确定可能需要额外法规的区域的必要手段。
-
经济关注:糟糕的空气质量会对经济活动产生负面影响,包括降低生产力、增加医疗保健成本和减少旅游业。监测空气质量可以帮助确定污染水平高的区域,并采取措施改善空气质量以支持经济增长。
总体而言,空气质量监测是保护公共健康、保护环境和促进可持续经济发展的关键工具。现在我们已经对空气质量监测进行了理论回顾,是时候实际探索这个项目了。首先,我们将从硬件开始,探索所有必需的组件,例如开发板、传感器、设计图和 PCB 设计以供实施。之后,我们将设置设备和云变量,上传代码到开发板,并设置仪表盘以进行数据可视化。
探索硬件需求
在继续前进之前,我们首先将查看完成项目所需的开发板和传感器的类型。我们的目标是使用提供 Wi-Fi 连接、体积小且成本低的板子。如果我们谈论具有 Wi-Fi 功能的开发板,那么有很多组织提供这些板子,例如Arduino、ESP32 系列和ESP8266 系列。与 ESP32 和 ESP8266 相比,Arduino 开发板如MKR Wi-Fi 1010和MKR Wi-Fi 1000价格较高。现在,我们有两个选择:我们要么选择 ESP32 或 ESP8266,并放弃 Arduino 开发板。在这个项目中,我们将使用 ESP8266 系列的 WeMos D1 Mini。尽管 ESP32 系列提供类似的功能,但它配备了低功耗蓝牙(BLE)连接,目前与本项目不兼容。因此,我们选择了 ESP8266 系列开发板,这些开发板不仅体积紧凑,而且价格更实惠。
在传感器中,有各种选项可以测量温度、湿度和空气质量。然而,我们的主要目标是提供对全球用户来说既经济又容易获得的传感器。对于温度和湿度测量,我们依赖于广泛可用且价格合理的 DHT11/DHT22 传感器。MQ-135 传感器提供广泛的检测范围,快速响应和高灵敏度。它是一种稳定且寿命长的简单驱动电路应用。这些传感器用于空气质量控制设备,适用于检测 NH3、NOx、酒精、苯、烟雾、CO2 等。它们在市场上容易获得,非常适合小型项目。
ESP8266 系列拥有多种大小和引脚数不同的开发板。在本章中,我使用 WeMos D1 Mini 开发板,因为它与其他板相比非常紧凑,当然,成本也更低,并且它提供 5V 和 3.3V 引脚。以下图是 WeMos D1 Mini 板的完整概述,并展示了所有基于 Arduino 的数字/模拟引脚编号、地线和电源引脚等:

图 4.1 – WeMos D1 Mini ESP8266
WeMos 提供了多个数字输入/输出引脚,但只有一个模拟引脚用于输入/输出操作。如果您想使用多个模拟传感器,则可以使用模数转换器。最著名的模数转换器之一是ADS1115/ADS1015 模块,它提供四个模拟引脚,有助于满足使用多个传感器的需求。
然而,对于当前项目,我们需要一个数字引脚用于DHT11/DHT22 传感器,以及一个模拟引脚用于MQ-135 空气质量传感器。WeMos D1 Mini 开发板的一个最佳特性是 5V 电源引脚,这在大多数 ESP8266 系列开发板上是不可用的。
接下来,我们将使用 DHT11 传感器来检测温度和湿度,但根据您的需求,您也可以使用 DHT22 传感器。就功能而言,DHT22 提供的检测范围比 DHT11 更广,但其成本更高。以下图表显示了两个传感器的引脚布局:

图 4.2 – DHT22 和 DHT11 引脚布局
引脚#1 是电压共集电极(VCC),与 3.3V 和 5V 都兼容。引脚#2 是一个数据引脚,可以连接到开发板上的任何数字引脚,而引脚#4 是一个地(GND)引脚,可以连接到开发板的 GND 引脚。传感器中还有一个引脚,即引脚#3,它是未连接(NC)的 – 在开发过程中我们不使用这个引脚。
下表解释了 DHT22 和 DHT11 之间的所有规格差异;最值得注意的是检测范围和检测周期:
| 型号 | DHT22 | DHT11 |
|---|---|---|
| 电源电压 | 3.3–5V | |
| 输出信号 | 通过单总线输出数字信号 | |
| 感测元件 | 聚合物电容器 | |
| 感测范围 | 湿度:0–100% RH 温度:40~80 摄氏度 | 湿度:20–90% RH 温度:0~50 摄氏度 |
| 准确度 | 湿度:± 2% RH(最大 ±5% RH)温度:<±0.5 摄氏度 | 湿度:±1% RH(最大 ± 5% RH)温度:<±2 摄氏度 |
| 感测周期 | 平均 2 秒 | 平均 1 秒 |
表 4.1 – DHT11 与 DHT22 比较
最后,我们将查看我们项目的核心传感器。MQ-135 传感器用于监测特定区域的空气质量。它是一种低成本的环境监测传感器,它可以监测广泛的参数,如烟雾、二氧化碳、氨、苯、氮氧化物和酒精。MQ-135 可以检测所有这些参数,并提供空气质量百万分之一(ppm)的值。以下图显示了 MQ-135 的形状及其引脚布局图以及 LED 和调节器的指示器:

图 4.3 – MQ-135 传感器和引脚布局
MQ-135 传感器模块由四个引脚组成,每个引脚都标有代码:模拟输出(AO)、数字输出(DO)、GND 和 VCC。该模块提供模拟和数字模式下的读数,但模拟模式最适合获取 PPM 值。该传感器在 5V 电源下运行效果更好,但您仍然可以使用 3.3V,尽管我推荐前者。MQ-135 需要 20 秒的预热才能提供更好的读数,因此请确保每隔 20 秒读取一次,或者至少在开发板首次启动后等待 20 秒。
该模块还包含一个调节器,用于控制传感器的灵敏度,可以根据环境进行调整。不同的指示表面贴装器件(SMD)LED 可用于验证模块状态,包括逻辑输出 LED和电源 LED。
理解项目架构
在前面的章节中,我们详细讨论了传感器和开发板。现在,是时候准备食谱了。在硬件开发中,在开始使用传感器和开发板之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于设计和发展有关电子项目的概念,但我们将选择 Fritzing。
在下一小节中,我们将讨论项目的电路图和设计,这将解释如何将引脚连接到开发板。在下一小节中,我们将讨论 PCB 设计和其实施,以便将产品部署到现场。
电路图和设计
我们设计的目的是清楚地了解传感器如何与开发板连接。它帮助工程师通过使用我们的设计文件在 面包板 或 Veroboard 上开发原型。设计的主要好处之一是 Fritzing 会根据你的设计在后台构建硬件原理图和 PCB 设计,设计师可以根据系统要求进行调整。以下设计提供了如何将传感器连接到开发板的全面概述:

图 4.4 – 空气质量监测系统设计
为了更好地理解,我们开发了如 图 4**.4 所示的原理图以及 表 4.2 以便于理解。引脚配置将在下一段详细讨论。
| WeMos D1 mini | MQ-135 | DHT22 |
|---|---|---|
| 5V | VCC | VCC |
| GND | GND | GND |
| A0 | A0 | - |
| D1 | - | 数据 |
表 4.2 – 传感器引脚配置表
根据设计(图 4**.4 和 表 4.2),我们从开发板到两个传感器都有共同的 5V 输出和 GND。MQ-135 传感器是一个模拟传感器,因此我们将它的 AO 引脚连接到 WeMos 开发板的 AO 引脚,而 DHT11/DHT22 是数字传感器,它们的 2 号引脚连接到开发板的 D1 引脚。
PCB 设计和硬件组件的组装
在前面的子节中,我们查看了一个非常适合使用面包板或 Veroboard 制作原型设计的方案,但如果我们想在现场部署该解决方案怎么办?Fritzing 是一个很好的工具,它提供了设计 PCB 的选项,但在你开发设计时,它会在后台自动创建 PCB 设计,这可以通过 PCB 设计 选项卡访问。自动 PCB 设计只是一个基本的封装,不适合直接生产,因此必须根据专业实践进行审查和重新排列。以下图表展示了项目的最终 PCB 设计:

图 4.5 – 空气质量监测系统 PCB 设计
开发 PCB 很容易;只需确保连接线不要与其他连接线交叉。有许多不同的 PCB 设计工具可用,如 EasyEDA、CircuitMaker 和 Altium,但多亏了 Fritzing,我才能如此轻松地创建该设计。
PCB 设计完成后,你有两个选择。首先,你可以使用 DIY 方法自行开发 PCB,这对于学习很有帮助,但不适合大规模产品。第二种方法是选择一个专业机构来专业制造 PCB。中国有许多组织提供 PCB 制造和加工服务,例如 Seeed Studio、JLCPCB 和 PCBWay。我尝试过 PCBWay,并对他们的制造和交货时间印象深刻。我已经将 PCB 设计上传到 PCBWay 项目仓库;从那里,你可以轻松选择和订购:www.pcbway.com/project/shareproject/Low_cost_Outdoor_Air_Quality_Monitoring_System_0157f1af.html。
在获得 PCB 板后,是时候焊接开发板和传感器的雌性引脚了。永远不要直接在 PCB 上焊接开发板和传感器,因为如果任何东西停止工作,那么很容易拆卸和更换。所以最终,我们有一个产品准备好了,其中传感器和开发板已经焊接在 PCB 上,以便最终部署。

图 4.6 – PCB 上的空气质量监测系统
在将雌性引脚焊接到 PCB 上后,WeMos 和其他传感器被插入到引脚中,如前图所示。在本节和前一节中,我们探讨了项目中将使用哪些类型的传感器和开发板,本节的后半部分讨论了设计,展示了传感器和 WeMos D1 Mini 之间的连接线路系统。最后,我们探讨了 PCB 设计并组装了 PCB 的所有组件。接下来,我们需要在 Arduino IoT Cloud 中设置 Thing、代码和仪表盘,为最终产品做好准备。
设置 Thing、网络凭证、云变量和代码
在设置好硬件后,是时候在 Arduino IoT Cloud 中设置 Thing 了。对于这个项目,我们需要三个云变量来从设备获取监测参数,由于基于 ESP 系列的开发板,Wi-Fi 网络设置将与 Arduino 开发板不同。以下图提供了 Thing 的概述,包括 云变量、关联设备和网络设置,这些将在下一步逐一讨论:

图 4.7 – 空气质量监测系统 Thing 设置
使用名称 Sense the Environment 创建一个新的 Thing。按照以下步骤创建变量、相关设备、网络配置,最后是代码:
-
首先,我们需要设置关于空气质量、湿度和温度的三个云变量。有关云变量的完整详细信息可在下一子节中找到。
-
之后,我们需要将设备与实体关联起来。在当前项目中,我们将使用 WeMos D1 Mini,因此向导将与 Arduino 板不同。完整的详细信息可在 关联设备 子节中找到。
-
最后,我们需要设置设备的网络配置,但这次,我们需要为 ESP 系列板提供一个安全密钥,以确保连接的安全性。Arduino 兼容的板在设备设置向导期间由 Arduino IoT Cloud 自动配置。
-
在设置云变量、设备和网络设置之后,我们将审查代码。
这里,我们概述了实体,并讨论了完成实体设置所需执行的要求步骤。
云变量
下表解释了我们在创建云变量时需要使用的变量的所有属性。整数是一个非常著名的数据类型,但我们将使用两种新的变量类型来测量湿度(CloudRelativeHumidity)和温度(CloudTemperatureSensor),分别以百分比和摄氏度为单位。接下来,请确保变量的声明与给定表格中的声明完全一致,包括大小写敏感的名称和变量类型。如果示例代码与您的命名不匹配,您需要相应地修改它。
| S# | 变量名 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | AirQuality |
int |
airQuality |
只读 | 变更时 |
| 2 | Humidity |
CloudRelative Humidity |
humidity |
只读 | 变更时 |
| 3 | Temperature |
CloudTemperature Sensor |
temperature |
只读 | 变更时 |
表 4.3 – 云变量详细信息
在这里,我们将 权限 设置为只读;尽管我们有读写选项,但在我们的项目中,我们只想从设备接收数据,而不是修改仪表板。这就是为什么使用只读模式来防止数据一致性问题的原因。更新策略 设置为 变更时,因为设备将在五分钟后发送数据,这个选项比定期更新更合适。
关联设备
在创建变量后,是时候添加设备并将其与实体关联起来。在添加设备之前,将开发板连接到计算机并打开 Arduino Create Agent 应用程序。以下图显示了 Arduino IOT Cloud 支持的不同类型的第三方板,在那个步骤中,我们将选择 ESP8266 系列板。

图 4.8 – 设备选择向导
请按照以下步骤将设备添加到 Arduino IoT Cloud:
-
在“关联设备”部分下点击选择设备按钮。
-
将会出现一个弹出窗口,其中您可以查看所有已可用的设备。如果您已经添加了您的 WeMos D1 Mini,请选择它。否则,点击设置****新设备。
-
接下来,点击第三方****设备选项。
-
从下拉菜单中选择ESP8266和LOLIN(WEMOS) D1 R2 mini,然后点击继续按钮。
-
提供设备名称并点击下一步按钮。
-
在最后的向导中,将显示设备 ID 和密钥。将密钥复制到安全的地方,因为它将在网络配置过程中使用。
在设置好设备并将其与“物”关联之后,现在是时候配置设备网络设置了。以下部分将涵盖配置设备以连接 Wi-Fi 网络的全部步骤。
网络
在将设备与“物”关联后,现在是时候配置设备通信的 Wi-Fi 设置了。填写带有Wi-Fi 名称和密码的表格:

图 4.9 – “物”的网络配置
在图 4.9 中,您将找到一个新的密钥字段。粘贴我们在设备关联过程中从系统中收到的密钥,该过程在上一个子节中解释为步骤 6。
现在,我们已经完成了设备与“物”的关联以及网络设置。下一步是理解和上传代码。以下部分将指导您通过代码。
编码
该章节的代码可在本书的官方 GitHub 仓库中找到,或者您可以通过以下链接直接下载代码:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers/tree/main/Chapter%234%20Project%231%20Sensing%20and%20Monitoring%20the%20Air%20for%20Clean%20Environment/Sense_the_Environment_feb24a
您可以通过导航到delay方法来下载代码并将其放入您的“物”中,因为它将阻塞ArduinoCloud.update()方法,然后每五分钟调用一次STHAM方法。以下代码演示了如何从dht对象中获取温度和湿度值,对于airQuality,我们简单地使用analogRead()方法。
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
temperature=0;
}
else {
//Send Temperature to Cloud
temperature=event.temperature;
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
humidity=0;
}
else {
//Send Humidity to Cloud
humidity=event.relative_humidity;
}
//Send Air Quality to Cloud
airQuality=analogRead(A0);
上述代码片段是从STHAM方法中提取的;在这里,我们只是修改了代码,以向您展示我们如何在从传感器获取值后向 Arduino IoT Cloud 发送值。
在前面的部分,我们创建了云变量。只需回忆一下云变量声明,并将传感器读数分配给这些变量。这个云变量声明可以在thingProperties.h文件中找到。因此,当你将这些值分配给这些变量时,循环中的ArduinoCloud.update()方法将自动将数据发送到云。
将代码上传到设备并验证连接性和读数。如果您想更改读数时间,只需修改interval变量的值。请确保您提供的时间以毫秒为单位,其中 1 秒等于 1,000 毫秒。
重要提示
如果您在变量声明中使用了不同的命名,那么根据您的命名方案更新代码。然而,最好您首先按照书中的所有步骤进行,然后再更改云变量名称并修改您的代码,按照这个顺序。
永远不要尝试使用delay方法,这将为ArduinoCloud.update()方法创建一个阻塞。始终使用毫秒来计算等待时间。回顾loop()方法,了解我们如何在 5 分钟后调用该方法。
Arduino IoT Cloud 仅在变量值更改时更新仪表板上的值。例如,如果温度是 30 度,并且 5 分钟后仍然相同,那么 Arduino IoT Cloud 将不会记录该值,所以如果图表上的值没有变化,请不要感到困惑。这是 Arduino IoT Cloud 的另一个好处:当您导出内容时,您将不会得到重复的数据。
我们已经成功设置了设备,包括云变量、设备关联、网络配置和代码,并将其上传到开发板。现在,是时候在下一节探索仪表板和传感器值可视化。
设置网页和移动设备的仪表板
在将代码上传到设备后,是时候为网页和移动设备设置仪表板,以便使用不同的小部件可视化数据。有关小部件及其使用的详细信息,请参阅第三章。如果您直接跳到了这一章,我建议您回到第三章,以获取小部件及其使用的详细概述,这将有助于您了解小部件的工作原理及其在不同用例中的使用。以下图示展示了使用不同小部件的读数可视化:

图 4.10 – 设备仪表板
我们有三个不同的读数,温度、湿度和空气质量。对于每个读数,我们使用不同的小部件控件来展示它们如何工作,但对于历史数据,图表是最好的小部件。
温度读数通过仪表进行可视化,湿度读数连接到百分比小部件,而空气质量读数连接到值小部件。这些小部件只能显示传感器的当前读数。然而,我们还想监控历史数据,图表是显示实时以及更早数据的最佳小部件。在这里,我们使用了三个图表,每个图表都连接到一个特定的云变量。
接下来是什么?
我们仍然有很多选项可供探索,但现在轮到你使用不同的传感器和开发板进行更多实验并从中学习。在本章中,我们只使用了两个传感器,它们只提供三个参数,但市场上有很多传感器提供广泛的性能,例如空气压力和不同气体的测量。
尝试以下传感器以增强你的实践知识,并从功能、范围和成本方面与其他传感器进行比较:
-
BMP280(压力和温度)传感器
-
MH-Z19C/D/E 系列二氧化碳监测传感器
-
MQ 系列传感器,设计用于检测不同的特定气体,包括 MQ-2、MQ-3、MQ-4、MQ-5、MQ-7、MQ-8 和 MQ-9
-
Seeed Studio SCD30(温度、湿度和 CO2)
-
Gravity:模拟电化学二氧化碳传感器(0–10,000 PPM)
摘要
在本章中,我们探讨了如何使用 DHT11、MQ-135 和 WeMos D1 Mini 开发板开发一个低成本空气质量监控系统。我们设置了“物”,这包括创建云变量、关联设备、配置网络和编写开发板代码。后来,我们创建了一个仪表板,使用不同类型的小部件可视化“物”的传感器读数,借助图表显示当前读数以及历史数据。通过这个项目,你将获得在实际中设置“物”并使用 PCB 在野外部署的信心。你已经了解了用于传感器读数和存储的新类型云变量,以及处理不同类型的仪表板小部件。
在下一章中,我们将研究物联网的 GSM 技术。我们将了解不同类型的全球物联网 SIM 卡及其使用方法。这个项目还将演示一个智能资产追踪示例,我们将使用 GPS 模块跟踪资产并将数据通过全球物联网 SIM 卡发送到 Arduino IoT 云。最后,你还将了解 Arduino IoT 云中的新小部件,用于基于 GPS 坐标可视化你的资产位置。
第五章:项目#2 - 使用 MKR GSM 1400 创建便携式设备跟踪器
本章致力于智能交通和智能远程监控。它展示了如何将支持蜂窝通信的设备集成到Arduino IoT Cloud平台,同时也提供了一个使用全球物联网 SIM 卡进行通信的示例。
在这里,我们将实际探索长期演进(LTE)技术,这些技术在远程监控和控制中非常有用,无论是涉及资产跟踪还是远程操作监控。本项目使用Arduino MKR GSM 1400开发板,它配备了最新的通信频段,并专门为工业物联网(IIoT)和物联网(IoT)用例设计。本项目实际解释了如何根据不同的用例开发基于蜂窝通信的跟踪解决方案。本章将帮助您了解蜂窝通信技术、全球物联网 SIM 卡以及使用蜂窝技术集成 Arduino IoT Cloud 的方法。到本章结束时,您将能够开发使用蜂窝技术的远程地区解决方案。
本章将涵盖以下主要内容:
-
通过物联网资产跟踪和远程控制增强操作
-
探索 GSM/LTE/NB-IoT 通信技术的优势
-
使用物联网 SIM 卡实现无缝全球连接
-
构建模块 - 物联网传感器和开发板
-
设计项目架构
-
激活物联网部署的 SIM 卡
-
配置设备、网络凭据、云变量和代码
-
创建全面的网页和移动仪表盘
技术要求
完成本章所需的硬件组件如下:
-
MKR GSM 1400/MKR NB 1500
-
一张 Hologram 全球物联网 SIM 卡
-
一款 NEO-6M GPS 模块
-
一块面包板
-
跳线
对于编程,我们将使用Arduino Web Editor,它包含大量开发板和传感器库,以及用于设备和仪表盘设置的 Arduino IoT Cloud。为了开发硬件和传感器设计,我们需要Fritzing桌面软件,以及用于 GPS 模块测试的Arduino IDE。
在本章中,我们将使用Arduino IoT SIM 卡进行通信,而不是使用本地 SIM 卡提供商。Arduino 为全球物联网 SIM 卡提供多种数据计划,可以根据需求进行选择。本章的代码可在本书官方 GitHub 仓库中找到,链接为:https://github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers。
通过物联网资产跟踪和远程控制增强操作
物联网技术对于资产追踪和远程控制与监控操作非常有用。通过在资产上安装传感器并将它们连接到中央网络,您可以实时跟踪资产的位置和状态。以下是物联网在资产追踪和远程控制与监控操作中的一些应用方式:
-
资产追踪:通过在您的资产上安装 GPS 跟踪器或 RFID 标签,您可以实时跟踪它们的位置和移动情况。这对于物流和供应链管理以及车队管理非常有用。
-
状态监控:通过在您的资产上安装传感器,您可以实时监控它们的状况和性能。这可以帮助您在问题变得严重之前识别潜在问题,并采取纠正措施以防止停机并降低维护成本。
-
预测性维护:通过分析传感器的数据,您可以使用机器学习算法预测您的资产何时需要维护。这可以帮助您在最方便的时间安排维护,并避免计划外的停机时间。
-
远程控制:通过将您的资产连接到中央网络,您可以从中央位置远程控制它们。这对于位于偏远地区或难以到达的操作非常有用。
-
远程监控:通过在您的资产上安装摄像头和其他传感器,您可以实时远程监控它们的操作。这可以帮助您快速识别潜在问题并采取纠正措施。
总体而言,物联网技术对于资产追踪和远程控制与监控操作非常有用。通过利用传感器的力量、数据分析以及机器学习,您可以提高操作效率并降低成本和停机时间。在本节中,我们讨论了使用蜂窝技术进行物联网资产追踪和远程监控。接下来,我们将介绍目前市场上可用的以及未来即将推出的不同通信技术。
探索 GSM/LTE/NB-IoT 通信技术的优势
全球移动通信系统(GSM)、LTE 和 窄带物联网(NB-IoT)都是广泛用于移动通信和物联网设备的无线通信技术。每种技术都有其自身的优缺点,选择哪种技术取决于具体需求和解决方案设计。
以下是选择 GSM、LTE 或 NB-IoT 而不是其他通信技术的一些原因:
-
广泛覆盖:GSM 和 LTE 网络覆盖范围广泛,几乎遍布全球,这使得它们非常适合全球连接。另一方面,NB-IoT 是专门为物联网设备设计的,在难以到达的地区提供更广泛的覆盖。
-
高数据速率:LTE 提供高数据速率,使其适用于需要快速可靠数据传输的应用。尽管速度较慢,但 NB-IoT 仍然比其他 低功耗广域网(LPWAN)技术提供更好的数据速率。
-
安全性:GSM 和 LTE 网络提供高安全级别,具有加密和身份验证等特性,以防止窃听和其他形式的网络攻击。NB-IoT 也为数据安全提供端到端加密。
-
兼容性:GSM 和 LTE 网络与之前的技术版本向后兼容,允许与现有基础设施无缝集成。NB-IoT 也被设计成与 LTE 网络兼容,这使得向现有 LTE 网络添加物联网功能变得容易。
-
电池寿命:NB-IoT 和其他低功耗广域网(LPWAN)技术被设计成消耗最少的电力,从而延长连接设备的电池寿命。
总体而言,GSM、LTE 和 NB-IoT 是广泛使用的通信技术,提供可靠的连接性、高数据速率、安全性和与现有基础设施的兼容性。在此,我们讨论了 GSM/LTE/NB-IoT 通信技术相对于其他无线通信技术的优势。在下一节中,我们将介绍全球物联网 SIM 卡,这是本章的主要内容支柱。
通过物联网 SIM 卡实现无缝全球连接
全球物联网 SIM 卡专门设计用于需要通过蜂窝网络连接到互联网或其他连接设备的物联网设备。这些 SIM 卡提供对多个网络的访问,允许设备在不同国家和区域之间漫游,无需在 SIM 卡之间切换。
全球物联网 SIM 卡通常提供以下功能:
-
多网络覆盖:这些 SIM 卡可以连接到多个蜂窝网络,包括 GSM、LTE 以及其他新兴技术,如 NB-IoT 和 Cat-M,以在不同地点提供可靠的覆盖。
-
空中更新(OTA)更新:许多全球物联网 SIM 卡提供商提供空中更新服务,使设备能够接收固件和软件更新,无需物理干预,提高效率并降低维护成本。
-
数据计划:全球物联网 SIM 卡提供商提供灵活的数据计划,可以根据设备或应用的具体需求进行定制。这包括数据配额、数据速度以及根据需要添加更多数据的能力。
-
安全性:全球物联网 SIM 卡通常包含加密和身份验证等安全特性,以保护数据并防止未经授权的访问。
-
管理工具:许多全球物联网 SIM 卡提供商提供基于网页的门户或移动应用程序,使用户能够监控和管理他们的 SIM 卡,包括数据使用、网络性能和账单信息。
全球物联网 SIM 卡为公司提供了一种经济实惠且灵活的解决方案,使他们能够在全球范围内部署物联网设备。它们允许无缝连接,确保设备始终连接到最佳可用网络,无论位置如何。
有许多物联网全球 SIM 服务提供商。以下是一些提供商的列表:
-
Hologram
-
Soracom
-
Arduino SIM
-
Twilio
-
Emnify
-
Aeris
-
KORE Wireless
-
Sierra Wireless
-
Teleena
-
泰雷兹集团
-
Truphone
-
UROS
-
1oT
重要提示
在从任何服务提供商购买物联网全球 SIM 卡之前,请验证它是否在您的地区工作,以及如果工作,它提供哪些类型的服务,例如 GSM、3G/4G或 NB-IoT,因为有许多地区,例如 NB-IoT 服务仍然不可用。
请注意,这并不是一个完整的列表,市场上还有许多其他物联网 SIM 卡提供商。在做出决定之前,根据您的具体需求和需求研究并比较不同的提供商非常重要。
在这里,我们详细讨论了全球物联网 SIM 卡,并列出了所有顶级全球物联网 SIM 卡服务提供商。接下来,我们将介绍完成本章项目所需的硬件和传感器类型。
建筑模块 – 物联网传感器和开发板
Arduino 系列拥有多种开发板,这些开发板在尺寸、引脚和通信技术方面各不相同。在本章中,我将使用 Arduino MKR GSM 1400 开发板,因为它体积紧凑,支持电池供电,并提供 GSM/3G/4G 的支持。图 5.1显示了 MKR GSM 1400 的引脚图。

图 5.1 – Arduino MKR GSM 1400
Arduino MKR GSM 1400 提供 7 个模拟引脚和 14 个数字输入/输出引脚,内置电池充电和 LiPo 电池连接器用于备用电源,这有助于开发者构建远程监控/操作的原型和解决方案,无需担心电源备份。有关更多详情,请访问官方网站store-usa.arduino.cc/products/arduino-mkr-gsm-1400。
Arduino 最新的开发板 MKR NB 1500 仅支持 NB-IoT、LTE-M和增强型 GPRS(EGPRS)用于短信。NB-IoT 和 LTE-M 是专门为物联网设备设计的,它们在不同地区的普及速度非常快。有关完整详情和规格,请访问store-usa.arduino.cc/products/arduino-mkr-nb-1500。有关 NB-IoT 和 LTE-M 部署的更新地区列表,请访问www.gsma.com/iot/deployment-map/。
在本章中,我们将根据 GPS 位置追踪资产。为了获取 GPS 坐标,我们将使用 GY-GPS6MV2 GPS 模块,该模块基于 NEO-6M u-blox 芯片。GPS 模块通过软件串行和硬件串行端口进行通信,但 MKR GSM 1400 提供了内置硬件串行端口,因此我们将使用 引脚 13 和 引脚 14 与 GPS 模块进行通信。
GPS 模块提供纬度、经度、卫星数量、海拔英尺和每英里速度数据。我们将将这些属性显示在仪表板上,以便进行适当的资产追踪。此模块是在中国开发的,并且以可承受的价格在市场上销售,但还有许多其他组织基于 NEO-6M u-blox 芯片开发 GPS 模块,例如 SparkFun、Seeed Studio 和 Adafruit。图 5.2 显示了 NEO-6M u-blox GPS 模块及其引脚图:

图 5.2 – NEO-6M u-blox GY-GPS6MV2 GPS 模块和引脚图
前面的图示说明了 GPS 模块的引脚布局。引脚 #1 是一个 地(GND)引脚,它与板上的 GND 相连接,而 引脚 #2 和 引脚 #3 分别是 发送(TX)和 接收(RX)引脚,分别连接到 MKR GSM 1400 的 引脚 #13 和 引脚 #14。引脚 #4 – 电压公共收集器(VCC)– 与板上的 VCC 和 5V 引脚一起工作。你可以将带有 GPS 模块的雄性接插件焊接,或者直接焊接电缆而不使用任何接插件。
重要提示
GPS 模块在户外环境中工作效果最佳。确保在测试和部署过程中没有屋顶,以便从卫星接收适当的信号。
如果你在一个实验室中使用该模块,那么 GPS 模块可能无法正常工作。记住,GPS 模块中有一个内置的灯,当你开始接收来自卫星的信号时,它会闪烁。
在本节中,我们讨论了带有 SIM 卡的 MKR GSM 1400 开发板和提供 GPS 坐标给开发板的 NEO-6M u-blox GPS 模块,我们还讨论了它们的引脚布局。接下来,我们将讨论如何将 GPS 模块与 MKR GSM 1400 开发板连接。
设计项目架构
在前面的章节中,我们详细讨论了模块和开发板。现在,是时候准备食谱了。在硬件开发中,在开始与传感器和开发板一起工作之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于设计和发展电子项目的概念设计,但在此情况下,我们将使用 Fritzing。
在接下来的两个小节中,我们将讨论原理图和项目设计,同时解释如何将引脚与开发板连接和焊接。然后,我们将进行一些测试以获取 GPS 坐标,这在将数据发送到云之前非常重要。
原理图设计和组装
您的原理图设计目的是清楚地了解传感器如何与开发板连接。原理图有助于您在面包板或Veroboard上开发原型,如图图 5**.3所示。设计的主要好处之一是 Fritzing 会根据您的设计在后台构建硬件原理图和 PCB 设计,可以根据系统要求进行调整。图 5**.3显示了如何连接 MKR GSM 1400 与 NEO-6M u-blox GPS 模块的原理图:

图 5.3 – MKR GSM 1400 和 GPS 模块原理图
图 5**.3是项目的原理图,但为了方便,我还创建了表 5.1,它展示了 MKR GSM 1400 到 GPS 模块的引脚编号和名称。
| MKR GSM 1400 板 | GPS 模块 |
|---|---|
| 5V | VCC |
| GND | GND |
| 14 TX | RX |
| 13 RX | TX |
表 5.1 – MKR GSM 1400 和 GPS 模块引脚连接列表
之前的设计提供了如何将模块连接到开发板的全面概述。根据我们的设计,我们从开发板到 GPS 模块有 5V 和 GND。GPS 模块的 TX 连接到开发板的 RX(引脚#13),GPS 模块的 RX 引脚连接到开发板的 TX(引脚#14)。表 5.1显示了引脚信息。最后,我们使用面包板构建了我们的原型,如图图 5**.4所示:

图 5.4 – 最终原型
在将公头焊接至 GPS 模块后,根据原理图连接引脚。只有一个传感器,因此没有 Veroboard 的要求。接下来,我们将使用串行监视器测试 GPS 模块,以验证我们的 GPS 模块是否正常工作并获取 GPS 值。
测试 GPS 模块数据
对于模块测试,我们需要在搜索栏中输入tinygps。

图 5.5 – TinyGPSPlus 库
在搜索后,库管理器显示了许多库。选择TinyGPSPlus库并安装其最新版本。该库附带了许多示例,但所有示例都基于软件串行。然而,Arduino SAMD板提供硬件串行,所以我修改了使用硬件串行与 GPS 模块通信的代码。
从本书官方 GitHub 仓库的章节文件夹中下载代码,打开MKR-1400-NEO-6M-GPS-Module代码,并将其上传到开发板:
while(Serial1.available()>0)//While there are characters to come from the GPS
{
gps.encode(Serial1.read());//This feeds the serial NMEA data into the library one char at a time
}
if(gps.location.isUpdated())//This will pretty much be fired all the time anyway but will at least reduce it to only after a package of NMEA data comes in
{
//Get the latest info from the gps object which it derived from the data sent by the GPS unit
Serial.println("Satellite Count:");
Serial.println(gps.satellites.value());
Serial.println("Latitude:");
Serial.println(gps.location.lat(), 6);
Serial.println("Longitude:");
Serial.println(gps.location.lng(), 6);
Serial.println("Speed MPH:");
Serial.println(gps.speed.mph());
Serial.println("Altitude Feet:");
Serial.println(gps.altitude.feet());
Serial.println("");
}
在设置中,我们初始化了Serial和Serial1。Serial用于在串行监视器上显示内容,而Serial1是用于与 GPS 模块通信的硬件串行。前面的代码属于loop()方法。
首先,GPS 模块将使用Serial1.read()方法从卫星读取数据,并通过gps.encode()方法编码数据。Serial1一次只读取一个字符,因此更新值需要一点时间。接下来,我们将使用gps.location.isUpdated()方法验证位置是否有更新。如果有变化,数据将打印在串行监视器上。
重要提示
确保你的 GPS 模块放置在一个开阔的环境中,那里有清晰的视野,没有任何障碍物,如屋顶或类似的东西,以便正确接收来自卫星的信号。
GPS 模块有一个内置的 LED 灯,当它从 GPS 接收数据时开始闪烁。
同样的代码无需修改即可在 MKR NB 1500 上运行。
图 5**.6显示了包含纬度和经度以及其他参数的 GPS 值的串行监视器:

图 5.6 – 串行监视器上的 GPS 模块数据
前面的图示显示了 GPS 模块从 GPS 卫星接收到的数据,并在串行监视器上打印出来。这些数据包括卫星数量、代表位置坐标的纬度和经度、基于当前和之前 GPS 坐标的速度(以每小时英里数MPH表示),以及以英尺为单位的海拔高度。
在本节中,我们在 Arduino IDE 中测试了 NEO-6M u-blox GPS 模块。首先,我们为该模块安装了 TinyGPSPlus 库,然后我们使用了前面代码中的开发板代码,该代码在串行监视器上显示读数。在下一节中,我们将开始全球物联网 SIM 卡的激活。
激活物联网部署的 SIM 卡
在将 GPS 模块与 MKR GSM 1400 组装并测试后,现在是时候激活 Hologram 全球物联网 SIM 卡了,它将作为设备与 Arduino 物联网云之间的桥梁。你可以从store.hologram.io/store/购买物联网 SIM 卡。它为不同行业提供不同类型的 SIM 卡,例如Hyper EUICC 物联网 SIM 卡,这是一种适用于学习项目的工业级简单 SIM 卡,并且根据开发板上的 SIM 卡槽位提供不同尺寸。你可以免费订购其试点 SIM 卡,但需要支付其运费。
在收到 SIM 卡后,请在 hologram.io 上创建一个账户,在那里您将能够激活和管理您所有的 SIM 卡。Hologram 仪表板提供了有关设备、套餐、计费和路由的数据使用详情。通过设置路由,您可以将设备数据直接发送到 Hologram 云之外的其他物联网云。然而,在我们的案例中,我们只需将 Hologram SIM 卡作为载体,将设备数据直接传输到 Arduino IoT 云,因此不需要设置路由。只需激活 SIM 卡并将其插入 MKR GSM 1400 开发板即可。
在本节中,我们讨论了如何进行 Hologram 全球物联网 SIM 卡的激活,以及 hologram.io 上为研究人员和工业界提供的不同类型的 SIM 卡。在下一节中,我们将设置 Arduino IoT 云中的物品,这包括云变量创建、设备关联、网络配置和代码。
配置物品、网络凭证、云变量和代码
在设置好硬件之后,现在是时候在 Arduino IoT 云中设置物品了。对于这个项目,我们需要四个云变量来从设备获取不同的属性。由于我们使用的是 GSM 系列板而不是 Wi-Fi,网络设置将会有所不同。图 5.7 展示了物品的完整概览:

图 5.7 – 使用 MKR GSM 1400 Thing 设置的便携式物品追踪器
使用名称 A portable thing tracker using MKR GSM1400 设置一个新的物品。然后,按照以下步骤创建云变量、关联设备、网络配置,最后是代码:
-
首先,我们需要为位置、海拔英尺、卫星数量和速度设置四个云变量。有关这些云变量的完整详情将在以下部分提供。
-
然后,我们需要将设备与物品关联起来。在当前项目中,我们将使用 MKR GSM 1400,因此向导将与用于 Arduino 板的向导相同。完整详情可在 关联设备 部分。
-
最后,我们需要为设备设置网络配置,但这次,我们需要为 GSM 板提供不同的设置,这将在 网络 子节中介绍。
在这里,我们讨论了在物品创建过程中将涉及哪些步骤。在接下来的子节中,我们将逐步创建云变量、将设备关联到物品,并在单独的子节中设置网络配置。
云变量
以下表格解释了我们在创建云变量期间需要使用到的所有属性。对于 位置,我们需要两个不同的变量来存储纬度和经度,但多亏了 Arduino IoT Cloud 扩展变量组,我们有一个 位置 类型的变量。接下来,确保每个变量与表中的声明相匹配;否则,你需要根据你的命名修改示例代码。
在 表 5.2 中,在创建云变量期间,我将权限设置为 只读。虽然我们有读写选项,但在本项目,我们只想从设备接收数据而不是在仪表板上修改它。这就是为什么使用只读模式的原因——以防止数据一致性出现问题的更新策略设置为变更时,因为设备会在 GPS 模块从卫星接收到新数据时发送数据。
| # | 变量名 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | AltitudeFeet |
Float |
altitudeFeet |
只读 | 变更时 |
| 2 | 位置 |
CloudLocation |
location |
只读 | 变更时 |
| 3 | SatelliteCount |
Int |
satelliteCount |
只读 | 变更时 |
| 4 | Speed |
Float |
speed |
只读 | 变更时 |
表 5.2 – Thing 的云变量列表
在本节中,我们讨论了本项目所需的云变量类型。在这里,我们列出了四种不同类型的云变量,但处于只读模式,因为我们只想从设备中获取值。在下一个小节中,我们将关联 MKR GSM 1400 与 Thing。
关联设备
在创建变量之后,是时候添加设备并将其与 Thing 关联了。在添加设备之前,将开发板连接到计算机并打开 Arduino Create Agent 应用程序。图 5.8 显示了一个弹出窗口,其中我们有两个选项:选择现有设备进行关联或设置列表中不可用的新设备:

图 5.8 – 关联设备
在我们的案例中,我们已经在门户中有了不同的设备,但我们要添加一个新的 MKR GSM 1400 设备,所以只需点击 设置新设备 来在账户中配置新设备。
然后,你将在弹出窗口中看到两个选项(图 5.9)。第一个选项是设置 Arduino 板,第二个选项是设置第三方设备。在这里,你将在两个选项下方看到一个备注,兼容设备 (
),这意味着你只能使用某些类型的 Arduino 设备以及 Arduino IoT Cloud 中的第三方设备。

图 5.9 – 选择开发设备
根据可用的设备,我们可以从弹出菜单中选择任何一个选项。然而,在这种情况下,请点击设置 Arduino 设备的选项,因为在本章中,我们将使用 MKR GSM 1400 板。在添加设备之前,请确保 Arduino Create Agent 在您的机器上运行。
在本小节中,我们将 MKR GSM 1400 开发板与“物”关联起来。接下来,我们将在“物”选项卡中配置网络设置。
网络
在将设备与“物”关联后,是时候配置设备通信的网络设置了。这些网络设置与 Wi-Fi 网络设置不同。MKR GSM 1400 和 MKR NB 1500 开发板都使用 SIM 技术进行通信。因此,它们的网络配置不同,并且将根据 IoT SIM 卡服务提供商而变化。以下图(图 5**.10)显示了 MKR GSM 1400 的“配置网络”弹出窗口,由于蜂窝通信,它与 Wi-Fi 配置完全不同:

图 5.10 – MKR GSM 1400 的网络配置
目前,我们正在使用 Hologram 全球 IoT SIM 卡,并且只需在prepay.pelion、0000和arduino下提及hologram。在使用任何其他全球 IoT SIM 卡之前,首先获取其 APN 信息以正确设置网络。
在这里,我们讨论了 Arduino MKR GSM 1400 的网络配置,包括 APN、PIN、用户名和密码。在下一节中,我们将介绍开发板的代码。
编码
本章的代码可在本书的官方 GitHub 仓库中找到。下载A_portable_thing_tracker_using_MKR_GSM1400_apr07a.zip并将其导入到 Arduino Web Editor 中。
您可以通过导航到setup()方法下载代码并将其放入您的“物”中;请记住,永远不要尝试使用delay方法,因为它将阻塞ArduinoCloud.update()方法:
TinyGPSPlus gps;
unsigned long previousMillis = 0;
const long interval = 30000; //milliseconds
在前面的代码片段中,我们声明了gps实例和两个变量,这些变量将在读取下一个值之前等待 30,000 毫秒(30 秒)而不阻塞代码。
接下来,我们将转向loop方法。在这里,我们每 30 分钟调用一次FetchGPS()方法,这是通过比较currentMillis和previousMillis而不使用delay来完成的:
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
//speed=currentMillis;
FetchGPS();
previousMillis = currentMillis;
}
在以下代码片段中,我只是从FetchGPS()方法中选取了一小部分代码。在这里,我将 GPS 模块的最新值分配给 Arduino 云变量,这些变量将用于向云端发送数据以及在串行监视器上打印数据:
if (gps.location.isUpdated())
{
altitudeFeet = gps.altitude.feet();
satelliteCount = gps.satellites.value();
speed = gps.speed.mph();
location = Location(gps.location.lat(), gps.location.lng());
Location cordinates = location.getValue();
.
.
.
}
将代码上传到设备,并打开 Arduino Web Editor 的串行监视器以验证值。在成功将数据上传到云端后,是时候为最终用户设置一个漂亮的网页和移动仪表盘了。
重要提示
如果你变量声明中使用了不同的名称,那么根据你的命名方案更新代码。然而,最好首先按照书中的所有步骤进行,然后再更改云变量名称,分别修改你的代码。
永远不要尝试使用 delay 方法,这将为 ArduinoCloud.update() 方法创建一个阻塞。
Arduino IoT Cloud 仅在变量值更改时在仪表板上更新一个值。例如,如果设备的 GPS 位置在一段时间后保持不变,那么这意味着设备没有移动。然后,Arduino IoT Cloud 不会记录该值,所以如果地图上的值没有变化,请不要感到困惑。这个功能的另一个好处是,当你导出内容时,你不会得到重复的数据。
相同的代码在 MKR NB 1500 上无需修改即可工作。然而,在这里,你需要将 MKR NB 1500 设备与 The Thing 相关联,而不是 MKR GSM 1400。
创建全面的网页和移动仪表板
将代码上传到设备后,是时候为网页和移动设备设置仪表板,使用不同的小部件可视化数据了。以下图示展示了使用不同小部件的读取数据可视化:

图 5.11 – The Thing 仪表板
我们有来自 GPS 模块的四个读取值用于可视化;在这里,我使用了三个小部件,location 变量。目前,地图小部件只能根据坐标显示资产设备的位置;如果你有多个资产需要跟踪,那么你需要根据跟踪设备的数量设置多个地图小部件。
好吧,这是我们章节的最后一部分。在这里,我们创建了一个令人惊叹的 GPS 跟踪仪表板,它使用仪表板上的地图小部件显示位置,每英里的速度,以及其他一些参数。
接下来是什么?
我们还有很多选项可供探索,但现在是你使用不同的传感器和开发板进行更多实验并从中学习的时候了。在当前章节中,我们只使用了一个 GPS 模块,它只提供了四个参数,但在市场上,有很多 GPS 模块提供广泛的性能;它们在屋顶下以及晴朗的天空下都能工作,并且具有多个精度功能。
在监控资产位置的同时,不同行业中还有一些其他重要参数需要监控,例如温度和湿度,这在食品和医疗产品中非常重要。在燃料运输期间,监控 CO2 和 LPG 气体非常重要。尝试使用带有 GPS 模块的不同传感器,为不同行业设置不同的跟踪原型。
摘要
在本章中,我们探讨了如何使用全球物联网 SIM 卡和 GPS 模块开发一个基于 GPS 的跟踪系统。我们设置了“物”,包括创建云变量、设备关联、GSM 网络配置以及编写开发板代码。随后,我们创建了一个仪表盘,使用不同类型的控件来可视化“物”的读数,其中本章最重要的控件是地图控件。这是一个非常有趣且重要的控件,用于显示物联网设备的 GPS 坐标位置。
GPS 跟踪是本章中我们讨论的一个重要方面,它帮助我们开发用于资产跟踪的设备,这将有助于我们在资产跟踪和监控方面。本章演示了如何在仪表盘上显示设备的地理位置,这为您构建更多关于资产跟踪的解决方案提供了信心。在下一章中,我们将探讨另一种长距离通信技术,称为LoRaWAN。我们将使用这项技术来构建远程监控偏远地区的解决方案,并将该技术与 GSM/4G/LTE 和 NB-IoT 技术进行比较,以提供适当的指导。
第六章:项目 #3 – 基于 LoRaWAN 的远程资产跟踪应用
本章致力于智能交通和智能远程监控,使用低功耗和长距离通信技术。本章中的项目将引导您实现和部署一个基于长距离广域网络(LoRaWAN)的远程报警应用,连接到公共、全球和去中心化的 The Things 网络。本章中的项目通过使用 GPS 模块提供定位功能。Arduino IoT Cloud将用于数据可视化和设备的远程配置。该应用将用于实际案例,展示 LoRaWAN 技术相较于其他无线技术提供的优势。
在这里,我们将实际探索 LoRaWAN 技术,这些技术在远程监控和控制中非常有用,无论是资产跟踪还是远程操作监控。本项目使用Arduino MKR WAN 1300开发板,该板配备了最新的通信频率,433/868/915 MHz US/EU。它专门为物联网(IoT)和工业 4.0用例设计。本项目解释了您如何实际开发基于 LoRaWAN 通信的跟踪解决方案,适用于不同的用例。
在本章中,我们将涵盖以下主要主题:
-
理解 LoRaWAN 及其物联网应用
-
LoRaWAN 与其他通信技术的比较
-
LoRaWAN 物联网应用组件
-
必备硬件 – 传感器和开发板
-
设计项目架构
-
设置 Thing,添加设备,云变量和代码
-
配置 The Things 室内网关
-
创建网页和移动仪表板
技术要求
完成本章练习所需的以下硬件组件:
-
MKR WAN 1300 或 MKR WAN 1310
-
The Things 室内网关
-
NEO-6M u-blox GPS 模块
-
面包板
-
跳线
编码时,我们将使用Arduino Web Editor,它包含大量开发板和传感器库,以及用于 Thing 和仪表板设置的Arduino IoT Cloud。为了开发硬件和传感器设计,我们需要Fritzing桌面软件,以及用于 GPS 模块测试的Arduino IDE。
在本章中,我们将使用The Things 室内网关进行 LoRaWAN 通信。本章中使用的代码可在本书的官方 GitHub 仓库中找到,通过以下链接:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers。
理解 LoRaWAN 及其物联网应用
LoRaWAN 是一种专为低功耗广域网(LPWANs)设计的无线通信协议和网络架构,它使得在物联网环境中设备之间能够进行长距离通信。LoRaWAN 技术针对需要低数据速率、长电池寿命和长通信范围的应用进行了优化,使其非常适合各种物联网用例。
在物联网中的应用
由于其独特的特性,LoRaWAN 已被广泛应用于各种物联网应用。以下是一些常见的用例:
-
智能农业:LoRaWAN 可用于土壤湿度监测、作物健康监测、牲畜追踪和精准农业,帮助农民优化他们的操作并提高产量
-
智能城市:LoRaWAN 可以启用智能街灯、废物管理、停车管理和环境监测,帮助城市变得更加高效和可持续
-
工业监控:LoRaWAN 可在工业环境中监测设备健康、追踪资产并改善供应链管理,从而提高维护实践并减少停机时间
-
公用事业:LoRaWAN 可用于智能电表,并远程监控公用事业基础设施,如水和燃气表,提高计费准确性和资源管理
-
环境监测:LoRaWAN 可以支持空气质量监测、水质监测和野生动物追踪等应用,帮助研究人员和组织收集有价值的环保数据
-
资产追踪:LoRaWAN 能够实时追踪资产,如货运集装箱、车辆和贵重设备,确保其安全和高效利用
总体而言,LoRaWAN 的长通信范围、低功耗和可扩展性使其成为构建覆盖大面积并连接各种应用的物联网网络的强大技术。
在本节中,我们讨论了 LoRaWAN 在物联网领域的不同应用案例,在下一节中,我们将讨论为什么选择 LoRaWAN 而非其他通信技术。
LoRaWAN 与其他通信技术的比较
LoRaWAN 相较于其他通信技术具有多项优势,使其成为某些物联网应用的优先选择。以下是选择 LoRaWAN 而非其他替代方案的一些原因:
-
长距离:LoRaWAN 提供了卓越的长距离通信能力,使得设备能够在开阔地区进行数公里的通信。这对于需要在大距离范围内连接的应用尤其有用,如农业、环境监测和资产追踪。
-
低功耗:使用 LoRaWAN 的设备可以在非常低的功耗下运行,延长电池寿命数年。这对于偏远或难以到达的地方至关重要,在这些地方更换或充电电池不切实际或成本高昂。
-
深度室内穿透:LoRaWAN 能够有效地穿透建筑物和其他障碍物,确保即使在具有挑战性的环境中也能保持连接。这使得它适用于智能楼宇管理和室内资产跟踪等应用。
-
成本效益:实施和维护 LoRaWAN 网络通常比部署传统蜂窝网络更具成本效益。这使得 LoRaWAN 成为寻求在大规模部署物联网解决方案的企业和组织的一个可行的选择。
-
可扩展性:LoRaWAN 网络能够在单个网络中处理大量的设备。这种可扩展性对于涉及高密度设备的物联网应用至关重要,例如智能城市部署。
-
低数据速率应用:LoRaWAN 针对传输少量数据且数据速率较低的应用进行了优化。对于涉及传感器数据、仪表读数和定期更新的物联网用例,LoRaWAN 提供了一个合适且高效的通信解决方案。
-
网络灵活性:LoRaWAN 支持公共和私有网络的部署。组织可以选择建立自己的私有 LoRaWAN 网络或使用现有的公共网络,这为他们提供了在所有权和控制方面的灵活性。
-
自适应数据速率:LoRaWAN 设备可以根据信号强度和干扰调整其数据速率,优化当前条件下的通信。这种自适应功能提高了可靠性并确保了可用资源的有效利用。
-
全球标准:LoRaWAN 是一个全球标准,与其兼容的设备可以在不同地区和国家无缝运行。这种标准化简化了国际项目的设备开发和部署。
-
多样化的应用:LoRaWAN 的通用性使其能够在各种应用领域中使用,从农业和工业监控到智能城市和环境传感。
虽然 LoRaWAN 提供了这些优势,但重要的是要注意,没有一种通信技术是普遍优越的。在 LoRaWAN 和其他技术(如蜂窝、Wi-Fi、蓝牙或 Zigbee)之间的选择取决于物联网应用的具体要求,包括范围、功耗、数据速率、成本和可扩展性等因素。每种技术都有其优势和劣势,选择应基于对项目需求的仔细分析。
在本节中,我们讨论了使用 LoRaWAN 的好处。在下一节中,我们将探讨 LoRaWAN 的重要组件。
LoRaWAN 物联网应用组件
LoRaWAN 是一种无线通信协议和网络架构,旨在实现物联网设备之间的长距离、低功耗通信。它专门针对需要延长电池寿命、可靠的长距离通信和高效无线频谱使用的设备进行设计。LoRaWAN 是 LPWAN 领域的关键技术之一。图 6.1展示了 LoRaWAN 解决方案的整体架构,包括终端节点、网关、网络服务器和应用服务器。

图 6.1 – LoRaWAN 网络的组件
LoRaWAN 架构由四个主要组件组成:
-
终端节点/设备:这些是物联网设备,从传感器收集数据或执行特定任务。它们使用 LoRa 调制技术与网关通信,以低数据速率发送数据包。
-
网关:网关作为中间点,接收来自终端设备的数据包并将它们传输到集中式网络服务器。它们通常通过有线或无线连接连接到互联网。
-
网络服务器:网络服务器负责管理网关和终端设备之间的通信。它处理诸如身份验证、加密以及将数据包路由到相应的应用服务器等功能。
-
应用服务器:应用服务器负责处理从网络服务器接收到的数据,并根据数据执行特定操作。它与终端用户的客户端或后端系统接口,以展示数据、触发警报、执行分析或控制设备。应用服务器可以托管在云端或本地。
在本节中,我们详细讨论了 LoRaWAN 组件,在下一节中,我们将探讨执行本章实际练习所需的硬件和传感器。
必要硬件 – 传感器和开发板
Arduino 系列拥有多种开发板,尺寸、引脚和通信技术各不相同。在本章中,我们将使用 Arduino MKR WAN 1300 开发板,因为它体积紧凑、支持电池供电,并提供支持全球不同地区的不同频率,包括 433/868/915 MHz。图 6.2展示了 MKR WAN 1300 的引脚图。

图 6.2 – Arduino MKR WAN 1300
Arduino MKR WAN 1300 提供七个模拟引脚,以A开头(A0、A1等),以及八个数字输入/输出引脚,以D开头(D0、D1等),内置电池充电和锂聚合物(LiPo)电池连接器用于备用电源,这有助于开发者构建远程监控/操作的原型和解决方案,无需担心电源备份。有关进一步更新和最新产品开发新闻,请访问官方网站store.arduino.cc/products/arduino-mkr-wan-1300-lora-connectivity。
Arduino 最新的开发板是 MKR WAN 1310,它包含与 MKR WAN 1300 相同的 LoRa 通信处理器和模块。然而,MKR WAN 1310 具有更新的内置电池充电器、2 MB 的串行外设接口(SPI)闪存和增强的功耗。该板专门为物联网设备设计,并在不同地区迅速增长。有关其完整详情和规格,请访问store.arduino.cc/products/arduino-mkr-wan-1310。
在本章中,我们将通过 GPS 坐标追踪设备。为了获取 GPS 坐标,我们将使用基于 NEO-6M u-blox 芯片的 GY-GPS6MV2 GPS 模块。该 GPS 模块可以在软件串行和硬件串行上运行,但 MKR WAN 1300 提供了内置的硬件串行,因此我们将使用ins 13和14与图 6**.3中所示的 GPS 模块进行通信。
GPS 模块提供纬度、经度、卫星数量、海拔英尺和每英里速度属性。这些属性将在仪表板上显示,以便进行适当的资产追踪。该模块是在中国开发的,价格实惠,但许多其他组织也在开发基于 NEO-6M u-blox 芯片的 GPS 模块,例如 SparkFun、Seeed Studio 和 Adafruit。图 6**.3显示了 NEO-6M u-blox GPS 模块及其引脚图:

图 6.3 – GY-GPS6MV2 NEO6MV2 GPS 模块和引脚图
上述图示描述了 GPS 模块的引脚布局。引脚#1是GND引脚,它与 MKR WAN 1300 板上的 GND 引脚相连。引脚#2和引脚#3分别是TX和RX,将分别连接到 MKR WAN 1300 的引脚#13和引脚#14。引脚#4,VCC,与板上的 VCC 和 MKR WAN 1300 的 5V 引脚兼容。您可以使用带有 GPS 模块的雄性引脚或直接焊接电缆而不使用任何引脚。
重要提示
GPS 模块在户外环境中表现最佳。确保在测试和部署期间没有屋顶阻挡,以便正确接收来自卫星的信号。
如果你是在实验室中使用该模块,那么 GPS 模块可能无法正常工作。请记住,GPS 模块上有一个内置的灯,当你从卫星接收到信号时,它会开始闪烁。
在本节中,我们详细讨论了开发板和 GPS 模块,包括它们的引脚图。在下一节中,我们将开始探索如何将 GPS 模块与 MKR WAN 1300 连接起来。
设计项目架构
在前面的章节中,我们详细讨论了模块和开发板。现在,是时候准备食谱了。在硬件开发中,在开始使用传感器和开发板之前,我们需要开发设计概念,以便更好地了解事物如何连接。有许多软件可用于设计电子项目的概念,但在此情况下,我们将使用 Fritzing。
在接下来的两个子节中,我们将讨论电路图和项目设计,同时解释如何使用开发板连接引脚并进行焊接。然后,我们将进行一些测试以获取 GPS 坐标,这在将数据发送到 Arduino IoT Cloud 之前非常重要。
电路图设计和组装
你的电路图设计目的是为了清楚地了解传感器如何与开发板连接。这有助于工程师在面包板或 Veroboard 上开发原型,如图图 6**.4所示。设计的主要好处之一是 Fritzing 可以根据你的设计在后台构建硬件电路图和 PCB 设计,这可以根据系统要求进行调整。图 6**.4显示了如何连接 MKR WAN 1300 与 NEO-6M u-blox GPS 模块的电路图:

图 6.4 – MKR WAN 1300 和 GPS 模块电路图
虽然图 6**.4说明了 MKR WAN 1300 和 GPS 模块的设计,但我们创建了表 6.1以方便理解,它以行格式说明了如何连接引脚。
| MKR WAN 1300 | NEO-6M u-blox GPS 模块 |
|---|---|
| 14 (TX) | RX |
| 13 (RX) | TX |
| VCC | VCC |
| GND | GND |
表 6.1 – MKR WAN 1300 到 GPS 模块引脚分配
上述设计提供了如何将模块连接到开发板的全面概述。根据我们的设计,我们从开发板到 GPS 模块有 5V 和 GND 引脚。GPS 模块的TX引脚连接到开发板的RX引脚(引脚编号 13),GPS 模块的RX引脚连接到开发板的TX引脚(引脚编号 14)。最后,我们使用面包板构建了我们的原型,如图图 6**.5所示:

图 6.5 – 最终原型 MKR WAN 1300 和 GPS 模块
在将公排针焊接至 GPS 模块后,根据原理图连接引脚。由于只有一个传感器,因此不需要 Veroboard。接下来,我们将使用 Arduino 的串行监视器工具测试 GPS 模块,以验证我们的 GPS 模块是否正常工作并从 GPS 卫星获取值。
测试 GPS 模块数据
在转向 Arduino IoT Cloud 之前,首先,我们需要验证我们的 GPS 模块是否工作。因此,在本节中,我们将使用 Arduino IDE 及其串行监视器工具测试 GPS 模块,以观察 GPS 模块的读数。以下步骤将指导我们如何设置测试环境:
-
对于模块测试,我们需要串行监视器工具来验证 GPS 模块是否正常工作。点击工具菜单并选择串行监视器。在 Arduino IDE 中,从工具 | 板 | Arduino SAMD | Arduino MKR WAN 1300选择 Arduino MKR WAN 1300 板。
-
选择 MKR WAN 1300 的端口。
-
接下来,我们需要在 Arduino IDE 中安装 GPS 模块的库。在搜索栏中导航到
tinygps。

图 6.6 – TinyGPSPlus 库
-
搜索后,库管理器会显示许多库。选择TinyGPSPlus库并安装其最新版本。该库附带许多示例,所有这些示例都是基于软件串行的。然而,Arduino SAMD 板提供硬件串行。因此,我已经修改了代码以使用硬件串行与 GPS 模块通信。
-
从书籍的官方 GitHub 仓库下载代码,然后在
chapter#6文件夹下,打开MKR-WAN-1300-NEO-6M-GPS-ModuleZIP 文件夹,解压它,并将代码上传到开发板:while(Serial1.available()>0)//While there are characters to come from the GPS { gps.encode(Serial1.read());//This feeds the serial NMEA data into the library one char at a time } if(gps.location.isUpdated())//This will pretty much be fired all the time anyway but will at least reduce it to only after a package of NMEA data comes in { //Get the latest info from the gps object which it derived from the data sent by the GPS unit Serial.println("Satellite Count:"); Serial.println(gps.satellites.value()); Serial.println("Latitude:"); Serial.println(gps.location.lat(), 6); Serial.println("Longitude:"); Serial.println(gps.location.lng(), 6); Serial.println("Speed MPH:"); Serial.println(gps.speed.mph()); Serial.println("Altitude Feet:"); Serial.println(gps.altitude.feet()); Serial.println(""); }
在设置中,我们已初始化Serial和Serial1。Serial用于在屏幕上显示内容到串行监视器(Arduino IDE 右上角的放大镜图标),而Serial1是用于与 GPS 模块通信的硬件串行。前面的代码属于loop()方法。
首先,GPS 模块将使用Serial1.read()方法从卫星读取数据,并通过gps.encode()方法进行编码。Serial1一次只读取一个字符,因此更新值将需要一点时间。然后,我们将使用gps.location.isUpdated()方法验证纬度和经度坐标是否有任何更新。如果有变化,则数据将在串行监视器上打印出来。
重要提示
确保您的 GPS 模块放置在一个开阔的环境中,您有清晰的视野,没有任何障碍物,如屋顶或任何阻止您接收卫星正确信号的东西。
GPS 模块有一个板载内置 LED,当它开始接收来自 GPS 卫星的数据时,LED 开始闪烁。
同样的代码无需修改即可在 MKR WAN 1310 上运行。
图 6.7显示了带有 GPS 值的串行监视器,包括纬度、经度和其他参数:

图 6.7 – 串行监视器上的 GPS 模块数据
前面的图显示了 GPS 模块从 GPS 卫星接收的数据,并在串行监视器上打印出来。数据包括卫星数量、代表位置坐标的纬度和经度、基于当前和先前 GPS 坐标的速度(英里/小时),以及高度(英尺)。
在本节中,我们在 Arduino IDE 中测试了 NEO-6M u-blox GPS 模块。首先,我们为该模块安装了TinyGPSPlus库,然后我们使用了上述代码进行开发板开发,该代码在串行监视器上显示了读数。在下一节中,我们将从 Arduino IoT 云中的“物”设置开始。
设置“物”、设备关联、云变量和代码
在设置好硬件之后,现在是时候在 Arduino IoT 云中设置“物”了。对于这个项目,我们需要四个云变量来从设备获取不同的属性。由于 LoRa 系列板,设备关联设置将有所不同。此外,当我们上传代码/草图到 MKR WAN 1300 时,网络配置将自动完成。图 6.8显示了“物”的完整概述:

图 6.8 – 使用 LoRaWAN“物”设置的远程资产跟踪
以使用 LoRaWAN 进行远程资产跟踪的名称设置一个新的“物”,然后按照以下步骤进行,这将带您进入下一小节以创建变量、关联设备网络配置,最后是代码。我们根据以下步骤在先前的图中用红色方框和数字进行了标记。
首先,我们需要设置四个云变量——Location、AltitudeFeet、SatelliteCount和Speed。有关云变量的完整细节可在以下小节中找到。
之后,我们需要将设备与“物”关联。在当前项目中,我们将使用 MKR WAN 1300,因此过程将与 Arduino 板上的过程相同,但在这里,我们将看到一些由于 LoRaWAN 而不同的选项。完整细节可在关联设备部分找到。
云变量
下表解释了我们需要创建的所有变量的属性。对于位置,我们需要两个不同的变量来存储纬度和经度,但多亏了 Arduino IoT 云扩展变量组,我们有一个Location类型的变量。然后,确保每个变量与表中的声明相匹配;否则,您需要根据您的命名修改示例代码。
如表 6.2所示,在创建云变量时,我们将权限设置为只读。尽管我们有读/写选项,但在本项目中,我们只想从设备接收数据,而不是通过仪表板修改数据。这就是为什么使用只读模式的原因——以避免数据一致性问题。更新策略设置为有变化时,因为当 GPS 模块从卫星接收到新数据时,设备将发送数据。
| S# | 变量名 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | AltitudeFeet |
Float |
altitudeFeet |
只读 | 有变化时 |
| 2 | Location |
CloudLocation |
location |
只读 | 有变化时 |
| 3 | SatelliteCount |
Int |
satelliteCount |
只读 | 有变化时 |
| 4 | Speed |
Float |
speed |
只读 | 有变化时 |
表 6.2 – 设备的云变量列表
在本节中,我们讨论了本项目所需的云变量类型。在这里,我们列出了四种不同类型的云变量,但都设置为只读模式,因为我们只想从设备提取值。在下一个小节中,我们将关联 MKR WAN 1300 与设备。
关联设备
创建变量后,现在是时候添加设备并将其与设备关联了:
- 在添加设备之前,请将开发板连接到计算机并打开Arduino Create Agent应用程序。图 6.9显示了弹出窗口,其中我们有两个选项:选择现有设备进行关联或设置不在列表上的新设备。

图 6.9 – 关联设备 – 选择设备
在我们的情况下,我们已经在门户中有了不同的设备,但我们要添加一个新的,即 MKR WAN 1300,因此只需点击设置新设备来在账户中配置新设备。
- 然后,您将在弹出窗口中看到三个选项。第一个选项是Arduino 板,第二个选项是第三方设备,第三个选项是任何设备,这是用于非兼容设备的。这意味着您现在可以使用所有类型的 Arduino 设备以及第三方设备,Arduino IoT Cloud 支持 Python、MicroPython 和 JavaScript。

图 6.10 – 选择开发设备
- 点击Arduino 板(如图 6.10 中的红色方框所示)并自动检测我们本章使用的 MKR WAN 1300 板。在添加设备之前,请确保Arduino Create Agent正在您的机器上运行。图 6.11显示 Arduino IoT Cloud 已检测到 MKR WAN 1300。

图 6.11 – 找到的设备
当弹出窗口找到设备时,点击配置按钮,这将带您进入下一个屏幕。
- 图 6**.12 展示了一个屏幕,提供了有关 The Things Stack 站点链接的一些详细信息。您还将看到一个消息,说明您需要一个活跃的 LoRaWAN 网关,以便 MKR WAN 1300 与 Arduino IoT Cloud 进行通信。

图 6.12 – 活跃的 LoRaWAN 网关
如果您已经设置了网关,那么就没有问题;否则,在 配置 The Things 室内网关 部分中,了解如何设置 The Things 室内网关,这将提供与 MKR WAN 1300 开发板的连接。
此消息还通知您,Arduino IoT Cloud 将自动在 The Things Stack 站点中配置您的设备。
- 将设备关联后,您将收到一封电子邮件,其中包含用户名和密码,以及 The Things Stack 站点登录的 URL,其中包含有关 LoRaWAN 节点的所有信息。在这里,Arduino IoT Cloud 将在最终步骤完成后自动将 MKR WAN 1300 添加到 The Things Stack 站点。接下来,图 6**.13 显示我们需要为我们的设备选择一个频率。

图 6.13 – MKR WAN 1300 频率选择
如我们之前讨论的,LoRaWAN 根据地区使用不同的频率。因此,从下拉菜单中选择您所在地区的特定频率。根据我的 LoRaWAN 网关,我选择了 欧洲 863-870 MHz (RX2 的 SF9 - 推荐)。从下拉菜单中选择频率后,单击 下一步 按钮。
- 现在,我们需要为设备提供一个名称,如图 图 6**.14 所示。

图 6.14 – 为 MKR WAN 1300 分配名称
在这里,我已将名称 LoRaWanGPSTracker 分配给设备,但您可以使用与您的项目结构相关的任何名称。分配名称后,单击 下一步 按钮。
- 然后,将出现另一个弹出窗口,如图 图 6**.15 所示,这将准备您的设备用于 Arduino IoT Cloud。

图 6.15 – MKR WAN 1300 配置
在这里,Arduino IoT Cloud 通过 Arduino Create Agent 配置 MKR WAN 1300。设置开发板并完成必要的配置可能需要一到两分钟。
- 当设备配置成功后,您将看到以下弹出窗口。只需单击 完成 按钮即可,您的设备将与您的项目关联。

图 6.16 – 设备设置成功
在本节中,我们将 MKR WAN 1300 与我们的项目关联。我们还看到了许多关于 LoRaWAN 的新选项,例如频率、网关等。在接下来的章节中,我们将讨论网络和代码。
网络
在前面的章节中,在将设备与实体关联后,我们配置了设备通信的网络设置。然而,这次我们不需要配置任何网络设置,因为当我们将草图上传到 MKR WAN 1300 开发板时,设备将自动配置。最初,你会在网络配置中看到一个空白区域,如图 6.8 所示,但在草图上传后,你会看到 LoRaWAN 网络配置参数。
编程
本章的代码可在本书的官方 GitHub 仓库中找到。下载A_remote_asset_tracking_using_LoRaWAN_aug30a.zip文件并将其导入到你的 Arduino Web Editor 中。
你可以通过导航到setup()方法下载代码并将其放入你的实体中。记住,永远不要尝试使用delay()方法,因为它会阻塞ArduinoCloud.update()方法:
TinyGPSPlus gps;
unsigned long previousMillis = 0;
const long interval = 30000; //milliseconds
在前面的代码片段中,我们声明了gps实例和两个变量,这些变量在读取下一次数据之前会等待30000毫秒(30 秒),而不会阻塞代码。
现在,我们将探索loop()方法。在这里,我们每 30 分钟调用一次FetchGPS()方法,这将通过比较currentMillis和previousMillis而不使用delay()来实现:
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
//speed=currentMillis;
FetchGPS();
previousMillis = currentMillis;
}
在下面的代码片段中,我仅从FetchGPS()方法中选取了一小部分代码。在这里,我将 GPS 模块的最新值分配给 Arduino 云端变量,这些变量将被用于向云端发送数据以及在串行监视器上打印:
if (gps.location.isUpdated())
{
altitudeFeet = gps.altitude.feet();
satelliteCount = gps.satellites.value();
speed = gps.speed.mph();
location = Location(gps.location.lat(), gps.location.lng());
Location cordinates = location.getValue();
.
.
.
}
将代码上传到设备,并打开 Arduino Web Editor 串行监视器以验证值。在成功将数据上传到云端后,是时候为最终用户设置一个漂亮的网页和移动端仪表板了。
重要提示
如果你声明变量时使用了不同的命名,请根据你的命名方案更新代码。然而,建议首先遵循书中的所有步骤,然后在稍后更改云端变量名称,分别修改你的代码。
永远不要尝试使用delay()方法,这将会阻塞ArduinoCloud.update()方法。
Arduino IoT Cloud 仅在变量值发生变化时才更新其仪表板上的值。例如,如果经过一段时间后 GPS 位置保持不变,那么这意味着资产没有从其原始位置移动。然后,Arduino IoT Cloud 将不会记录该值,所以如果地图上的值没有变化,请不要感到困惑。这个功能的另一个好处是,当你导出内容时,你不会得到重复的数据。
同样的代码在 MKR WAN 1310 上无需修改即可使用。然而,在这个例子中,你需要将 MKR WAN 1310 设备与实体关联,而不是与 MKR WAN 1300 关联。
在本节中,我们逐步分析了我们的代码,以了解其工作原理。在下一节中,我们将设置 The Things 室内网关。如果你在你的地区/区域已经有了网关,那么你可以跳过这一部分,但如果你在附近没有网关,那么你需要设置网关;否则,你的 MKR WAN 1300 将无法与 Arduino IoT 云通信。
配置 The Things 室内网关
在本节中,我们将设置 The Things 室内网关。它适用于不同的频率,但我有一个 EU868 MHz 频率的网关。如果你在你的地区已经有了 LoRaWAN 网关并想跳过这一节,那么你可以继续前进,但如果你在你的地区没有网关,那么这一节对于 MKR WAN 1300 通信是强制性的。没有网关,你的模块将无法与 Arduino IoT 云通信。要设置网关,请按照以下步骤操作:
-
打开你的网关盒子,用电源线设置好,并打开网关。如果你使用的是全新的网关,那么它将处于设置模式;否则,你可以通过在橙色和绿色灯光开始闪烁时按住设置按钮几秒钟来将网关置于设置模式。这意味着网关已进入设置模式。
-
选择 The Things 室内网关的 Wi-Fi 网络,并连接到它。Wi-Fi 密码写在设备的背面。图 6.17显示了 The Things 室内网关的设置页面。

图 6.17 – The Things 室内网关设置页面
连接到室内网关后,打开你的浏览器并输入http://192.168.4.1。这将打开MiniHub 设置页面,如图所示。点击加号图标(+)选择连接到互联网的 Wi-Fi 网络,并提供其 Wi-Fi 密码。然后,点击保存并重启按钮。它将需要几秒钟来重启,最终,你的 LoRaWAN 室内网关将通过你选择的 Wi-Fi 网络连接到互联网。
- 现在,是时候在The Things Stack门户中配置 LoRaWAN 网关了,如图图 6.18所示。

图 6.18 – LoRaWAN 网关注册 – 第 1 步
当你将 MKR WAN 1300 与 Arduino IoT 云中的事物关联时,你将收到来自 The Things Stack 云的电子邮件,其中包含门户 URL 以及你的用户名和密码详情。登录到门户,在那里你将获得一个集群列表,以便将你的网关添加到推荐的集群。在关联设备部分,我选择了 MKR WAN 1300 的欧洲 863-870 MHz(RX2 的 SF9 推荐)频率,因此在这里,我将选择欧洲 1作为我的网关。这样,我的网关和 MKR WAN 1300 开发板都位于同一个集群下。
- 选择集群后,您将被重定向到门户的主页。从这里,我们将开始添加网关,如图 图 6**.19 所示。

图 6.19 – LoRaWAN 网关注册 – 步骤 2
在主页上,我们有几个菜单和两个大图标,如图中所示。从那里,点击 转到 网关 图标。
- 然后,我们将进入显示网关完整列表以及注册新网关选项的页面,如图 图 6**.20 所示。

图 6.20 – LoRaWAN 网关注册 – 步骤 3
点击蓝色 + 注册 网关 按钮。
- 这将带我们到一个新页面,我们可以向 The Things Stack 网络添加网关,如图 图 6**.21 所示。

图 6.21 – LoRaWAN 网关注册 – 步骤 4
首先,我们需要从 所有者 下拉菜单中选择所有者。在这里,您将看到两个名字。一个是您的个人用户名,另一个是 arduino-iot-cloud-user。只需选择您的个人用户名,因为您是添加网关的主要人员。在下一个字段中,输入 网关 EUI 详细信息。EUI 将写在网关背面。之后,点击 确认 按钮。
- 现在,我们将验证我们的网关并选择频率计划,如图 图 6**.22 所示。

图 6.22 – LoRaWAN 网关注册 – 步骤 5
您将在顶部看到 声明认证码 字段。在这里,我们需要为网关提供一个用于认证的 Wi-Fi 密码。您可以从网关背面获取网关 Wi-Fi 密码,您之前就是从那里将其取下来连接到设备的 Wi-Fi 网络。
现在,我们需要为我们的网关选择频率计划。在 MKR WAN 1300 关联期间,我们已经选择了 欧洲 863-870 MHz (RX2 的 SF9 - 推荐),因此我们将从下拉菜单中选择相同的频率。选择频率后,点击 声明 网关 按钮。
- 网关成功注册后,我们将看到以下图所示的页面,它提供了网关连接状态、实时数据、创建于、最后更新于以及大量其他信息。

图 6.23 – LoRaWAN 网关成功注册在 The Things Network 上
在本节中,我们逐步探讨了如何设置 The Things Indoor 网关。在下一节中,我们将为我们的设备在移动和网页上创建仪表板以跟踪我们的资产。
创建网页和移动仪表板
在将代码上传到设备后,是时候设置一个用于网页和移动端的仪表板,使用不同的小部件来可视化数据了。图 6.24展示了使用不同小部件进行读数可视化的示例。

图 6.24 – The Thing 仪表板
我们从 GPS 模块中获取了四个读数以进行可视化。在这里,我使用了四个小部件:一个仪表盘,两个值和一个地图。仪表盘小部件显示位置变量。目前,地图小部件只能根据坐标显示资产设备的地理位置;如果您要跟踪多个资产,则需要根据跟踪设备的数量设置多个地图小部件。
好吧,这是我们章节的最后一部分。在这里,我们为 GPS 跟踪创建了一个令人惊叹的仪表板,它使用仪表板上的地图小部件显示位置,每英里速度,以及其他一些参数。
接下来是什么?
我们还有很多选项可供探索,但现在轮到您使用不同的传感器和开发板进行更多实验并从中学习。在本章中,我们只使用了一个 GPS 模块,它只提供了四个参数,但市场上有很多 GPS 模块提供广泛的性能,例如在屋顶下工作以及精度功能。
在监控资产位置的同时,在各个行业中,一些其他参数也非常重要,例如温度和湿度,这在食品和医疗产品中非常重要。在燃料运输期间,CO2 和液化石油气(LPG)气体也非常重要需要监控。尝试使用 GPS 模块与不同传感器一起设置不同行业的不同跟踪原型。
摘要
在本章中,我们探讨了如何使用 LoRaWAN 和 GPS 模块开发资产跟踪系统。我们设置了 The Thing,包括云变量创建、设备关联、The Things 室内网关,以及编写开发板代码。然后,我们创建了一个仪表板,使用不同类型的小部件来可视化 The Thing 读数。本章最重要的部件是地图小部件,它对于绘制设备的当前位置非常有趣且重要。
GPS 跟踪是一个非常重要的主题,它帮助我们开发用于我们资产的设备,协助我们在资产跟踪和监控方面。我们可以在特定区域使用 LoRaWAN,因为它有更长的范围,但这个范围仅在特定区域内工作,与其他无线技术不同。本章展示了我们如何在仪表板上显示设备的地理位置,这使你更有信心构建更多的资产跟踪解决方案。
在下一章中,“启用不同设备之间的通信”,我们将探讨 Arduino IoT Cloud 如何使设备之间发送数据变得容易。使用这种方法,我们将同步物联网节点以实现无缝操作。
第三部分:节点和云应用之间的数据交换
本书第三部分描述了如何在 Arduino IoT Cloud 上配置的物联网节点之间以及 Arduino IoT Cloud 和外部云应用之间交换数据。
在许多实际案例中,这些功能是构建分布式和可靠网络、在物联网应用中实现一些相互依赖的可视化和逻辑,以及通过外部工具扩展 Arduino IoT Cloud 功能所必需的。
本部分包含以下章节:
-
第七章, 启用不同设备之间的通信
-
第八章, 使用 Arduino IoT Cloud SDK 和 JavaScript 进行操作
-
第九章, 项目#4 – 为智能农业收集土壤和环境数据
-
第十章, 项目#5 – 使用语音助手使您的家庭更智能
第七章:启用不同设备之间的通信
本章致力于物与物通信(TTC),这是物联网(IoT)领域的一个重要概念和需求。您也可以称之为设备到设备(D2D)通信。在复杂系统中,一个设备的操作完全依赖于另一个设备时,D2D 通信发挥着至关重要的作用。例如,假设您想根据室外天气条件控制房间的空调;在这里,D2D 通信通过将室外温度发送到房间的空调控制器设备,使其知道是否需要根据外面的天气来冷却或加热房间,发挥着至关重要的作用。
Arduino IoT Cloud 为多个设备以及仪表盘提供了云变量同步功能,这有助于我们轻松构建复杂系统。本章解释了同步功能的使用,用于实现云图形用户界面(GUI)和点对点(D2D)通信。
在本章中,您将学习如何使用图形用户界面(GUI)同步跨多个设备上的云变量,而无需编写任何复杂的代码。本章将帮助您通过几个点击设置设备之间的通信,而无需编写任何冗长的代码。它还将帮助您开发完全依赖于其他设备传感器数据的解决方案。您还将学习如何为多个设备创建单个仪表盘,以便您可以在一个地方显示它们的读数,这有助于用户从单个显示屏监控一切,而无需导航到其他仪表盘。
在本章中,我们将涵盖以下主要主题:
-
物联网云中的 D2D 通信是什么?
-
Arduino IoT Cloud 物与物通信的好处
-
硬件组件 - 传感器和开发板
-
项目架构
-
设置设备
-
使用同步云变量实现 GUI
-
云变量/属性同步的限制
-
接下来是什么?
技术要求
完成本章练习所需的以下内容:
-
完成本书的第四章(B19752_04.xhtml#_idTextAnchor085)
-
MKR Wi-Fi 1010
-
1 个 5 毫米红色 LED 和 1 个 5 毫米绿色 LED
-
面包板
-
跳线
我们将使用Arduino Web Editor进行编码,它包括大量开发板和传感器库,以及Arduino IoT Cloud进行设备和仪表盘设置。本章代码可在官方书籍 GitHub 仓库中找到,请通过以下链接访问:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers。
物联网云中的 D2D 通信是什么?
物联网和物联网云环境中的 D2D 通信是指物联网设备能够直接相互交换数据或信息,而不依赖于中央服务器或基于云的服务作为中介。这种通信形式也被称为物联网设备之间的点对点(P2P)通信。
下面是关于物联网云中 D2D 通信的一些关键点:
-
直接通信: 在传统的物联网架构中,设备将数据发送到云平台,在那里进行处理,并可能与其他设备共享。D2D 通信允许设备直接相互通信,在必要时绕过云平台。
-
低延迟: D2D 通信可以降低延迟,因为数据不需要往返于远程服务器。这在需要实时或近实时响应的应用中至关重要,如工业自动化或联网汽车。
-
效率: 通过使设备能够直接通信,可以减少云服务器的负载和带宽使用,使物联网系统更加高效和成本效益。
-
离线操作: D2D 通信即使在设备未连接到互联网或云的情况下也能工作。这在间歇性连接常见的场景中特别有用,例如在偏远地区或紧急情况下。
-
安全性: 实现设备之间的直接通信需要强大的安全措施来保护数据并确保消息的真实性。加密和身份验证机制对于防止未授权访问是必不可少的。
-
用例: D2D 通信可用于各种物联网应用。例如,在智能家居中,恒温器和灯光等物联网设备可以直接通信以协调动作,而无需将数据发送到中央服务器。在农业中,农业设备上的传感器可以直接通信以优化任务。
-
协议: 在物联网中,各种通信协议可以促进 D2D 通信,包括消息队列遥测传输(MQTT)、约束应用协议(CoAP)、蓝牙和Zigbee。协议的选择取决于范围、数据量和功耗等因素。
-
挑战: 虽然 D2D 通信提供了许多好处,但也带来了挑战,例如确保来自不同制造商的设备之间的互操作性以及管理去中心化通信的复杂性。
总结来说,物联网云环境中的 D2D 通信允许物联网设备直接相互通信,这提供了降低延迟、提高效率和离线操作等好处。然而,它也需要仔细规划和安全措施,以确保通信网络的可靠性和完整性。
在本节中,我们探讨了 D2D 通信的好处和挑战,这在物联网基础设施和解决方案开发中非常重要。在下一节中,我们将探讨 Arduino IoT Cloud 为 TTC 提供的哪种类型选项。
Arduino IoT Cloud 设备间通信的好处
Arduino IoT Cloud 是一个专为简化使用 Arduino 板和其他兼容硬件的物联网项目开发和管理的平台。在 Arduino IoT Cloud 的上下文中,TTC 有几个好处:
-
易于集成:Arduino IoT Cloud 提供了一个用户友好的界面,用于连接和配置物联网设备,这使得建立设备之间的通信更加容易。用户可以快速设置和管理他们 Arduino 板与其他物联网设备之间的连接。
-
遥控:您可以使用 TTC 从一台 Arduino 设备控制另一台。例如,您可以使用一台 Arduino 设备控制另一个房间的灯泡。
-
可扩展性:Arduino IoT Cloud 允许您轻松扩展您的物联网项目。您可以向您的网络添加新设备并配置它们的通信参数,而无需进行大量编程,这使得它适用于从小型到大型物联网部署。
-
降低延迟:在同一网络内物联网设备之间的直接通信可以显著降低与发送数据到外部云服务器并返回相比的延迟。这对于需要低延迟的实时应用至关重要。
-
节能:Arduino IoT Cloud 允许您通过控制设备之间何时以及如何通信来优化设备的功耗。这可以延长电池供电的物联网设备的电池寿命。
-
可定制逻辑:您可以为 TTC 编程定制逻辑以满足您特定的项目需求。这种灵活性使您能够在物联网系统中实现复杂的行为和自动化。
-
安全性:Arduino IoT Cloud 提供安全功能以帮助保护您的设备之间的通信,包括加密和认证机制。这确保了设备之间交换的数据保持安全。
-
成本效益:通过减少对外部云服务的依赖并最小化数据传输成本,Arduino IoT Cloud 可以成为物联网项目的经济高效解决方案,尤其是在处理大量设备时。
-
兼容性:Arduino IoT Cloud 支持广泛的 Arduino 板和兼容硬件,使其对广泛的用户群体可访问。这种兼容性简化了在基于 Arduino 的物联网项目中实现 TTC 的过程。
总结来说,Arduino IoT Cloud 简化了物联网项目中的 TTC,提供了易于集成、可扩展性、降低延迟、节能、离线操作、定制、安全性、成本效益和广泛的硬件兼容性等功能。这些特性使其成为开发和管理依赖设备间直接通信的物联网系统的宝贵平台。
在本节中,我们讨论了 Arduino IoT Cloud TTC 的好处。在下一节中,我们将探讨完成本章练习所需的硬件组件。
硬件组件 – 传感器和开发板
在本章中,我们将探讨如何在多个 Arduino IoT Cloud 项目之间同步云变量。因此,这里我们将使用与 第四章 中相同的设备,包括开发板和传感器。为了本章的演示,我们将使用 Arduino MKR Wi-Fi 1010 以及两个 5 毫米 LED 灯,一个红色和一个绿色。完整的项目总结在 图 7**.1 中。

图 7.1 – 项目架构
如 图 7**.1 所示,我们使用了一个基于 ESP8266 的 WeMos D1 mini 开发板,整个项目在 第四章 中进行了演示。本章使用不同类型的板子的目的是为了展示在不同类型的开发板之间同步云变量是多么容易。在下一节中,我们将详细讨论项目架构。
项目架构
在本节中,我们将讨论云变量同步的工作原理。如 图 7**.1 所示,我们是从 第四章 中的项目开始的。在那个项目中,我们设置了一个监控户外温度、湿度和空气质量的设备。现在,我们希望将户外温度与我们的室内设备(MKR Wi-Fi 1010)共享。为了使事情更简单,我们只使用了 MKR Wi-Fi 1010 和 LED,如 图 7**.2 所示。我们的室内设备将在温度超过指定阈值时打开红色 LED,如果温度低于指定阈值则打开绿色 LED。您也可以使用继电器代替 LED 来控制您房间的加热和冷却系统。
我们已经在 Arduino IoT Cloud 中有一个正在运行的项目,但现在我们需要为 MKR Wi-Fi 1010 创建另一个项目,命名为 室内 MKR Wi-Fi 1010,并附带一系列云变量。然后我们将室内 MKR Wi-Fi 1010 项目的温度云变量与在 第四章 中创建的“感知环境”项目同步。
在前面的章节中,我们详细讨论了模块和开发板。现在,是时候开始练习了。在硬件开发中,在我们开始使用传感器和开发板之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于设计电子项目的概念和开发,但在此情况下,我们将使用Fritzing。
在以下子节中,我们将讨论项目的原理图,同时解释如何将引脚与开发板连接。
原理图设计和组装
原理图设计的目的是清楚地了解传感器/LED 如何与开发板连接。这有助于工程师在面包板或Veroboard上开发原型。图 7.2 显示了 LED 如何连接到 MKR Wi-Fi 1010 开发板的原理图。

图 7.2 – MKR Wi-Fi 1010 和 LEDs 原理图
在图 7.2 中,我们有一个来自 MKR Wi-Fi 1010 的共同地线,它通过黄色线与两个 LED 共享。红色 LED 通过引脚#6连接到 MKR Wi-Fi 1010,绿色 LED 使用 MKR Wi-Fi 1010 开发板的引脚#7。
在本节中,我们讨论了云同步的工作原理以及如何将 LED 与 MKR Wi-Fi 1010 连接。在下一节中,我们将设置 MKR Wi-Fi 1010 的事物以及设备关联和网络配置;最重要的是,我们将创建云变量并将它们与其他事物同步。
设置事物
在设置硬件之后,是时候在 Arduino IoT Cloud 中设置事物了。对于这个项目,我们需要三个云变量。稍后,我们将把 MKR Wi-Fi 1010 与我们的事物关联起来。接下来,我们将执行 Wi-Fi 网络配置。图 7.3 显示了事物的完整概述:

图 7.3 – 室内设备 MKR Wi-Fi 1010 事物设置
设置一个名为“室内设备 MKR Wi-Fi 1010”的新事物。在图 7.3 中,以下步骤用红色方框标记。按照这些步骤创建变量、关联设备、配置网络,最后编写代码:
-
首先,我们需要为绿色 LED、红色 LED 和温度(将与另一个云变量同步)设置三个云变量。关于云变量的更详细讨论将在下一节中介绍。
-
之后,我们需要将设备与事物关联。在当前项目中,我们使用 MKR Wi-Fi 1010。更多细节请参阅本章的关联设备子节。
-
在连接设备后,我们需要通过提供 Wi-Fi 网络的 SSID 和密码来使设备网络就绪。只需点击配置按钮(如果网络为空,则您将看到配置按钮。否则,您将看到更改按钮)并您将看到网络设置的弹出窗口。
我们已经讨论了设置事物的过程,所有这些步骤将在后续小节中详细解释。我们将从云变量小节开始,在那里我们将为我们的事物创建云变量以及同步它们。
云变量
下表描述了我们需要配置的所有云变量的属性。对于这个项目,我们需要三个云变量,如表 7.1中所示。接下来,请确保每个变量与表中的声明相匹配;否则,您需要根据您的命名修改示例代码。
当我们创建云变量时,除了Temperature之外,我们为所有变量设置了只读权限,因为我们需要这个云变量与第四章中“感知环境”事物的Temperature云变量同步。这就是为什么这个变量的权限被设置为读/写。更新策略对所有变量都设置为变更时。
| S# | 变量名 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | GreenLed |
布尔值 | greenLed |
只读 | 变更时 |
| 2 | RedLed |
布尔值 | redLed |
只读 | 变更时 |
| 3 | Temperature |
温度传感器 | Temperature |
读/写 | 变更时 |
表 7.1 – 事物云变量列表
使用表 7.1创建GreenLed和RedLed云变量。Temperature云变量的创建将分步骤讨论;我们将同步此云变量与第四章中的事物云变量。图 7**.4显示了创建Temperature云变量的第一步。

图 7.4 – 温度云变量步骤 1
在这一步,我们将为云变量分配一个名称,如图 7**.4所示。接下来,我们将点击与其他事物同步。这将打开一个新的弹出窗口,如图 7**.5所示。

图 7.5 – 温度云变量步骤 2
在此弹出窗口中,您将找到所有在您的 Arduino IoT Cloud 中可用的云变量的完整列表。为了防止复杂性和错误,请选择一个特定的事物。我们从下拉菜单中选择了感知环境事物,这在图 7.5中被标记为红色框。在选择下拉菜单中的事物后,您将在弹出窗口中仅看到该事物的关联云变量。点击温度云变量复选框,然后点击同步变量按钮。图 7.6显示了最终的弹出窗口,其中您将找到云变量同步状态的最终状态。

图 7.6 – 温度云变量步骤 3
在图 7.6中,您将看到云变量同步状态的状态,它被标记为红色框。请记住,对于同步变量,您必须选择读/写权限,否则它将无法正常工作。然后保存云变量,我们就可以出发了。完成这些步骤后,您应该对如何通过使用简单的界面在几秒钟内同步多个事物中的云变量有一个大致的了解。
重要提示
请记住,对于同步变量,您必须选择读/写权限,否则它将无法正常工作。
在本节中,我们讨论了本项目所需的云变量类型。我们列出了三种不同类型的云变量,并详细讨论了如何从一个事物同步云变量到另一个事物。接下来,我们将把 MKR Wi-Fi 1010 与事物关联起来。
关联设备
在创建变量后,是时候添加设备并将其与事物关联了:
- 在添加设备之前,将开发板连接到计算机并打开Arduino Create Agent应用程序。图 7.7显示了弹出窗口,其中我们有两个选项:要么选择现有设备进行关联,要么如果列表中没有可用,则设置新设备:

图 7.7 – 关联设备 – 选择设备
在我们的案例中,我们已经在门户中有了不同的设备,但我们要添加一个新的 MKR Wi-Fi 1010。只需点击设置新设备来配置账户中的新设备。
- 接下来,您将在弹出窗口中看到三个选项。第一个选项是Arduino 板,第二个选项是第三方设备。第三个选项是任何设备,这是用于非兼容设备的。这意味着您可以使用任何类型的 Arduino 设备,以及支持 Python、MicroPython 和 JavaScript 的 Arduino IoT Cloud 第三方设备。

图 7.8 – 选择开发设备
- 从弹出窗口中选择适合您项目的正确选项。在本例中,点击Arduino 板,因为在本章中,我们使用的是 MKR Wi-Fi 1010 板。在添加设备之前,请确保Arduino Create Agent在您的机器上运行。图 7.9显示 Arduino IoT Cloud 已检测到 MKR Wi-Fi 1010 设备。

图 7.9 – 设备找到
当弹出窗口显示已找到设备时,只需点击配置按钮,这将带您进入下一个配置步骤,在那里您将提供设备的名称,稍后,另一个弹出窗口将在您的开发板上执行一些配置并将开发板与 Arduino IoT Cloud 关联。一旦完成,将显示成功的设备关联消息。
- 当设备配置成功时,您将看到一个弹出窗口表示祝贺。只需点击完成按钮,您的设备将与您的“物”关联。
在本节中,我们将 MKR Wi-Fi 1010 设备与我们的“物”关联,在接下来的章节中,我们将讨论网络和代码。
网络
将设备连接到“物”之后,我们可以看到设备处于离线状态。为了将其上线,我们需要提供 Wi-Fi 详细信息。以下截图显示了网络配置弹出窗口,它只包含两个字段:

图 7.10 – 网络配置
在图 7.10所示的“物”页面上,在网络选项卡中,点击配置按钮,这将带您进入包含两个字段Wi-Fi 名称和密码的配置网络弹出窗口。输入 Wi-Fi SSID 和密码,然后点击保存按钮。
在本节中,我们已经为我们的设备配置了网络,该设备是 MKR Wi-Fi 1010。在下一小节中,我们将创建云变量。
编码
本章的代码可在本书的官方 GitHub 仓库中找到。下载Indoor_Device_MKR_Wi-Fi_1010_sep07a.zip并将其导入到您的 Arduino Web Editor 中。
您可以通过导航到以下片段中的RLED和GLED并将它们分别分配为引脚编号6和7来下载代码并将其放入您的设备中:
#define RLED 6
#define GLED 7
然后,我们在setup()方法中初始化所有必需的引脚和方法。具体来说,我们使用pinMode()方法将引脚模式更改为输出:
void setup() {
pinMode(RLED, OUTPUT);
pinMode(GLED, OUTPUT);
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
下一个重要方法是onTemperatureChange()。每当 Sense the Environment 设备上的Temperature云变量值发生变化时,它将自动与室内设备 MKR Wi-Fi 1010 设备的Temperature云变量同步。然后,当值发生变化时,此方法将被调用:
void onTemperatureChange() {
// Add your code here to act upon Temperature change
if(temperature>30)
{
//if Temperature is more then 30 then turn on the Red LED and turn off Green LED
redLed=true;
greenLed=false;
}else{
//If Temperature is 30 or less then turn on Green LED and turn off Red LED
redLed=false;
greenLed=true;
}
digitalWrite(RLED,redLed);
digitalWrite(GLED,greenLed);
}
在前面的代码片段中,我们已定义了temperature的手动阈值。如果temperature值大于 30 摄氏度,则将redLed赋值为true,将greenLed赋值为false;否则,将redLed赋值为false,将greenLed赋值为true。在方法末尾,我们根据redLed和greenLed的值控制 LED。在这里,你可以使用继电器而不是 LED 来控制室内环境的加热和冷却系统。
将代码上传到设备,你会看到红色或绿色 LED 之一会被点亮,这取决于温度。在成功将数据上传到云后,是时候为用户设置一个漂亮的仪表盘,用于网页和移动端。这次,我们将创建一个仪表盘,将显示两个事物的云变量值。
重要提示
如果你使用了不同的命名在变量声明中,那么根据你的命名方案更新代码。但最好是首先按照书中的所有步骤进行,然后再更改云变量名称并修改你的代码。
永远不要尝试使用delay()方法,这将创建一个阻塞ArduinoCloud.update()方法的块。也不要将代码放在循环末尾的方法中,因为它会在脉冲传感器读数中创建延迟。
在本节中,我们探讨了代码,并使用与第四章中的Temperature云变量同步的Temperature云变量,根据温度值开启和关闭 LED。在下一节中,我们将探讨如何在单个仪表盘上显示多个事物的云变量。
使用同步云变量实现 GUI
在将代码上传到设备后,是时候设置一个仪表盘,用于网页和移动端,以使用不同的小部件可视化数据。“图 7.11”展示了使用不同小部件的读数可视化。

图 7.11 – 事物仪表盘
我们有三个不同的读数,温度、湿度和空气质量来自“感知环境”事物,以及来自“室内设备 MKR Wi-Fi 1010”事物的两个读数,红 LED和绿 LED。由于室内设备 MKR Wi-Fi 1010 事物的温度与“感知环境”事物同步,所以我们在这里只显示一个温度值。对于每个读数,我们使用不同的小部件控制来展示它们是如何工作的。但对于 LED 状态,我们使用了 LED 小部件控制。
关于这个仪表盘需要注意的主要事项是,我们正在使用来自两个不同事物但相同仪表盘的值来可视化这些值。这个例子演示了我们可以在一个仪表盘上显示多个事物的值。“图 7.12”展示了将任何云变量链接到小部件控制是多么容易。

图 7.12 – 将云变量链接到小部件控制
图 7.12 展示了如何将来自室内设备 MKR Wi-Fi 1010的RedLed云变量链接到一个小部件。但是,正如你所看到的,你可以从任何事物中选择任何云变量并将其与小部件控制链接。因此,我们可以看到 Arduino IoT Cloud 仪表板如何使我们能够轻松地为多个事物创建单个仪表板。
在本节中,我们讨论了如何设置包含多个事物附加小部件的仪表板。在下一节中,我们将详细讨论限制和云变量同步。
云变量/属性同步的限制
Arduino IoT Cloud 提供了一个物联网设备管理和通信的平台,包括设备间的 TTC。虽然它为连接和管理物联网设备提供了有价值的特性,但也有一些缺点需要考虑:
-
延迟: TTC 可能会引入延迟,这是在一个设备上更改变量时与它在另一个设备上反映之间的延迟。这对于需要非常低延迟的应用程序来说可能是一个问题,例如实时控制机器人。
-
离线设备挑战: 暂时离线的设备可能会错过来自其他设备的重要消息或更新。确保设备在网络重新连接时能够赶上错过的通信可能很复杂。
-
依赖互联网连接: Arduino IoT Cloud 依赖于互联网连接来实现设备间的通信。如果互联网连接中断,设备可能会失去相互通信的能力。
-
功能有限: TTC 不如一些其他物联网通信协议灵活。例如,你不能使用 TTC 在设备之间发送任意数据。
-
依赖云服务: TTC 依赖于 Arduino IoT Cloud 才能运行。这意味着如果云服务不可用,你的 TTC 连接将无法工作。
当你在物联网项目中考虑使用 Arduino IoT Cloud 进行 TTC 时,必须权衡这些缺点与平台的优势,并评估它是否符合你特定的项目需求和限制。此外,探索替代的物联网平台和通信解决方案可能是必要的,以确保最适合你的需求。
在本节中,我们详细讨论了 Arduino IoT Cloud TTC 的限制。在下一节中,我们将探讨如何为不同类型的云变量使用 TTC。
接下来是什么?
我们还有很多选项可供探索,但现在轮到您使用不同的传感器和开发板进行更多实验并从中学习。在本章中,我们只使用了一个在两个事物之间同步的温度云变量,但您可以尝试使用此功能同步多个云变量与多个事物。接下来,为多个事物创建一个仪表板,以便在一个地方可视化所有值。我们配置了简单的 LED 灯根据温度开关,但您也可以使用继电器来控制室内家庭/办公室和仓库环境的供暖/冷却系统,或者您可以使用此 TTC 功能在温度升高时创建一个警报。
摘要
在本章中,我们探讨了点对点通信以及 Arduino IoT Cloud 在物与物通信中的优势。我们讨论了如何开发物与物通信的解决方案。我们还探讨了仅使用图形用户界面同步云变量与其他事物的简便性。我们设置了一个仪表板,其中将小部件控件与多个物云变量相连接。最后,我们详细讨论了 Arduino IoT Cloud 在物与物通信中的限制。
在下一章中,我们将探讨如何使用 Arduino IoT Cloud SDK。本章是为那些渴望学习如何使用 Arduino IoT Cloud 编程和开发自定义解决方案的开发者而准备的,这些解决方案可以使用 Arduino IoT Cloud 或将其与第三方平台集成。
第八章:使用 Arduino IoT Cloud SDK 和 JavaScript 进行工作
每个平台都提供APIs和SDKs以使他们的产品与其他平台兼容,并且这些端点被开发者用来创建新的功能以解决现实世界的问题。同样,Arduino IoT Cloud也自带内置的功能和特性,但还有三种不同的方式来扩展 Arduino IoT Cloud 平台的功能或使其与其他工具和服务兼容:即REST APIs、SDKs和webhooks。
在本章中,我们将讨论 APIs 和 SDKs 以及它们的工作原理。具体来说,我们将使用Node.js SDK来展示不同的编码练习。本章将涵盖设备、事物、属性(即变量)和仪表板的创建、读取、更新和删除(CRUD)操作。除此之外,我们还将探索一些其他功能,例如如何设置/获取属性的值。
到本章结束时,你将了解如何通过 API 或 Node.js SDK 与 Arduino IoT Cloud 平台交互以创建自定义仪表板,使用其他工具/应用程序与数据交互,以及使用 SDK 进行大量设备创建和管理。
在本章中,我们将涵盖以下主要主题:
-
揭秘 Arduino IoT Cloud SDK – 功能和操作
-
保护访问权限 – 揭示 API 密钥和身份验证
-
步骤详解 – 安装 Arduino Node.js SDK 客户端
-
初步探索 – 使用 Postman 进行试驾
-
多平台兼容性 – 适用于各种环境的 SDKs
-
与设备交互 – 使用 Node.js SDK 进行实践
-
与事物互动 – Node.js SDK 实现指南
-
探索属性 – Node.js SDK 交互技巧
-
打造仪表板 – 通过 Node.js SDK 释放潜力
-
使用 Node.js SDK 进行微调 – 属性值管理
技术要求
本章没有特定的硬件要求,因为我们专注于 SDK,并将通过不同的编码练习在 Arduino IoT Cloud 平台上使用 Node.js SDK 执行不同的操作。为了跟随编码和测试练习,需要以下软件:
-
Node.js
-
已安装Node.js Arduino IoT Cloud 模块
-
VSCode 编辑器
-
Postman
-
Arduino IoT Cloud 账户
将使用 Postman 进行cURL 测试和身份验证,这将帮助其他开发者在进行请求和响应测试时。对于 SDK 编码,我们将使用 Node.js 和 VSCode 编辑器。本章的代码可在书籍的官方 GitHub 仓库github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers中找到。
揭秘 Arduino IoT Cloud SDK – 功能和操作
Arduino IoT Cloud 提供了一系列功能,但不可避免地会有一些情况,开发者需要将他们的工具/系统/应用程序与 Arduino IoT Cloud 集成,以改善操作管理和控制。为了满足这些需求,Arduino IoT Cloud 提供了不同的技术和工具,供开发者和组织使用,以扩展产品的功能并解决现实世界的问题。
如以下图所示,Arduino IoT Cloud 为开发者提供了三个主要接口,以帮助他们满足需求。首先是 webhooks,我们在上一章中使用它将 Arduino IoT Cloud Thing 的数据发送到自定义 端点 或任何知名平台,包括 Zapier 或 IFTTT 以进行进一步集成。在 webhooks 之后,我们有 REST API 和 SDK,这两个都是开发者根据需求塑造系统的非常有用的功能。

图 8.1 – Arduino IoT Cloud 界面
在本章中,我们将特别关注 Node.js SDK。然而,首先对 Arduino IoT Cloud 的功能进行适当的概述是很重要的,这有助于开发者在与其他平台集成时做出更好的决策。Arduino 团队为不同的操作创建了 REST API 端点,例如 创建、删除、列出、更新 等,并根据 Arduino IoT Cloud 平台上使用的术语,如 Thing、设备、属性等,将它们放入不同的类别中。开发者可以通过不同的方法向这些端点发送请求,例如 PUT、DELETE 或 GET,并带有不同的参数,然后他们将从 Arduino IoT Cloud 获取所需的 JSON 格式响应,这些响应可以用于进一步的产品开发。
REST API 对开发者来说就像原材料,他们需要通过在首选语言中编写代码来处理它们,并使用 cURL 库发送和接收请求和响应。另一方面,Arduino 团队提供了一个 SDK,它基本上是 REST API 端点的编程包装器。这使我们能够节省时间,因为我们通过使用库方法获得对许多方法和示例代码的访问权限,从而完成我们的任务。在撰写本文时,Arduino 团队已经为三个编程平台开发了 SDK:Node.js、Python 和 GoLang。
在本章中,我们将专门使用 Node.js SDK 创建不同的脚本,以对 Thing、设备、属性和仪表板执行 CRUD 操作。我们还将开发允许您 获取/设置 Thing 属性最新值的脚本,以及更多功能。总的来说,本章对开发者来说将会很有趣,因为我们将探索不同的技术和方法,这些方法将帮助我们从小规模扩展到企业级的物联网操作。
在本节中,我们讨论了 Arduino IoT Cloud API/SDK 为开发者提供哪些类型的功能。在下一节中,我们将讨论用于认证的 API 密钥。
保护访问权限 – 揭示 API 密钥和认证
在进入本章的主要内容之前,我们首先需要讨论平台的认证机制。Arduino IoT Cloud 使用requests/responses。
在我们开始 SDK 安装和用 Postman 进行测试之前,我们需要在 Arduino Cloud 中设置 API,它将为我们提供客户端 ID 和密钥。在旧版本的界面中,API 选项位于集成选项卡下,但现在已移动到 Arduino Cloud,可在cloud.arduino.cc/home/找到。
访问集成页面后,点击API 密钥,您将被带到 API 页面。点击创建 API 密钥。将出现一个弹出窗口;为 API 提供一个名称,然后点击继续按钮。出现的向导将花费几秒钟生成密钥,然后会出现一个新的弹出窗口显示密钥:

图 8.2 – API 密钥
通过点击复制图标复制客户端 ID和客户端密钥的值 – 千万不要尝试手动选择复制,因为客户端密钥非常长,所以点击复制图标是最好的选择。将客户端 ID 和客户端密钥保存在安全的位置,然后点击复选框确认您已保存您的密钥。最后,点击完成,您将在面板中看到您的 API 密钥 – 现在它已准备好使用。
重要提示
使用单个 API 密钥即可访问所有设备和它们的变量。只需一个 API 密钥就能访问所有基础设施非常方便,无需为每个设备创建单独的 API 密钥,但您必须保管好您的密钥!这是一个很大的安全风险,因为如果您丢失了密钥,黑客可能会获取到您的整个账户的访问权限。
在本节中,我们已经设置并创建了由客户端 ID 和客户端密钥组成的 API 认证密钥。本节非常重要,因为没有这些密钥,我们无法使用任何 API。在下一节中,我们将尝试使用 Postman 工具进行第一次 API 调用。
初步探索 – 使用 Postman 进行试驾
在深入研究 SDK 之前,我们将尝试使用 Postman 的裸露的 REST API端点,Postman 是一个帮助开发者调试其他编程语言平台(这些平台没有作为 SDK 提供)的请求/响应的工具。Postman 是后端开发者中广为人知的一个工具,用于在不进行任何编码的情况下公开 API 请求/响应。Postman 还帮助开发者通过图形用户界面(GUI)分析响应。
从www.postman.com/下载 Postman,选择适合您操作系统的正确版本。在开始使用 Postman 之前,首先为 Arduino IoT Cloud 创建一个新的工作区,以便将所有请求放入一个单独的组中。为此,点击工作区然后创建工作区:

图 8.3 – Postman 工作区
将会打开一个新窗口:提供工作区名称和描述,并根据您的需求设置可见性策略。创建新工作区后,导航到文件 > 新建…并选择HTTP 请求。在向 Arduino IoT Cloud 发送任何请求之前,必须有一个认证令牌。参考以下截图:点击授权选项卡,然后从类型下拉菜单中选择OAuth 2.0。滚动到授权页面以找到配置新令牌部分,并点击此部分下的配置选项选项卡。

图 8.4 – 授权配置选项
在配置选项下,我们需要提供三样东西。首先,将api2.arduino.cc/iot/v1/clients/token URL 添加到访问令牌 URL字段,然后将我们在 Arduino IoT Cloud API 中之前生成的值插入到客户端 ID和客户端密钥字段。最后,从客户端认证下拉菜单中选择在正文中发送客户端凭据。现在点击高级选项选项卡,我们将在此设置接收请求的 API 受众。
图 8.5显示了高级选项,我们需要提供 Arduino IoT Cloud 认证 URL,以便我们可以认证和授权请求。

图 8.5 – 授权高级选项
将api2.arduino.cc/iot URL 添加到受众字段。设置好配置后,点击获取新的访问令牌按钮。它将返回错误消息或成功消息。如果有任何错误,请逐个重复所有步骤,确保配置与之前描述的一致。如果成功,请点击继续,您将获得用于认证的令牌。
获取认证令牌后,是时候做一些实验了。Arduino 团队已经用 cURL 和 Node.js SDK 示例记录了所有端点,这些示例按不同类别提供,可在 www.arduino.cc/reference/en/iot/api/ 找到。因此,我们想查看特定事物的云变量/属性列表。打开上述 API 文档 URL,找到 https://api2.arduino.cc/iot/v2/things/{id}/properties?show_deleted=。在这里,我们需要将 URL 中的 {id} 替换为特定事物的 ID (图 8.6)。事物 ID 在 URL 的 show_deleted 之后,位于事物的 true 之前。在将所有所需数据添加到 URL 后,它将看起来像 api2.arduino.cc/iot/v2/things/8aee742e-4492-423d-9f19-79fec856b917/properties?show_deleted=true。
点击 发送,你将收到来自 Arduino IoT Cloud 的 JSON 格式响应,其中包含事物的所有云变量属性,包括属性 ID、名称、类型、云变量的最后值等:

图 8.6 – Postman 请求响应
上一张截图显示了 Postman 中的响应。您可以将响应转换为纯文本以及其他格式,包括 XHTML、HTML 等,但 Postman 对 JSON 数据响应的视觉功能非常出色。这样,开发者可以轻松理解并调整响应的性质,并根据其数据结构准备脚本。这也有助于开发者更快地从响应中选择特定内容,从而减少所需的时间和精力。
在本节中,我们使用 Postman 向 Arduino IoT Cloud 发送了我们的第一个请求。我们首先在 Postman 中配置了 API 认证密钥,然后请求事物的云变量/属性列表。Arduino IoT Cloud 成功以 JSON 格式返回了包含所有所需数据的响应。在下一节中,我们将检查不同平台可用的 SDK。
多平台兼容性 – 各种环境的 SDK
在使用 Postman 测试 请求/响应 后,是时候探索 Arduino IoT Cloud 可用的 SDK 了。之前我提到,Arduino 团队为三个编程平台开发了官方 SDK,分别是 Node.js、Python 和 GoLang。
Node.js 是后端开发者中非常知名的语言,被网页和移动开发者广泛使用。因此,如果您计划为 Arduino IoT Cloud 自动化创建带有自定义可视化的移动或网页应用,那么 Node.js 是最佳语言,它提供了广泛的 HTTP 服务库。
另一方面,Python 也是在 Web、IoT 和 AI/ML 开发者中非常知名且快速发展的语言。Python 似乎正朝着 AI/ML 发展趋势,而 IoT 作为领域与 AI/ML 非常接近。如果你计划开发专注于 AI/ML 的解决方案,例如 预测性维护、时间序列分析或预测,那么 Python SDK 是与 Arduino IoT Cloud 交互的最佳选择。
GoLang 是 Arduino 团队为其开发的最后一个平台。GoLang 由 Google 开发,遵循 C 类语法。GoLang 平台非常适合操作系统和网络/API 服务开发。如果你计划使用 Arduino IoT Cloud 维护高性能系统或计划运行并发操作,那么 GoLang 是更好的选择。
我们在这里讨论了三种不同的平台及其专门的应用领域。Node.js 适用于 Web APIs,Python 适用于机器学习,而 GoLang 是高性能系统的绝佳选择。你可以根据项目需求选择一个 SDK 平台进行开发,或者消费所有 SDK。
在下一节中,我们将开始使用 Node.js SDK 的旅程,首先在我们的机器上安装官方 Arduino IoT Cloud Node.js SDK。
步骤-by-步骤 – 安装 Arduino Node.js SDK 客户端
从这个点开始,我们将使用 Node.js SDK 进行我们的练习和实验。在进入实际练习之前,我们首先需要安装 Arduino IoT Cloud 的 Node.js 包。从 nodejs.org/ 下载并安装 Node.js。Node.js 安装完成后,打开 Windows/Mac/Linux 的 终端 并导航到使用 VSCode 设置编码工作空间的目录:
npm install @arduino/arduino-iot-client
npm i request-promise
在 终端 中输入前两个命令,等待安装完成。安装成功后,打开 VSCode 并将(你安装 Node.js Arduino IoT Cloud SDK 的)文件夹添加到安装 Arduino IoT Cloud 和 request-promise 模块的 workspace 中。
导航到本书的官方 GitHub 仓库,并从本章文件夹中下载所有代码。将文件复制到 VSCode 的 Workspace 文件夹中,并解压下载的 .zip 文件。导航到 start 文件夹,并在 VSCode 中打开 main.js 文件。
在这里,我们有两种方法,getToken() 和 ThingProperty()。getToken() 方法将在编码练习中保持一致,并用于根据客户端 ID 和客户端密钥从 Arduino IoT Cloud 获取认证令牌:
client_id: '-----Paste ClientID Here-----', client_secret: '-----Paste Client Secret Here-----',
上述代码片段来自 getToken() 方法。将你的客户端 ID 插入 client_id 变量,将你的客户端密钥插入 client_secret 变量。同样,在 ThingProperty() 方法下的以下代码片段中插入你的 Thing ID 和 Property ID。你可以通过导航到 Arduino IoT Cloud 中的“设备”然后是 元数据 选项卡来获取你的 Thing ID。属性 ID 可以通过在 Arduino IoT Cloud 的设备页面上的云变量上点击来找到:
var id = "Paste -----Thing ID-----"; // {String} The id of the thing
var pid = "-----Property ID-----"; // {String} The id of the property
打开 main.js 代码并在控制台提供响应:
node main.js
如果一切正常,你将在控制台收到以下响应:
API called successfully. Last Value of Property=259
如果你收到 401 错误,这意味着你的客户端 ID 和/或客户端密钥不正确。如果返回 404 错误,这意味着你没有使用正确的方法来获取属性数据。如果你得到 500 错误,这意味着服务器已关闭或你的 ISP 对 Arduino IoT Cloud 有网络阻塞。
在 第一次使用 Postman 尝试 部分,我们讨论了如何使用 Arduino IoT Cloud 端点与 Postman 进行请求/响应任务,以及安装云的 Node.js 模块并使用示例进行测试,其中我们获取了 Thing 云变量/属性的最后一个值。
在这个基础上,我们将开始一段新的旅程,我们将围绕 Arduino IoT Cloud 进行操作。首先,我们将从设备开始。在下一节中,我们将创建、更新、删除、列出和查看特定设备。在章节的后面,我们将对 Things、属性(也称为云变量)和仪表板做同样的操作。
与设备交互 - 使用 Node.js SDK 进行实际操作
在本节中,我们将亲自动手,使用设备进行实际操作。我们将对设备执行 CRUD 操作,以及列出所有设备并显示特定设备的所有参数。打开 VSCode 并导航到本章的示例代码。然后点击 device 文件夹:在这里你可以找到所有与设备操作相关的代码。
创建设备
首先,我们将从设备创建开始。设备创建的文档可以在 www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2Create 找到。在 VSCode 中 device 文件夹下打开 create-device.js。
代码中有两种方法:一种是 getToken(),这与我们所有的编码练习中的方法相同,帮助我们获取请求的认证令牌。第二种方法是 CreateDevice(),它负责设备创建。查阅文档,我们可以看到我们需要使用 AiotApi.DevicesV2Api() 对象初始化 api 变量,这与设备相关:
var DeviceProperties = {
'name':'Sense Home XIAO Series',
'connection_type':'wifi',
'fqbn':'esp32:esp32:XIAO_ESP32C3',
'type':'login_and_secretkey_wifi'
};
var options = {
};
api.devicesV2Create(DeviceProperties, options).then(function(data) {
console.log('Device Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
api.devicesV2Create 是负责设备创建的方法,它接受两个输入参数。DeviceProperties 包括设备名称、类型和 name 第一部分——这可以是任何您喜欢的,但请避免使用特殊字符。接下来,我们需要提供一个 connection_type 的选择,例如 Wi-Fi、GSM、LoRa WAN 等。所有可用类型都在文档中提供。对于 fqbn,我们需要提供开发板的详细信息。例如 esp32:esp32:XIAO_ESP32C3。
options 是可选的,所以我留空了,但你可以根据需求提供 X-Organization 的值。两个数组都传递给 api.devicesV2Create 方法,该方法将返回响应。使用 util.inspect 方法以适当的格式在控制台上显示 JSON 响应。输入以下命令以执行 create-device.js 程序:
node create-device.js
脚本成功执行后,将打印出如下响应:
Device Created successfully. Returned data: ArduinoDevicev2 {
href: '/iot/v2/devices/e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
id: 'e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
label: 'Login and secret key for wifi device',
name: 'Sense Home XIAO Series',
serial: '',
type: 'login_and_secretkey_wifi',
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
fqbn: 'esp32:esp32:XIAO_ESP32C3'
}
在响应中,您将获得设备 ID,它将在本章的设备创建部分使用,当我们将设备与设备关联时。其余属性与代码中已覆盖的相同。
重要注意事项
如果您无法获取正确的 FQBN,则可以从仪表板手动添加设备,通过下拉菜单查找并点击设备。这将提供 fqbn、type 和 connection_type 详细信息。您可以在 Node.js 脚本中稍后使用这些详细信息来自动创建设备。
更新设备
在本节中,我们将探讨如何使用设备 ID 更新设备。假设我们错误地添加了一个具有错误 FQBN 和名称的设备。我们将使用设备 ID 更新这两个属性。有关更新设备的文档可在 www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2Update 查找。在 VSCode 中打开 device 文件夹下的 update-device.js 文件:
var api = new AiotApi.DevicesV2Api();
var DeviceID="e88b84a7-7ad7-4c2b-b79c-ab426e47dc67";
var DeviceProperties = {
'name':'Sense Home WeMos D1 Mini Series',
'connection_type':'wifi',
'fqbn':'esp8266:esp8266:d1_mini',
'type':'login_and_secretkey_wifi'
};
var options = {
};
api.devicesV2Update(DeviceID,DeviceProperties, options).then(function(data) {
console.log('Device Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
上述代码几乎与 create-device 代码相同。这里我们有一个额外的变量 DeviceID,我们将用它来更新特定的设备。其余的代码与之前相同,具有相同的设备属性和选项。现在,在 DeviceProperties 变量中填写正确的 fqbn 和 name 值。最后,我们调用 api.devicesV2Update() 方法。在终端中执行以下命令:
node update-device.js
脚本成功执行后,将打印出如下响应:
Device Updated successfully. Returned data: ArduinoDevicev2 {
href: '/iot/v2/devices/e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
id: 'e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
label: 'Login and secret key for wifi device',
name: 'Sense Home WeMos D1 Mini Series',
serial: '',
type: 'login_and_secretkey_wifi',
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
created_at: 2023-04-17T00:47:40.700Z,
fqbn: 'esp8266:esp8266:d1_mini'
}
如我们所见,在更新后,响应会发送回新的内容。我们提供了名称和 FQBN 的更改,并且成功反映在响应中。
删除设备
在本节中,我们将探讨如何使用设备 ID 来删除设备。有关删除设备的文档可在www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2Delete找到。
在 VSCode 中打开device文件夹下的delete-device.js文件:
var api = new AiotApi.DevicesV2Api();
var DeviceID='e88b84a7-7ad7-4c2b-b79c-ab426e47dc67';
var options = {
};
api.devicesV2Delete(DeviceID, options).then(function(data) {
console.log('Device Deleted successfully. Returned data: ' + data);
}, function(error) {
console.error(error);
});
上述代码片段是从DeleteDevice()方法中提取的。在此方法中,我们需要将DeviceID和options变量作为参数提供。DeviceID是删除过程的必需参数,而options变量不是必需的。请在终端中执行以下命令:
node delete-device.js
脚本执行成功后,将在控制台打印一条响应,报告设备已成功删除。
列出设备
在本节中,我们将列出所有设备。请注意,列出设备和显示设备之间存在差异:列出设备意味着显示所有设备及其属性,而显示设备仅根据设备 ID 返回特定设备的属性。
列出设备的文档可在www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2List找到。在 VSCode 中打开device文件夹下的list-device.js文件。以下代码片段是从list-device.js文件中的ListDevice()方法中提取的:
var api = new AiotApi.DevicesV2Api()
var opts = {
'acrossUserIds': true // {Boolean} If true, returns all the devices
};
api.devicesV2List(opts).then(function(data) {
for(var i=0;i<data.length;i++){
console.log("Device ID:"+data[i].id+" Device Name:"+data[i].name);
}
}, function(error) {
console.error(error);
});
在这里,我们需要提供用于过滤设备和返回所需响应的准则。在当前代码中,我们只提到了一个参数,即'acrossUserIds',其值为true以获取所有类型的设备。但如果需要,你可以根据tags、serial和X-Organization来过滤列出的设备。请在终端中执行以下命令:
node list-device.js
脚本执行成功后,将以 JSON 格式打印包含设备属性的响应,这将导致终端控制台输出大量信息。我修改了代码,只显示设备 ID 和设备名称在控制台上:
Device ID:04d8025a-4270-4d7e-aa04-45db87a594f5
Device Name:SmartAgriESP32-Sargodha
Device ID:5aae7e1f-940b-4426-80ac-1c953839cdb2
Device Name:MKR-GSM-1400
Device ID:fae0951d-3169-4d6a-a8e5-739c347eafc1
Device Name:MKR1500
Device ID:ca711f68-6de9-497a-ac45-780219ad2bb8
Device Name:Wemos d1 Mini by API Update
Device ID:64990519-1833-4bba-b035-978fcaa33466
Device Name:MKR1010-Device
Device ID:62e8600b-2733-4f24-9654-1fac549af27f
Device Name:XIAO-ESP32C3-Pulse-Sensor
Device ID:e88b84a7-7ad7-4c2b-b79c-ab426e47dc67
Device Name:Sense Home WeMos D1 Mini Series
Device ID:b9f3ff20-ebf1-4260-ad16-f434466458ac
Device Name:ArduinoNanoRP2040
Device ID:047d8316-dcdb-4bf5-af30-4319bb5a5eb0
Device Name:Delly
在前面的代码中,我们在控制台显示了两个参数,但你可以通过指定它们的名称在 for 循环中自由选择并指定任意数量。使用这种方法,我们可以将输出以 JSON 格式发送到 Web/移动客户端,该客户端将在列表框或菜单中显示信息。
显示设备
这是“与设备交互 – 使用 Node.js SDK 动手实践”部分的倒数第二个小节。在这里,我们将通过提供设备 ID 来获取特定设备的所有属性。有关显示设备的文档可在www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2Show找到。
在 VSCode 中打开 device 文件夹下的 show-device.js 文件。以下代码片段是从 show-device.js 文件中的 ShowDevice() 方法中摘取的:
var api = new AiotApi.DevicesV2Api()
var id = '62e8600b-2733-4f24-9654-1fac549af27f'; // {String} The id of the device
var opts = {
};
api.devicesV2Show(id, opts).then(function(data) {
console.log('Device Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
devicesV2Show() 方法只接受两个参数:第一个是 DeviceID,第二个是 options,包括 X-Organization。DeviceID 是获取适当响应的必需参数,而 opts 变量是可选的,因此我们将其留空。在终端中执行以下命令:
node show-device.js
脚本执行成功后,它将以 JSON 格式打印出包含设备属性以及任何关联变量的详情(如果有的话):
ArduinoDevicev2 {
id: '62e8600b-2733-4f24-9654-1fac549af27f',
label: 'Login and secret key for wifi device',
name: 'XIAO-ESP32C3-Pulse-Sensor',
……………………………………..
thing: ArduinoThing {
id: '6b6cd076-5859-4a6d-9b4e-18879893c6cb',
name: 'Tracking and notifying Your Heart Rate',
……………………………………..
webhook_active: true,
webhook_uri: 'https://hooks.zapier.com/hooks/catch/14930971/324me7k/'
}
}
以下代码是关于设备属性的脚本编辑后的响应,包括给定设备的所有详细信息,如最后活动时间、云变量数量、与设备关联的 Thing ID、webhook 详细信息(如果处于活动状态)、sketch ID 等。
在本小节中,我们探讨了如何使用 Node.js SDK 从 Arduino IoT Cloud 获取所有设备列表。接下来,让我们探索如何获取与设备关联的云变量/属性列表。
设备属性/变量
在这里,我们将通过提供设备 ID 来获取特定设备的所有云变量详情。关于显示设备的文档可在 www.arduino.cc/reference/en/iot/api/#api-DevicesV2-devicesV2GetProperties 查找。
首先,在 VSCode 中打开 device 文件夹下的 properties-device.js 文件。以下代码片段是从 properties-device.js 文件中的 ListPropDevice() 方法中摘取的:
var api = new AiotApi.DevicesV2Api()
var id = '62e8600b-2733-4f24-9654-1fac549af27f'; // {String} The id of the device
var opts = {
};
api.devicesV2GetProperties(id, opts).then(function(data) {
console.log('Device Properties.' + util.inspect(data));
}, function(error) {
console.error(error);
});
devicesV2GetProperties() 方法只接受两个参数:第一个是设备 ID,第二个是选项,包括 showDeleted 和 X-Organization。DeviceID 是获取适当响应的必需参数,而 opts 变量是可选的,因此我们将其留空。在终端中执行以下命令:
node properties-device.js
脚本执行成功后,它将以 JSON 格式打印出与特定设备 ID 相关的云变量详情:
Properties: [
ArduinoProperty {
href: '/iot/v1/things/6b6cd076-5859-4a6d-9b4e-18879893c6cb/properties/b357a513-ad2b-4e1f-a76b-6dac078e36d5',
id: 'b357a513-ad2b-4e1f-a76b-6dac078e36d5',
name: 'BPM',
permission: 'READ_ONLY',
thing_id: '6b6cd076-5859-4a6d-9b4e-18879893c6cb',
type: 'HEART_BEATS',
update_strategy: 'ON_CHANGE',
created_at: 2023-03-31T16:41:33.103Z,
persist: true,
tag: 1,
thing_name: 'Tracking and notifying Your Heart Rate',
update_parameter: 0,
updated_at: 2023-03-31T17:05:19.564Z,
variable_name: 'bPM'
}
]
以下响应是关于设备云变量的脚本编辑后的响应,包括 variable_name、type、permission、thing_id、update_strategy 等。我们已经看到了如何获取云变量详情,在下一节中,我们将继续介绍 Things。
与事物互动 – Node.js SDK 实现指南
Thing 是 Arduino IoT Cloud 中最重要的元素之一,它作为一个定义的容器,包含所有成分,如云变量、设备、设备的 sketch 以及设备的网络配置。在本节中,我们将尝试一系列不同的编码练习,以了解 Thing CRUD 操作。
创建一个 Thing
首先,我们将从创建 Thing 开始。相关文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2Createe找到。在 VSCode 中打开位于 thing 文件夹下的 create-thing.js 文件。
此代码中有两种方法:一种是 getToken(),这与我们所有编码练习中的方法相同,帮助我们获取请求的认证令牌。第二种方法是 CreateThing(),它负责创建 Thing。根据文档,我们可以看到需要使用 AiotApi.ThingsV2Api() 对象初始化 api 变量,该对象与 Arduino IoT Cloud Thing 相关。该对象负责对 Thing 执行操作:
var api = new AiotApi.ThingsV2Api()
var thingCreate = {'name':' Sense the Env Thing Via API'}; // {ThingCreate}
var opts = {
'force': true // {Boolean} If true, detach device from the other thing, and attach to this thing
};
api.thingsV2Create(thingCreate, opts).then(function(data) {
console.log('Thing Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
api.thingsV2Create 是负责创建 Thing 的方法,它接受两个参数作为输入:name 和 opts。首先,我们从 name 开始,这可以是任何您喜欢的名称,但请确保避免特殊字符。目前,我们在变量中只提供了 Thing 名称,但在即将到来的更新部分,我们还将传递时区和设备 ID 参数。
opts 是可选的,因此我将其留空,但如有需要,您可以提供 X-Organization 值。这两个变量都传递给 api.thingsV2Create 方法,该方法将返回响应。util.inspect 方法用于在控制台上以适当的格式显示 JSON 响应。输入以下命令以执行 create-device.js 脚本:
node create-thing.js
脚本执行成功后,将打印出如下响应:
Thing Created successfully. Returned data: ArduinoThing {
href: '/iot/v1/things/d99e244d-f245-4e27-9ead-717e52ac5a96',
id: 'd99e244d-f245-4e27-9ead-717e52ac5a96',
name: 'Sense the Env Thing Via API',
timezone: 'America/New_York',
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
created_at: 2023-04-18T16:46:35.767Z,
properties_count: 0,
updated_at: 2023-04-18T16:46:35.767Z,
webhook_active: false
}
在响应中,您将获得您的 Thing ID,该 ID 将在以下 Thing 更新/删除操作中很快使用——因此请确保将此 Thing ID 粘贴到记事本文件或其他类似文件中。同时返回的还有时区、属性计数和 webhook 状态。
更新一个 Thing
在本节中,我们将探讨如何使用 Thing ID 更新一个 Thing。假设我们错误地添加了 Thing,但没有设置正确的时间区域,也没有进行设备关联。在这种情况下,我们有选项使用新属性更新 Thing。有关更新设备的文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2Update找到。在 VSCode 中打开位于 device 文件夹下的 update-thing.js 文件:
var api = new AiotApi.ThingsV2Api()
var id = 'd99e244d-f245-4e27-9ead-717e52ac5a96'; // {String} The id of the thing
var thingUpdate = {
'name':'Sense the Env Thing Via API Update',
'timezone':'Asia/Karachi',
'device_id':'e88b84a7-7ad7-4c2b-b79c-ab426e47dc67'
};
var opts = {
'force': true // {Boolean} If true, detach device from the other thing, and attach to this thing
};
api.thingsV2Update(id,thingUpdate, opts).then(function(data) {
console.log('Thing Updated successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
上述代码与 create-thing 代码类似。这里我们有一个额外的变量 id,它将帮助我们更新特定的 Thing。在 thingupdate 变量中,我们还有 timezone、device_id 和 name。最后,我们调用 api.thingsV2Update() 方法。在终端中执行以下命令:
node update-thing.js
脚本执行成功后,将打印出如下响应:
Thing Updated successfully. Returned data: ArduinoThing {
href: '/iot/v1/things/d99e244d-f245-4e27-9ead-717e52ac5a96',
id: 'd99e244d-f245-4e27-9ead-717e52ac5a96',
name: 'Sense the Env Thing Via API Update',
timezone: 'Asia/Karachi',
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
created_at: 2023-04-18T16:46:35.767Z,
device_id: 'e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
properties_count: 0,
updated_at: 2023-04-18T16:46:35.767Z,
webhook_active: false
}
更新后,响应将返回新的内容。我们提供了新的 name 和 device_id 值,以及正确的时间区域。所有内容都已成功更新并反映在响应中。
创建 Thing 草图
在完成 Thing 的创建后,我们现在需要为 Thing 创建一个草图。相关文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2CreateSketch找到。在 VSCode 中打开位于 thing 文件夹下的 create-sketch-thing.js 文件。
代码中有两种方法:一种是 getToken(),这是我们在所有编码练习中使用的相同方法,用于获取请求的认证令牌。第二种方法是 CreateSketch(),它处理为特定 Thing 创建草图:
var api = new AiotApi.ThingsV2Api()
var id = 'd99e244d-f245-4e27-9ead-717e52ac5a96'; // {String} The id of the thing
var thingSketch = {'sketch_version':'v1'}; // {ThingSketch}
var opts = {
};
api.thingsV2CreateSketch(id, thingSketch, opts).then(function(data) {
console.log('Thing Sketch Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
api.thingsV2CreateSketch 是负责创建 Thing 草图的方法,它接受三个输入参数。第一个参数是 Thing ID;第二个是草图版本。opts 是可选的,所以我留空了,但你可以根据需要提供 X-Organization 值。所有变量都传递给 api.thingsV2CreateSketch 方法,该方法将返回响应。使用 util.inspect 方法在控制台上以适当的格式显示 JSON 响应。输入以下命令以执行 create-device.js 脚本:
node create-sketch-thing.js
脚本执行成功后,将打印以下响应:
Thing Sketch Created successfully. Returned data: ArduinoThing {
href: '/iot/v1/things/d99e244d-f245-4e27-9ead-717e52ac5a96',
id: 'd99e244d-f245-4e27-9ead-717e52ac5a96',
name: 'Sense the Env Thing Via API Update',
timezone: 'Asia/Karachi',
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
created_at: 2023-04-18T16:46:35.767Z,
device_id: 'e88b84a7-7ad7-4c2b-b79c-ab426e47dc67',
properties_count: 0,
sketch_id: '93297fc6-835d-46b3-89bc-1c6738a8ec7b',
updated_at: 2023-04-18T17:10:34.779Z,
webhook_active: false
}
在响应中,您将看到您的 Thing ID 以及一些其他属性,表明已成功创建了给定 Thing 的草图。您还可以通过在 Arduino IoT Cloud 中导航到指定的 Thing 来验证草图。
重要提示
在创建草图之前,将设备与 Thing 关联是很重要的。
在本节中,我们创建了 Thing 的草图,因为 Arduino IoT Cloud 默认不会这样做。因此,在 Arduino IoT Cloud 中创建 Thing 后,必须创建一个草图。接下来,我们将探讨如何使用 Arduino IoT Cloud API 删除一个 Thing。
删除 Thing
在本节中,我们将探讨如何使用 Thing ID 删除一个 Thing。关于 Thing 删除的文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2Delete找到。在 VSCode 中打开位于 thing 文件夹下的 delete-thing.js 文件:
var api = new AiotApi.ThingsV2Api()
var id = 'ac9fc5fd-a946-406e-983d-715dcc2571b6'; // {String} The id of the thing
var opts = {
'force': true // {Boolean} If true, detach device from the other thing, and attach to this thing
};
api.thingsV2Delete(id, opts).then(function(data) {
console.log('Thing Deleted successfully. Returned data: ' + data);
}, function(error) {
console.error(error);
});
上述代码片段来自 DeleteThing() 方法。在 DeleteThing() 方法中,我们需要将 id(Thing ID)和 opts 变量作为参数提供。id(Thing ID)是删除过程所必需的,而 opts 变量则不是。在终端中执行以下命令:
node delete-thing.js
脚本执行成功后,将在控制台上打印一个响应,指示设备已成功删除。
列出 Things
在本节中,我们将列出所有的事物。请注意,列出事物和显示事物之间有区别:列出事物将显示所有事物的属性,而显示事物仅显示与特定事物 ID 相关的特定事物属性。
有关列出事物的相关文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2List找到。在 VSCode 中打开thing文件夹下的list-thing.js文件。以下代码片段是从ListThing()方法中摘取的:
var api = new AiotApi.ThingsV2Api()
var opts = {
'acrossUserIds': false
};
api.thingsV2List(opts).then(function(data) {
for(var i=0;i<data.length;i++){
console.log("Thing ID:"+data[i].id+" Thing Name:"+data[i].name);
}
}, function(error) {
console.error(error);
});
在这里,我们需要提供用于过滤事物并返回响应的准则。在当前代码中,我们只提供了一个参数,即'acrossUserIds',其值为true,因此将检索所有类型的事物。但你也可以根据标签、ID、X-Organization 等进行事物过滤。在终端中执行以下命令:
node list-thing.js
脚本执行成功后,它将以 JSON 格式打印包含事物属性的响应,这将使控制台充满大量输出。我修改了代码,只显示控制台上的事物 ID 和事物名称:
Thing ID:6b6cd076-5859-4a6d-9b4e-18879893c6cb Thing Name:Tracking and notifying Your Heart Rate
Thing ID:6e3d308c-dfb2-49ad-aa61-998227f214ab Thing Name:Thing Via API-Name-Update
Thing ID:85b04a9c-e335-4842-bf4b-c13f726e0522 Thing Name:AgriStack
Thing ID:8aee742e-4492-423d-9f19-79fec856b917 Thing Name:A portable thing tracker using MKR GSM1400
Thing ID:bf8e11ea-1a78-4f95-b6a0-c6d50b868402 Thing Name:MKR1010 Hello World
Thing ID:d99e244d-f245-4e27-9ead-717e52ac5a96 Thing Name:Sense the Env Thing Via API Update
如前所述输出所示,我在控制台上只显示两个参数,但你可以通过在 for 循环中指定它们的名称来选择你想要显示的任何参数。这样我们就可以将输出以 JSON 格式发送到 Web/移动客户端,信息将在列表框或菜单中显示。
显示事物
这是“与事物互动 – Node.js SDK 实现指南”部分的最后一个子部分。我们将通过提供事物 ID 来获取有关特定事物的所有属性。有关显示事物的文档可在www.arduino.cc/reference/en/iot/api/#api-ThingsV2-thingsV2Show找到。在 VSCode 中打开thing文件夹下的show-thing.js文件。以下代码片段是从ShowThing()方法中摘取的:
var api = new AiotApi.ThingsV2Api()
var thingid='6b6cd076-5859-4a6d-9b4e-18879893c6cb';
var opts = {
};
api.thingsV2Show(thingid, opts).then(function(data) {
console.log('API called successfully. Returned data: ' +util.inspect(data));
}, function(error) {
console.error(error);
});
thingsV2Show()方法只接受两个参数:第一个是thingid,第二个是opts,其中包含X-Organization。thingid是获取适当响应的必需参数,而opts变量不是强制性的,因此我传递了这个空变量。在终端中执行以下命令:
node show-thing.js
脚本执行成功后,它将以 JSON 格式打印响应,其中包含设备属性以及云变量的详细信息(如果有相关变量):
API called successfully. Returned data: ArduinoThing {
name: 'Tracking and notifying Your Heart Rate',
timezone: 'Asia/Karachi',
……………………………………..
device_fqbn: 'esp32:esp32:XIAO_ESP32C3',
device_id: '62e8600b-2733-4f24-9654-1fac549af27f',
device_name: 'XIAO-ESP32C3-Pulse-Sensor',
device_type: 'login_and_secretkey_wifi',
properties: [
ArduinoProperty {
id: 'b357a513-ad2b-4e1f-a76b-6dac078e36d5',
name: 'BPM',
permission: 'READ_ONLY',
thing_id: '6b6cd076-5859-4a6d-9b4e-18879893c6cb',
type: 'HEART_BEATS',
update_strategy: 'ON_CHANGE',
created_at: 2023-03-31T16:41:33.103Z,
last_value: 50,
……………………………………..
variable_name: 'bPM'
}
],
properties_count: 1,
sketch_id: 'f490fec5-b62a-41f9-9ff7-2b5c3f2ed7d1',
updated_at: 2023-04-01T16:42:47.152Z,
webhook_active: true,
webhook_uri: 'https://hooks.zapier.com/hooks/catch/14930971/324me7k/'
}
上述代码片段显示了输出响应中关于事物属性的编辑部分,其中包括事物的所有详细信息,设备属性,云变量(如最后值),webhook 详细信息(如果处于活动状态),草图 ID 等。
在本节中,我们探讨了如何使用 JSON 格式的设备 ID 获取特定 Arduino IoT Cloud 事物的完整详细信息。接下来,我们将开始玩转云变量/属性。
探索属性 - Node.js SDK 交互技术
属性,也称为云变量,是 Arduino IoT Cloud 中事物最重要的组成部分之一,负责从设备到云或反之的数据存储。在本节中,我们将探讨如何使用 Node.js SDK 创建、更新、删除和列出云变量。
创建属性
首先,我们将从属性创建开始。属性创建文档可在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2Create找到。在 VSCode 中打开位于 properties 文件夹下的 create-property.js 文件。
代码中有两种方法:一种是 getToken(),这是我们所有编码练习中用来获取请求认证令牌的相同方法。第二种方法是 CreateProperty(),它处理云变量创建。查阅文档,我们可以看到我们需要使用 AiotApi 和 PropertiesV2Api() 对象初始化 api 变量,这与属性相关:
var api = new AiotApi.PropertiesV2Api()
var thing_id="d99e244d-f245-4e27-9ead-717e52ac5a96";
var property = {
'name':'Temperature',
'variable_name':'temperature',
'permission':"READ_ONLY",
'persist':true,
'type':'TEMPERATURE_C',
'update_strategy':'ON_CHANGE'
};
api.propertiesV2Create(thing_id, property).then(function(data) {
console.log('Property Created successfully. Returned data: ' +util.inspect(data));
}, function(error) {
console.error(error);
});
api.propertiesV2Create 是负责属性创建的方法,它接受两个输入参数。一个是设备 ID,另一个变量包含有关云变量的强制详细资料。设备 ID 简单且易于从设备元数据中获取,但云变量有多种不同的参数,包括 type、permission 和 update_strategy,这些参数可以在官方文档页面上找到(该 URL 在本节开头已提供)。这两个变量都传递给 api.devicesV2Create 方法,该方法返回响应。使用 util.inspect 方法在控制台上以适当的格式显示 JSON 响应。输入以下命令以执行 create-device.js 脚本:
node create-property.js
脚本执行成功后,将打印以下响应:
Property Created successfully. Returned data: ArduinoProperty {
href: '/iot/v1/things/d99e244d-f245-4e27-9ead-717e52ac5a96/properties/c4dc8f92-b62f-44df-9455-74cdd08041bc',
id: 'c4dc8f92-b62f-44df-9455-74cdd08041bc',
name: 'Temperature',
permission: 'READ_ONLY',
thing_id: 'd99e244d-f245-4e27-9ead-717e52ac5a96',
type: 'TEMPERATURE_C',
update_strategy: 'ON_CHANGE',
created_at: 2023-04-18T23:49:46.610Z,
persist: true,
tag: 1,
updated_at: 2023-04-18T23:49:46.610Z,
variable_name: 'temperature'
}
在响应中,您将获得您的云变量 ID、创建日期和更新日期,以及其他在我们云变量创建练习中提到的其他详细信息。
更新属性
在本节中,我们将探讨如何使用云变量 ID 更新云变量。假设我们错误地添加了一个具有错误数据类型和一些其他参数的云变量——在这种情况下,我们有更新它的选项。有关更新属性的文档可在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2Update找到。在 VSCode 中打开 update-property.js 文件,位于 property 文件夹下:
var api = new AiotApi.PropertiesV2Api()
var thing_id="d99e244d-f245-4e27-9ead-717e52ac5a96";
var property_id="c4dc8f92-b62f-44df-9455-74cdd08041bc"
var property = {
'name':'OutdoorTemperature',
'variable_name':'outdoorTemperature',
'permission':"READ_ONLY",
'persist':true,
'type':'TEMPERATURE_F',
'update_strategy':'ON_CHANGE'
};
api.propertiesV2Update(thing_id,property_id, property).then(function(data) {
console.log('Property Updated successfully. Returned data: ' +util.inspect(data));
}, function(error) {
console.error(error);
});
前面的代码与create-property代码非常相似。这里我们有一个额外的变量property_id,用于更新指定的属性。除此之外,我们还有相同的云变量属性及其更新内容。最后,我们调用api.propertiesV2Update()方法。在终端中执行以下命令:
node update-property.js
脚本执行成功后,它将打印出类似于以下内容的响应:
Property Updated successfully. Returned data: ArduinoProperty {
href: '/iot/v1/things/d99e244d-f245-4e27-9ead-717e52ac5a96/properties/c4dc8f92-b62f-44df-9455-74cdd08041bc',
id: 'c4dc8f92-b62f-44df-9455-74cdd08041bc',
name: 'OutdoorTemperature',
permission: 'READ_ONLY',
thing_id: 'd99e244d-f245-4e27-9ead-717e52ac5a96',
type: 'TEMPERATURE_F',
update_strategy: 'ON_CHANGE',
created_at: 2023-04-18T23:49:46.610Z,
persist: true,
updated_at: 2023-04-18T23:58:07.496Z,
variable_name: 'outdoorTemperature'
}
更新后,响应将返回新的内容。我们提供了名称、类型和变量名的更新信息,并在响应中成功反映出来。
删除属性
在本节中,我们将探讨如何使用设备 ID 和属性 ID 来删除属性。有关删除属性的文档可在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2Delete找到。在 VSCode 中打开property文件夹下的delete-property.js文件:
var api = new AiotApi.PropertiesV2Api()
var thing_id="d99e244d-f245-4e27-9ead-717e52ac5a96";
var property_id="c4dc8f92-b62f-44df-9455-74cdd08041bc";
var options = {
'force':true
};
api.propertiesV2Delete(thing_id,property_id, options).then(function(data) {
console.log('Property Deleted successfully. Returned data: ' +data);
}, function(error) {
console.error(error);
});
前面的代码片段是从delete-property.js文件中的DeleteProperty()方法中摘取的。在DeleteProperty()方法中,我们需要将thing_ID、property_id和options变量作为参数提供。thing_id和property_id都是删除过程的必需参数,而options变量是可选的。在终端中执行以下命令:
node delete-property.js
脚本执行成功后,将在控制台打印出响应,表明属性已成功删除。
列出属性
在本节中,我们将使用设备 ID 列出给定设备的所有属性。正如之前在设备和设备中概述的那样,列出属性和显示属性之间存在差异。列出属性意味着显示设备的所有云变量,而显示属性仅显示与给定设备 ID 和属性 ID 相关的特定云变量属性。
列出属性的文档可在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2List找到。在 VSCode 中打开property文件夹下的list-property.js文件。以下代码片段是从ListProperty()方法中摘取的:
var api = new AiotApi.PropertiesV2Api()
var thing_id="6b6cd076-5859-4a6d-9b4e-18879893c6cb";
var options = {
'showDeleted':true
};
api.propertiesV2List(thing_id, options).then(function(data) {
console.log('Property Updated successfully. Returned data: ' +util.inspect(data));
}, function(error) {
console.error(error);
});
这里我们只需要提供设备 ID 和选项,就可以获取与设备关联的所有云变量的完整列表。在终端中执行以下命令:
node list-property.js
脚本执行成功后,它将以 JSON 格式打印出响应,包含云变量的属性。我选择了一个只有一个云变量的设备:
Returned data: [
ArduinoProperty {
href: '/iot/v1/things/6b6cd076-5859-4a6d-9b4e-18879893c6cb/properties/b357a513-ad2b-4e1f-a76b-6dac078e36d5',
id: 'b357a513-ad2b-4e1f-a76b-6dac078e36d5',
name: 'BPM',
permission: 'READ_ONLY',
thing_id: '6b6cd076-5859-4a6d-9b4e-18879893c6cb',
type: 'HEART_BEATS',
update_strategy: 'ON_CHANGE',
created_at: 2023-03-31T16:41:33.103Z,
last_value: 50,
persist: true,
tag: 1,
thing_name: 'Tracking and notifying Your Heart Rate',
update_parameter: 0,
updated_at: 2023-03-31T17:05:19.564Z,
value_updated_at: 2023-04-01T16:43:12.293Z,
variable_name: 'bPM'
}
]
前面的响应包含了与云变量相关的所有值,例如最后值、更新时间等。如果您想获取一个云变量的最后值,那么这个方法可以在您的应用程序中用来实现这一点。
接下来,我们还有一个与显示单个云变量属性相关的 API 端点。代码位于property文件夹中,代码的执行以及如何检查其工作作为练习留给您。
在本节中,我们深入讨论了如何使用 Arduino IoT Cloud API 以 JSON 格式获取云变量/属性的完整详情,该 API 提供了包括last_value和value_update_at在内的大量数据。在下一节中,我们将开始处理仪表板,并学习如何使用 Node.js SDK 对它们进行操作。
构建仪表板——通过 Node.js SDK 释放潜力
仪表板是 Arduino IoT Cloud 中与数据可视化最重要的组成部分。在 SDK 中,我们有针对仪表板的特定方法来执行对仪表板的 CRUD 操作,以及其他操作,如共享、请求访问等,但在这里我们只关注 CRUD 操作。
创建仪表板
让我们先从仪表板创建开始。相关文档可以在www.arduino.cc/reference/en/iot/api/#api-DashboardsV2-dashboardsV2Create找到。在 VSCode 中打开dashboard文件夹下的create-dashboard.js文件。
在此代码中有两种方法:一种方法是getToken(),这与我们所有编码练习中的方法相同,用于获取请求的认证令牌。第二种方法是CreateDashboard(),它负责仪表板的创建。参考文档,我们可以看到我们需要使用AiotApi.DashboardV2Api()对象初始化api变量,该对象用于对仪表板对象执行操作:
var api = new AiotApi.DashboardsV2Api();
var dashboardprop = {
'name':'Dashboard Created via API'
};
var opts = { };
api.dashboardsV2Create(dashboardprop,opts).then(function(data) {
console.log('Dashboard Created successfully. Returned data: ' + util.inspect(data));
}, function(error) {
console.error(error);
});
api.dashboardsV2Create是负责创建仪表板的方法,它接受两个输入参数:第一个是仪表板属性,第二个变量是opts,它不是必需的,因此我将其留空。这两个变量都传递给api.dashboardsV2Create方法,该方法返回响应。使用util.inspect方法在控制台上以适当的格式显示 JSON 响应。输入以下命令以执行create-dashboard.js脚本:
node create-dashboard.js
脚本执行成功后,它将打印出如下所示的响应:
Dashboard Created successfully. Returned data: ArduinoDashboardv2 {
id: '5b872702-059c-4895-a677-808981f31588',
name: 'Dashboard Created via API',
updated_at: 2023-04-19T17:31:39.487Z,
created_by: ArduinoDashboardowner {
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
username: 'mafzalattari'
}
}
在响应中,您将获得仪表板 ID、创建日期、更新日期以及其他我们在仪表板创建过程中已经讨论过的事项。
更新仪表板
在本节中,我们将探讨如何使用仪表板 ID 更新仪表板。通过 API 向仪表板添加组件是一个选项,但由于涉及 JSON 数据,这将使代码变得复杂得多。因此,我们将只更新仪表板名称而不是添加组件。有关更新属性的文档可在www.arduino.cc/reference/en/iot/api/#api-DashboardsV2-dashboardsV2Update找到。在 VSCode 中打开dashboard文件夹下的update-dashboard.js文件:
var api = new AiotApi.DashboardsV2Api()
var dashboard_id="5b872702-059c-4895-a677-808981f31588";
var dashboardprop = {
'name':'Dashboard Created via API Update'
};
var opts = {
};
api.dashboardsV2Update(dashboard_id,dashboardprop, opts).then(function(data) {
console.log('Dashboard Updated successfully.'+ util.inspect(data));
}, function(error) {
console.error(error);
});
上述代码几乎与create-dashboard代码相同。这里我们有一个额外的变量dashboard_id,用于更新特定的仪表板。除此之外,我们还有相同的仪表板属性及其更新后的内容。最后,我们调用api.dashboardsV2Update()方法。在终端中执行以下命令:
node update-dashboard.js
在脚本成功执行后,它将打印出以下类似的响应:
Dashboard Updated successfully.ArduinoDashboardv2 {
id: '5b872702-059c-4895-a677-808981f31588',
name: 'Dashboard Created via API Update',
updated_at: 2023-04-19T17:39:28.378Z,
created_by: ArduinoDashboardowner {
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
username: 'mafzalattari'
}
}
更新后,响应将返回新的内容,反映我们提供的名称的更新数据。
删除仪表板
在本节中,我们将探讨如何使用仪表板 ID 删除仪表板。有关删除仪表板的文档可在www.arduino.cc/reference/en/iot/api/#api-DashboardsV2-dashboardsV2Delete找到。在 VSCode 中打开dashboard文件夹下的delete-dashboard.js文件:
var api = new AiotApi.DashboardsV2Api()
var dashboard_id="3681cdbe-ecb2-4237-a834-e3423c6bd8e3";
var opts = {
};
api.dashboardsV2Delete(dashboard_id, opts).then(function(data) {
console.log('Dashboard Deleted successfully.');
}, function(error) {
console.error(error);
});
上述代码片段是从delete-dashboard.js文件中的DeleteDashboard()方法中提取的。在DeleteDashboard()方法中,我们需要将dashboard_id和opts变量作为参数提供。dashboard_id是删除过程所必需的,而opts变量是可选的。在终端中执行以下命令:
node delete-dashboard.js
在脚本成功执行后,它将在控制台上打印出响应,表明仪表板已成功删除。
列出仪表板
在本节中,我们将列出所有仪表板及其完整细节和组件。列出仪表板与显示仪表板之间的区别在于,列出仪表板将显示 Arduino IoT Cloud 中所有可用的仪表板,而显示仪表板仅显示与给定仪表板 ID 相关的特定仪表板属性和组件。
列出仪表板的文档可在www.arduino.cc/reference/en/iot/api/#api-DashboardsV2-dashboardsV2List找到。在 VSCode 中打开dashboard文件夹下的list-dashboard.js文件。以下代码片段是从ListDashboard()方法中提取的:
var api = new AiotApi.DashboardsV2Api()
var opts = { };
api.dashboardsV2List().then(function(data) {
console.log(util.inspect(data));
}, function(error) {
console.error(error);
});
在终端中执行以下命令:
node list-dashboard.js
在脚本成功执行后,它将以 JSON 格式打印出包含仪表板属性和组件的响应:
[
ArduinoDashboardv2 {
id: '36287c03-5034-4a64-b40a-102740c998c6',
name: 'SmartAgri-Sargodha',
updated_at: 2023-03-05T11:00:18.395Z,
created_by: ArduinoDashboardowner {
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
username: 'mafzalattari'
},
widgets: [
]
},
ArduinoDashboardv2 {
id: '28ea7839-7a81-460e-a871-368d45d82cee',
name: 'Tracking and notifying Your Heart Rate Dashboard',
updated_at: 2023-04-19T16:41:36.604Z,
created_by: ArduinoDashboardowner {
user_id: 'f067c1e9-3ff8-4b9f-a9b4-f8c5c1d0ceb4',
username: 'mafzalattari'
},
widgets: [ [ArduinoWidgetv2], [ArduinoWidgetv2] ]
},
]
前面的响应包含与仪表板相关的所有属性,如小部件、创建日期、更新时间等。接下来,我们还有一个与显示仪表板相关的 API 端点,它用于显示单个仪表板的所有信息。代码位于dashboard文件夹中;代码的执行和检查其工作方式留给你作为独立练习。
在这些子部分中,我们讨论了如何使用 Arduino IoT Cloud Node.js SDK 编程方式与仪表板进行交互,包括仪表板创建、更新、删除以及通过仪表板列表显示仪表板等操作。在下一节中,我们将探讨如何使用 Node.js SDK 来微调我们的云变量/属性。
使用 Node.js SDK 进行微调 – 属性值管理
在本节中,我们将探讨如何使用 SDK 来设置/获取云变量值。这对于执行批量操作非常有用;例如,如果你有 100 个连接到 Arduino IoT Cloud 的灯,手动从仪表板控制它们将非常困难。假设从仪表板切换一个设备开关需要 3 秒钟 – 对于 100 个设备来说,这将需要 300 秒,总共 5 分钟,还有人为错误的可能性(也许用户在批量处理中遗漏了一个设备)。但是,有了 SDK 的帮助,我们可以在事物上执行批量操作,节省时间并提高我们实现零错误操作的信心。
获取属性值
让我们先看看如何获取云变量的最后一个值。为此,我们需要设备 ID 和云变量 ID。更确切地说,我们将在这里获取云变量的完整属性,以 JSON 格式呈现,但只会获取云变量的last_value。相关文档可以在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2Show.找到。在 VSCode 中打开getset文件夹下的get-prop.js文件:
var api = new IotApi.PropertiesV2Api()
var thingid = "8aee742e-4492-423d-9f19-79fec856b917"; // {String} The id of the thing
var propertyid = "182d7319-5c36-4988-a5b8-ace2df7bd08a"; // {String} The id of the property
var opts = {
'showDeleted': false // {Boolean} If true, shows the soft deleted properties
};
api.propertiesV2Show(thingid, propertyid, opts).then(function(data) {
console.log('Last Value of Property=' + data.last_value);
}, function(error) {
console.error(error);
});
上述代码片段是从GetProperty()方法中摘取的。我们定义了thingid和propertyid,然后在代码片段的后面将这些变量传递给api.propertiesV2Show方法。在以 JSON 格式获取响应后,我们只使用last_value属性在控制台上显示其数据。在终端运行以下命令:
node get-prop.js
执行成功后,你将获得包含值的响应。
设置属性值
在上一节中,我们讨论了如何获取云变量的最后一个值,在本节中,我们将探讨如何设置/发布值到云变量。相关文档可以在www.arduino.cc/reference/en/iot/api/#api-PropertiesV2-propertiesV2Publish找到。在 VSCode 中打开getset文件夹下的set-prop.js文件:
var api = new IotApi.PropertiesV2Api()
var thingid = "8aee742e-4492-423d-9f19-79fec856b917"; // {String} The id of the thing
var propertyid = "182d7319-5c36-4988-a5b8-ace2df7bd08a"; // {String} The id of the property
var propertyValue = {
'device_id':'5aae7e1f-940b-4426-80ac-1c953839cdb2',
'value':true
}; // {PropertyValue}
api.propertiesV2Publish(thingid, propertyid, propertyValue).then(function(data) {
console.log('Value Published to Property Successfully');
}, function(error) {
console.error(error);
});
以下代码片段是从SetProperty()方法中摘取的。在这里,我们向api.propertiesV2Publish方法提供了三个变量。第一个是thingid,第二个是propertyid,第三个变量包含两个进一步的属性device_id和value。在终端上运行以下命令以执行脚本:
node set-prop.js
执行成功后,你将收到一个响应,表明值已成功更新。
在本节中,我们详细讨论了如何以编程方式获取/设置云变量的值。这有助于开发者获取值并在他们的自定义仪表板上显示它们,或将云变量的值设置为控制设备操作。接下来,你将有一个示例项目的练习任务,这将帮助你提高技能并深化对章节的学习。
任务
在玩 SDK 之后,现在是时候进行更多实验,以便你可以在新的场景中应用你的学习并巩固你的知识。对于这个任务,你将创建一个具有以下属性的设备自动化脚本:
-
设置一个用于WeMos D1 Mini设备创建的方法。此设备属于ESP8266类别。
-
设置一个名为
Sense Environment的设备,并为设备创建一个草图。然后,将之前创建的设备与设备关联。 -
为温度、湿度和空气质量创建三个云变量/属性,并将这些变量附加到之前创建的设备上。
在一个文件中创建所需的脚本,包含所有方法,我们只需提供设备名称,它将自动设置设备、设备和草图,处理设备与设备的关联,并负责变量的创建。成功完成这项任务将教会你高效有效地自动化工作流程和流程。
摘要
在本章中,我们介绍了 API 端点、SDK 以及我们在 Arduino IoT Cloud 上可用的 SDK 平台类型。我们还学习了如何使用 Postman 测试 API。接下来,我们通过在设备、设备、属性和仪表板上执行不同类型的操作,特别是 CRUD 操作,来探索 Node.js SDK。最后,我们看到了如何获取和设置云变量的值。
这章专门为寻求使用 Arduino IoT Cloud 作为基础并希望为其解决方案开发自定义前端的后端开发者设计。当你知道如何使用 Node.js SDK 以编程方式与 Arduino IoT Cloud 交互时,这成为可能。同样,创建自定义服务的功能使我们能够集成第三方云服务和应用程序。
下一章将会更加有趣,因为我们将要深入探讨智能农业,实施一个项目,在这个项目中你将学习如何测量土壤湿度、土壤温度和室外温度与湿度。我们将设计一个设备,使我们能够监控四种不同的作物/植物。你也可以使用这个项目来监控你家的植物,同时帮助那些在农业领域工作的朋友。
第九章:项目 4 – 为智能农业收集土壤和环境数据
本章专门介绍智能农业。我们的人口正在迅速增长,食物消耗与人口直接相关。幸运的是,我们有最新的工具和技术,帮助我们通过使用更少的自然资源来提高作物产量。在智能农业中,有多个参数需要监控,但我们将只关注土壤湿度和土壤温度,因为它们都与水资源消耗有关;随着工业和人口的快速增长,清洁水的获取也是一个问题。
在本章中,我们将通过监测土壤湿度、土壤温度和室外温度湿度来实际探索智能农业,这将帮助我们了解土壤如何对外部环境的变化做出反应,以及灌溉作物后土壤保持水分的天数。我们的智能农业设备将把所有数据发送到 Arduino IoT Cloud,在那里我们将实时监控并做出有助于我们使用控制灌溉来节约用水并提高土壤质量的决策。
在本章中,我们将使用开源且成本效益高的传感器在实验室和田间进行实验。对于开发板,我们使用ESP32和ADS1115模拟数字转换器(ADC)模块,结合四个电容式土壤湿度和四个DS18B20传感器进行土壤温度监测,以及一个DHT22模块进行室外温度和湿度监测。这个项目将帮助你通过精准农业、温室农业和滴灌来优化你的作物,同时对于家庭园艺也非常有用。
在本章中,我们将涵盖以下主题:
-
基于物联网的智能农业
-
你的农业技术项目必备硬件
-
构建你的农业物联网系统
-
完善传感器校准
-
设置事物、网络和云变量
-
创建网页和移动仪表板
技术要求
完成本章所需的以下硬件组件:
-
ESP32 开发板
-
ADS1115 ADC 模块
-
DHT22 模块
-
土壤湿度传感器 x4
-
DS18B20 x4
-
PCB(在PCB 设计和硬件组件组装部分可找到链接)
-
2.54 毫米三针连接器
-
女性端子
-
跳线电缆
对于编码,我们将使用 Arduino Web Editor,它包含大量开发板和传感器库,我们将使用 Arduino IoT Cloud 进行设备和仪表板的设置。为了开发硬件和传感器设计,我们需要 Fritzing 桌面软件。
本章的代码可在本书的官方 GitHub 仓库中找到,或者您可以直接在github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers下载代码。
基于物联网的智能农业
物联网(IoT)技术在智能农业中用于优化农场运营,提高作物产量,减少浪费,并增加利润。以下是一些物联网在智能农业中应用的例子:
-
自动灌溉:物联网传感器可以用来监测土壤湿度水平和天气条件,以确定何时灌溉作物。然后可以触发自动灌溉系统,为作物提供适量的水,这可以减少水浪费并提高作物产量。
-
畜牧业管理:物联网传感器可以用来监测牲畜的健康和行为,如它们的移动、进食习惯和睡眠模式。这些数据可以用来检测疾病的早期迹象,追踪繁殖周期,并确保牲畜的最佳条件。
-
作物监测:物联网传感器可以用来监测作物生长,检测害虫和疾病,并确定需要关注的区域。这些数据可以用来进行及时干预并提高作物产量。
-
精准农业:物联网传感器可以用来收集有关单个植物或作物的数据,使农民能够优化其资源的使用,如水、肥料和杀虫剂。这有助于减少浪费,提高产量并节省金钱。
-
智能收获:物联网传感器可以用来监测作物成熟度并确定收获的最佳时间。这有助于减少浪费并提高收获作物的质量。
-
天气监测:物联网传感器可以用来监测天气条件,如温度、湿度和降雨量。这些数据可以用来做出关于种植、收获和其他农业操作的明智决策。
总体而言,物联网技术正在改变农业的实践方式。通过使用实时数据和数据分析,农民可以做出更好的决策,实现更好的结果,最终导致世界粮食供应的更加可持续。
在本节中,我们讨论了智能农业以及智能农业中常见的不同术语和技术。在下一节中,我们将讨论本章项目中将要使用的硬件组件。
您农业技术项目的必备硬件
在这个项目中,我们选择了开源且易于获得的硬件组件。为了展示 Arduino IoT Cloud 如何与 ESP32 系列开发板协同工作,我们选择了以下硬件。在 ESP32 系列中,我们有多种尺寸和引脚数量的开发板可供选择。在本章中,我们使用ESP32-DevKit V1,因为它与其他板相比非常紧凑,尺寸更小。当然,它也更便宜,并提供一个 5V 引脚,也称为 VIN,同时还有一个 3.3V 引脚。以下图显示了 ESP32 V1 的引脚布局(引脚图)。

图 9.1:ESP32-DevKit V1
ESP32 提供了多个数字和模拟输入/输出引脚。如果你想使用多个模拟传感器,那么 ADCs 是可用的。最著名的 ADC 之一是 ADS1115/ADS1015 模块,它提供四个模拟引脚,当你需要为你的项目添加额外的模拟引脚时,它是个不错的选择。在这个项目中,需要四个模拟引脚来获取土壤湿度传感器的值;这个板子有足够的模拟引脚,但我使用 ADS1115 来演示我们如何使用 ADC 模块为我们的项目添加额外的模拟引脚。
在当前项目中,我们需要五个数字引脚用于 DHT22 模块和 DS18B20 温度探头,以及四个模拟引脚用于电容式土壤湿度传感器。这个开发板的一个优点是它提供了一个 5V 电源引脚,这在大多数 ESP32 系列开发板上是不提供的。
接下来,我们使用 DHT22 模块来感应室外温度和湿度,但根据你的需求,你也可以使用 DHT11 传感器。如果具体谈到特性,那么 DHT22 相比 DHT11 提供了更广泛的传感器范围,但它的成本更高。以下图示展示了 DHT22 模块,我们已为引脚标注以供更好地理解。

图 9.2:DHT22 和 DHT11 模块引脚排列
前面的图示展示了 DHT22/DHT11 传感器模块的引脚排列;完整的引脚连接配置可以在表 9.3中查看。第一个引脚(VCC)可以与 3.3V 和 5V 同时工作。第二个引脚是数据引脚,它连接到 ESP32-DevKit V1 的任何数字引脚。第三个引脚是地引脚,它连接到开发板的地引脚。
在继续之前,以下表格解释了 DHT22 和 DHT11 之间的所有规格差异。最值得注意的是测量范围和测量周期:
| 特性 | DHT22 | DHT11 |
|---|---|---|
| 电源 | 3.3 至 5V | |
| 输出信号 | 通过单总线传递的数字信号 | |
| 测量元件 | 聚合物电容器 | |
| 测量范围 | 湿度 0-100% 相对湿度(RH)温度 40-0°C | 湿度 20-90% RHT 温度 0-50°C |
| 精度 | 湿度:+-2% RH(最大+-5% RH)温度:<+-0.5°C | 湿度:1% RH(最大 5% RH)温度:<2°C |
| 测量周期 | 平均 2 秒 | 平均 1 秒 |
表 9.1:DHT22 和 DHT11 传感器规格
项目的主要传感器是一个电容式土壤湿度传感器,用于监测特定区域的土壤湿度。它是一种低成本土壤湿度监测传感器,由于其使用 PCB(PCB 板使用塑料和油漆,使其防锈)而具有防锈性。它通过向土壤湿度传感器中通入少量电流来感应土壤湿度,如图 图 9**.3 所示,并根据返回的电流确定土壤湿度。如果传感器接收到的电流较高,则表示湿度较高;如果接收到的电流较低,则表示土壤中水分含量很少或没有。

图 9.3:电容式土壤湿度传感器引脚图
土壤湿度传感器由三个引脚组成:在 FetchSoilMoisture() 方法下的 map() 方法。完整的代码可在 GitHub 的本章文件夹中找到。该传感器既可以用 5V 电源也可以用 3.3V 电源运行,但推荐使用 5V。
本项目的另一个主要传感器是 DS18B20 防水温度传感器探头,用于监测特定区域的土壤温度以及土壤湿度。它是一种低成本防水温度监测传感器,由于其钢制外壳而具有防锈性。以下图显示了 DS18B20 防水温度探头及其引脚图和与 ESP32-DevKit V1 的连接图。

图 9.4:DS18B20 防水温度探头
前面的图显示了传感器及其引脚图。DS18B20 包含三根彩色线:黑色线用于 GND,红色线用于连接 VCC,可以是 3.3V 或 5V,黄色线用于连接任何数字引脚,但需要串联一个 4.7k 拉电阻,如图所示。如果我们谈论传感器的规格,那么其温度感测范围很好——它能够测量从 -55 到 125°C 的温度。所有其他详细信息都在以下表格中提供,以供进一步探索:
| 特性 | DS18B20 |
|---|---|
| 电源 | 3.3 至 5V |
| 输出信号 | 数字信号/单线 |
| 温度感测范围 | -55~125°C |
| 温度精度 | 温度 ± 0.5°C |
| 感测周期 | <750 毫秒 |
表 9.2 – DS18B20 规格表
在本节中,我们详细讨论了开发板和传感器,包括完整的规格和引脚图。在下一节中,我们将讨论这些传感器如何连接到 ESP32-DevKit V1 以及项目的 PCB 设计。
构建你的农业物联网系统
在前面的章节中,我们详细讨论了传感器和开发板。现在,是时候将理论付诸实践了。在硬件开发中,在开始与传感器和开发板一起工作之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于设计电子项目的概念和开发,但我们将使用 Fritzing。
在接下来的两个小节中,我们将首先讨论项目的电路图和设计,并解释如何将引脚与开发板连接。然后,我们将讨论 PCB 设计和其实施,以便产品可以部署到现场。
电路图和设计
设计的目的是清楚地了解传感器如何与开发板连接。它帮助工程师基于这些设计文件在面包板或 Veroboard 上开发原型。使用 Fritzing 进行设计的重大优势是它会在后台根据您的设计构建硬件电路图和 PCB 设计,设计师可以根据系统要求进行调整。以下图显示了整个项目图,说明了传感器和 ADS1115 模块如何连接到 ESP32-DevKit V1 板。

图 9.5:智能农业系统设计
图 9.5 展示了整个项目的电路图,其中也包括了引脚号。但为了使您更容易理解,我们提供了以下表格,其中包含了所有引脚号。表 9.3 包含了 ESP32 与 DHT22 的引脚配置:
| ESP32 | DHT22 |
|---|---|
| D13 | 数据(I/O) |
| GND | GND |
| 3.3V | VCC |
表 9.3:ESP32 和 DHT22 引脚分配表
表 9.4 包含了 ESP32 与 DS18B20 温度探头的引脚配置。在这里,我们使用了四个 DS18B20 温度探头,在每个传感器的列中,我们都提到了将连接到 DS18B20 数据引脚的 ESP32 引脚号。ESP32 开发板的 GND 和 VCC 引脚将适用于所有传感器:
| 土壤温度 传感器 #1 | 土壤温度 传感器 #2 | 土壤温度 传感器 #3 | 土壤温度 传感器 #4 |
|---|---|---|---|
| 与 ESP32(D32)的数据引脚 | 与 ESP32(D33)的数据引脚 | 与 ESP32(D25)的数据引脚 | 与 ESP32(D26)的数据引脚 |
| ESP32 GND 到 GND | ESP32 GND 到 GND | ESP32 GND 到 GND | ESP32 GND 到 GND |
| ESP32 3.3V 到 VCC | ESP32 3.3V 到 VCC | ESP32 3.3V 到 VCC | ESP32 3.3V 到 VCC |
表 9.4:ESP32 和 DS18B20 温度探头引脚分配表
表 9.5 展示了 ESP32 到 ADS1115 的引脚配置。其余的土壤湿度传感器将通过 ADS1115 模拟引脚连接到系统,这些引脚在 表 9.6 中有详细说明:
| ESP32 | ADS1115 |
|---|---|
| D22 | SCL |
| D21 | SDA |
| 3.3V | VCC |
| GND | GND |
表 9.5:ESP32 和 ADS1115 引脚分配表
在表 9.6中,您将看到我们如何使用 ADS1115 将土壤湿度传感器连接到系统中。表格的第二行说明了 ADS1115 的哪个引脚将被用于将土壤湿度传感器连接到系统中:
| 土壤湿度 传感器 #1 | 土壤湿度 传感器 #2 | 土壤湿度 传感器 #3 | 土壤湿度 传感器 #4 |
|---|---|---|---|
| 土壤湿度模拟引脚到 ADS1115(A0) | 土壤湿度模拟引脚到 ADS1115(A1) | 土壤湿度模拟引脚到 ADS1115(A2) | 土壤湿度模拟引脚到 ADS1115(A3) |
| ESP32 GND 到 GND | ESP32 GND 到 GND | ESP32 GND 到 GND | ESP32 GND 到 GND |
| ESP32 VCC 到 VCC | ESP32 VCC 到 VCC | ESP32 VCC 到 VCC | ESP32 VCC 到 VCC |
表 9.6:ADS1115 和土壤湿度传感器引脚表
上述设计提供了一个全面概述,展示了您如何将传感器连接到开发板上。根据设计,我们从开发板中只取了一个 5V 和一个 GND,这些将被用于所有传感器。土壤湿度传感器是模拟传感器,因此我们将所有传感器通过 ADS1115 模块的引脚从 AO 引脚连接到 A4 引脚,如图图 9.5和表 9.6所示,而 DHT22 模块和 DS18B20 是数字传感器,它们连接到 ESP32 的 D12、D32、D33、D25 和 D26 引脚,如图图 9.5以及分别如图表 9.3和表 9.4所示。ESP32 到 ADS1115 的引脚分配如图表 9.5以及图 9.5所示。
PCB 设计和硬件组件的组装
在上一节中,我们看到了一个适合使用面包板或 Veroboard 创建原型的好设计,但如果我们想在野外部署该解决方案怎么办?Fritzing 是一个很好的工具,它提供了设计 PCB 的选项,当您开发设计时,它会在后台自动创建 PCB 设计,这可以通过 Fritzing 软件中的PCB 设计选项卡访问。自动 PCB 设计只是一个基本功能,并不适合直接生产,因此必须根据专业实践审查和重新排列设计。以下图显示了当前项目的 PCB 设计。

图 9.6:智能农业系统 PCB 设计
上述图显示了项目的最终 PCB 设计。(我能够轻松创建这个设计得益于 Fritzing。)有许多不同的工具可用于 PCB 设计,例如EasyEDA、Circuit Maker和Altium。开发 PCB 很容易;只需确保 PCB 上的连接线不要与其他连接线交叉。
PCB 设计完成后,你有两种选择:要么自己使用 DIY 方法开发 PCB(这对于学习目的很好,但不适合大规模产品),要么选择一个专业机构来专业制造 PCB。中国有许多组织提供 PCB 制造和加工服务,例如 Seeed Studio、JLCPCB 和 PCBWay。我们尝试了 PCBWay,并对他们的工作和交货时间印象深刻。我们已经将 PCB 设计上传到 PCBWay 项目仓库,您可以从那里选择 PCB 设计并轻松订购:www.pcbway.com/project/shareproject/ESP32_Based_Smart_Agriculture_Node_11223e5a.html。
在获得 PCB 板后,是时候焊接用于开发板和传感器的母头和 2.54 毫米三针连接器了。切勿直接在 PCB 板上焊接开发板和传感器,这样如果任何东西停止工作,那么很容易拆卸和更换。以下图显示了 PCB 板的最终面,其中包含白色 2.5 毫米三针连接器,用于土壤湿度传感器、DS18B20 和 DHT22,而黑色母头用于插入 ESP32-DevKit V1 和 ADS1115 模块。

图 9.7:智能农业系统 PCB
上述图显示了焊接了三针 2.54 毫米连接器和母头后的 PCB 板外观。土壤湿度连接器标记为SM,DS18B20 连接器标记为T,电阻标记为R,如图 9.7所示。现在,是时候将所有连接器插入,以便将我们的智能农业节点准备好进行后续步骤。但是等等——默认情况下,土壤湿度传感器附带非常短的电线,这不够用,所以你需要通过在两端放置 2.54 毫米母头来延长电缆长度,因为土壤湿度传感器也使用相同的连接器进行连接。DS18B20 也附带裸端子,但我们插入了 2.54 毫米母头,以便于清洁的连接。以下图显示了包含所有传感器和电缆布线的完整设置。

图 9.8:包含所有传感器和模块的智能农业系统
上述图显示了所有组件堆叠在 PCB 板上。我们可以看到土壤湿度传感器通过连接器使用定制电缆进行扩展,而 DS18B20 裸端子连接到母头,DHT22 模块也是如此。硬件组装完成后,在将节点部署到现场之前,我们需要校准土壤湿度和 DS18B20 温度。
完善传感器校准
传感器校准是产品开发中非常重要的一个方面,尤其是在你计划将产品部署到实时环境中的时候。因此,在继续之前,我们首先需要校准电容式土壤湿度和 DS18B20 传感器。由于空气湿度和水位不同,土壤湿度传感器的操作因地区而异。
因此,首先,我们将通过在空气中取传感器的值,然后将传感器放入水中来校准土壤湿度传感器。这些值将用于绑定最终读数,最后,我们将通过 map 方法将土壤湿度传感器的值从 0 转换为 100%。土壤湿度传感器是一个模拟传感器,因此除了ADS 模块库外,不需要额外的辅助库,该库如图所示,名称为Adafruit ADS1X15。

图 9.9 – ADS1115 库
在这里,我们需要在 Arduino IDE 中安装 ADS1115/ADS1015 库,以便我们可以使用 ADS 模块。导航到Adafruit ADS1X15,并安装最新版本,如图所示。安装库后,从官方 GitHub 书库下载代码,并从Soil-Moisture-Calibration文件夹打开代码:
int AirValue[]={0,0,0,0};
int WaterValue[]={0,0,0,0};
前面的代码片段包含两个数组:一个用于空气值,一个用于传感器浸入水中的值。对于土壤传感器校准,我们只需要通过一次获取AirValue和WaterValue值。将代码上传到开发板,并确保你的土壤湿度传感器是干燥的。打开串行监视器,并记下每个传感器的AirValue值。之后,将传感器浸入一盆水中,并记下传感器的WaterValue值。
让我们看看图 9.10中 AIN0、AIN1、AIN2 和 AIN3 的AirValue。AIN是模拟输入的缩写,而前面的 0、1、2 和 3 是连接土壤湿度传感器的 ADC1115 模块的引脚号:

图 9.10:土壤湿度传感器的空气值
现在,让我们看看将土壤湿度传感器放入水中后的WaterValue:

图 9.11:土壤湿度传感器的水值
等待一段时间,当值稳定时记下。在获取Air和Water值后,将这些值放入前面的数组中,并将代码再次上传到开发板。通过将传感器放入水中并清洁它们来验证土壤湿度百分比级别的值。在这里,当传感器完全浸入水中时,你会得到 100%,而当它们干燥时,你会得到 0%。
在土壤湿度水平之后,是时候验证 DS18B20 温度探头传感器的读数了。首先,我们需要为 DS18B20 温度传感器安装一个库。导航到“Miles Burton 的 Dallas 温度”,并安装最新版本。安装库后,从官方 GitHub 书库下载代码,并从DS18B20-Calibration文件夹打开代码:
OneWire ds18x20[] = {32,33,25,26};
在前面的代码中,我们提到了数字引脚号,这些引脚在 PCB 上预留用于连接 DS18B20 传感器。如果你在面包板上使用不同的引脚,那么根据你的选择更新引脚号。将代码上传到开发板,然后上传后,打开串行监视器,查看你是否从传感器获得了值。以下图显示了用于校准目的的 DS18B20 温度探头在串行监视器上的读数。

图 9.12:DS18B20 温度传感器在串行监视器上的值
前面的图显示了 DS18B20 温度传感器工作正常,值已稳定。现在,我们可以继续进行实验室校准。
重要提示
对于 DS18B20,必须使用 4.7k上拉电阻。没有上拉电阻,你将无法获得值。
在土壤湿度传感器用“空气”和“水”值测试之后,是时候在实验室中对两个传感器进行校准了。对于湿度测试,我们使用了热空气烤箱方法来验证土壤湿度传感器的准确性。我们在土壤、沙子和盐中添加了不同水平的水,并用传感器进行测量。然后,我们将这些样品放入热空气烤箱中,比较两种方法之间的传感器读数;结果令人难以置信:只有±0.5 的差异。对于 DS18B20,我们使用校准过的模拟温度计,观察到的差异也只有±0.5。以下图显示了我们在实验室中对土壤湿度传感器和 DS18B20 传感器进行行业标准校准的照片。

图 9.13:实验室中的湿度传感器和温度传感器校准
前面的图显示了实验室中传感器的校准。在这里,我们用土壤、沙子和盐测试了传感器。
在本节中,我们通过原理图讨论了传感器及其与 ES32-DevKit V1 的连接,以及 PCB 设计和其实施。之后,我们讨论了土壤湿度和 DS18B20 传感器的校准。在下一节中,我们将设置事物、网络凭据和云变量,并查看代码。
设置事物、网络和云变量
在设置好硬件后,是时候在 Arduino IoT Cloud 中设置事物了。对于本项目,我们需要 10 个云变量来从设备获取监控参数;由于 ESP 系列板,网络设置将不同。以下图提供了我们将要设置的 AgriStack 事物的完整概述。

图 9.14:智能农业系统事物设置
使用名称 AgriStack 创建一个新事物。按照以下步骤创建变量、相关设备、网络配置,最后是代码。我们已在先前的图中用不同的红色方框标记并分配了数字。这些数字对应以下步骤,将帮助您设置事物:
-
首先,我们需要设置 10 个云变量,如图 图 9**.14 所示。有两个云变量用于户外温度和湿度;这些值将从 DHT22 中获取。有四个云变量用于土壤湿度,四个变量用于土壤温度。前四个将使用土壤湿度传感器,后四个将使用 DS18B20 温度探头。更多关于云变量的详细信息将在下一小节中提供。
-
之后,我们需要将设备与事物关联起来。在当前项目中,我们将使用 ESP32-DevKit V1,因此向导将与 Arduino 板不同。完整详情请参阅 关联设备 部分。
-
最后,我们需要为设备设置网络配置,但这次,我们需要为 ESP 系列板提供安全密钥以使连接安全,而 Arduino 兼容板将在设备设置向导期间自动由 Arduino IoT Cloud 配置。
在这里,我们讨论了帮助我们设置事物的不同步骤。在下文中,我们将开始探讨云变量。
云变量
下表解释了我们在创建云变量时需要使用的所有变量属性。整数(int)是一个非常著名的数据类型,但在这里您将观察到两种关于湿度和温度的新变量类型,它们分别以百分比和摄氏度取值。同时,确保您有与表格相同的变量声明;否则,您需要根据您的命名修改示例代码。
我们已将所有云变量的权限设置为只读,但我们也有读写选项。在本项目中,我们只想从设备接收数据,而不是从仪表板发送数据,这就是为什么使用只读模式,以避免数据一致性问题。更新策略设置为有变化时,因为设备将在五分钟后发送数据,所以这个选项比定期更新更合适:
| 序列号 | 变量名称 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | Humidity |
CloudRelativeHumidity |
humidity |
只读 | 变更时 |
| 2 | Temperature |
CloudTemperatureSensor |
temperature |
只读 | 变更时 |
| 3 | SM1 |
int |
sM1 |
只读 | 变更时 |
| 4 | SM2 |
int |
sM2 |
只读 | 变更时 |
| 5 | SM3 |
int |
sM3 |
只读 | 变更时 |
| 6 | SM4 |
int |
sM4 |
只读 | 变更时 |
| 7 | ST1 |
int |
sT1 |
只读 | 变更时 |
| 8 | ST2 |
int |
sT2 |
只读 | 变更时 |
| 9 | ST3 |
int |
sT3 |
只读 | 变更时 |
| 10 | ST4 |
int |
sT4 |
只读 | 变更时 |
表 9.7:带有完整参数的云变量列表
在成功创建云变量之后,我们将继续进行设备关联步骤,在这里我们将添加并将 ESP32-DevKit V1 与我们的设备关联。
关联设备
变量创建完成后,是时候添加一个设备并将其与设备关联了。在添加设备之前,请将开发板连接到计算机,并打开Arduino Create Agent应用程序。我们已经在第二章的什么是 Arduino Create 代理?部分讨论了 Arduino Create 代理。

图 9.15:设备选择向导
在设备页面下关联设备部分点击选择设备按钮。将弹出一个窗口,其中你可以看到所有已可用的设备。如果你已经添加了 WeMos D1 mini,请选择它。如果没有,点击设置新设备。接下来,点击设置第三方设备选项。从下拉菜单中选择ESP32和DOIT ESP32 DEVKIT V1,然后点击继续按钮。提供设备名称并点击下一步按钮。在最后的向导中,将显示设备 ID和密钥详细信息。将密钥复制到安全的地方,因为它将在网络配置中使用。
网络配置
在将设备与设备关联后,是时候配置设备通信的 Wi-Fi 设置了,如图 9.14 中标记的3区域所示。在网络下,你可以找到填写表单以输入 Wi-Fi 名称和密码的选项。在最后一个字段中,你将找到一个用于密钥的新字段。粘贴我们在设备创建期间从系统中接收到的密钥。

图 9.16:设备网络配置
在网络配置完成后,我们的主要任务就完成了;现在,编码任务仍然存在,在下一节中,我们将对其进行介绍。
编码
项目代码以名为AgriStack_mar05a的 ZIP 文件形式存储在书籍的官方 GitHub 仓库中。下载它并将其导入到 Arduino Web 编辑器中。
您可以通过导航到setup方法下载代码并将其放入您的设备中;记住,永远不要尝试使用delay方法,因为它将阻塞ArduinoCloud.update()方法。然后,每五分钟调用一次名为SmartAgri()的方法。以下是完全的SmartAgri()方法。在此之后,我们将探讨此方法执行的操作:
bool SmartAgri(void *){
//Fetch Soil Moisture
FetchSoilMoisture();
//Fetch Soil Temperature
FetchTemperature();
//Fetch DHT Temp & Humiditiy
FetchDHTTempHum();
//Send Data To Arduino IoT Cloud
SendToArduinoIoTCloud();
//Print The Readings on Serial Port
PrintTheReadingsSerialPort();
return true;
}
在这个项目中,我们将所有操作都分成了不同的方法,以便于使用。因此,首先我们调用FetchSoilMoisture()方法,它负责从传感器获取土壤湿度读数并将它们存储在数组中。在将数据存储在数组之前,它将百分比值进行映射。接下来,我们有FetchTemperature()方法,它负责从所有 DS18B20 传感器获取温度并将它们保存到土壤温度数组中,以供进一步使用。最后,我们调用FetchDHTTempHum()来从 DHT22 模块获取户外温度和湿度值,这些值将存储在两个变量中。现在,我们将探讨如何在以下方法中获取土壤湿度传感器的值:
float getSoilMoisture(int Pin){
float SoilMoisture=0;
//loop 10 times for averaging
for(int j = 0; j < 5; j++){
delay(1000);
SoilMoisture+= ads.readADC_SingleEnded(Pin);
}
//divide by 5 to get the average
SoilMoisture /= 5;
return SoilMoisture;
}
之前的技术在FetchSoilMoisture()方法中使用,用于获取土壤湿度的读数。在这里,您将看到该方法以一秒的延迟从传感器读取值五次,并将它们添加到变量中;然后稍后,它将传感器读数除以 5 以获得平均值。这种技术的优点是您将获得土壤传感器可能获得的最佳值。
前三种方法已经被用来从不同的传感器中获取值并将它们存储在全局变量和数组中。现在,是时候将这些值发送到 Arduino 物联网云平台了;因此,我们有了SendToArduinoIoTCloud()方法,它将所有传感器的值分配给云变量,并且这些值将在ArduinoCloud.update()方法的帮助下在云上更新。最后,我们有PrintTheReadingsSerialPort()方法,这是一个在运行时可选使用的方法,用于在串行监视器上显示所有传感器值。
将代码上传到设备并验证连接性和读数。如果您想更改读数时间,只需修改timer.every(600000, SmartAgri);的值。确保您提供的时间是以毫秒为单位的,其中 1 秒等于 1,000 毫秒。
重要提示
如果您在变量声明中使用了不同的命名方案,那么请根据您的命名方案更新代码。但首先,您应该按照书中的所有步骤进行操作,然后您可以稍后更改云变量名称并修改您的代码。
永远不要尝试使用delay方法,因为它将阻塞ArduinoCloud.update()方法。始终使用毫秒来计算等待时间。回顾loop()方法,在五分钟后调用其他方法。
Arduino 物联网云平台仅在变量值更改时更新仪表板上的值。例如,如果温度是 30°C,五分钟之后仍然是这个值,那么 Arduino 物联网云平台将不会记录这个值,所以如果图表上的值没有变化,请不要感到困惑。这个功能的另一个好处是,当你导出内容时,你不会得到重复的数据。
在成功讨论了代码中的不同方法并将代码上传到 ESP32-DevKit V1 之后,现在是时候探索如何使用出色的 Arduino 物联网云平台仪表板小部件来可视化所有数据了。
创建网页和移动仪表板
在将代码上传到设备后,现在是时候设置一个网页和移动仪表板,使用不同的仪表板小部件可视化数据了。以下图显示了使用不同小部件的读数可视化:

图 9.17:物事物仪表板
我们有 10 种不同的读数:户外温度、户外湿度、四个土壤湿度读数和四个土壤温度读数。对于每个读数,我们使用仪表小部件控件,并使用了高级图表来比较土壤湿度和土壤温度,以可视化这两个属性之间的适当相关性。但我们还希望监控历史数据;图表是显示实时数据以及旧数据的最佳小部件。在此,如图 9.17 所示,我们使用了四个图表,每个图表都连接到一个特定的云变量。
在本节中,我们成功地为智能农业事物创建了一个仪表板,以文本格式显示所有传感器读数,并使用图表进行比较。
接下来是什么?
我们还有很多选项可供探索,但现在轮到您使用不同的传感器和开发板进行更多实验并从中学习。在本章中,我们使用了 10 个传感器,但只有 3 种不同类型,即湿度、温度和户外温度和湿度。然而,在市场上,有许多传感器为土壤提供广泛的多种功能,例如NPK(代表氮、磷和钾),EC(代表电导率),以及 pH 传感器和用于户外测量的不同气体传感器。
尝试以下传感器以增强您的实践知识,并从功能、范围和成本方面与其他传感器进行比较:
-
NPK 传感器
-
土壤 EC 传感器
-
土壤 pH 传感器
-
MQ 系列传感器,专为检测特定气体而设计,包括 MQ-2、MQ-3、MQ-4、MQ-5、MQ-7、MQ-8 和 MQ-9,以找到气体及其对土壤和作物的影响之间的相关性
-
Seeed Studio SCD30(温度、湿度和 CO2)用于户外监测
摘要
在本章中,我们探讨了如何使用 DHT22、电容式土壤湿度传感器、用于土壤温度的 DS18B20 探头以及 ESP32 开发板和 ADS1115 ADC 模块来开发智能农业监控系统。我们在将它们用于田野之前,在实验室中对土壤湿度和温度传感器进行了校准。我们还设置了一个事物,包括创建云变量、设备关联、网络配置和开发板的编码。然后,我们创建了一个仪表板,使用不同类型的仪表盘来可视化事物的传感器读数,显示当前读数以及借助图表显示的历史数据。
这个项目将帮助你并给你信心,与农业研究人员和土壤科学家合作,在更高级别上工作。它将帮助你将物联网系统添加到实际田野和隧道农场,同时也有助于你在家庭园艺中。
在下一章中,我们将着手一个智能家居项目,我们将开发一个智能 RGB LED 灯,该灯将连接到亚马逊 Alexa 语音助手,帮助你理解和开发智能家居解决方案。
第十章:项目#6 - 使用语音助手使你的家更智能
本章致力于智能家居。智能家居是一个广泛的领域,旨在自动化你家的所有事物,以使你的生活体验更好、更舒适,例如智能照明系统、智能空调、智能电视等等。但在这章中,我们将探讨如何构建一个由Arduino IoT Cloud网页和移动仪表板控制的彩色智能灯泡。我们还将添加亚马逊 Alexa 语音助手,通过语音命令来控制智能灯泡。
在这里,我们将实际探索智能家居,选择WS2812 RGB LED环形灯和 Seeed Studio 最新、非常小巧的 XIAO 系列开发板,该开发板基于 ESP32,具有许多功能。借助灯光模块、开发板和 Arduino IoT Cloud,我们将构建一个智能照明系统。
到本章结束时,你将能够自信地使用任何开源 ESP32/ESP8266 或 Arduino 系列开发板,借助 Arduino IoT Cloud 构建智能家居解决方案。特别是,你将了解如何轻松地将亚马逊 Alexa 语音助手集成到你的智能家居项目中,使其对最终用户更加方便。
在本章中,我们将涵盖以下主要主题:
-
使用物联网创建更智能的家庭
-
必要组件 - 传感器和开发板
-
智能家居物联网项目的蓝图
-
初始设置 - 事物、网络凭证、云变量和代码
-
用户体验友好的控件 - 构建网页和移动仪表板
-
增强控制 - 将 Arduino IoT Cloud 与亚马逊 Alexa 集成
技术要求
完成本章练习需要以下硬件组件:
-
Seeed Studio XIAO ESP32C3
-
XIAO ESP32C3 的 USB Type-C 线缆
-
WS2812 RGB LED 环形灯
-
阳性端子、阴性端子和 Veroboard
-
跳线
-
焊锡枪
-
亚马逊 Echo Dot 和亚马逊 Alexa 移动应用
对于编码,我们将使用Arduino Web Editor,它包含大量开发板和传感器库,以及用于事物和仪表板设置的 Arduino IoT Cloud。为了开发硬件和传感器设计,我们需要Fritzing桌面软件和Arduino IDE来测试 WS2812 环形灯。
在这里,我们将使用亚马逊 Echo Dot作为语音助手来执行语音命令以控制智能灯泡。如果你没有 Echo Dot,那么你可以使用亚马逊 Alexa应用(适用于 Android/iOS)。本章的代码可在官方 GitHub 仓库中找到,请通过以下链接访问:github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers。
使用物联网创建更智能的家庭
物联网技术(IoT)在智能家居的发展中起着至关重要的作用。它使得家庭中的各种设备和家电能够连接、通信并自动化任务,从而为房主提供便利、舒适和效率。以下是智能家居中物联网的一些关键方面:
-
连接性:智能家居中的物联网设备连接到互联网,使它们能够相互通信,以及与房主远程通信。这种连接性使得无论身在何处,都可以使用智能手机、平板电脑或电脑控制、监控和自动化设备。
-
家庭自动化:物联网使得智能家居中各种任务的自动化成为可能。例如,灯光可以根据占用情况或一天中的时间自动开启或关闭。恒温器可以根据房主的偏好或在家中的存在情况调整温度设置。物联网驱动的自动化有助于优化能源使用、增强安全和简化日常活动。
-
安全和监控:物联网设备可以增强智能家居的安全性。智能锁提供无钥匙进入并允许远程访问控制。视频门铃允许房主远程看到并与访客通信。监控摄像头可以从任何地方访问和监控,提供额外的安全层。
-
能源管理:物联网设备有助于优化智能家居中的能源消耗。智能恒温器会学习用户的偏好并根据需要调整温度设置,在房间无人时节约能源。智能插座和电源插座可以监控和控制家电和电子产品的能源使用,帮助识别能源消耗大的设备并促进高效使用。
-
语音控制:与物联网设备集成的语音助手,如亚马逊 Alexa 或谷歌助手,使得智能家居中各种功能的免提控制成为可能。房主可以使用语音命令控制灯光、调整恒温器、播放音乐、查看天气并执行其他任务,从而提高便利性和可访问性。
-
健康与福祉:物联网设备可以促进智能家居中的健康与福祉。可穿戴设备,如健身追踪器或智能手表,可以与其他家庭设备,如智能秤或健康监测器,集成,以提供全面的健康数据和见解。这些数据可以与医疗保健专业人员共享,或用于自动化某些与健康相关的任务。
-
家电控制:物联网使得智能家居中各种家电的远程控制和监控成为可能。冰箱、烤箱、洗衣机和其他家电可以连接到互联网,允许房主检查其状态、接收警报或远程控制其操作。这种连接性为家务管理和操作提供了便利性和灵活性。
-
集成和互操作性:对于智能家居的物联网来说,一个关键方面是来自不同制造商的设备的集成和互操作性。例如Zigbee或Z-Wave这样的标准和协议,促进了设备之间无缝的连接和通信,确保不同的物联网产品可以在统一的生态系统中协同工作。
需要注意的是,尽管物联网技术为智能家居带来了众多好处,但它也引入了潜在的安全和隐私风险。房主应采取措施确保他们的物联网设备安全,例如使用强密码、保持固件更新以及确保适当的网络安全配置。
在这里,我们详细讨论了物联网如何改变人类在家庭和办公室的生活。接下来,我们将讨论进行本章项目所需的硬件和组件。
必要组件 – 传感器和开发板
在 ESP32 系列中,我们有各种各样的开发板,大小和引脚数量各不相同。在本章中,我们使用的是 Seeed Studio 的最新开发板XIAO ESP32C3,因为它非常紧凑,尺寸比其他板更小,当然,价格也更便宜,并且适用于 5V 以及 3.3V。以下图是 XIAO ESP32C3 的引脚布局图。

图 10.1 – XIAO ESP32C 引脚图
XIAO ESP32C 提供了多个数字输入/输出引脚。在之前的 ESP 系列板上,我们只找到一个模拟引脚,但在这块开发板上,我们有四个模拟引脚,这消除了在开发使用多个模拟引脚的解决方案时的最大障碍。使用之前的 ESP 系列板时,我们使用了 ADS1115/ADS1015 来获得额外的模拟引脚,因此这块开发板将为我们节省一些费用,因为我们可以在开发板上默认获得四个模拟引脚。
除了所有这些特性之外,XIAO 还提供内置的电池充电模块,并且该板针对功耗进行了优化,有助于将其用作可穿戴设备。对于连接性,提供了 Wi-Fi 和蓝牙选项。它还支持低功耗蓝牙(BLE 5),这更适用于物联网用例。有关更多详细信息,请访问wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/。
在当前项目中,我们需要一个数字引脚用于 WS2812 RGB LED 灯环。开发板的一个优点是有 5V 电源引脚,这在大多数 ESP32 系列开发板上是不常见的。
我们使用的是 WS2812 16 像素 RGB 环形灯,但它有不同的像素和形状,如棒状、矩阵和条形。对于灯具,我们更喜欢环形形状,但你们可以根据自己的喜好选择。WS2812 还提供长条形电缆,用于室内装饰和电脑桌——特别是对游戏玩家、酒店等。有不同供应商提供 WS2812 模块,但我们使用的是从 AliExpress 购买的 WS2812,它工作得很好。您可以从 Amazon、AdaFruit、SparkFun 或 AliExpress 购买。
WS2812 配备 RGB 颜色,并且它还允许您控制模块的亮度,范围从 1–100%。它还允许您控制每个单独的 LED 像素——无论是开/关,还是任何颜色,这为开发有趣解决方案和原型提供了广泛的应用场景。WS2812 RGB LED 有不同的尺寸和形状。以下图示显示了带有正面和背面的 RGB LED 环形灯。

图 10.2 – WS2812 RGB LED 环形灯和引脚布局图
前面的图示展示了 WS2812 RGB 环形灯的引脚布局。WS2812 与 XIAO ESP32C3 的引脚连接完整配置显示在 表 10.1 中。引脚 #1 是一个 GND 引脚,它与 XIAO ESP32C3 板上的 GND 引脚相连。引脚 #2 是一个 5V DC 电源引脚,它既适用于 3.3V 也适用于 5V。引脚 #3 是 数据输入,它可以连接到任何数字引脚。引脚 #4 是 数据输出,仅在您想用另一个环形灯或条形灯扩展 WS2812 环形灯时使用——这个引脚将作为扩展连接到另一个环形灯的数据输入引脚。在这里,我将 数据输入 连接到板上的 引脚 #D3。您可以使用带有 WS2812 的公头或直接焊接电缆而不使用任何头针。
重要提示
WS2812 模块工作得很好,但仍然有必要验证环形灯/条形灯的所有像素是否都工作正常。在我的情况下,我的最后一个像素没有工作。
在本节中,我们讨论了 XIAO ESP32C3 和 WS2812 RGB 环形 LED,以及其引脚。接下来,我们将详细讨论项目架构,包括项目原理图和组装。
智能家居 IoT 项目蓝图
在前面的章节中,我们详细讨论了传感器和开发板。现在,是时候动手制作食谱了。在硬件开发中,在开始使用传感器和开发板之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于设计和发展有关电子项目的概念,但我们将使用 Fritzing。
在以下两个小节中,首先,我们将讨论项目的原理图和设计,并解释如何通过焊接将开发板的引脚连接起来。接下来,我们将对 WS2812 进行一些测试,以检查所有颜色和像素是否正常工作。
原理图设计和组装
设计的目的是清楚地了解传感器将如何连接到开发板。它帮助工程师使用这些设计文件在面包板或 veroboard 上开发原型。设计的主要好处之一是 Fritzing 会在后台根据您的设计构建硬件原理图和印刷电路板(PCB)设计,设计师可以根据系统要求进行调整。XIAO ESP32C3 和 WS2812 RGB LED 环的完整连接图如下所示。

图 10.3 – XIAO ESP32C 和 WS2812 系统设计
图 10.3展示了整个设置的引脚图,但为了便于指导,我们还创建了表 10.1,它以简单的方式解释了如何将 WS2812 的引脚连接到 XIAO ESP32C。
| XIAO ESP32C | WS2812 环形灯 |
|---|---|
| A3 | 数据输入 |
| 5V | 电源 5V 直流 |
| GND | 电源信号地 |
表 10.1 – XIAO ESP32C 和 WS2812 连接
上述设计和表格提供了如何将传感器连接到开发板的全面概述。根据设计,我们从 XIAO ESP32C3 板到 WS2812 模块有常见的 5V 和 GND 引脚。WS2812 是一个数字模块,因此我们将它的数据输入引脚连接到开发板的 D3 引脚。以下图显示了 veroboard 上智能灯泡的最终原型。

图 10.4 – 最终原型
在将电缆连接到模块和公排针连接到 XIAO ESP32C3 之后,根据原理图连接引脚。只有一个模块,因此不需要 veroboard。但这次我正在开发一个合适的原型——这就是为什么我使用了 veroboard。现在,是时候使用 ESP32C3 验证 WS2812 的颜色和像素了。
使用 Arduino IDE 测试 WS2812
要在 Arduino IDE 中安装 ESP32 系列开发板,首先,在首选项中添加板的定义文件。要继续操作,请按照以下步骤进行:
- 导航到文件 > 首选项,并在附加板管理器 URL中填写 URL
raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json,如图以下所示。

图 10.5 – Arduino IDE 中的 ESP32 板信息
- 之后,在搜索框中导航到
esp32,选择最新的esp32版本,并安装,如图所示。


- 最后,选择板子,导航到工具 > 板 > ESP32 Arduino,并选择XIAO_ESP32C3。板子的列表有点长,你需要滚动到最底部,如图所示。
![图 B19752_10_07.jpg]()

现在是安装 WS2812 库的时候了。在搜索栏中导航到Adafruit neopixel。在这里,你会得到不同的库,但你需要安装与搜索查询匹配的特定库。
现在我们已经准备好进行测试步骤。从官方 GitHub 仓库下载代码,导航到WS2812_Testing文件夹,并打开代码:
#include <Adafruit_NeoPixel.h>
#define LED_PIN D3
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 16
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}
将LED_PIN常量更改为D3或D5。接下来,将像素数量分配给LED_COUNT常量。目前,我在 WS2812 中有 16 个像素,这就是为什么我插入16。修改后,将代码上传到板子。之后,你将在 LED 上看到白色,以及圆形形式的移动动画。在setup()方法中,我们初始化了NeoPixel strip并将亮度设置为 50%:
// loop() function -- runs repeatedly as long as board is on ---------------
void loop() {
for(int i=0; i<LED_COUNT+1; i++){
strip.setBrightness(50);
strip.setPixelColor(i, strip.Color(127+i, 127, 127)); // Set pixel's color (in RAM)
strip.show();
delay(200);
}
for(int i=0; i<LED_COUNT+1; i++){
strip.setBrightness(0);
strip.setPixelColor(i, strip.Color(0, 0, 0)); // Set pixel's color (in RAM)
strip.show();
}
}
在loop()方法中,有两个循环。第一个循环用于将白色分配给每个像素,并根据循环值打开像素,延迟 200 毫秒,而在第二个循环中,我们通过将亮度更改为0和 RGB 颜色更改为0,逐个关闭所有像素。
在本节中,我们在 veroboard 上组装了硬件组件,并使用代码验证 WS2812 RGB LED 是否工作。接下来,我们将在 Arduino IoT 云中设置设备和云变量,使我们的原型机运行。
初始设置 – 设备、网络凭证、云变量和代码
在设置好硬件后,现在是时候在 Arduino IoT 云中设置设备了。对于这个项目,我们需要一个云变量来控制 LED 亮度、颜色,以及打开/关闭 WS2812 环形灯,但我使用了三个不同的云变量,这样你就可以了解何时以及为什么需要使用这些云变量,每个变量都与一个特定的小部件连接。由于使用了 ESP 系列板,网络设置将与 Arduino 开发板不同。

图 10.8 – 空气质量监控系统设备设置
设置一个新的语音控制智能灯,并按照以下步骤创建变量,关联设备和网络配置,最后编写代码:
-
首先,我们需要为 WS2812 设置三个云变量。有关云变量的详细信息,请参阅以下部分。
-
之后,我们需要将设备与实体关联起来。在当前项目中,我们使用 XIAO ESP32C3,因此向导将与 Arduino 板不同。完整的细节在关联设备部分有所说明。
-
最后,我们需要设置设备的网络配置,但这次我们需要为 ESP 系列板提供安全密钥以确保连接安全。Arduino 兼容的板子在设备设置向导期间由 Arduino IoT Cloud 自动配置。
云变量
以下表格提供了我们在创建云变量时需要使用的所有变量的属性。对于 WS2812,我们可以使用整数和布尔数据类型,这会创建很多混乱,但多亏了 Arduino IoT Cloud 扩展的变量组,我们有Dimmed light、Color和Colored Light类型的变量。接下来,确保变量声明与表 10.2中所示相同,否则您需要根据您的命名修改示例代码。
在这里,我设置了读写权限,因为这次我们将从云仪表板或语音助手发送命令,因此必须授予云变量读写权限。
| S# | Variable Name | Variable Type | Declaration | Permission | Update Policy |
|---|---|---|---|---|---|
| 1 | LightBrightness |
Dimmed light | lightBrightness |
Read and write | On change |
| 2 | RGBLightColor |
Color | rGBLightColor |
Read and write | On change |
| 3 | TableLight |
Colored Light | tableLight |
Read and write | On change |
表 10.2 – 云变量属性表
之前,我提到我们只需要一个云变量,但我正在使用三个不同的云变量,并将解释它们的用法。如果我们从RGBLightColor开始,关于颜色变化只有一个选项。但如果我们转到Colored Light类型的云变量,那么它提供了所有三个选项:亮度、颜色以及开关。这个云变量也与 Amazon Alexa 兼容,并且这种类型的云变量将在 Amazon Alexa 智能家居技能门户中作为一个设备表示,这在增强控制 - 将 Arduino IoT Cloud 与 Amazon Alexa 集成部分有所讨论。
关联设备
变量创建后,是时候添加与实体关联的设备了。在添加设备之前,将开发板连接到计算机并打开Arduino Create Agent应用程序。以下图示显示了如何在弹出窗口中选择 ESP32,然后选择 XIAO_ESP32C3 开发板。

图 10.9 – 设备选择向导
按照以下步骤将 XIAO ESP32C3 与实体关联:
-
在实体的页面中,点击关联设备部分下的选择设备按钮,如图 10.8*所示。
-
将出现一个弹出窗口,其中您可以查看所有已可用的设备。如果您已经添加了您的 XIAO ESP32C3,请选择它。否则,点击 设置 新设备。
-
然后,点击 第三方 设备 选项。
-
从下拉菜单中选择 ESP32 和 XIAO_ESP32C3,然后点击 图 10.9 中显示的 继续 按钮。
-
填写 设备名称 并点击 下一步 按钮。
-
在最后的向导中,将显示 设备 ID 和 密钥。请将密钥复制到安全的地方,因为它将在网络配置过程中使用。
现在,让我们转到网络配置。
网络
在将设备与 Thing 关联后,是时候配置设备通信的 Wi-Fi 设置了。以下图显示了带有 Wi-Fi 名称 和 密码 字段的网络配置弹出窗口。

图 10.10 – Thing 的网络配置
您将找到一个新字段 – 密钥。粘贴我们在设备创建期间从系统收到的密钥。
编码
该章节的代码可在本书的官方 GitHub 仓库中找到。从仓库下载 Voice_Controlled_Smart_Lamp_may13a 代码并将其导入到 Arduino Web 编辑器中。
您可以通过导航到 delay() 方法下载代码并将其放入您的 Thing 中 – 它将阻塞 ArduinoCloud.update() 方法。但在继续之前,我们需要在代码的开始处将 LED_PIN 常量更改为 5 并根据环/条带中的像素数量为 LED_COUNT 分配一个值。在这里,我将值设置为 16,因为我使用的是一个 16 像素的环:
#define LED_PIN 5
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 16
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
//Sync Variables
bool swi;
float bright;
float sat;
float hue;
如果我们回顾先前的常量代码,那么我们会看到有一个 NeoPixel strip 对象和四个全局变量(开关 swi)、亮度 bright)、饱和度 sat)和色调,这些将在以后用于从一个部件控制同步到另一个部件控制,以启用部件之间的同步。
在用适当的值填写前面的常量之后,是时候探索一些其他方法了。如果我们谈论设置,那么只有几行代码会初始化 NeoPixel strip 对象以及 Arduino IoT Cloud 和一些其他操作。在这个项目中,我们的 loop() 方法将包括一行关于 Arduino Cloud 更新的代码,没有其他内容。实际上,在这个项目中,代码将在部件侧发生任何变化时执行。
在项目中,我们还有四种更多方法。其中三种是面向事件的,一种是一个将被三个 onLightBrightnessChange()、onRGBLightColorChange() 和 onTableLightChange() 方法使用的通用辅助方法,而 ControlTheWS2812() 方法是一个 通用辅助方法。接下来,我们将逐步探索所有这些方法:
void onLightBrightnessChange() {
// Add your code here to act upon LightBrightness change
swi=lightBrightness.getSwitch();
bright=lightBrightness.getBrightness();
//Sync the values to tableLight Cloud Variable
tableLight.setSwitch(swi);
tableLight.setBrightness(bright);
//Call the method for operations on WS2812
ControlTheWS2812();
}
在 onLightBrightnessChange() 方法中,我们从 lightBrightness 云变量中获取亮度和开关值,随后将这些值与全局变量一起分配。最后一个调用的方法 ControlTheWS2812() 根据全局变量的值在 WS2812 环上执行操作:
void onRGBLightColorChange() {
// Add your code here to act upon RGBLightColor change
hue=rGBLightColor.getValue().hue;
sat=rGBLightColor.getValue().sat;
bright=rGBLightColor.getValue().bri;
//Sync the values with LightBrightness & tableLight widget
tableLight.setBrightness(bright);
tableLight.setHue(hue);
tableLight.setSaturation(sat);
lightBrightness.setBrightness(bright);
//Call the method for operations on WS2812
ControlTheWS2812();
}
onRGBLightColorChange() 方法是在颜色控件控制中发生任何变化时将被调用的第二个方法。此方法从 Color 类型的云变量中获取色调、饱和度和亮度值,随后将这些值分配给其他云变量以及全局变量。最后一个调用的方法 ControlTheWS2812() 根据全局变量的值在 WS2812 环上执行操作:
void onTableLightChange() {
// Add your code here to act upon TableLight change
swi=tableLight.getSwitch();
bright=tableLight.getBrightness();
hue=tableLight.getHue();
sat=tableLight.getSaturation();
//Sync the values with LightBrightness & RGBLightColor widget
lightBrightness.setSwitch(swi);
lightBrightness.setBrightness(bright);
rGBLightColor= Color(hue,sat,bright);
//Call the method for operations on WS2812
ControlTheWS2812();
}
onTableLightChange() 方法与 tablelight 云变量相关联,并将这些值分配给全局变量以及另外两个云变量以实现同步。最后一个调用的方法 ControlTheWS2812() 将根据全局变量的值在 WS2812 环上执行操作:
void ControlTheWS2812(){
// declare a variable of the Color data type and define it using the HSB values of the color variable
Color currentColor=Color(hue,sat, bright);
byte RValue;
byte GValue;
byte BValue;
currentColor.getRGB(RValue, GValue, BValue); // the variables will contain the RGB values after the function returns
if(swi==true){
strip.setBrightness(bright);
for(int i=0; i<LED_COUNT+1; i++){
strip.setPixelColor(i, strip.Color(RValue, GValue, BValue)); // Set pixel's color (in RAM)
strip.show();
}
}else{
for(int i=0; i<LED_COUNT+1; i++){
strip.setBrightness(0);
strip.setPixelColor(i, strip.Color(0, 0, 0)); // Set pixel's color (in RAM)
strip.show();
}
}
}
最后,我们有我们的最后一个、通用的辅助方法 ControlTheWS2812()。此方法首先根据色调、饱和度和亮度生成 RGB 颜色。然后它将检查开关值 – 如果它是真的,那么条件将分配亮度和颜色到 WS2812 环,并借助 for 循环打开环上的每个像素。否则,它将亮度设置为 0 并关闭 WS2812 的所有像素。
重要提示
如果你在变量声明中使用了不同的 命名,那么请根据你的命名方案更新代码。但最好是首先按照书中的所有步骤进行,然后再分别更改云变量名称并修改你的代码。
Arduino IoT Cloud 仅在变量值更改时更新仪表板上的值。例如,如果温度是 30 度,5 分钟后仍然是同样的温度,那么 Arduino IoT Cloud 不会记录该值。所以,如果控件上的值没有变化,请不要感到困惑。此功能的另一个好处是,当你导出内容时,你将不会得到重复的数据。
在本节中,我们设置了事物,将 XIAO ESP32C3 与事物关联,并设置了不同类型的云变量以控制 LED 操作。我们还根据不同的方法详细讨论了设备的代码,一步一步地。现在,在下一节中,我们将设置仪表盘。
用户体验友好的控件 – 构建网页和移动仪表盘
在将代码上传到设备后,是时候为网页和移动设备设置仪表盘,以便使用不同的控件可视化数据了。以下截图显示了使用不同控件的光控制可视化。

图 10.11 – 事物仪表盘
WS2812 有三个核心功能,包括 RGB 颜色、亮度和开关。在上一节中,我们创建了三个不同的云变量,提供了不同的功能。这就是为什么这里我们有三个不同的小部件控制,它们只与这些云变量一起工作。第一个小部件是tableLight云变量,能够执行 WS2812 上的所有操作,例如颜色变化、亮度控制和开关。
接下来,我们还有两个具有有限功能的小部件。第二个小部件是lightBrightness云变量,它只提供了一个开关和亮度控制,而我们的第三个小部件控制是rGBLightColor云变量,它只提供了选择颜色的选项。如果我们比较这三个小部件,那么彩色灯光小部件等于调暗灯光和颜色小部件,因为彩色灯光小部件有三个功能,包括开关、颜色选择和亮度控制,而调暗灯光小部件控制只有两个选项,亮度控制和开关功能,颜色小部件控制只有选择颜色的选项。
因此,最终的结论是,如果你有一个带有亮度控制功能的多色条,那么彩色灯光小部件和云变量就很好用;否则,对于带有亮度控制的单色灯,调暗灯光小部件和云变量是完美的。如果你只有带有多色选项但没有亮度控制的多色条,那么一个简单的颜色小部件和云变量类型就足够了,但请记住,颜色类型的云变量与 Amazon Alexa 不兼容。
在本节中,我们已经设置了包含不同类型小部件控制的仪表板,这有助于你以不同的方式控制 WS2812,例如控制亮度、颜色以及开关 LED 环。接下来,我们将使用 Arduino IoT Cloud 设置 Amazon Alexa 技能,通过 Amazon Alexa 使用语音命令控制我们的台灯。
增强控制功能 – 将 Arduino IoT Cloud 与 Amazon Alexa 集成
在 Arduino IoT Cloud 仪表板上测试完所有设备后,是时候将 Amazon Alexa 与我们的设备连接起来,以实现语音控制系统。我们有一个用于 Alexa 的物理硬件设备以及 Android/iOS 的移动应用程序。请访问alexa.amazon.com/来设置此项目。我使用的是第二代 Amazon Echo Dot,但如果你无法访问 Alexa 硬件设备,那么你可以简单地使用移动应用程序。

图 10.12 – Arduino Skill for Amazon Alexa
Arduino IoT Cloud 原生开发了一个适用于 Amazon Alexa 的技能,可以在www.amazon.com/Arduino-LLC/dp/B07ZT2PK2H找到。设置您的 Amazon Alexa 并导航到前面的 URL 以启用技能,如图所示。当您链接账户时,它将自动链接已登录此技能的 Arduino IoT 云账户。因此,请确保您已经登录到 Arduino IoT 云。前面的图显示了 Amazon Alexa 的 Arduino 技能。

图 10.13 – Amazon Alexa 智能家居和设备
启用 Amazon Alexa 中的 Arduino 技能后,导航到alexa.amazon.com/spa/index.html并点击左侧侧边栏中的智能家居链接,然后点击图中的设备。在这里,您将看到云变量将变成设备,如图所示。如果您看不到您想要的 Arduino IoT 云变量作为设备,那么在页面底部,点击设备页面上的发现按钮,这将花费大约 20 秒来加载所有内容。

图 10.14 – Arduino Cloud 变量作为 Amazon Alexa 中的设备
最后,打开您的 Amazon Echo Dot 和基于 WS2812 的智能灯,并在 Amazon Alexa 上尝试以下语音命令。首先,尝试以下命令,这将帮助您打开/关闭TableLight。如图所示,TableLight现在正在作为 Amazon Alexa 智能家居中的设备运行:
Hey Alexa Turn on the TableLight
Hey Alexa Turn off the TableLight
现在是时候使用语音命令来改变 WS2812 的亮度和颜色了。尝试以下命令,这将帮助您更新亮度和颜色。目前,我刚刚写了四种不同的颜色,但您可以选择任何您想要的颜色名称:
Hey Alexa set the brightness of TableLight to 99
Hey Alexa set the brightness of TableLight to 50
Hey Alexa change the color of TableLight to red
Hey Alexa change the color of TableLight to blue
Hey Alexa change the color of TableLight to green
Hey Alexa change the color of TableLight to purple
最后,我正在使用 Alexa 计时器功能来安排在特定时间间隔后打开/关闭台灯。但您也可以像闹钟一样使用此功能,长时间打开/关闭 WS2812,例如在清晨提前打开灯光,晚上 10:00 关闭灯等:
Hey Alexa turn on the table light after 30 minutes
Hey Alexa turn off the table light after 10 minutes
我们已经讨论了针对 Amazon Alexa 的不同语音命令,但您可以在互联网上搜索更多有关灯光控制和颜色的命令。
现在是时候讨论哪些 Arduino Cloud 变量与 Amazon Alexa 兼容了。您可以在www.amazon.com/Arduino-LLC/dp/B07ZT2PK2H获取最新信息。目前,我们有以下列表的云变量可以完美与 Amazon Alexa 配合工作:
-
温度
-
运动检测
-
轻巧的智能插头和智能开关
-
调暗灯光
-
彩色灯光
根据前面的列表,你可以创建一个房间恒温器,这将帮助你根据室外和室内恒温器的温度来改变房间或厨房的温度,你可以控制你的供暖和冷却系统。为了开启/关闭任何设备,我们有四种不同类型的云变量,它们具有相同的数据类型布尔型但名称不同,包括灯光、智能插头、智能开关和运动检测。这四个变量可以用来控制任何继电器/电磁接触器来开启/关闭家用电器,例如冷却/供暖系统。我们已经在之前章节讨论了调光灯光和彩色灯光。
在本节中,我们设置了亚马逊 Alexa 与 Arduino 云技能,并尝试了与开启/关闭灯光以及如何更改 WS2812 RGB LED 环形灯的颜色和亮度相关的不同语音命令。
接下来是什么?
我们还有很多选项可供探索,但现在你的任务是使用不同的继电器、传感器和开发板进行更多实验并从中学习。在当前章节中,我们只使用了一个 WS2812 模块进行灯光控制,但你可以使用温度传感器、继电器和运动传感器来自动化你家的设备,例如自动化房间开关来控制风扇、排气扇、灯光和空调系统,根据房间温度来开启/关闭。
重要提示
在连接电缆到继电器时,玩弄高压电缆时要小心。
摘要
在本章中,我们探讨了如何使用 XIAO ESP32C3 和 WS2812 开发一个低成本、多色智能台灯,用于我们的房间。我们设置了事物,包括云变量创建、设备关联、网络配置和开发板的编码。后来,我们使用不同的小部件创建了一个仪表盘来控制 WS2812 RGB 环形灯。最后,我们使用亚马逊 Alexa 语音助手通过语音命令来开启/关闭我们的台灯,并控制其颜色和亮度。
本章将让你有信心构建更多有趣的东西,让你的家和办公室更智能。在下一章中,我们将讨论云调度器和空中更新功能。这两个功能都很有趣,专门设计用于在物联网节点上执行操作。
第四部分:学习 Arduino IoT 云的高级功能和展望
在第四部分中,读者被引导了解 Arduino IoT 云平台的高级功能,如何使用它们来开发专业应用程序,以及在整个生命周期中维护解决方案的工具。本书以一些关于进一步学习、实验和获取信息的建议结束。
本部分包含以下章节:
-
第十一章,实现 Arduino IoT 云调度器和空中更新功能
-
第十二章,项目#6 – 跟踪和通知心率
-
第十三章, 使用 Cloud CLI 编写 Arduino 物联网云脚本
-
第十四章, 在 Arduino 物联网云中继续前进
第十一章:实现 Arduino IoT Cloud 调度器和空中更新功能
世界充满了各种不同和有趣的用例,这些用例根据不同的情况而变化。在完全自动化的世界中,许多用例需要应用程序在特定时间或频率执行特定操作,这些由最终用户定义。为了处理这种情况,Arduino IoT Cloud 有一个调度器功能,允许最终用户通过仪表板配置执行时间和频率,而无需在最终设备上修改代码。在本章的初始阶段,你将了解 Arduino IoT Cloud 调度器功能和它的实现。
然后,本章将介绍空中更新(OTA)功能,该功能在远程设备(如移动节点、特别是远程物联网节点)中越来越受欢迎。OTA 功能允许您向物联网节点广播固件更新,这些节点将无线更新,无需任何物理连接。此过程使得在商业 Arduino-based/ESP 系列物联网节点的生命周期内进行远程维护成为可能,当新功能和安全修复可用时,可以降低相关的服务成本。
Arduino IoT Cloud 调度器提供通过仪表板小部件安排操作的能力,这有助于在不修改代码的情况下执行设备上的操作,用户可以简单地调整常规操作的执行时间。OTA 可以帮助您通过空中发送最新的代码和更新到设备,无需与设备有任何物理连接,这将节省操作成本和时间。
在本章中,我们将涵盖以下主题:
-
调度器在物联网中的重要性
-
使用 Arduino IoT Cloud 调度器——一个 MKR Wi-Fi 1010 示例
-
初始配置——设备、网络凭证、云变量和代码
-
仪表板创建和对调度器小部件的深入了解
-
当前任务——一个任务
-
探索物联网中的 OTA 更新
-
利用 Arduino IoT Cloud 进行 OTA 更新
技术要求
在我们继续之前,首先,你需要有一个与 Arduino IoT Cloud 兼容的板。我推荐带有一些 5 毫米 LED 的 Arduino MKR Wi-Fi 1010,但这里有完整的兼容板列表:store-usa.arduino.cc/pages/cloud-compatible-boards。你可以根据自己的需求选择一个。
其次,你需要有一个 Arduino IoT Cloud 账户。如果你还没有,你可以在cloud.arduino.cc/注册并根据自己的需求选择一个计划。
第三,我们需要下载并安装Arduino Create Agent。Arduino 为安装创建了一个非常漂亮的基于 Web 的指南,可在create.arduino.cc/getting-started/plugin/welcome找到。本章的代码可在本书的官方 GitHub 仓库github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers中找到。
重要提示
所有 Arduino 物联网云计划都在第一章中详细讨论。您也可以访问以下链接以获取最新的计划定价和功能:cloud.arduino.cc/plans/。如果您来自教育机构,那么学生和教师有很多好的计划。Arduino 还根据其需求为商业组织提供定制计划。
调度器在物联网中的重要性
在物联网和云计算领域,调度器指的是负责管理和控制任务、进程或事件的时间安排和执行的组件或系统。其主要功能是确保物联网云设置中各种活动的平稳和高效运行。以下是采用调度器在物联网云环境中的优势:
-
任务协调:调度器通过允许用户定义依赖关系和优先级,在物联网云中协调多个任务和进程。这确保了任务按照期望的顺序执行,这对于涉及互连设备和服务的复杂物联网系统尤为重要。
-
资源优化:在物联网云中,通常有限的计算资源需要通过智能分配任务来优化其利用,这些任务基于需求、可用资源和优先级。这防止了资源过载或低效利用,从而提高了效率和成本效益。
-
时间同步:在物联网系统中,实现特定操作或事件的时间同步至关重要。调度器通过根据精确的时间要求协调任务执行来帮助实现时间同步。这种同步保证了设备、传感器和服务在预定的时间被触发或激活,从而实现准确的数据收集、分析和决策。
-
能源效率:许多物联网设备在有限的电池功率下运行,因此能源效率是一个重要的考虑因素。调度器通过优化任务调度来最小化设备的活跃时间并最大化睡眠或低功耗模式,从而节约能源。这延长了物联网设备的电池寿命,减少了维护需求,并提高了整体系统可靠性。
-
容错性:物联网系统容易受到网络问题、设备故障或服务不可用引起的故障和中断的影响。通过监控任务状态和检测故障,调度器集成了容错机制。它自动重新安排失败或中断的任务,确保物联网云中的操作连续性和可靠性。
总体而言,在物联网云环境中,调度器通过协调任务、优化资源、同步时间、节约能源、确保容错性和支持可扩展性,带来了组织、效率和可靠性。它的存在对于管理物联网系统的复杂性并最大化其性能至关重要。
在本节中,我们详细讨论了什么是调度器以及我们如何在产品开发中从中受益。在下一节中,我们将探讨 Arduino IoT 云调度器在现实场景中的好处,并学习如何使用 MKR Wi-Fi 101 实现 Arduino IoT 云调度器。
使用 Arduino IoT 云调度器——以 MKR Wi-Fi 1010 为例
在本节中,我们将探讨 Arduino IoT 云调度器如何提供不同的好处,以及何时何地我们需要调度功能。稍后,我们将通过使用 MKR Wi-Fi 1010 实现一个调度器的实际示例。
Arduino IoT 云调度器
Arduino IoT 云调度器是集成到 Arduino IoT 云平台中的一个功能,它赋予用户为他们的连接 Arduino 设备安排和自动化操作和事件的能力。它提供了一种方便的方式来定义和管理物联网项目中各种任务和功能的时机。以下是 Arduino IoT 云调度器的一些关键方面和好处:
-
任务调度:Arduino IoT 云调度器允许用户在 Arduino 设备上安排任务和事件。它使得定义特定的时间、间隔或触发动作(如数据收集、设备控制和传感器读取)成为可能。
-
远程控制:通过利用调度器,用户可以远程触发 Arduino 设备上的操作。这种能力使得从任何位置控制自动化功能成为可能,无需直接物理访问设备。它增强了灵活性,并使物联网项目的远程管理更加高效。
-
基于事件的触发:调度器支持基于事件的触发,使用户能够根据特定的事件或条件自动化操作。例如,任务可以安排在特定传感器的值超过定义的阈值或检测到外部事件时执行。
-
时区管理:Arduino IoT 云调度器处理时区管理,确保任务根据期望的时区执行。当在不同时区运营或为不同地区的用户提供服务时,此功能特别有用。
-
与物联网云服务的集成:调度器与 Arduino 物联网云平台提供的其他功能和服务无缝集成。这包括数据存储、可视化和通知服务。用户可以将调度与数据记录、图表和警报相结合,创建全面且连贯的物联网应用。
-
灵活性和定制:Arduino 物联网云调度器提供了高度的可定制性,使用户能够为他们的任务定义复杂的计划和条件。用户可以指定任务频率、持续时间和间隔,并配置高级参数以满足他们的特定需求。
通过利用 Arduino 物联网云平台调度器的力量,用户可以自动化任务,远程控制设备,并为基于 Arduino 的物联网项目建立基于时间或事件驱动的流程。这一功能简化了跨设备动作的管理和协调,提升了物联网应用的功能性和效率。
在本节中,我们讨论了 Arduino 物联网云调度器如何为我们的任务提供调度的好处。在下一节中,我们将使用 MKR Wi-Fi 1010 实现一个调度器。
MKR Wi-Fi 1010 示例
在本章中,我将不会进行复杂的项目来演示我们如何使用调度器。相反,我们将使用一个简单的 MKR Wi-Fi 1010 和三个 5 毫米 LED,我们将设置系统,使其在特定时间间隔后打开或关闭 LED。这个示例将简化硬件复杂性,并帮助您理解 Arduino 物联网云调度器的工作原理。图 11.1展示了 LED 如何连接到 MKR Wi-Fi 1010 以进行此调度器示例。

图 11.1 – 配有 LED 的 MKR Wi-Fi 1010
在这里,我们将仅使用三个 LED 来为三个不同的调度器/计时器。我们使用引脚 8、7和6将 LED 连接到 MKR Wi-Fi 1010,使用 220 欧姆的电阻,这将控制这些引脚的电源,一个公共地(GND)通过面包板连接到所有 LED。
在本节中,我们讨论了我们的项目原理图,其中我们解释了哪些引脚用于将 LED 连接到 MKR Wi-Fi 1010。在下一节中,我们将设置与“物”关联的“物”和设备,以及云变量创建和网络配置将逐步讨论,包括代码。
初始配置 – “物”、网络凭证、云变量和代码
在设置好硬件后,是时候在 Arduino 物联网云中设置一个“物”了。对于这个项目,我们需要为调度器设置三个云变量,这些变量将与仪表板小部件链接并从用户那里接收值。稍后,当调度器处于活动状态时,设备将执行操作(在我们的例子中,它将根据调度器时间打开和关闭 LED)。图 11.2给出了云****调度器“物”的完整概述。

图 11.2 – 云调度器事物设置
使用名称CloudScheduler设置一个新的事物。按照以下步骤创建云变量、关联设备、设置网络配置,最后编写代码。在图 11.2 中,所有步骤都以上方红色方框中的数字标记,这些步骤与以下步骤相关:
-
首先,我们需要为
CloudScheduler设置三个云变量。有关云变量的详细信息将在下一节中提供。 -
之后,我们需要将设备与事物关联。在当前项目中,我们使用 Arduino 的 MKR Wi-Fi 1010,因此对于 Arduino 板,向导将是相同的。完整的详细信息可在关联设备部分找到。
-
最后,我们需要为设备设置网络配置。Arduino 兼容的板在设备设置向导期间由 Arduino IoT Cloud 自动配置,因此你只需要提供 Wi-Fi服务集标识符(SSID)和密码。
云变量
以下表格解释了我们创建云变量时需要使用的所有变量属性。对于调度器,我们将使用自定义数据类型Schedule,这是由于 Arduino IoT Cloud 扩展变量组所提供的。然后,确保你有与表格中相同的声明变量;否则,你需要根据你的命名修改示例代码。
| S# | 变量名称 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | CloudScheduler1 |
Schedule |
cloudScheduler1 |
读写 | 变更时 |
| 2 | CloudScheduler2 |
Schedule |
cloudScheduler2 |
读写 | 变更时 |
| 3 | CloudScheduler3 |
Schedule |
cloudScheduler3 |
读写 | 变更时 |
表 11.1 – 云变量声明列表
在这里,我将权限设置为读取和写入,因为我们将从 Arduino 仪表板输入日期、时间和间隔,这将由最终用户控制,设备仅在调度器处于true状态时执行 LED 开关操作。更新策略设置为变更时,因为仪表板将在用户更改调度器值时向设备发送数据。
关联设备
创建变量后,是时候添加设备并将其与事物关联了:
-
在添加设备之前,将开发板连接到计算机并打开Arduino Create 代理应用程序。
-
为事物分配名称后,我们需要将其设备附加到它上面。当你点击选择设备按钮时,你会看到一个弹出窗口,显示可用的设备和添加新设备选项。在我们的案例中,我们在门户中没有设备,因此我们可以直接点击设置新设备来在账户中配置新设备。

图 11.3 – 关联的设备
- 然后,您将在弹出窗口中看到两个选项。第一个选项是设置 Arduino 设备,第二个选项是设置第三方设备。在这里,您将在两个选项下方看到一个说明,说明兼容设备。这意味着您不能使用所有类型的 Arduino 设备和第三方设备与 Arduino IoT Cloud 兼容。

图 11.4 – 选择设备
根据可用的设备,从弹出窗口中选择一个选项。在本例中,我们将点击设置 Arduino 设备,因为在本章中,我们使用的是 MKR Wi-Fi 1010 板。在添加设备之前,请确保Arduino Create Agent已在您的机器上运行。
重要提示
这里是您可以找到与 Arduino IoT Cloud 兼容的板的链接:store-usa.arduino.cc/pages/cloud-compatible-boards。对于第三方设备,我们有三种选择,分别是 ESP8266、ESP32 和 LoRaWAN 设备。对于其他设备,我们有 API 访问,这在第二部分的第二章中已讨论。
- 现在,您将看到设置设备弹出窗口,该窗口将开始搜索您的设备。确保设备已正确连接到机器。

图 11.5 – 设置设备
向导将找到并列出所有连接的板及其名称和端口详细信息。点击配置按钮继续。如果向导在搜索后没有显示设备,请尝试将其插入不同的端口,并点击底部位置的刷新链接。
- 在下一个配置向导中,提供设备名称。设备名称中不允许有空格和特殊字符。然后,点击下一步按钮。

图 11.6 – 设备配置名称
之后,向导将开始设备配置过程。这可能需要五分钟,但在大多数情况下,配置设备只需要一分钟。
- 在下一个弹出窗口中,您将看到恭喜!您已设置完毕的消息。点击完成按钮,设备将被附加到您的设备上。
在本节中,我们将 MKR Wi-Fi 1010 开发板与我们的设备关联起来。在下一节中,我们将配置 MKR Wi-Fi 1010 的 Wi-Fi 网络设置。
网络配置
在设备与设备关联后,我们可以看到设备处于离线状态。要使其上线,我们需要提供 Wi-Fi 详细信息。

图 11.7 – 网络配置
在 网络 选项卡下的设备页面上,点击 配置 按钮。你会看到一个带有两个字段的 配置网络 弹出框 - Wi-Fi 名称 和 密码。输入 Wi-Fi SSID 和密码,然后点击 保存 按钮。
我们已经完成了设备和网络配置;只剩下编码部分。在下一节中,我们将查看设备的代码。
编码
本章的代码可在书的官方 GitHub 仓库中找到。从仓库中下载 Cloud_Scheduler_may22a 代码,并将其导入到你的 Arduino Web 编辑器 中。
你可以通过导航到 delay() 方法来下载代码并将其放入你的设备中,因为它将阻塞 ArduinoCloud.update() 方法:
#define LED1 8
#define LED2 7
#define LED3 6
在这里,我们有一个非常简单的代码。首先,我们将定义 LED1、LED2 和 LED3 引脚常量,这些常量将在 setup() 方法中使用 pinMode() 方法初始化为输出:
void setup() {
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
然后,我们在 loop() 方法中有了关于调度器的所有代码,当调度器/计时器处于活动状态时,它将执行一个操作。在下面的代码中,我们为每个 cloudScheduler 云变量有一个单独的 if-else 语句;在这里,我们检查 cloudScheduler 是否处于活动状态,然后打开 LED;否则,关闭 LED。我们有 cloudScheduler1、cloudScheduler2 和 cloudScheduler3,以及三个 if-else 语句来检查它们的值:
void loop() {
ArduinoCloud.update();
// Your code here
//Cloud Scheduler 1 Code
if(cloudScheduler1.isActive()){
digitalWrite(LED1,HIGH);
}else{
digitalWrite(LED1,LOW);
}
//Cloud Scheduler 2 Code
if(cloudScheduler2.isActive()){
digitalWrite(LED2,HIGH);
}else{
digitalWrite(LED2,LOW);
}
//Cloud Scheduler 3 Code
if(cloudScheduler3.isActive()){
digitalWrite(LED3,HIGH);
}else{
digitalWrite(LED3,LOW);
}
}
调度器小部件在配置上非常复杂,有很多选项,但它的代码非常简单直接。你只需要验证调度器状态是 true 还是 false,如果是 true,则继续执行任务;否则,停止任务。因此,在 loop() 方法中,我们有三个 if-else 语句,它们检查不同的云调度器/计时器的状态。如果特定的调度器处于活动状态,则特定的 LED 将打开;否则,它将关闭。
我将 LED 连接到 Pin #8 的 cloudScheduler1,将 LED 连接到 Pin #7 的 cloudScheduler2,将 LED 连接到 Pin #6 的 cloudScheduler3。现在,将第一个小部件的时间设置为每分钟 5 秒,第二个小部件为每分钟 10 秒,第三个小部件为每分钟 15 秒。所有 LED 将同时打开,但第一个 LED 将打开 5 秒,第二个 LED 将打开 10 秒,第三个将在 15 秒后关闭。在这个示例项目中,我们使用了三个不同的调度器来演示我们如何使用多个调度器/计时器来自动化单个开发板上的任务。
重要提示
如果你使用了不同的 命名 在变量声明中,那么根据你的命名方案更新代码。然而,首先最好按照书中的所有步骤进行,然后再分别更改云变量名称并修改你的代码。
另外,不要将代码放在 loop() 方法的末尾,因为它会在脉冲传感器读取时创建延迟。
在本节中,我们讨论了代码以及它是如何与 Arduino IoT Cloud Scheduler 一起工作来打开和关闭 LED 的。在下一节中,我们将设置仪表板,我们将放置调度器小部件并将其连接到我们的云变量。
仪表板创建和深入探讨调度器小部件
将代码上传到设备后,是时候为网页和移动设备设置仪表板,插入将链接到调度器变量的多个调度器小部件,以便进行进一步的控制和操作。以下图显示了具有不同计时器选项的可视化调度器:

图 11.8 – 事物仪表板
我们有三个调度器变量。为了可视化所有这些变量,将分别将三个调度器小部件链接到每个云变量。这三个小部件和变量的目的是展示我们如何设置不同类型的计时器。第一个小部件演示了如何使用每分钟执行 30 秒的计时器,第二个小部件演示了如何使用每小时激活五分钟的计时器,第三个小部件演示了我们可以设置长时间计时器,例如在特定时间特定日期。在这里,我将其设置为在星期一、星期三和星期五激活五分钟。
我们只是设置了不同计时器设置的多个小部件。调度器小部件的一个示例设置如图 11.9所示,我们将深入探讨如何设置这些设置。这个控制小部件有多个配置选项,因此我认为有必要详细讨论它,以便提供适当的指导。

图 11.9 – 调度器小部件选项
当你点击调度器小部件时,会出现一个弹出窗口,其中包含选项,就像在前面的图中所示。在这里,我将截图分为四个不同的编号部分。从这个弹出窗口中,你可以从秒到年调整你的时间设置,设置开始和结束日期,或者选择无日期限制执行。让我们看看每个部分:
-
在这里,我们有两个输入控制项——一个是起始日期,另一个是起始时间,如控制标题所示。
-
接下来,我们有持续时间设置,其中包含三个下拉框——小时、分钟和秒。这将定义计时器在机器上执行的时间长度。例如,如果你想执行 30 秒的操作,只需选择30 秒并留出其他字段,或者如果你想执行 5 分钟的操作,则选择5 分钟并留出其他字段,依此类推。
-
然后,我们有“重复间隔”设置,这仅适用于“周”、“月”和“年”;对于分钟和小时没有预设设置。我选择了“周”。在该选项下,显示了日期(通过其首字母),在那里你可以选择可以在哪一天/哪些天执行操作。对于“月”和“年”有不同的选项,稍后将会讨论。
-
最后,我们有“结束重复”设置。在这里,我们有两个选项 – “永不”和“开启”。当你点击“开启”时,你需要输入操作停止的日期和时间。如果你想无限期执行,只需选择“永不”选项。
在“重复间隔”部分的“年”和“月”中,调度器有不同的选项。以下图示显示了这两个选项的所有详细信息。首先,让我们看看“月”:

图 11.10 – 调度器中的“月”选项
这里是“年”选项:

图 11.11 – 调度器中的“年”选项
对于“月”,我们有一个下拉菜单,允许我们选择日期(例如1st),而在“年”的情况下,我们有两个下拉菜单 – 一个用于日期,一个用于月份(例如1st January)。
在本节中,我们设置了包含三个不同调度器小部件的仪表板,并将布尔类型的云变量分配给了它们,这些变量将在我们的代码中用于检查调度器状态以及调度器是否处于活动状态。在下一节中,你将有一个作业任务,根据指定的要求使用调度器,这将给你一个很好的想法,了解你如何在项目中使用调度器功能来增强你的产品开发。
当前任务 – 一个作业
从之前连接三个 LED 到 MKR Wi-Fi 1010 并设置 Arduino IoT Cloud 调度器的前一个项目中继续,完成以下作业任务:
-
使用调度器连接三个继电器来控制任何电气/电子设备,例如风扇、灯光或加热器。
-
实现调度器来控制你家的室外/室内灯光的开关。
-
用蜂鸣器代替 LED,为你的房间/教室创建一个警报设备。
-
使用调度器打开惊喜照明,用于生日或周年纪念日。使用多个调度器相同的灯带,在不同的场合打开/关闭灯带。
-
使用调度器控制你的花园/隧道农场的电磁阀(这是可选的,如果你有智能农业设施)。
在本节中,我们概述了一个测试你不同场景技能的作业,帮助你探索在不同环境中使用调度器功能。在下一节中,我们将开始探索 OTA 的好处、Arduino IoT Cloud 的 OTA 功能、支持 OTA 的开发板以及如何在 Arduino IoT Cloud 中使用 OTA 功能。当然,你还将了解 Arduino IoT Cloud OTA 的优缺点。
探索物联网中的 OTA 更新
OTA 是指软件或固件更新或其他更新到设备的无线分发。这项技术允许更新在无需物理连接或手动干预的情况下被发送和安装到设备上。OTA 在各个行业中得到广泛应用,包括电信、汽车、消费电子和物联网。以下是 OTA 使用的几个示例:
-
移动设备:OTA 更新通常用于向智能手机和平板电脑分发操作系统更新、安全补丁和功能增强。用户会收到通知,提示他们无线下载和安装更新。
-
汽车行业:许多现代车辆都配备了 OTA 功能,使制造商能够远程更新车辆软件、信息娱乐系统、导航地图和其他功能。OTA 更新可以提高车辆性能、引入新功能并解决安全漏洞。
-
物联网设备:物联网设备,如智能家居设备、可穿戴设备和工业传感器,通常依赖于 OTA 更新来提供固件更新、错误修复和新功能。这使得制造商能够增强设备性能、解决漏洞并引入新功能,而无需物理访问设备。
-
机顶盒和智能电视:OTA 更新被用于向机顶盒和智能电视提供固件更新和软件补丁。这确保了这些设备能够保持最新功能、安全增强和错误修复。
OTA 更新提供了许多好处,包括便利性、成本效益以及快速解决安全漏洞或软件问题的能力。然而,确保 OTA 更新的完整性和安全性至关重要,以防止未经授权的访问或恶意活动,这些活动可能会损害设备或数据。
在本节中,我们探讨了 OTA 是什么以及它如何在当今世界提供好处。在下一节中,我们将详细讨论 Arduino IoT Cloud 的 OTA 功能,包括 Arduino IoT Cloud 支持的兼容设备,以及如何在 Arduino IoT Cloud 中使用 OTA 功能向设备发送固件更新。
利用 Arduino IoT Cloud 进行 OTA 更新
Arduino 物联网云 OTA是 Arduino 物联网云平台中的一个功能,旨在简化基于 Arduino 的物联网设备的远程监控和控制。此功能允许用户无线更新其部署的 Arduino 物联网设备的固件。
Arduino 物联网云的优点
Arduino 物联网云 OTA 功能提供了以下功能:
-
固件更新:用户可以使用 Arduino 物联网云 OTA 远程更新其 Arduino 物联网设备以及 ESP 系列设备。这使部署错误修复、安全补丁、功能增强和新版本代码成为可能,而无需物理访问设备。
-
代码同步:OTA 功能确保 Arduino/ESP 系列物联网设备上运行的代码与云上存储的最新版本保持同步。它消除了手动逐个更新每个设备的必要性,从而在整个物联网设备群中保持一致性。
-
OTA 配置:除了固件更新和代码同步之外,Arduino 物联网云 OTA 还允许用户远程配置其 Arduino/ESP 系列物联网设备的参数或设置。这意味着可以修改设备行为,调整阈值,并更改变量,而无需物理干预。
-
安全和完整性:Arduino 物联网云 OTA 通过身份验证和加密机制确保固件更新的安全和完整性。这保护了在传输过程中的未授权访问或篡改,增强了物联网设备的安全性,并防止了潜在的安全漏洞。
通过提供一种方便且安全的方法来远程更新固件和配置设备,Arduino 物联网云 OTA 简化了基于 Arduino 的物联网部署的管理和维护。它提高了效率,降低了成本,并使用户能够通过最新的功能、错误修复和安全增强来保持其物联网设备更新。在以下小节中,我们将讨论 Arduino 物联网云 OTA 功能的缺点。
Arduino 物联网云 OTA 的缺点
Arduino 物联网云 OTA 功能是用于远程更新连接到 Arduino 物联网云平台的 Arduino 设备的固件的便捷工具。然而,与任何技术一样,它也有其缺点和局限性。以下是 Arduino 物联网云 OTA 功能的缺点:
-
带宽有限:OTA 更新需要在互联网上传输数据,这可能在带宽有限或昂贵的地区造成成本或问题。大型固件更新可能会消耗大量数据。
-
网络稳定性:可靠的互联网连接对于 OTA 更新至关重要。如果在更新过程中设备断开连接,可能会导致固件更新失败或损坏,从而可能使设备无法使用。
-
版本控制:在多个设备上管理固件的不同版本可能会变得具有挑战性。跟踪哪些设备正在运行哪些固件版本并确保兼容性可能会耗费时间。
-
兼容性问题:OTA 更新可能无法与所有类型的设备和配置无缝工作。确保您的硬件支持 OTA 更新,并且您已安装必要的库和代码,这可能是一项复杂的任务。
-
延迟:根据固件更新的大小和互联网连接的速度,OTA 更新可能会引入延迟,导致设备在更新过程中暂时不可用。
-
依赖 Arduino IoT Cloud:要使用 Arduino IoT Cloud OTA 功能,您必须依赖 Arduino IoT Cloud 平台。如果平台出现停机或服务变更,可能会影响您执行 OTA 更新的能力。
-
回滚选项有限:在某些情况下,如果 OTA 更新失败或引起问题,回滚到以前的固件版本可能会很困难,尤其是如果您事先没有计划回滚机制。
尽管存在这些缺点,OTA 更新仍然是许多物联网项目的宝贵功能。然而,在实施 OTA 更新之前,仔细评估您项目的具体需求和限制,并通过适当的规划和安全措施解决这些挑战是至关重要的。
在本节中,我们讨论了 Arduino IoT Cloud OTA 功能的优点以及其缺点。在下一节中,我们将深入了解哪些硬件开发板与 Arduino IoT Cloud OTA 功能兼容,因为目前并非所有硬件开发板都支持该功能。因此,如果您需要在产品开发阶段为您的产品添加 OTA 功能,这一点是必须牢记在心的。
Arduino OTA 兼容的开发硬件列表
并非所有官方 Arduino(或其他)开发板都准备好支持 OTA 功能,但以下是一些兼容并准备就绪的。请访问此链接查看有关 OTA 兼容开发板的所有信息:https://docs.arduino.cc/arduino-cloud/features/ota-getting-started。
这些是准备好进行 OTA 的官方 Arduino 开发板:
-
Arduino MKR Wi-Fi 1010
-
Arduino Nano 33 IoT
-
Arduino Nano RP2040 Connect
-
Portenta H7
-
Portenta Machine Control
-
Nicla Vision
-
Arduino Opta (PLC)
这些是准备进行 OTA 更新的 ESP32 系列开发板:
-
ESP32-S2-DevKitC
-
NodeMCU-32-S2
-
WeMos LOLIN D32
-
ESP32-S3-DevKitC
-
ESP32-CAM
-
NodeMCU-32S
-
Freenove ESP32 WROVER
-
ESP32-DevKitC-32E
-
DOIT ESP32 DevKit v1
好事是 Arduino 为 ESP32 系列开发板提供了最新功能。这些板子在学生/研究人员和专业开发者中非常受欢迎,因为它们的成本和全球的可用性。我使用了XIAO ESP32-C3 系列开发板进行各种项目,并测试了该板的 OTA 服务。根据我的个人经验,与 ESP32 系列相比,官方 Arduino 开发板上的 OTA 服务运行速度更快,但我希望在未来 Arduino Cloud 团队将为 ESP32 系列板优化 OTA 功能,以提供更快更好的体验。
重要提示
Arduino IoT Cloud 为 Wi-Fi 兼容设备提供了 OTA 功能。这意味着 LoRaWAN 目前与 OTA 功能不兼容。
在本节中,我们讨论了支持 Arduino IoT Cloud OTA 功能的广泛兼容板。在下一节中,我们将探讨如何使用 Arduino IoT Cloud 中的 OTA 功能通过互联网发送固件更新,而无需任何设备连接到主机电脑。
在 MKR Wi-Fi 1010 上实现 OTA 更新
首先,我们将探讨如何使用 OTA,然后我们将深入了解 OTA 在幕后是如何工作的。我们需要导航到一个使用支持 OTA 的开发板的“物”。我们将选择一个已经连接到 MKR Wi-Fi 1010 设备的“物”。导航到“物”中的草图标签。以下图显示了 OTA 功能和端口:

图 11.12 – 带有 OTA 更新功能的物理端口连接
我的设备连接到我的 MacBook,同时也通过 Wi-Fi 连接到 Arduino IoT Cloud。这就是为什么在前面的图中可以看到两个草图上传选项的原因。第一个是端口选项,仅在您的开发板直接连接到您的笔记本电脑/电脑时才可用,而第二个选项是空中传输,当您的代码在开发板上配置了网络设置并成功通过互联网连接到 Arduino IoT Cloud 时才可用。
选择空中传输选项,然后点击草图上传(绿色箭头图标)按钮;这将通过网络开始将您的更新代码上传到板子,而无需物理连接的干预。然而,您如何确认这是通过互联网完成的呢?只需将开发板从您的电脑上拔下,并用任何适配器供电,但请确保您的设备可以访问 Wi-Fi 路由器。

图 11.13 – 独立的空中传输更新选项
在断开与计算机的连接并通过电源适配器打开设备后,您将在您的Sketch标签中只看到空中更新选项。只需修改您的代码或添加一些额外的登录详细信息,然后点击Sketch Uploading(绿色箭头图标),在短时间内,您的代码将无缝地出现在开发板上。
根据我的经验,我常常认为我们应该有一个选项,通过这个选项我们可以修改/更新远程设备的代码,例如智能农业、仓库监控和工业监控设备,因为去偏远地方更新/修改代码非常困难。然而,Arduino IoT Cloud 的 OTA 功能使我们的生活总体上变得更加容易。有了 OTA 功能,我们可以节省时间和成本,并准时为设备提供正确的更新,而不会有任何延迟。
OTA 的工作原理
让我们来谈谈 OTA 背后的工作原理。Arduino IoT Cloud 首先在云环境中根据所选设备编译代码,然后将这些编译文件存储在OTA_REQ标志为true时,它将从指定的 URL 开始下载编译文件。下载完成后,开发板将使用长度/CRC 检查验证下载的文件。下载验证后,板将开始使用最新的固件进行闪存。以下图展示了幕后发生的整个流程:

图 11.14 – Arduino IoT Cloud OTA 背后的工作原理
Arduino IoT Cloud 团队简化了这一过程的复杂性,并为开发者提供了 OTA 的单击选项。此图的目的是为您提供一个如何工作的概览,这可能会为您的未来开发提供新的想法。
在本节中,我们学习了如何实现 Arduino IoT Cloud 的 OTA 功能以发送固件 OTA。我们还讨论了 Arduino IoT Cloud 如何使用 Amazon S3 服务向设备发送固件更新。
摘要
在本章中,我们探讨了调度器以及我们如何使用 Arduino IoT Cloud 来自动化具有不同模式或随机操作模式的任务。我们使用简单的 LED 和 MKR Wi-Fi 1010 来演示多个调度器/定时器操作,这有助于您了解如何在现实世界的项目中使用此功能,例如在智能农业和智能工业中。
在本章的第二部分,我们探讨了 OTA。首先,我们讨论了 OTA 的优缺点以及我们如何利用它节省时间和成本。然后,我们使用 OTA 启用的发展板演示了 OTA 功能的使用,最后,我们探讨了 OTA 背后的工作原理。
在接下来的章节中,我们将实现一个医疗保健项目。你将学习如何使用心率传感器以及 Arduino 物联网云的 webhooks 功能,这些功能会将数据发送到第三方服务(Zapier)。我们将使用 Zapier 来设置一个Zap,该 Zap 将接收心率读数,如果读数超过或低于阈值,则会向指定人员发送电子邮件通知。
第十二章:项目 #6 – 跟踪和通知心率
本章致力于智能医疗保健和可穿戴设备。它展示了医疗设备如何与Arduino IoT Cloud 平台集成,并提供了 Arduino IoT Cloud 与第三方服务之间接口的示例。当测量的心率超过定义的心率阈值时,通知服务会向收件人发送通知。
在本章中,我们将通过使用心率传感器和 Seeed Studio 最新且非常小巧的开发板——XIAO 系列中的 XIAO ESP32C3,它具有许多功能——来实际探索智能健康和可穿戴设备。借助传感器的帮助、开发板和 Arduino IoT Cloud,我们将构建一个物联网智能健康解决方案。你还将学习如何设置 webhooks,以便将最新的心率值发送到 Zapier。最后,你将看到如何在 Zapier 中设置 Zaps,以便在心率数据上接收电子邮件/移动通知。
在本章中,我们将涵盖以下主要主题:
-
探索物联网智能健康解决方案
-
了解硬件组件——传感器和开发板
-
理解项目架构
-
设置事物、网络凭据、云变量和代码
-
设置网页和移动仪表板
-
设置通知服务
技术要求
以下硬件组件是完成本章练习所必需的:
-
Seeed Studio XIAO ESP32C3
-
XIAO ESP32C3 的 USB Type-C 线缆
-
脉搏传感器(在了解硬件组件——传感器和开发板部分找到完整详情和存储链接)
-
开发板上的公接头
-
跳线
对于编码,我们将使用Arduino Web Editor,它包含大量开发板和传感器库,以及用于事物和仪表板设置的 Arduino IoT Cloud。为了开发硬件和传感器设计,我们需要Fritzing桌面软件和Arduino IDE桌面软件,用于使用串行绘图仪对脉搏传感器进行校准,而串行绘图仪在 Arduino Web Editor 中不可用。
我们还将使用Zapier在传感器检测到心率超过我们指定的每分钟跳动次数(BPM)阈值时通过电子邮件发送警报。你可以根据项目需求使用免费/试用账户或购买 Zapier 专业计划,因为与免费账户相比,Zapier 专业计划提供了更多功能和功能。本章中使用的代码可在书籍的官方 GitHub 仓库github.com/PacktPublishing/Arduino-IoT-Cloud-for-Developers中找到。
探索物联网智能健康解决方案
物联网(IoT)在提供能够改善患者结果和降低医疗保健成本的智能医疗保健解决方案中发挥着重要作用。物联网设备可以收集实时数据,与其他设备通信,并生成有助于医疗保健提供者做出更好决策的见解。
以下是一些物联网在智能健康解决方案中应用的例子:
-
远程患者监测:物联网设备可用于实时监测患者健康状况,即使他们不在医院。可穿戴设备、传感器和医疗级物联网设备可以收集生命体征、心率、血糖水平和药物依从性的数据。医疗保健提供者可以使用这些数据提供个性化护理并防止并发症。
-
远程医疗:物联网设备可以启用虚拟咨询和远程医疗服务。患者可以通过视频会议与他们的医疗保健提供者沟通,医疗保健提供者可以通过物联网设备远程监测患者的健康状况。这可以提高医疗保健服务的可及性,降低医疗保健成本,并改善患者结果。
-
智能药物管理:物联网设备可以帮助患者更有效地管理他们的药物。物联网药物分配器可以在患者需要服药时提醒他们,并跟踪药物使用情况。医疗保健提供者可以使用这些数据提供个性化护理并防止用药错误。
-
预测性维护:物联网设备可用于监控医疗设备并预测何时需要维护。这有助于防止设备故障,减少停机时间,并改善患者结果。
-
智能医院管理:物联网设备可用于更有效地管理医院资源。例如,物联网资产跟踪系统可以帮助医疗保健提供者快速定位医疗设备,减少患者的等待时间。
总之,物联网可以启用改善患者结果和降低医疗保健成本的智能健康解决方案。医疗保健提供者可以使用物联网数据提供个性化护理并做出更明智的决策。随着物联网技术的不断发展,我们预计未来将看到更多创新的健康保健解决方案。
在本节中,我们讨论了物联网和智能医疗保健以及物联网如何对我们开发智能医疗保健产品有益。接下来,我们将探讨执行本章练习所需的硬件和传感器类型。
了解硬件组件——传感器和开发板
ESP32 系列提供了各种尺寸和引脚的开发板。在本章中,我们使用的是 Seeed Studio 的最新开发板,XIAO ESP32C3,因为它非常紧凑,尺寸比其他板更小,成本更低,并提供 5V 和 3.3V。图 12.1显示了我们将使用的 XIAO ESP32C3 的引脚图:

图 12.1 – XIAO ESP32C3 引脚图
XIAO ESP32C3 提供了多个数字输入/输出引脚。在之前的 ESP 系列板上,如 ESP8266,我们只有一个模拟引脚,但在这个开发板上我们有四个,这消除了在多个模拟引脚上开发解决方案时遇到的最大障碍。为了在之前的 ESP 系列板上解决这个问题,我们不得不使用 ADS1115/ADS1015 来增加额外的模拟引脚,因此这个开发板默认提供四个模拟引脚,可以为您节省一些费用。
除了这些特性,XIAO 提供了内置电池充电模块,并且该板针对功耗进行了优化,这使得该板非常适合开发可穿戴设备。对于连接性,Wi-Fi 和蓝牙都可用,包括 低功耗蓝牙 (BLE) 5 支持,这更适用于物联网用例。有关进一步详情,请访问 wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/。
对于我们当前的项目,我们需要一个用于 脉冲传感器 的模拟引脚和一个 5V 电源引脚。我们选择的开发板的一个优点是它有一个 5V 电源引脚,这在大多数 ESP32 系列开发板上是不存在的。
我们使用脉冲传感器来测量 BPM,但市场上还有各种其他用于 BPM 和脉搏测量的脉搏血氧计。以下脉冲传感器(图 12.2)是开源的,比其他传感器更便宜,也更易于使用。您也可以使用中国制造的脉冲传感器,但在使用这些传感器时需要控制条件。

图 12.2 – 脉冲传感器及其引脚图
以下是可以购买原始脉冲传感器的官方商店列表:
-
SparkFun:
www.sparkfun.com/products/11574 -
Adafruit:
www.adafruit.com/product/1093 -
Amazon UK:
www.amazon.co.uk/dp/B01CPP4QM0 -
Amazon USA:
www.amazon.com/PulseSensor-com-Original-Pulse-Sensor-project/dp/B01CPP4QM0
前面的图显示了脉冲传感器的引脚布局。引脚 #1 是 GND 引脚,它连接到板上的 GND 引脚。引脚 #2,VCC,与 3.3V 和 5V 都兼容。引脚 #3 连接到板上的任何模拟引脚。我将它连接到板上的 Pin #A1。您可以将公头接到脉冲传感器上,或者直接焊接电缆而不使用任何头针。
测量脉搏是一个非常关键且困难的任务,但我们可以从由世界著名的电子公司发起的众筹项目pulsesensor.com中受益。在这个网站上,你可以找到所有官方细节,包括规格、传感器的工作原理以及开发板代码示例。
重要提示
国产的脉搏传感器适合 DIY 项目,但即使是官方店铺的传感器,在没有使用实时心电图(ECG)、BPM 设备和医生验证的专业校准的情况下,也无法在实际应用场景中部署。
在本节中,我们讨论了脉搏传感器,以及你可以在哪里购买它,以及检查其引脚图以获得更好的理解。接下来,我们将检查项目架构,涵盖如何将传感器连接到 XIAO ESP32C3。
理解项目架构
在前面的章节中,我们详细讨论了传感器和开发板。现在,我们该开始着手制作食谱了。在硬件开发中,在我们开始使用传感器和开发板之前,我们需要开发设计概念,以便更好地理解事物如何连接。有许多软件可用于为电子项目设计和开发设计概念,但我们将使用 Fritzing。
在接下来的两个小节中,我们将涵盖原理图和项目设计,解释如何将引脚连接到开发板并进行焊接。接下来,我们将对脉搏传感器读取阈值进行一些校准,因为这对于不同的开发板是不同的。在我们将数据发送到云之前,这非常重要。
印制电路板设计和组装
设计的目的是清楚地了解传感器将如何连接到开发板。清晰的设计有助于工程师在面包板或Veroboard上开发原型。有效设计的另一个主要好处是,Fritzing 会根据你的设计在后台构建硬件原理图和 PCB 设计,然后设计师可以根据系统要求进行调整。图 12.3显示了项目原理图,展示了如何将脉搏传感器连接到 XIAO ESP32C3:

图 12.3 – XIAO ESP32C 和脉搏传感器系统设计
前面的设计图概述了如何将传感器连接到开发板。根据我们的设计,我们从开发板到脉搏传感器有 5V 和 GND。脉搏传感器是一个模拟传感器,因此我们将它的信号引脚连接到开发板的A1引脚。

图 12.4 – 最终原型
在将公头焊接到脉冲传感器和 XIAO ESP32C3 之后,根据原理图连接引脚。只有一个传感器,因此不需要面包板。图 12.4显示了脉冲传感器直接通过跳线连接到 XIAO ESP32C3,而没有使用任何面包板或 Veroboard。现在,是时候校准脉冲传感器并通过将指尖放在传感器上来获取适当的阈值值了。
传感器校准
对于传感器校准,我们需要串行绘图器来识别脉冲值阈值。目前,Arduino Web 编辑器不支持串行绘图器,因此我们将使用 Arduino IDE。要使用 Arduino IDE,我们需要安装Seeed Studio XIAO ESP32C3 系列开发板和pulsesensor.com库。
要在 Arduino IDE 中安装 ESP32 系列开发板,首先,在首选项中添加板的定义文件:
-
导航到文件 > 首选项,并在附加板管理器 URL字段中填写以下 URL:
raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json。 -
然后,在搜索框中导航到
esp32,选择esp32的最新版本,并安装它。 -
最后,通过导航到工具 > 板 > ESP32 Arduino并选择XIAO_ESP32C3来选择板。板列表有点长,您需要滚动到底部才能找到它。
是时候安装脉冲传感器库了。在搜索栏中导航到pulsesensor playground。这里只会返回一个库——安装它。
现在我们已经准备好进入校准步骤。导航到文件 > 示例 > PulseSensor Playground > 入门项目。在这里,您将获得校准的模板代码,我们将对其进行以下修改:
// Variables
int PulseSensorPurplePin = A1; // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED = 10; // The on-board Arduino LED
将PulseSensorPurplePin变量设置为A1。请记住永远不要使用简单的1,因为它会给出不同的值。接下来,将10分配给LED变量。在这些修改完成后,将代码上传到板。要以图形格式监控记录的值,请导航到工具 > 串行绘图器。图 12.5显示了串行绘图器以图形形式展示所有值。阈值值由红色框标记。

图 12.5 – 使用串行绘图器显示的脉冲传感器原始读取值图
将手指放在脉冲传感器的正面,上面有一个白色的心形标记。等待一段时间,让读取值在串行绘图器上稳定。几秒钟后,您应该看到如图所示稳定的读取值。将最低值标记为阈值。在我的情况下,我将3500作为阈值值以避免噪声。
之后,从 GitHub 仓库下载 第十二章 下的 PulseSensor_BPM_Alternative 代码([B19752_12.xhtml#_idTextAnchor251])。这是我们修改过的代码,我们将用它来显示 BPM。但在将代码上传到板子之前,请按照以下方式修改值:
const int PULSE_INPUT = A1;
const int PULSE_BLINK = 10;
const int PULSE_FADE = 5;
const int THRESHOLD = 3450; // Adjust this number to avoid noise when idle
将 A1 分配给 PULSE_INPUT 变量,将 10 分配给 PULSE_BLINK,并根据从 Serial Plotter 读取的稳定值设置 THRESHOLD 值。正如所述,我使用的是从我的图表中读取的 3500。将代码上传到板子,并在 Serial Monitor 中观察 BPM 读取值。将手指放在传感器的顶部,你会得到不同的 BPM 读取值。图 12.6 展示了它应该看起来是什么样子:

图 12.6 – 序列监视器中的 BPM 值
前面的图显示了随机的 BPM 值,当我们把手指放在传感器上时,它会检测到 96 和 100 BPM。你可以玩一下传感器,并用任何专业智能手表验证读取值。接下来,我们需要在 Arduino IoT Cloud 中设置一个 Thing、一些代码和一个仪表盘,以准备我们的物联网项目。
设置 Thing、网络凭据、云变量和代码
在设置好硬件之后,现在是时候在 Arduino IoT Cloud 中设置一个 Thing 了。对于这个项目,我们需要一个云变量来从设备获取 BPM 读取值。由于我们使用的是 ESP 系列板,网络设置将与 Arduino IoT 开发板不同。图 12.7 展示了包括云变量、设备信息和网络配置在内的完整 Thing 详细信息:

图 12.7 – 跟踪和通知心率 Thing 设置
设置一个新的 Tracking and notifying about your heart rate。然后,继续阅读本章的以下部分,它将带我们完成以下步骤:创建变量、关联设备、设置网络配置,最后应用代码:
-
首先,我们需要为 BPM 设置一个云变量。有关云变量的详细信息,请参阅以下 云变量 部分。
-
之后,我们需要将设备与 Thing 关联。在我们的当前项目中,我们使用的是 XIAO ESP32C3,因此向导将不同于 Arduino 板的向导。详细信息请参阅 设备关联 部分。
-
接下来,我们需要为设备设置网络配置,但这次,我们需要为 ESP 系列板提供一个安全密钥,以确保连接的安全性(而 Arduino 兼容板在设备设置向导期间会自动由 Arduino IoT Cloud 配置)。
-
最后,我们将在本章末尾设置 webhook,以及使用 Zapier 设置通知服务。
云变量
下表概述了我们在创建云变量时需要使用的属性。对于 BPM,我们可以只使用整数数据类型,但多亏了 Arduino IoT Cloud 扩展变量组,我们可以选择特定的心率变量类型。接下来,请确保您使用与表中相同的变量声明;否则,您将需要根据您自己的命名修改示例代码。
对于权限,虽然我们有读/写选项,但我选择了只读,因为我们只想从设备接收数据,而不是修改仪表板,因此只读模式将避免数据一致性问题。更新策略设置为更改时,因为设备将在检测到 BPM 值有任何变化时发送数据:
| S# | 变量名 | 变量类型 | 声明 | 权限 | 更新策略 |
|---|---|---|---|---|---|
| 1 | BPM | 心率 | bPM |
只读 | 更改时 |
表 12.1 – 我们事物的云变量
在本节中,我们创建了接收来自传感器设备的 BPM 心率值的云变量。在下一节中,我们将关联设备与事物。
设备关联
变量创建完成后,现在是时候添加设备并将其与事物关联起来。在添加设备之前,将开发板连接到计算机并打开Arduino Create Agent应用程序。图 12.8显示了设备设置向导,我们在下拉菜单中选择了ESP32,然后选择了XIAO_ESP32C3:

图 12.8 – 设备选择向导
-
在事物页面上的关联设备部分下点击选择设备按钮。将弹出一个窗口,显示所有已可用的设备。如果您已经添加了您的 XIAO ESP32C3,请选择它。否则,点击设置 新设备。
-
然后,点击第三方设备选项。从下拉菜单中选择ESP32和XIAO_ESP32C3,然后点击继续按钮。
-
在设备名称字段中填写,然后点击下一步按钮。
-
在最后的向导屏幕上,将显示设备 ID和密钥值。将密钥值复制到安全的地方,因为它将在稍后的网络配置中需要。
在本节中,我们将 XIAO ESP32C3 设备与事物关联起来。设备关联过程与将 Arduino MKR1010 添加到事物中的过程有所不同。接下来,让我们完成网络设置。
网络
将设备与事物关联后,现在是时候配置设备通信的 Wi-Fi 设置了。使用图 12.9中所示表格填写您的Wi-Fi 名称和密码值。最后一个字段是密钥字段。粘贴我们在设备创建期间从系统中接收到的密钥值。

图 12.9 – 事物的网络配置
图 12**.9显示了输入所有相关值后应该看起来是什么样子。在下一小节中,我们将介绍设备的编码。
编程
本章的代码可在本书的官方 GitHub 仓库中找到。从仓库中下载Tracking_and_notifying_Your_Heart_Rate_mar31a代码,并将其导入 Arduino Web Editor。
你可以通过导航到草图选项卡来下载代码并将其添加到你的设备中。我们不会详细讨论代码,因为你在自己阅读代码后就会明白其要点,但我将解释我们初始化所有变量和常数的 main workflow。
记住永远不要使用delay方法,因为它会在ArduinoCloud.update()方法中创建阻塞。但在继续代码之前,我们需要将PULSE_INPUT变量设置为引脚A1,将PULSE_BLINK设置为数字引脚10用于 LED,并使用你的校准值设置THRESHOLD:
const int PULSE_INPUT = A1;
const int PULSE_BLINK = 10;
const int PULSE_FADE = 5;
const int THRESHOLD = 3450; // Adjust this number to avoid noise when you will start getting values from sensor
在使用适当的值配置前面的变量之后,是时候探索循环方法了:
if (pulseSensor.sawNewSample()) {
if (--samplesUntilReport == (byte) 0) {
samplesUntilReport = SAMPLES_PER_SERIAL_SAMPLE;
//pulseSensor.outputSample();
if (pulseSensor.sawStartOfBeat()) {
bPM=pulseSensor.getBeatsPerMinute();
Serial.print(bPM);
Serial.println(" bpm");
}
}
/*******
Here is a good place to add code that could take up
to a millisecond or so to run.
*******/
}
/******
Don't add code here, because it could slow the sampling
from the PulseSensor.
******/
在循环方法中,开发板会调用pulseSensor.sawNewSample()来获取新的样本,如果存在的话。除此之外,它不会调用任何活动,这就是为什么如果你在 BPM 数据中没有找到变化,你会看到返回的读取有延迟。如果传感器读取中发生了任何变化,则 BPM 读取将使用pulseSensor.sawStartOfBeat()方法进行验证。
在我们创建云变量的上一节中,回想一下云变量声明——我们的pulseSensor.getBeatsPerMinute();方法将传感器读取分配给那个thingProperties.h文件。所以,当你将这些值分配给这些常量时,循环中的ArduinoCloud.update()方法将自动将数据发送到云。最后,将代码上传到设备,并使用串行监视器验证返回的读取值。
重要提示
如果你使用了不同的命名在变量声明中,那么根据你的命名方案更新代码。然而,按照书中的步骤首先进行操作,然后稍后更改云变量名称并相应地修改你的代码会更好。
永远不要使用delay方法,因为它会在ArduinoCloud.update()方法中创建阻塞,并且不要在循环方法的末尾放置代码,因为它会导致脉搏传感器读取的延迟。
Arduino IoT Cloud 仅在变量值更改时才更新仪表板上的值。例如,如果心跳是80,并且 5 分钟后仍然相同,那么 Arduino IoT Cloud 将不会记录该值,所以如果你在图表上没有看到值的变化,请不要感到困惑。这个功能的另一个好处是,当你导出内容时,你将不会得到重复的数据。
在本节中,我们深入讨论了代码,并指导您了解代码操作以及如何设置阈值。在下一节中,我们将设置仪表板以不同格式可视化 BPM 值,以便更好地理解。
为网页和移动设备设置仪表板
在将代码上传到设备后,现在是时候设置网页和移动仪表板,以便使用不同的小部件可视化数据了。以下图示演示了这种可视化可能的外观:

图 12.10 – 事物仪表板
在前面的图中,我们有一个 BPM 读数,为了可视化它,我们使用了两个小部件,值和高级图表。屏幕左侧的值小部件显示实时BPM值,而高级图表小部件展示了实时读数以及用于适当分析的历史读数,就像心电图机显示一样。这两个小部件都连接到 BPM 云变量。
高级图表小部件是新增的小部件之一,它包含各种功能,包括不同的图表格式,如线形图、样条图、样条图/线形图面积图和柱状图,以及自定义绘图颜色的选项。另一个重要功能是能够在同一图表上可视化多个云变量,这在简单的图表小部件中是不可用的。我们将在未来的项目中使用该功能进行适当的演示。
在本节中,我们简要讨论了一些小部件及其为何在我们的仪表板中使用。接下来,我们将使用 Zapier 设置通知服务,当脉冲检测到超过或低于我们的阈值时,将发送电子邮件/SMS。
设置通知服务
多个平台提供 软件即服务 (SaaS) 基础设施,并作为各种应用程序之间的桥梁,使互操作性变得容易。此类平台包括 Zapier、IFTTT 和 Integromat,并提供接口将其他平台集成到 Arduino IoT 云平台中,以满足需求,而不是从头开始开发所需功能。
因此,首先,我们需要了解为什么我们需要 Zapier 自动化平台。在我们的当前项目中,我们希望在达到特定阈值时通过电子邮件/SMS 发送通知,但 Arduino IoT 云平台仅提供数据可视化、webhooks 和 API 功能。我们有两种解决此问题的方法。要么我们需要开发一个自定义解决方案,使用 Arduino webhooks 和 API 通过电子邮件/SMS 发送通知,或者我们可以使用自动化平台,如 Zapier 或 IFTTT,这比第一种方法节省时间和降低成本。
对于这个练习,我们将使用 Zapier,它将通过 Arduino webhook 接收数据。我们将在 Zaps 中应用 Zapier 过滤器来管理阈值,当阈值被超过时,Zapier 将发送关于 BPM 水平的电子邮件通知。Zap 是 Zapier 中用来描述允许连接应用程序和服务的自动化工作流程的术语,每个 Zap 可以包含多个操作。
在进行主要步骤之前,首先在 zapier.com 上注册并使用试用版,因为我们将要使用的 Zapier webhook 只在 专业计划 下可用。以下截图展示了设置我们的通知功能所需的触发器和两个操作:

图 12.11 – Zapier 完整通知 Zap
创建此 Zap 的步骤,我们将在本节剩余部分进行操作,如下所示:
-
首先,我们需要设置 webhook 触发器,它将提供一个 URL。这个 URL 应该通过点击 Arduino IoT Cloud Thing 页面上的 设置 Webhook 来插入到 Thing 中。这个触发器将负责接收来自 Arduino IoT Cloud 的数据。
-
在第二步中,我们对 BPM 值应用过滤器,指定如果 BPM 大于 100 或小于 60,则进行下一个操作;否则,BPM 是正常的,不需要发送通知。
最后,我们将使用 Zapier 的电子邮件 或 Gmail 选项来发送通知。我们在 Zap 中添加了多个操作。为了使事情简单易管理,我们选择使用简单的电子邮件通知。或者,您也可以使用 Twilio 向收件人发送短信通知。
之前,我们已经逐步讨论了触发和发送通知所需的不同的触发器和操作。以下要点将指导您在 Zapier 中完成这些步骤:
-
上一张截图大致展示了我们在 Zapier 中的设置。要在 Zapier 中创建一个新的 Zap,请点击 创建 按钮,然后选择 新建 Zap,这将打开一个新页面,您可以在其中选择所需的触发器和操作。
-
在搜索栏中输入
Webhook并选择 Zapier Webhooks 选项,这是在专业计划下可用的。点击 事件 并选择 捕获钩子,然后点击 继续。在 触发器 选项卡中,只需保持空的 选择子键 文本框不变,然后通过点击 继续 按钮进行下一步。 -
在 测试 选项卡中,您将获得 webhook URL – 复制该 URL 并导航到 Arduino IoT Cloud 中的 Thing,然后点击 设置 Webhook。将 URL 插入弹出的窗口中,然后点击 保存 按钮。
返回 Zapier 并点击 测试触发 按钮以验证数据是否到达。在您验证之前,设备必须开启并连接到互联网以发送值。这可能不会在第一次尝试时成功;如果不成功,请再次尝试,您应该会看到数据到达,这意味着您已成功从 Arduino Thing 接收数据。图 12.12 显示了一个触发测试,展示了从 Arduino IoT Cloud 脉搏监测 Thing 接收到的值:

图 12.12 – 触发测试
上一张截图显示了 Zapier 成功从 Arduino IoT Cloud Thing 接收数据。在红色框中,我们可以看到 bPM 和 value。value 参数将在下一个动作中使用。点击 继续 按钮,将出现一个新的 动作 弹窗。在这里,我们需要配置过滤器动作,我们将设置 BPM 通知的阈值,如图 12.13 所示:

图 12.13 – 过滤器动作
在搜索框中输入 Filter,然后在下一个输入字段中选择 100。这会将上限阈值设置为 100 BPM。接下来,在下一个字段中点击 60。最后,点击 继续。
我们的过滤器已准备就绪;现在,我们需要电子邮件通知动作来完成设置。我们有两种发送电子邮件通知的方式:在搜索框中输入 Email 并点击 通过 Zapier 发送电子邮件。点击 事件 并选择 发送出站电子邮件。在下一个窗口中,设置电子邮件接收者、主题和正文的全部参数,如图下所示截图:

图 12.14 – 邮件通知设置
这里只有三个字段是必填的——在 收件人 字段中输入收件人电子邮件,为 主题 字段编写相关条目,并在 正文 区域中插入消息。是否填写其他字段或留空取决于您。如果您观察上一张截图,可能会注意到我在 主题 和 正文 字段中添加了 Values Value,这将显示触发通知的电子邮件中的值。点击页面底部的 继续 按钮并测试动作——如果您收到带有 BPM 值的电子邮件,那么发布 Zap 即可。
在本节中,我们使用 Zapier 为我们的脉搏监测器设置通知服务。我们创建了一个包含三个步骤的 Zap。首先,我们设置了负责接收数据的 webhook。第二步处理阈值,第三步和最后一步处理发送电子邮件通知。
接下来是什么?
有许多更多选项可供探索,但这些留给你去使用不同的健康传感器和开发板进行更多实验并从中学习。在当前章节中,我们只使用了一个传感器,它只提供了一个参数,但市场上有很多传感器提供了广泛的性能,包括血糖、血氧、血压、体温等的监测。
尝试以下传感器以增强你的实践知识,并从功能、范围和成本等方面将此选择与其他传感器进行比较:
-
LilyPad 温度传感器(
www.sparkfun.com/products/8777) -
高灵敏度脉搏血氧仪和心率传感器,适用于可穿戴设备(
www.seeedstudio.com/MAXREFDES117-HEART-RATE-AND-PULSE-OXIMETRY-MONITOR-p-2762.html?queryID=51de6141574a711bbe455cb4894ce3fb&objectID=411&indexName=bazaar_retailer_products) -
倒地检测模块(
www.seeedstudio.com/24GHz-mmWave-Radar-Sensor-Fall-Detection-Module-p-5268.html) -
开源 Arduino 血糖仪盾牌
-
MIKROE 系列健康传感器
摘要
在本章中,我们探讨了如何使用 XIAO ESP32C3 和一个脉搏传感器开发低成本可穿戴智能心率监测系统。需要注意的一个重要事项是在现场使用医疗传感器之前必须对其进行校准。我们设置了一个“事物”,其中包括云变量创建、设备关联、网络配置和为我们的开发板编写代码。后来,我们创建了一个仪表板,使用不同的小部件可视化我们的传感器读数,包括当前读数和历史数据,并通过图表帮助显示。最后,我们使用 Zapier 根据阈值设置基于 webhooks 的电子邮件通知服务,并了解了如何使用 webhooks 将第三方服务与 Arduino IoT Cloud 集成。
在下一章中,我们将学习如何在 Arduino IoT Cloud 中使用Arduino Cloud CLI(CCLI)进行脚本编写。这是一个通过终端命令提供对 Arduino IoT Cloud 服务访问的命令行工具。我们将使用 Arduino IoT Cloud CLI 来自动化大量操作,包括大量设备创建,这将帮助我们最小化操作和维护所需的时间。
第十三章:使用 Cloud CLI 编写 Arduino IoT Cloud 脚本
Arduino Cloud 命令行界面(CLI)是一个自动化工具,对于脚本编写和创建设备、事物和仪表板非常有用。它还提供了执行大量上传(OTA)的选项,从而能够管理已部署的 IoT 节点。本章将探讨该工具的高级功能,并提出一些使用场景。
Arduino Cloud CLI 是一个跨平台工具,它允许你通过命令行执行批量管理和操作,这有助于提高你的生产力,并提供通过命令行脚本自动事物选项。在本章中,我们将探讨所有命令并观察它们的上下文。
在本章结束时,你将了解如何通过 CLI 与 Arduino IoT Cloud 平台交互,以创建、删除或从设备、事物和仪表板中提取模板,并通过命令行向设备发送 OTA 更新。本章将展示如何通过命令行执行所有操作以提高你的生产力。你将学习的命令将帮助你编写用于大量部署和批量管理操作的定制脚本。
在本章中,我们将涵盖以下主要主题:
-
什么是 Arduino Cloud CLI?
-
保护访问权限 – 揭示 API 密钥和身份验证
-
安装 Arduino Cloud CLI
-
与设备交互
-
与事物互动
-
构建仪表板 – 通过命令行释放潜力
-
OTA 管理
-
接下来是什么?
技术要求
本章没有特定的硬件要求,因为我们将会专注于 Arduino Cloud CLI,并通过不同的命令练习来执行在 Arduino IoT Cloud 平台上使用 CLI 的操作。然而,在继续之前,我们需要以下软件来完成本章的不同练习:
-
Arduino Cloud CLI
-
Arduino IDE
-
Arduino IoT Cloud 账户
对于命令,我们需要 Arduino Cloud CLI 和一个活跃的 Arduino IoT Cloud 账户。本章只包含命令,因此在 GitHub 上没有为其创建文件夹。
什么是 Arduino Cloud CLI?
Arduino Cloud CLI 是一个强大的工具,可以管理和与云端的 Arduino 项目进行交互。它允许你执行各种操作,例如部署和管理设备,以及生成仪表板和事物模板以进行批量创建,所有这些都可以在你的命令行中完成。
使用 Arduino Cloud CLI 的好处有很多。首先,它提供了一种方便且高效的方式来管理你的项目,无需图形用户界面。如果你更喜欢使用命令行工具,或者将 Arduino 集成到自动化工作流程中,这尤其有用。
Arduino Cloud CLI 是一个命令行工具,它使你能够通过终端与 Arduino IoT Cloud 的关键功能进行交互。它提供了以下任务的能力:
-
通过提取模板来复制现有的事物和仪表板
-
执行大量 OTA 上传
-
通过 CLI 直接生成设备、事物和仪表板
下面是使用 Arduino Cloud CLI 的一些好处:
-
自动化:Arduino Cloud CLI 可以用来自动化您否则必须手动完成的任务。例如,您可以使用它创建一个脚本,克隆一个事物,然后对该事物关联的所有设备执行大量 OTA 上传。
-
高效设备管理:Arduino Cloud CLI 可以帮助您更高效地管理大量设备。例如,您可以使用它列出与特定标签关联的所有设备,或获取特定设备的状态。
-
访问高级功能:Arduino Cloud CLI 可以用来访问在网页界面中不可用的 Arduino IoT Cloud 功能。例如,您可以使用它创建一个脚本,每分钟检查设备状态,如果状态发生变化,则发送电子邮件警报。
-
定制:作为开源工具,用户可以根据自己的特定需求定制 Arduino Cloud CLI,并将其集成到他们的工作流程中。
-
积极开发和社区支持:该工具正在积极开发中,这意味着它持续接收更新、新功能和错误修复。此外,庞大社区的存在可以为用户提供帮助和支持。
-
节省时间和精力:Arduino Cloud CLI 可以在管理物联网项目中节省时间和精力,对于使用 Arduino 设备的开发者来说是一个宝贵的资源。
总体而言,Arduino Cloud CLI 是一个强大的工具,可以用来自动化任务、管理大量设备,以及访问在网页界面中不可用的 Arduino IoT Cloud 功能。
在本节中,我们讨论了 Arduino Cloud CLI 是什么以及 Arduino Cloud CLI 的好处。在下一节中,我们将探讨如何设置 API 密钥以及如何使用 API 密钥通过 Arduino IoT Cloud 对 Arduino Cloud CLI 进行身份验证。
保护访问权限 – 揭示 API 密钥和身份验证
在进入本章的主要内容之前,我们首先需要讨论平台的身份验证机制。Arduino IoT Cloud 使用令牌身份验证机制来验证 Arduino Cloud CLI 请求。
在我们开始安装和测试 Arduino Cloud CLI 之前,我们需要在 Arduino Cloud 中设置 API 密钥,这将为我们提供客户端 ID 和密钥。在旧版本的界面中,API 选项位于集成标签下,但现在它们已移动到 Arduino Cloud,可在cloud.arduino.cc/home/找到。
访问集成页面后,点击API 密钥,然后您将被带到 API 页面。点击创建 API 密钥。将弹出一个窗口;为 API 提供一个名称,然后点击继续按钮。出现的向导将花费几秒钟生成密钥,然后会弹出一个新的窗口显示密钥,如图图 13.1所示。

图 13.1 – API 密钥
通过点击复制图标复制客户端 ID和客户端密钥的值 – 永远不要尝试手动选择复制,因为客户端密钥非常长,所以点击复制图标是最好的选择。将客户端 ID和客户端密钥的值保存在安全的位置,然后点击复选框,确认您已保存您的密钥。最后,点击完成,您将在面板中看到您的 API 密钥 – 现在它已准备好使用。
重要提示
单个 API 密钥用于访问所有事物及其变量。仅使用一个 API 密钥即可访问所有基础设施,这很方便,而不是为每个事物创建单独的 API 密钥,但您必须小心保管您的密钥!这是一个很大的安全风险,因为如果您丢失了密钥,黑客可能会获得对您整个账户的访问权限。
在本节中,我们创建了 API 认证密钥,这些密钥由客户端 ID 和客户端密钥组成。本节非常重要,因为没有这些密钥,我们无法通过 Arduino Cloud CLI 执行任何命令。在下一节中,我们将安装 Arduino Cloud CLI。
安装 Arduino Cloud CLI
在本节中,我们将安装 Arduino Cloud CLI 工具。Arduino 团队为所有三个主要操作系统:macOS、Windows 和 Linux 开发了 CLI 工具。您可以从github.com/arduino/arduino-cloud-cli/releases下载适用于您的操作系统的 Arduino Cloud CLI 工具。官方 Arduino Cloud CLI 页面可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli找到;在这里,您可以获取有关命令及其使用的更新信息。
总是尝试下载 Arduino Cloud CLI 的最新和最稳定的版本。根据您的操作系统下载 ZIP 文件后,从中提取文件。您将找到一个名为arduino-cloud-cli的可执行文件,另一个名为LICENSE.txt,您可以在操作系统中为arduino-cloud-cli可执行文件设置环境变量,这将帮助您在终端中执行arduino-cloud-cli而无需指定arduino-cloud-cli文件夹的位置。
只需打开终端并输入以下命令:
arduino-cloud-cli
然后,您将在终端上看到以下输出(图 13.2)。

图 13.2 – Arduino Cloud CLI 终端
这只是简单地展示了如何使用 Arduino Cloud CLI 与不同的参数一起使用,因为我们没有在命令执行期间指定任何参数。
现在,是时候使用我们在上一节中生成的 API 密钥,通过 Arduino Cloud CLI 来初始化 Arduino Cloud 的认证了。请在终端中输入以下命令:
arduino-cloud-cli credentials init
执行上述命令后,您将被要求输入您的客户端 ID 和客户端密钥,最后您将被要求输入您的组织 ID,这不是强制性的,您可以将其留空,如图 13.3 所示。

图 13.3 – 使用 Arduino Cloud CLI 与 Arduino Cloud 的认证过程
成功认证后,您将在终端看到成功消息,如图 13.3 所示。恭喜!您现在可以执行终端上的命令,并通过命令在 Arduino IoT Cloud 上执行操作。
在本节中,我们下载了arduino-cloud-cli文件并在我们的操作系统上安装了它,我们还使用 Arduino IoT Cloud 初始化了arduino-cloud-cli工具的认证过程。在下一节中,我们将开始使用命令行来玩设备。
与设备交互
在本节中,我们将通过设备进行实际操作。我们将对设备执行创建、列出、删除、标记和取消标记操作,以及列出所有设备并显示特定设备的所有参数。打开命令终端,然后我们将执行以下章节中的命令。
创建设备
首先,我们将创建一个设备。有关设备创建的文档可以在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#device找到。在您执行命令之前,请将您的开发板连接到您的电脑,并从文档页面中找出您的设备的端口号和 FQBN。以下为device create命令的语法:
arduino-cloud-cli device create --name <deviceName> --port <port> --fqbn <deviceFqbn>
我将 MKR Wi-Fi 1010 连接到我的电脑,该电脑在端口/dev/cu.usbmodem101上可用,其 FQBN 为arduino:samd:mkrwifi1010。因此,以下是我的命令:
arduino-cloud-cli device create -n ArduinoDevBoardByCLI -p /dev/cu.usbmodem101 -b arduino:samd:mkrwifi1010
执行上述命令后,您将看到以下输出,显示设备已成功创建(图 13**.4)。

图 13.4 – 使用 arduino-cloud-cli 创建设备
创建设备后,终端将显示设备名称、ID、板、序列号和 FQBN。想象一下,与图形用户界面相比,使用命令行将数十个开发板连接到 Arduino IoT Cloud 是多么容易。Arduino Cloud CLI 还能够通过 CLI 创建LoRaWAN设备和 ESP32/ESP8266 设备。
在本小节中,我们使用命令行在 Arduino IoT 云平台上创建了一个设备。在下一小节中,我们将探讨如何列出设备。
列出设备
在本节中,我们将列出所有设备。列出设备意味着显示所有设备及其属性。列出设备的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#list-devices找到。以下为列出所有设备的简单命令:
arduino-cloud-cli device list
执行上述命令后,我们将看到设备列表的完整列表,如下图所示。

图 13.5 – 设备列表命令
在输出中,我们可以看到设备名称、ID、板、FQBN、序列号和标签。在这里,ID 非常重要,因为它将在后续的设备删除、标签创建和删除命令中使用。在本小节中,我们已看到如何列出设备,在下一小节中,我们将探讨如何使用设备 ID 删除设备。
删除设备
在本节中,我们将探讨如何使用设备 ID 删除设备。删除设备的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#delete-a-device找到。以下为设备删除的命令语法:
arduino-cloud-cli device delete --id <deviceID>
根据上述命令语法,我们需要一个设备 ID 来进行删除。您可以通过使用device list命令来检索设备 ID:
arduino-cloud-cli device delete -i ca711f68-6de9-497a-ac45-780219ad2bb8
在成功删除设备后,您将不会看到任何错误信息;否则,您将在屏幕上看到401 错误。

图 13.6 – 设备删除命令
图 13**.6 展示了设备删除的完整命令,屏幕上没有错误信息,这意味着设备已成功删除。在本小节中,我们讨论了delete命令。在接下来的小节中,我们将对设备进行标记和取消标记。
标记和取消标记设备
在本节中,我们将探讨如何使用设备 ID 对设备进行标记和取消标记。设备标记的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#tag-device找到,设备取消标记的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#untag-device找到。以下为标记设备的命令语法:
arduino-cloud-cli device create-tags --id <deviceID> --tags <key0>=<value0>,<key1>=<value1>
以下为取消标记设备的命令语法:
arduino-cloud-cli device delete-tags --id <deviceID> --keys <key0>,<key1>
你可能会问,为什么需要一个标签来表示设备?假设你有一个通用的仓库监控产品,并且你在不同的组织和不同的房间中部署了该产品。现在的问题是,在设备名称字段中分配组织名称和位置非常困难。因此,一个最佳解决方案是使用标签。你可以根据需要多次使用标签。标签有两个选项——一个是键,另一个是值。
在以下示例中,我们将附加两个标签——一个用于组织名称,另一个用于位置。使用device list命令选择设备 ID 以附加标签。以下是将标签附加到设备的命令:
arduino-cloud-cli device create-tags -i cda148e4-b011-459a-95fd-a7510c9601c2 --tags Org=ASNAGroup,Location=Warehouse1
根据以下命令语法,我们需要设备 ID 来从设备中删除标签。你可以使用device list命令获取设备 ID。以下是从设备中删除标签的命令:
arduino-cloud-cli device delete-tags -i cda148e4-b011-459a-95fd-a7510c9601c2 -k Location
在这里,命令略有不同,因为我们使用了delete-tags和-k来指定标签键。如果你想删除多个标签,那么使用逗号来分隔键。
在本节和前面的子节中,我们使用命令对设备执行了各种操作,包括设备创建、列出设备、设备删除、标签和取消标签。在下一节中,我们将探讨如何实际地对事物执行操作。
与事物互动
事物是 Arduino IoT Cloud 中最重要元素之一,它作为一个独立的容器,包含所有组成部分,如云变量、设备、设备的草图以及设备的网络配置。在本节中,我们将通过命令尝试一系列不同的操作,例如从事物中提取模板、从模板创建事物、克隆事物以及删除事物。
从事物中提取模板
在 Arduino Cloud CLI 中,我们处理命令并提供不同的参数来执行不同类型的操作。因此,通过命令行创建新的事物会更复杂,因为它将使传递不同参数(如云变量和网络配置)变得更加复杂。
为了解决这个问题,Arduino 团队引入了从实体中提取模板的概念。例如,假设你想部署数百个环境监测节点。通过 Arduino 图形用户界面创建数百个实体并创建一个包含有关实体的所有信息的长命令是困难的。因此,Arduino 引入了模板提取技术。首先,我们将通过 Arduino 图形用户界面创建一个实体,然后我们将通过命令行提取其模板。然后,使用模板,我们将在 Arduino IoT Cloud 中通过命令行创建实体,因为 Arduino Cloud CLI 不允许你从头创建实体。你可以在官方文档中了解更多关于实体模板提取的信息,文档地址为docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#extract-thing-template。
以下为模板提取的命令语法。使用此命令,我们需要提供一个实体 ID,该命令将获取实体的模板。然后,我们需要提供模板文件的格式——要么是 JSON,要么是 YAML:
arduino-cloud-cli thing extract --id <thingID> --format <json|yaml>
对于实体 ID,你可以访问 Arduino IoT Cloud 以找到它,或者参考即将到来的小节,其中我们将向你展示如何列出实体,这提供了实体名称、ID 等信息,因此你也可以从输出中检索实体 ID。现在,我们将指定格式;我们希望模板输出为 JSON 格式,所以我这里使用了 JSON:
arduino-cloud-cli thing extract -i 91c90962-56b6-4094-abe0-1b5ad4828721 --format json
执行命令后,我们将在屏幕上以 JSON 格式获得模板输出,如图图 13.7所示。

图 13.7 – 提取实体模板
我们的实体模板显示了有关云变量的所有信息。复制文本并将其保存到文件中,该文件将在下一节用于实体创建。
创建实体
在提取了实体模板之后,我们现在将开始创建实体。有关实体创建的文档可以在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#create-things找到。以下为实体创建命令的语法,该命令接受两个参数。首先,它将接受名称,其次,它将接受用于实体创建的模板文件名,该文件名包含我们在上一节中保存的 JSON 格式的实体模板:
arduino-cloud-cli thing create --name <thingName> --template <template.(json|yaml)>
在这里,我已提供了一个实体名称,EnvSense101,在上一节中,我将 JSON 模板保存到了名为EnvSenseTemplate.json的文件中。然后,我们使用-n参数提供名称,使用-t参数提供模板文件:
arduino-cloud-cli thing create -n EnvSense101 -t EnvSenseTemplate.json
执行前面的命令后,你将获得以下成功创建实体的输出(图 13.8)。

图 13.8 – 使用 arduino-cloud-cli 创建设备
创建设备后,终端将显示设备名称、ID、设备 ID(目前为空,但在接下来的章节中,我们将将与该设备关联的设备与该设备关联),以及变量名称。
在本小节中,我们使用命令行在 Arduino IoT 云中创建了一个设备。在下一节中,我们将探讨如何克隆设备以进行批量创建。
克隆设备
从模板创建设备后,我们现在将探讨如何使用克隆操作进行大规模部署。有关设备克隆的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#clone-things找到。以下为thing clone命令的语法,它将接受两个参数。首先,它将接受一个名称,其次,它将接受一个设备 ID:
arduino-cloud-cli thing clone --name <thingName> --clone-id <thingToCloneID>
在这里,我提供了一个设备名称,EnvSense102,在上一节中,我们创建了该设备,因此我可以从终端获取其 ID,如图图 13.8所示(在命令行中使用您自己的设备 ID)。然后,使用-n参数提供名称,使用-c参数提供设备 ID:
arduino-cloud-cli thing clone -n EnvSense102 -c 131f2498-2067-468c-bd68-2f52a0233de5
执行上述命令后,您将获得以下输出以成功克隆设备(图 13.9)。

图 13.9 – 使用 arduino-cloud-cli 进行设备克隆
这是 Arduino Cloud CLI 成功克隆设备后的输出。克隆设备后,终端将显示设备名称、ID、设备 ID(目前为空,但在接下来的章节中,我们将将与该设备关联的设备与该设备关联),以及变量名称。您可以看到,仅使用clone命令就可以轻松创建数百个设备。在这里,您只需创建一个批处理脚本,通过使用for循环只更改设备名称,就可以在几分钟内创建数百个设备。
在本小节中,我们学习了如何使用命令行在 Arduino IoT 云中克隆设备。在下一节中,我们将探讨如何列出设备。
列出设备
在本节中,我们将列出所有设备。有关列出设备的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#list-things找到。以下是一个列出所有设备的非常简单的命令:
arduino-cloud-cli thing list
执行上述命令后,我们将看到设备的完整列表,如图下所示。

图 13.10 – 设备列表命令
在输出中,我们可以看到 Thing 名称、ID、设备和标签。再次强调,ID 非常重要,因为它将在以下命令中用于 Thing 删除,以及标签创建和删除。在前面的章节中,我们也使用了 ID 进行 Thing 模板提取和创建,以及 Thing 克隆。
Arduino Cloud CLI 还提供了不同的参数,以便在终端上获取更详细的输出,例如变量列表以及 Thing 列表。我们可以将 -s 参数附加到 Thing 上,也可以通过提供设备 ID 来列出 Thing,还可以通过提供 Thing ID 来列出一系列的 Thing。在这里,我想探讨如何获取变量列表以及 Thing。以下是一个列出云变量的简单命令:
arduino-cloud-cli thing list -s
执行前面的命令后,你将看到 图 13.11 中所示的输出。

图 13.11 – 带变量的 thing 列表命令
在这里,你可以看到所有云变量以及 Thing 名称,但看起来有点复杂。现在,我们将尝试列出带有云变量的单个 Thing。以下为列出带有云变量的 Thing 的命令语法。它将接受两个参数作为输入 – 一个 Thing ID 和一个 -s 参数:
arduino-cloud-cli thing list -i eee6e2ff-7e88-4240-9671-1b79736618ea -s
执行前面的命令,你将看到 图 13.12 中所示的完整且可读的输出。

图 13.12 – 使用云变量显示单个 Thing
现在,是时候探索如何使用设备 ID 来查找一个 Thing。以下是一个简单的命令,用于根据设备 ID 获取一个 Thing:
arduino-cloud-cli thing list -d ef63111f-72bb-4826-84bb-02093d4d85f1 -s
执行前面的命令后,我们将使用设备 ID 获取特定的 Thing 数据,以及其云变量,正如我们在命令中使用了 -s 参数(如 图 13.13 所示)。

图 13.13 – 基于设备 ID 显示单个 Thing,包含云变量
在本小节中,我们探讨了如何使用不同的参数来列出 Thing。在下一个小节中,我们将探讨如何删除一个 Thing。
删除一个 Thing
在本节中,我们将探讨如何使用 Thing ID 删除一个 Thing。有关删除 Thing 的文档可在 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#delete-things 查找。以下为删除 Thing 的命令语法:
arduino-cloud-cli device delete --id <deviceID>
根据命令语法,我们需要一个 Thing ID 用于删除。你可以通过使用 thing list 命令来获取 Thing ID:
arduino-cloud-cli thing delete -i eee6e2ff-7e88-4240-9671-1b79736618ea
在设备成功删除后,你将不会看到错误消息;否则,你将在屏幕上得到一个 401 错误消息。

图 13.14 – Thing 删除命令
图 13.14 展示了 Thing 删除的完整命令,屏幕上没有错误,这意味着 Thing 已成功删除。在本小节中,我们讨论了 delete 命令,在接下来的小节中,我们将探讨如何将设备与 Thing 关联。
将设备与 Thing 关联
在前面的 Thing 小节中,我们提取了 Thing 模板,从该模板创建了 Thing,并也执行了 Thing 克隆操作。然而,在整个过程中,我们没有将设备与 Thing 关联,没有设备,Thing 只是一个空 JAR 文件,无法执行任何操作。
在本小节中,我们将探讨如何通过使用设备 ID 和 Thing ID 来将设备与 Thing 相关联。有关将设备与 Thing 关联的文档可在 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#bind-thing-to-device 查找。以下是在 Arduino IoT Cloud 中将设备与 Thing 关联的简单命令语法:
arduino-cloud-cli thing bind --id <thingID> --device-id <deviceID>
这里,你可以使用 arduino-cloud-cli device list 命令获取特定的设备 ID,以及使用 arduino-cloud-cli thing list 获取 Thing ID:
arduino-cloud-cli thing bind -i 131f2498-2067-468c-bd68-2f52a0233de5 -d cda148e4-b011-459a-95fd-a7510c9601c2
在前面的命令中,我们通过 -i 参数分配了一个 Thing ID,并通过 -d 参数分配了一个设备 ID。执行前面的命令,你将看到 图 13.15 中所示的输出。

图 13.15 – 使用 Thing 进行设备绑定
图 13.15 展示了一个设备成功与 Thing 绑定的情况。为了确认,我们使用了带有 -i 参数的 thing list 命令来验证设备 ID。在命令以及 thing list 输出中,设备 ID 是相同的。
在本小节中,我们探讨了如何将/关联设备与 Thing。在下一小节中,我们将讨论如何为 Thing 分配和移除标签。
标记和取消标记 Thing
在本节中,我们将探讨如何使用 Thing ID 来标记和取消标记 Thing。有关标记 Thing 的文档可在 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#tag-a-thing 查找,而对于取消标记 Thing,文档可在 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#untag-a-thing 查找。以下是为 Thing 标记的命令语法:
arduino-cloud-cli thing create-tags --id <thingID> --tags <key0>=<value0>,<key1>=<value1>
以下是不标记 Thing 的命令语法:
arduino-cloud-cli thing delete-tags --id <thingID> --keys <key0>,<key1>
你可能会质疑给一个事物分配标签的必要性。考虑以下场景。你有一个适用于仓库监控的多功能产品,并且已经在多个组织和这些组织内的不同房间中部署了该产品。当尝试将组织的名称和位置直接输入到设备名称字段时,会遇到挑战,这可能会相当繁琐。在这种情况下,通过使用标签,可以提供一个更有效的解决方案。标签可以无限制地应用,就像我们之前为设备建立标签时一样。每个标签由两个部分组成:一个键和一个相应的值。
因此,在以下示例中,我们将附加两个标签——一个用于组织名称,另一个用于位置。使用thing list命令选择事物 ID 来附加标签。以下是将标签附加到事物的命令:
arduino-cloud-cli thing create-tags -i 131f2498-2067-468c-bd68-2f52a0233de5 --tags Org=ASNAGroup,Location=MainUnit
执行前面的命令后,你可以使用thing list命令来验证标签,如图图 13.16所示。

图 13.16 – 为事物分配标签
图 13.16显示了用于为事物分配标签的完整命令,并且它还清楚地显示了用于验证标签的thing list命令。
现在,我们来探讨如何从事物中移除标签。之前,我们看到了从事物中取消标签的语法。以下是将位置标签从特定事物中移除的完整命令:
arduino-cloud-cli thing delete-tags -i 131f2498-2067-468c-bd68-2f52a0233de5 -k Location
执行前面的命令后,你可以使用thing list命令来验证标签,如图图 13.16所示。

图 13.17 – 从事物中删除标签
图 13.17显示了用于从事物中删除标签的完整命令,并且它还清楚地显示了用于验证标签的thing list命令。
在这里,命令略有不同,因为我们使用了delete-tags和-k来指定标签键。如果你想删除多个标签,那么使用逗号来分隔键。在下一节中,我们将探讨如何使用 Arduino Cloud CLI 与仪表板一起工作。
构建仪表板 – 通过命令行释放潜力
仪表板是 Arduino IoT Cloud 中与数据可视化最重要的组成部分。在 Arduino Cloud CLI 中,我们有针对仪表板的特定命令来执行操作,例如从现有仪表板中提取模板、查看仪表板列表、删除仪表板以及从提取的模板中创建仪表板。首先,我们将从仪表板模板提取开始。
从仪表板中提取模板
在 Arduino Cloud CLI 中,我们处理命令并提供不同的参数以执行各种操作。因此,通过命令行创建新的仪表盘是困难的,因为它会使指导 Arduino IoT Cloud 关于小部件以及通过命令将这些小部件与云变量关联变得更加复杂。
为了解决这个问题,Arduino 团队引入了从仪表盘中提取模板的概念。例如,如果您想部署数百个环境监测节点,通过 Arduino 图形用户界面创建数百个仪表盘是困难的。创建包含有关仪表盘所有信息的长命令也很困难。因此,Arduino 引入了模板提取技术。首先,我们将通过 Arduino 图形用户界面创建仪表盘,然后我们将通过命令行提取其模板。然后,使用模板,我们将在 Arduino IoT Cloud 中通过命令行创建仪表盘,因为 Arduino Cloud CLI 不允许您从头创建仪表盘。仪表盘模板提取的官方文档可在 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#extract-dashboard-template 查找。
下面的示例显示了模板提取的命令语法。使用此命令,我们需要提供一个仪表盘 ID,该命令将获取仪表盘的模板。然后,我们需要提供模板文件的格式 – 要么是 JSON,要么是 YAML:
arduino-cloud-cli dashboard extract --id <dashboardID> --format <json|yaml>
对于仪表盘 ID,您可以访问 Arduino IoT Cloud 以找到它,或者参考即将到来的小节,我们将向您展示如何列出仪表盘,这将提供它们的名称、ID 等信息。现在,我们将指定格式;我们希望模板输出为 JSON 格式,所以我在这里使用了 JSON:
arduino-cloud-cli dashboard extract -i f00aaaab-7faa-4ba6-bdd7-814377f296ba --format json
执行命令后,我们将在屏幕上以 JSON 格式获得模板输出,如图 图 13**.18 所示。

图 13.18 – 提取仪表盘模板
图 13**.18 展示了屏幕上的部分输出。我们有一个 JSON 格式的仪表盘模板,它显示了有关小部件及其配置的所有信息,包括 thing_id 和 variable_id。复制 JSON 格式的输出并将其保存到文件中,该文件将在下一节中用于仪表盘创建。
重要提示
在 Arduino Cloud CLI 中提取仪表盘时存在一个错误,因为它在 thing_id 值中显示的是事物名称而不是事物 ID。因此,您需要用事物 ID 替换文本;否则,在执行仪表盘创建命令时将发生错误。
在本小节中,我们探讨了如何从现有仪表盘中提取模板。在下一小节中,我们将探讨如何列出仪表盘。
列出仪表盘
在本节中,我们将列出所有仪表板。有关列出仪表板的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#list-dashboards找到。以下是一个列出所有仪表板的非常简单的命令:
arduino-cloud-cli dashboard list
执行上述命令后,我们将看到仪表板的完整列表,如图下所示。

图 13.19 – 仪表板列表命令
在图 13.19所示的输出中,我们可以看到仪表板的名称、ID和更新时间详情。在这里,ID非常重要,因为它将在以下命令中用于删除仪表板。它还有助于仪表板模板提取,因为我们使用仪表板 ID 在上一个小节中提取了模板。
在本小节中,我们探讨了如何使用一个非常简单的命令列出仪表板。在下一小节中,我们将探讨如何使用仪表板 ID 删除仪表板。
删除仪表板
在本小节中,我们将探讨如何使用仪表板 ID 删除仪表板。有关删除仪表板的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#delete-dashboards找到。以下为删除仪表板的命令语法:
arduino-cloud-cli dashboard delete --id <dashboardID>
根据上述命令语法,我们需要提供一个仪表板 ID 进行删除。您可以通过使用dashboard list命令来获取仪表板 ID:
arduino-cloud-cli dashboard delete -i 5e658ff8-2519-4d00-b556-41bad8b15571
在成功删除设备后,您将不会看到错误消息;否则,您将在屏幕上收到一个401 错误消息。

图 13.20 – 仪表板删除命令
图 13.20显示了删除仪表板的完整命令,屏幕上没有错误,这意味着仪表板已成功删除。在本小节中,我们讨论了delete命令。在下一小节中,我们将探讨如何使用模板创建仪表板,该模板我们在本节的第一小节中提取。
创建仪表板
在提取仪表板模板后,我们可以开始创建仪表板。有关创建仪表板的文档可在docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#create-dashboard找到。以下为创建仪表板命令的语法,该命令接受两个参数。首先,它接受仪表板的名称,其次,它接受用于创建仪表板的模板文件名,该文件名包含我们在上一节中保存的 JSON 格式的仪表板模板:
arduino-cloud-cli dashboard create --name <dashboardName> --template <template.(json|yaml)> --override <thing-0>=<actualThingID>,<thing-1>=<otherActualThingID>
在这里,我提供了设备名称 EnvSense101,并在上一节中,我将 JSON 模板保存为名为 EnvSenseTemplate.json 的文件。然后,我们使用 -n 参数提供名称,并使用 -t 参数提供模板文件:
arduino-cloud-cli dashboard create -n EnvSensedashboard101 -t EnvSensedashboard.json
执行前面的命令后,您将获得以下输出以成功创建仪表板 (图 13.21*):

图 13.21 – 使用 arduino-cloud-cli 创建仪表板
图 13.21* 显示了 Arduino Cloud CLI 成功创建仪表板的命令和输出。创建仪表板后,终端显示了仪表板的 名称、ID、更新时间和 小部件详细信息。
重要提示
Arduino Cloud CLI 在仪表板提取中存在一个错误,因为它在 thing_id 值中显示的是设备名称而不是设备 ID。因此,您需要将文本替换为设备 ID;否则,在创建仪表板命令执行过程中将发生错误。
在本小节中,我们使用命令行在 Arduino IoT Cloud 中创建了一个仪表板。在下一节中,我们将探讨如何通过 CLI 进行 OTA 更新。
OTA 管理
在 第十一章 中,我们探讨了 OTA 是什么以及我们如何轻松使用此功能向远程设备发送更新。在第十一章中,我们使用了图形用户界面,这对于单个设备来说是一个不错的选择。然而,当我们有大量设备需要发送 OTA 时,情况就变得复杂了,因为我们需要逐个处理不同的设备来发送 OTA 更新,这非常耗时,在企业层面也是一个困难的操作。
正因如此,Arduino 团队为 Arduino Cloud CLI 创建了命令,以自动向单个或多个设备发送 OTA 更新,以最大限度地减少复杂性和操作时间。因此,首先,我们将探讨如何使用 Arduino IDE 导出编译后的二进制文件,然后我们将使用设备的 ID 向其发送 OTA 更新。有关官方文档和更新,请访问 docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#ota-over-the-air。
使用 Arduino IDE 导出二进制文件
在本节中,我们将使用 Arduino IDE 生成程序的编译后的二进制文件,用于设备的 OTA。首先,从 Arduino IoT Cloud 下载您的设备代码。然后,提取下载的代码并在 Arduino IDE 中打开它。在 Arduino IDE 中选择开发板,然后点击 草图 | 导出编译后的二进制文件,如图 图 13.22* 所示。

图 13.22 – 在 Arduino IDE 中导出编译后的二进制文件
在您的 sketch 目录下的 build 目录中点击,您会找到由 Arduino 编译器生成的许多文件。您需要选择以 ino.bin 扩展名结尾的文件,如图 图 13.23 所示。

图 13.23 – 草图构建文件
在本节中,我们探讨了如何使用 Arduino IDE 生成草图的构建文件。在下一个小节中,我们将通过命令行将这个构建文件发送到设备进行 OTA 上传。
将草图上传到设备
Arduino Cloud CLI 提供了一个单独的上传选项以及一个大规模部署选项。这是官方文档链接:docs.arduino.cc/arduino-cloud/getting-started/arduino-cloud-cli#upload。您可以访问页面获取最新更新和新闻。首先,我们将探讨如何向单个设备发送更新。以下是一个单设备 OTA 操作的简单命令语法:
arduino-cloud-cli ota upload --device-id <deviceID> --file <sketch-file.ino.bin>
在这里,我们需要指定设备 ID 和文件名,包括其路径,这可以通过以下命令完成:
arduino-cloud-cli ota upload -d cda148e4-b011-459a-95fd-a7510c9601c2 --file EnvSense101_sep15a.ino.bin
命令成功执行后,您将看到一个没有错误且为空的终端,如图 图 13.24 所示。然而,如果设备不可用或出现任何其他问题,则详细信息将打印在终端上。

图 13.24 – OTA 上传命令执行成功
图 13.24 显示我们的上传已经成功完成,没有任何错误。上传文件需要一些时间,取决于您的网络速度以及您的草图大小,但您需要等待直到最终输出。永远不要中断上传过程。
然后,在 OTA 中我们有大规模部署选项,您可以通过使用 FQBN 以及标签来上传固件到多个设备。以下是一个使用 FQBN 的大规模部署简单命令,您也可以分配特定的设备 ID:
arduino-cloud-cli ota mass-upload --fqbn <deviceFQBN> --device-ids <deviceIDs> --file <sketch-file.ino.bin>
然而,使用这个特定的命令,我将只使用 fqbn 将更新发送到所有相同的设备类型:
arduino-cloud-cli ota mass-upload -b arduino:samd:mkrwifi1010 --file EnvSense101_sep15a.ino.bin
您还可以通过添加标签来探索 OTA 大规模上传,以将更新发送到特定的设备组。在本节中,我们探讨了如何使用 Arduino IDE 构建草图的二进制文件,以及如何使用 OTA 命令上传更新。
接下来是什么?
在玩了一些命令之后,现在是时候进行更多实验,以便您可以将所学知识应用到新的场景中,并学习新知识。我们探讨了 Arduino 云 CLI 上可用的完整命令列表。然而,您可以查看 Arduino 的官方网站以获取最新更新和新闻,保持对最新功能的了解。现在,轮到您使用 Arduino 云 CLI 创建批处理脚本来自动化您的操作了,例如在 Arduino 物联网云中批量添加设备,使用模板批量创建事物,将设备与事物绑定,以及从仪表盘模板为每个事物创建仪表盘。
摘要
在这一章中,我们涵盖了在 Arduino 云 CLI 上官方提供的所有命令类型。首先,我们探讨了与设备相关的命令,包括设备创建、列出设备、删除、标记和取消标记。然后,我们探讨了如何与事物一起工作;在该部分,我们从模板提取开始,然后使用模板创建了一个事物。我们还探讨了如何克隆一个事物,如何将设备与事物绑定,等等。在倒数第二个部分,我们玩了一些仪表盘命令,在最后一部分,我们探讨了如何通过命令行以不同方式发送更新到设备,从而利用 OTA 命令为我们带来好处。
这一章特别设计为面向希望使用 Arduino 云 CLI 来优化日常任务的后端开发人员和管理员,通过使用终端命令而不是图形用户界面。这一章将帮助他们使用 CLI 与 Arduino 物联网云进行交互。它还将帮助他们创建自定义脚本,自动化他们的日常任务。
以下章节是本书的最后一章,在这一章中,我们将探讨针对教育和企业组织的不同 Arduino 物联网云计划。我们还将探讨工业物联网硬件设备和针对企业组织特别提供的不同类型的 Arduino 物联网云服务。这一章将为您提供一个全面概述,说明如何将您的产品从小规模扩展到企业级。
第十四章:在 Arduino 物联网云中继续前进
Arduino 物联网云提供各种计划,每个计划都启用了不同级别的不同功能。在本章中,你将了解撰写时提供的不同选项,包括企业计划,以及它们提供的附加功能描述。
然后,你将被邀请通过实施和扩展具有更多功能的示例来实践之前章节中学到的内容。Arduino 物联网云是一个实时产品,始终在发展,本章将列出官方 Arduino 信息来源,让你能够监控任何更新和未来发布。
你还将了解专门为工业物联网解决方案设计的 Arduino PRO 硬件和软件工具。这些信息将帮助你为你的行业设计和构建专业解决方案。
在本章中,我们将涵盖以下主要主题:
-
Arduino 物联网云计划
-
Arduino PRO
-
更多资源和见解
Arduino 物联网云计划
Arduino 物联网云为不同类型的实体提供不同的计划,每个实体都为用户提供了不同类型的定价计划。在 Arduino 物联网云中,主要有三种实体,包括个人、学校和机构,如图 14.1 所示。

图 14.1 – Arduino 物联网云计划的不同类别
Arduino 物联网云团队根据不同的类别和用户划分了定价计划,价格因类别而异。在这些类别中也有不同的定价计划。有关更新后的定价计划和功能,请访问cloud.arduino.cc/plans/。
我们将在以下子节中逐步讨论所有类别,并在单独的章节中讨论商业计划。首先,我们将在下一子节中查看个人计划。
个人计划
首先,我们将从个人定价计划开始。这个类别专门为学习者、专业人士、创客、爱好者或任何希望作为个人实体学习或使用 Arduino 物联网云的人设计。对于他们,Arduino 物联网云有四个不同的计划,包括免费版、入门版、创客版和创客增强版。所有计划根据其功能有不同的定价,除了免费版,它对所有人免费提供,没有任何成本。
现在,我们将通过比较它们的限制、功能和成本,来讨论每个计划如何与其他计划不同,并在表 4.1 中列出。我们不会在这里比较所有功能,因为完整的详细信息可在 Arduino 物联网云计划页面上找到。在这里,我们只讨论重要功能。
| 功能 | 免费版 | 入门版 | 创客版 | 创客增强版 |
|---|---|---|---|---|
| 设备数量 | 2 | 10 | 25 | 100 |
| 数据保留 | 1 天 | 15 天 | 90 天 | 1 年 |
| 云触发器 | 不可用 | 不可用 | 每天 100 通知 | 每天 400 通知 |
| 云变量 | 5 | 10 | 无限制 | |
| API | 不可用 | 每秒 1 请求 | 每秒 10 请求 | |
| 可分享仪表板 | 不可用 | 不可用 | 可用 | |
| OTA | 不可用 | 可用 | ||
| 每年价格 | 免费 | 美元 23.88 | 美元 71.88 | 美元 239.98 |
| 每月价格 | 免费 | 不可用 | 美元 6.99 | 美元 23.99 |
表 14.1 – 个人计划功能比较
在 表 14.1 中,我们比较了不同计划的一些重要功能。首先,我们将探讨 免费计划,它只允许您创建两个设备。提供一天的数据保留,并且您可以为您的事物创建最多五个云变量。然而,云触发器、API 访问、可分享仪表板和(OTA)功能不可用。免费计划从学习角度来看是好的,您甚至可以托管多达两个个人物联网设备。
然后,我们有 入门计划,如果学生和爱好者想要在小规模上扩展他们的物联网设备,这个计划是完美的。此计划每年将花费他们 23.88 美元,并且仅提供年度计费,不提供月度计费。在这个计划中,您将获得 10 个设备,并保留 15 天的数据,每个设备最多有 10 个云变量。用户还将获得 API 和 OTA 功能的好处,但云触发器和可分享仪表板功能仍然不可用。
maker 计划 是这个类别中的第三个计划,适合那些设计和开发物联网解决方案并希望尝试 Arduino IoT Cloud 所有功能的用户。它每年花费 71.88 美元,并且可以按月支付。使用此计划,用户可以创建 25 个设备,并允许 90 天的数据保留(这对于数据记录来说是一个非常不错的选择)。此外,用户每天可以设置 100 个通知的云触发器,并且每秒允许 10 个 API 请求。
最后,我们有 maker plus 计划,这是物联网自由职业者或小型物联网初创企业的完美选择。在这个计划中,用户可以托管最多 100 个设备,并保留一年的数据,这对于专业的小规模部署来说是一个完美的组合,他们只需每年支付 239.98 美元或每月支付 23.99 美元。您可以在 表 4.1 或官方网站上查看 Maker Plus 计划的所有功能以及上述计划。
机器学习工具 对所有计划都是可用的,因此任何人都可以享受这一功能的益处,并将机器学习集成到他们的物联网解决方案中,使它们更加先进。这提供了在云端的强大机器学习功能,而无需任何麻烦。
让我们探讨一下针对自由职业者和小型物联网初创企业的 maker plus 计划的成本。此计划每年费用为 239.98 美元,允许您托管多达 100 个物联网设备。如果我们计算每个设备的成本,那么一年的成本大约为每个设备 2.40 美元,价格非常合理,而且基础设施和安全维护没有额外费用,因为这些需求都由 Arduino 物联网云平台团队管理。
在本小节中,我们详细讨论了适用于个人的不同 Arduino 云计划。在下一小节中,我们将探讨教育机构的计划。
学校计划
每个组织,例如谷歌、微软和亚马逊 AWS,都为教育机构提供特殊的定价计划,以帮助他们增长学生的知识和技能,根据最新的行业趋势进行准备。Arduino 物联网云平台也为学校、学院和大学提供特殊的定价计划。
除了特殊的定价计划外,Arduino 物联网云平台还为学生们提供免费计划,类似于个人免费计划。因此,我们不会讨论这一点,而是专注于定制化的学校计划。在学校计划类别中,价格根据学生人数而变化,但所有用户可用的功能都保持不变。表 14.2提供了根据学生人数的详细定价计划。有关学校的最新定价信息,请访问cloud.arduino.cc/plans。
| 学生人数 | 每位成员/每年的定价 |
|---|---|
| 5 至 50 名成员 | 每年每位成员 20 美元 |
| 51 至 100 名成员 | 每年每位成员 18 美元 |
| 101 名及以上成员 | 每年每位成员 15 美元 |
表 14.2 – 根据学生人数的学校定价计划
表 14.2说明了根据学生人数和每位成员的定价。让我们探讨一下他们为每位学校成员提供哪些功能。在学校计划中,每位成员可以创建多达 5 个设备,拥有无限的云变量和六个月的数据保留,这对于博士和硕士研究生来说非常好,因为他们可能需要从物联网设备收集数据以进行进一步的研究和实验,或者正在构建原型来解决现实世界的问题。此外,该计划每天提供 10 次云触发通知和每秒 10 次 API 请求。
Arduino 物联网云平台的学校计划也可以原生集成 Google Classroom 用户。这使得教师们可以通过 Google Classroom 轻松管理他们的学生、作业以及 Arduino 物联网云平台中的许多其他内容。Arduino 物联网云平台还提供符合通用数据保护条例(GDPR)的集中式计费和用户管理。
学生可以通过GitHub Education获得另一个优惠——学生开发者包。学生可以访问官方 GitHub 页面获取更多更新和新闻:education.github.com/pack#offers。根据 Arduino 和 GitHub 之间的当前协议,Arduino 提供为期六个月的 Arduino IoT Cloud 制造商计划免费服务,以及精选开发板的折扣。
在本小节中,我们深入探讨了教育定价计划和每个学生的特点。在下一节中,我们将详细探讨企业基础计划,该计划可以帮助您通过企业级功能扩展您的产品。
企业基础计划
在本节中,我们将首先探讨企业基础计划的基本功能,然后在不同的子节中,我们将探讨仅在企业计划中可用的专用功能,这些功能允许组织执行批量操作,如车队和设备管理。
企业基础计划专门为那些对将 Arduino IoT Cloud 作为解决方案部署和管理的主要基础设施感兴趣的组织设计。就定价和设备而言,该计划从 50 个设备的 42 美元起价,以 50 的倍数增加,最高可达 500 个。如果您有超过 500 个设备,则需要直接联系 Arduino 支持团队以获取定制定价计划。50 个设备的年费为 500 美元,每个设备每年 10 美元,每月大约 0.83 美元。这个每台设备的成本非常低廉,因为您不需要支付任何基础设施或开发费用、安全成本等。此计划还为您提供高级管理控制,这将使您的管理和操作比其他计划更容易。
企业计划中的数据保留期限为所有设备一年,每个设备都允许通过云触发器发送 20 条通知,以及每秒 10 次API请求。除了所有这些功能外,组织将通过票务系统获得技术支持,这在其他计划中不可用。
在本小节中,我们讨论了企业基础计划的基本功能。现在,我们将探讨在接下来的子节中基于角色的访问控制和车队管理。
基于角色的访问控制和车队管理
在企业层面,一个组织中通常有几位员工负责管理和执行不同的操作。组织根据员工的责任分配不同的访问级别是强制性的。为此,Arduino IoT Cloud 为组织提供了一个基于角色的访问控制系统,使他们能够轻松地为员工分配访问权限并根据其工作描述进行管理。
基于角色的访问控制确保了您的设备的安全性和安全性,并保护它们免受人为错误和错误的影响。借助基于角色的访问控制,您可以在项目协作中共享访问权限,并根据他们的管理责任将设备访问权限分配给不同级别的成员。
Arduino IoT Cloud 企业基础计划的另一个功能是编队管理。Arduino IoT Cloud 引入了此功能,以有效地轻松管理大量设备。编队管理包括设备过滤和分组功能、批量 OTA 更新、层次结构以及许多其他功能。
在本小节中,我们讨论了基于角色的访问控制和设备编队管理。在接下来的小节中,我们将探讨机器学习工具和 Portenta X8 Manager。
机器学习工具和 Portenta X8 Manager
随着人工智能和机器学习的快速发展,物联网解决方案将机器学习集成到其解决方案中已成为至关重要的需求,以便客户能够从其提高运营效率的能力中受益,例如预测性维护、异常检测和质量控制。
Arduino 团队与 Edge Impulse 合作,在 Arduino IoT Cloud 中提供机器学习集成。在 Edge Impulse 中,您可以通过将数据导入 Edge Impulse 或直接连接设备(如 Arduino Nano 33 BLE Sense、Arduino Nicla Vision、Arduino Portenta H7 或任何支持 Linux 的设备)来使用设备数据训练模型。此功能帮助开发人员和解决方案提供商使用图形用户界面和少量代码来训练模型。
然后,您可以使用 TinyML 将这些模型部署到 Arduino 支持的开发板上。有关详细信息,请访问cloud.arduino.cc/machine-learning-tools/。在企业基础计划中,Arduino 每月收取 500 美元的机器学习服务费,包括每个任务 60 分钟,每月总计 1,000 分钟。
Portenta X8 Manager 是一个与 Arduino IoT Cloud 集成的专用扩展,旨在赋予用户保护和管理其 Portenta X8 Linux 发行版的能力。它提供了诸如安全维护、容器化应用程序部署和安全的OTA差异更新等基本功能。
Portenta X8 Manager 是为需要安全可靠地部署和管理大量 Portenta X8 设备的企业和组织设计的。它提供了一系列使其非常适合企业使用的功能,包括以下内容:
-
安全 OTA 更新:Portenta X8 Manager 使用安全的 OTA 更新过程确保设备始终使用最新的固件和安全补丁。
-
容器化应用:Portenta X8 管理器允许用户在其设备上部署和管理容器化应用。这使得部署和更新复杂应用变得容易,无需重新编程整个设备。
-
基于角色的访问控制(RBAC):Portenta X8 管理器支持 RBAC,以便组织可以控制谁有权访问他们的设备和应用程序。
-
审计日志: Portenta X8 管理器提供审计日志功能,以便组织能够跟踪其设备和应用程序上的所有活动。
Portenta X8 管理器作为 Arduino IoT Cloud 企业基础计划的付费附加组件提供,该计划每月费用为 250 美元。更多详情,请参阅 企业基础计划 选项卡,该选项卡位于 商业 选项卡下的 Arduino IoT Cloud 计划页面中。
在本小节中,我们深入探讨了机器学习和 Arduino IoT Cloud 企业基础计划的 Portenta X8 管理器附加组件。在下一节中,我们将详细介绍 Arduino PRO 硬件和软件工具。
Arduino PRO
Arduino PRO 是一个独立的产品线,包含硬件和软件类别中的专业工具。这些工具专门设计用于执行工业操作,例如航空、工业 4.0、医疗保健、机器人技术、智能城市和智能家庭/办公室中的操作。我们将在以下小节中逐步探索这些硬件和软件工具。
Arduino PRO 硬件
Arduino PRO 是由 Arduino LLC 提供的产品线,该公司是流行的开源 Arduino 平台背后的公司。Arduino PRO 板卡是为那些对微控制器和电子有更深入理解的用户设计的,他们寻找的是比标准 Arduino 板卡提供更多功能和能力的板卡。这些板卡通常被创客、工程师和专业人士用于各种应用。
在以下小节中,我们将仅探讨三种类型的硬件;若要获取完整列表,请访问 www.arduino.cc/pro/platform-hardware/。
Portenta 系列产品
Arduino Portenta 系列是一系列高性能的工业级板卡。这些板卡旨在能够同时执行高级代码,例如协议栈、机器学习,甚至是 MicroPython 或 JavaScript 这样的解释性语言,同时也能执行低级、实时任务。Portenta 系列在板卡的底部增加了两个 80 引脚的高密度连接器,确保了适用于广泛应用的扩展性。图 14.2 展示了 Portenta 系列的所有开发板。以下段落将逐步讨论这些板卡的详细信息。

图 14.2 – Portenta 系列开发板
在图 14.2中展示了 Arduino Portenta 系列中的一些开发板,以下列表详细介绍了这些板子:
-
Portenta X8:一块强大的工业级系统级模块(SOM),预装了 Linux 操作系统。由于其模块化容器架构,它能够运行设备无关的软件。它还提供板载 Wi-Fi/蓝牙低功耗连接,用于安全的操作系统/应用程序 OTA 更新。
-
Portenta Max Carrier:这款载板将 Portenta 模块转换为单板计算机或参考设计,从而实现高性能工业、建筑自动化和机器人应用的边缘 AI。
-
Portenta H7 Lite Connected:这款产品旨在为 AI 应用和低延迟控制解决方案提供 Portenta H7 的计算能力。通过移除高分辨率视频接口功能,它比完整的 H7 模块更具成本效益。
-
Portenta H7 Lite:一块允许您构建下一个智能项目的板子。它与 Arduino IoT Cloud 兼容,并允许您从世界任何地方连接设备、可视化数据、控制和共享您的项目。
-
Portenta Machine Control:这是一个完全集中化、低功耗的工业控制单元,能够驱动设备和机械。它可以使用 Arduino 框架或其他嵌入式开发平台进行编程。
注意,这些只是 Arduino Portenta 系列中的一小部分示例。您可以在store.arduino.cc/collections/portenta-family找到有关这些板子和其他相关产品的更多信息。
在本小节中,我们探讨了专门为工业用例设计的 Portenta 系列,它还支持包括 MicroPython 和 JavaScript 在内的不同编程语言。它还提供了并行执行并发操作的选择。在下一小节中,我们将探讨专门为语音和视觉设计的 Nicla 系列。
Nicla 系列
Arduino Nicla 系列是一系列面向工业的板子,专为低功耗 AI、机器学习和机器视觉应用设计。这些板子配备了工业级传感器,并设计为自主、电池供电的系统。图 14.3展示了 Nicla Vision,但您可以访问官方网站查看 Nicla 系列的其他变体。

图 14.3 – Nicla Vision 开发板
这里是 Arduino Nicla 系列中可用的部分板子:
-
Nicla Voice:Arduino PRO 迄今为止最小的外形尺寸板子。它可以用于升级或改造现有机器和系统。由于其长电池供电自主性,它特别适合可穿戴产品,如头盔和智能手环。
-
Nicla Vision:一个方形板,配备 2 兆像素彩色摄像头传感器和其他内置设备,用于收集各种环境数据。它适用于边缘的基于机器视觉的应用。
注意,这些只是 Arduino Nicla 系列的一些示例。您可以在 www.arduino.cc/pro/hardware-nicla-family 找到有关这些板和其他相关产品的更多信息。
在这个小节中,我们讨论了 Nicla Voice 和 Nicla Vision,这两个开发板都是专门为工业用例设计的,在这些用例中,声音和视觉是控制机器过程的强制性要求,例如物流和装卸机器人。在下一小节中,我们将讨论 Arduino 的最新产品,即 Opta PLC。
Opta PLC
Arduino Opta 是一个安全、易于使用的微 PLC,具有工业物联网功能,与 Finder 合作设计。它允许专业人士在利用开放且广为人知的 Arduino 生态系统的同时扩大自动化项目。Opta 板配备了强大的 STM32H747XI 双核 Cortex®-M7 + M4 MCU,可实现实时控制、监控和预测性维护应用。它支持安全的 OTA 固件更新,并通过其板载安全元素和 X.509 标准合规性建立从硬件到云的数据安全性。Opta 板还提供各种连接选项,如以太网、Wi-Fi 和蓝牙低功耗。图 14.4 显示了 Opta PLC;其他变体形状相同,但在通信功能上有所不同。

图 14.4 – Opta PLC
Arduino Opta 系列包括以下变体,如 图 14.4 所示(所有变体在形状上相同,但在连接性上不同,因此这里我只添加了一张图片):
-
Opta Lite:这个变体具有板载以太网和 USB-C 编程端口
-
Opta RS485:除了以太网之外,这个变体还提供 RS485 半双工连接接口
-
Opta Wi-Fi:最通用的变体,提供 Wi-Fi/蓝牙低功耗连接
要编程 Arduino Opta 板,您可以使用 Arduino PLC IDE,它支持 IEC 61131-3 标准定义的五种编程语言 – 梯形图、功能块图、结构化文本、顺序功能图和指令列表。这使得 PLC 编程变得简单,并允许您快速编写 PLC 应用程序,或将现有的应用程序移植到 Arduino Opta 或 Portenta Machine Control。
如需了解更多关于 Arduino Opta 系列及其功能的信息,请访问 www.arduino.cc/pro/hardware-arduino-opta。
在这些小节中,我们探讨了三种主要的顶级 Arduino PRO 硬件产品。在下一节中,我们将探讨 Arduino PRO 软件工具。
Arduino PRO 软件
除了其硬件工具外,Arduino 还开发了 Pro 系列软件,包括物联网云、IDE 2、Arduino CLI 应用程序、Arduino PLC IDE和语音识别引擎库。有关这些工具的完整详细信息,请访问www.arduino.cc/pro/platform-software/。
在以下子节中,我们将介绍 Arduino PLC IDE 和语音识别引擎。
Arduino PLC IDE
Arduino PLC IDE 是一个集成开发环境,允许您使用 IEC 61131-3 标准定义的五种编程语言来编程 Portenta Machine Control 和 Arduino Opta。这些语言如下:
-
梯形图
-
功能块图
-
结构化文本
-
顺序功能图
-
指令列表
Arduino PLC IDE 界面如图 14.5 所示,与 Arduino IDE 完全不同。它支持各种编程接口,如前所述,但 PLC 中著名的编程接口之一是梯形图,这是 PLC 工程师专门用于编程 PLC 的。

图 14.5 – Arduino PLC IDE
Arduino PLC IDE 提供了一个直观的用户界面(如图 14.5 所示),包括一套调试工具,包括监视窗口、带步骤执行的中断点、触发器、示波器功能和实时调试模式。它还通过快速移植解决方案扩展其功能,并允许通过集成草图编辑器将 PLC 编程与 Arduino 草图集成。这种协同作用使得这两个环境之间变量交换变得轻松,便于在软件应用程序中包含确定性循环任务和多任务处理。
Arduino PLC IDE 支持各种工业现场总线协议,包括 Modbus RTU、Modbus TCP 和 CANOpen。它提供了一套预安装的库和功能块,以及创建自定义库的选项。要使用 IEC 61131-3 编程,您需要使用 Arduino 官方商店提供的终身许可证密钥解锁硬件。
如需了解 Arduino PLC IDE 及其功能的信息,请访问官方页面www.arduino.cc/pro/software-plc-ide/。
在本节中,我们讨论了 Arduino PLC IDE,它是专门为 Arduino Opta PLC 编程而设计的。Arduino PLC 支持五种不同的编程语言。在接下来的子节中,我们将探讨语音识别引擎库。
语音识别引擎库
Arduino 语音识别引擎是一个强大的软件库,它使您能够基于语音识别开发项目。它允许您通过语音命令与机器交互,无需语音训练或互联网连接。该库由全球语音识别领域的领导者 Cyberon 开发,旨在易于使用且与多个 Arduino 板和 Arduino IDE 兼容。它支持超过 40 种语言的语音命令,无论说话者的声音、语调或口音如何。您可以为不同的用户配置多个唤醒词和序列,无需为不同用户重新训练。
语音识别引擎非常适合各种应用,例如智能建筑和家庭自动化、信息亭、自动售货机、医院中的智能病床以及紧急警报系统。它能够倾听任何人对它说话,同时忽略背景噪音。
要开始使用 Arduino 语音识别引擎,您可以访问官方 Arduino 网站:www.arduino.cc/pro/software-speech-recognition-engine/。它提供了一个功能强大的库,其中包含一个集成的 AI/ML 引擎,在基于音素建模方面表现出色。这个高级库能够在无需语音训练的情况下识别多个唤醒词和命令序列。该库与多个 Arduino 板兼容,无需额外的硬件、软件或互联网连接。
注意,还有一个名为 Nicla Voice 的 Arduino 板,这在 Arduino PRO 硬件 部分中已有讨论。该板在边缘实现了始终开启的语音和动作识别功能。它集成了来自 Syntiant 的神经决策处理器(NDP120),以运行多个 AI 算法。
在 Arduino PRO 部分及其子部分中,我们探讨了主要的 Arduino PRO 高端开发板,包括 Portenta 系列、Nicla 系列和 OPTA PLC 系列。我们还探讨了 Arduino PRO 软件,包括 Arduino PLC IDE 和语音识别引擎库。在接下来的部分,我们将介绍一些进一步的学习资源。
进一步的资源与见解
Arduino 根据最新的需求和趋势不断发展和完善其产品和服务的功能。因此,全面覆盖所有内容是有一定难度的。到目前为止,我仅仅提到了一些有用的资源,这些资源将帮助您了解最新的新闻和功能。
最好关注 Arduino 官方博客,获取其产品最新动态和更新,请访问 blog.arduino.cc/。社区总是分享并帮助用户学习,所以加入增长最快的 Arduino 社区论坛,您可以通过以下链接找到:forum.arduino.cc/。您还可以在 Arduino 项目中心分享您的项目,并从他人的项目中学习:projecthub.arduino.cc。为了与社区成员进行即时沟通,您可以加入 Discord 频道:discord.gg/jQJFwW7。
除了 Arduino 社区,您还可以成为其他全球知名创客社区的一部分,例如 Hackster.io 和 instructables.com/。在这些平台上,您将找到最新的项目以及完整的描述,这是保持自己更新的好方法。在从这些社区学习后,轮到您提交自己的 DIY 项目,以教育其他社区成员。上述两个社区还举办不同类别的比赛;尝试参加它们。
这里有一份其他 Arduino 资源列表,将帮助您进一步学习:
-
Arduino 入门 产品:
www.arduino.cc/en/Guide -
Arduino Cloud 文档:
cloud.arduino.cc/resources -
Arduino 编程语言的参考:
www.arduino.cc/reference/en/ -
Arduino IDE 文档的内置示例:
docs.arduino.cc/built-in-examples/ -
内置库及其示例文档:
docs.arduino.cc/library-examples/ -
Arduino 官方支持和知识库:
support.arduino.cc/hc/en-us -
Arduino 教育:
www.arduino.cc/education -
专业硬件:
www.arduino.cc/pro
在本节中,我们探讨了不同的在线资源,这些资源将帮助您了解最新发展,并成为在线创客社区的一员,保持自己进一步学习的热情。
摘要
在这一章中,我们探讨了个人、教育机构和企业组织的不同定价方案。所有方案都进行了深入讨论,我们还比较了方案以进一步探索差异。Arduino 物联网云根据用户需求提供不同计划的特性,具有不同的阈值。然后,我们深入探讨了 Arduino PRO 软件和硬件工具,使你能够在开发工业解决方案时做出明智的决定。最后,我们探讨了可以为你提供最新产品发展新闻和更新的进一步资源,我们还分享了用户可以通过成为会员从中受益的不同社区资源。
因此,在阅读这一章之后,你将能够确定你需要哪种定价方案来满足你的使用需求,并根据他们的需求指导你的组织或客户选择适合他们的 Arduino 云计划。你现在还了解 Arduino PRO 硬件开发板,包括 Portenta、Nicla 和 Opta 系列,以及 Arduino PRO 软件,包括 Arduino PLC IDE 和语音识别引擎。这条 Pro 线将帮助你识别和选择适用于你的专业和工业级解决方案的特定硬件和软件工具。最后,你现在知道如何通过跟踪提供的“进一步资源和见解”部分中的链接来保持自己更新。
当我们到达《Arduino 物联网云开发者指南》的结尾时,我希望这段旅程对你来说像对我一样富有启发性和回报。物联网的世界是一个充满无限可能性的领域,我们周围的事物变得更加智能、响应迅速和互联。
通过这些页面,我们探讨了物联网的基础知识,深入了解了 Arduino 物联网云的能力,并通过实际项目使我们的知识变得生动。我们拥抱了数据交换、高级脚本和提升我们生活的实用应用的力量。
记住,物联网开发是一场持续的冒险,无数的机会等待着你去发现。当你继续前进时,保持实验、创造和创新。世界需要你的想法、你的解决方案以及你对一个更智能、更互联的未来愿景。
无论你是新手还是经验丰富的开发者,我都鼓励你保持好奇心,持续学习,永不停止探索。物联网与 Arduino 的交汇处是创新蓬勃发展的地方,现在它就是你的游乐场。
感谢您与我一同踏上这段旅程。让我们为物联网和 Arduino 物联网云为我们的生活带来的无限可能性干杯。未来属于你们去创造。


浙公网安备 33010602011771号