当前位置: 首页 > news >正文

Arduino-Yun-物联网指南-全-

Arduino Yun 物联网指南(全)

原文:zh.annas-archive.org/md5/5adfde3977d9c1890a46c10dfc85e6f2

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

物联网(IoT)是科技界的一个增长话题,越来越多的使用众筹活动资助的硬件项目都包含一些连接对象。这些对象可以是连接到网络的智能手表、气象站、摄像头、能源监控设备,甚至是机器人。谷歌和三星等许多行业巨头也正在进入市场,推出连接对象和可穿戴设备。

另一方面,全世界有成千上万的人使用 Arduino 平台来创建硬件项目。由于 Arduino 非常易于使用,它不仅允许爱好者,还允许艺术家和没有技术背景的人创建令人惊叹的硬件项目。该平台始终在不断发展,提供新的解决方案,使人们能够创建越来越复杂的 DIY 项目。

Arduino 最新推出的板子之一——Arduino Yún,和谐地融合了这两个世界。这块板的发布受到了全球爱好者的欢迎,他们希望开发连接对象。确实,开发物联网应用程序一直相当复杂,需要硬件和 Web 应用程序开发方面的专业知识。然而,我们将看到为什么使用 Arduino Yún 可以使这个过程变得容易得多。

Arduino Yún 的尺寸与最常见的 Arduino 板——Arduino Uno 相同。然而,不同之处在于它配备了一个小型 Linux 机器,该机器在独立的处理器上运行,以及一个板载 Wi-Fi 芯片,这样您就可以将板子连接到您的本地 Wi-Fi 网络。

他们与 Arduino Yún 板一起做的聪明事是创建了一个 Bridge 库,允许您从板上的常规 Arduino 微控制器调用 Linux 机器的功能。这样,您可以通过与 Arduino Uno 板相同的编程方式使用 Linux 机器的强大功能。例如,您可以使用 Python 等高级语言编写整个程序,并从 Arduino 草图调用它们。

事实上,板子上还配备了板载 Wi-Fi,这改变了所有的一切。这块板是在与 Temboo 网络服务的紧密合作下开发的,该服务提供了许多库,用于将板子与 Google Docs、Gmail 和 Dropbox 等 Web 服务进行接口。

由于所有这些原因,使用 Arduino Yún 将使您能够构建连接的应用程序,而无需您是该领域的专家。利用嵌入式 Linux 机器、Wi-Fi 连接和 Temboo 库的力量,您将能够轻松地创建自己的物联网设备。为了展示 Arduino Yún 究竟可以做什么,我已经使用这块板子构建了四个令人兴奋的项目,在阅读这本书之后,您也将能够构建这些项目。

本书涵盖内容

第一章, 构建连接到云的气象站,介绍了 Arduino Yún 的物联网功能。在本章中,我们将构建一个气象测量站(测量温度、湿度和光照水平),并将数据发送到网络。该项目将通过 Temboo 将数据发送到 Google Docs 电子表格,并在电子表格中记录结果,以便图形化显示。这个项目的优点是,这些数据可以通过登录您的 Google 账户并访问电子表格从世界任何地方访问。

第二章, 创建远程能源监控和控制设备,通过创建一个开关设备(如灯泡)的项目来专注于能源管理。我们将把电流传感器接口连接到项目,以测量连接到项目的设备的能源消耗。该项目还将能够远程开关设备,我们将为您构建一个界面,让您可以从电脑和移动设备控制这个开关。

第三章, 创建自己的云连接摄像头,让我们能够通过将标准 USB 摄像头连接到 Arduino Yún 来构建我们自己的 DIY 无线安全摄像头。我们将使用这个项目执行两个令人兴奋的应用:首先,当在摄像头前方检测到运动时,我们将自动上传图片,然后我们将使摄像头从 YouTube 直播视频,这样你就可以从任何地方监控家里的情况。

第四章, Wi-Fi 控制的移动机器人,专注于机器人技术。我们将构建一个带有两个轮子和前方超声波距离传感器的 Wi-Fi 控制的移动机器人。此外,我们将利用 Arduino Yún 的强大功能,通过 Wi-Fi 轻松控制这个机器人。为此,我们将构建一个网页界面,用于控制机器人的移动,并且这个界面还将显示前方传感器的测量距离。

你需要这本书的物品

这本书的主要重点是 Arduino Yún 板;因此,当然,你需要一块 Arduino Yún 板来制作书中的所有四个项目。根据章节的不同,你还需要一些硬件组件。这些组件的详细信息在每个章节的开头给出。

你还需要在电脑上安装一些软件来使项目工作。第一个是 Arduino IDE 的最新 beta 版本(唯一可以与 Yún 一起工作的版本)。对于所有这些项目,我使用了 Arduino IDE 版本 1.5.6-r2,但所有更新的版本也应该可以工作。你可以在 arduino.cc/en/main/software#toc3 下载 Arduino IDE。

你还需要在电脑上运行一个用于某些项目的 Web 服务器。我建议使用一个集成了 Web 服务器和数据库的软件,并且为你处理所有细节。如果你使用的是 Windows,我推荐使用 EasyPHP,它可以在 www.easyphp.org/ 找到。

在 OS X 系统下,我推荐使用 MAMP,它可以在 www.mamp.info/ 找到。

对于 Linux,你可以按照 doc.ubuntu-fr.org/lamp 提供的说明来安装 Web 服务器。

确保服务器此时正在运行;我们将在本书的几个项目中使用它。

所有项目都假设你的 Arduino Yún 板已经配置并连接到你的 Wi-Fi 网络。要配置和连接 Yún 到 Wi-Fi 网络,只需遵循几个步骤。第一步是将 Arduino 板插入墙壁插座并等待片刻。

一段时间后,你应该会在电脑上的 Wi-Fi 网络列表中看到由 Yún 创建的新 Wi-Fi 网络。连接到它,打开浏览器,并输入以下命令:

arduino.local

这应该会打开由 Arduino Yún 板提供服务的页面。你将被提示输入你的 Yún 板的密码;请输入一个你容易记住的密码,因为你在尝试本书中的项目时需要多次使用它。

然后,你将被带到一个新的页面,其中包含有关你的 Yún 板的一些信息。你可以更改板子的名称(我们将在所有项目中使用它),还可以设置你的 Wi-Fi 参数。你必须设置这些参数,以便板子可以连接到你的家庭 Wi-Fi 网络。从列表中选择正确的网络,输入你的密码,然后点击 Configure & Restart

然后,Yún 将重新启动并连接到你的网络。在这个时候,你也可以重新连接你的电脑到本地 Wi-Fi 网络。一段时间后,你可以在浏览器中输入以下命令,并加上你给你的 Arduino 板起的名字:

myarduinoyun.local

你应该会再次回到相同的页面,但这次,Yún 板已经连接到你的本地 Wi-Fi 网络。如果一切正常,这意味着 Yún 板已经准备好用于本书中的所有项目。

你还需要打开 Yún 的 REST API。这个设置在 Yún 的配置页面上进行配置,你必须选择 OPEN,它靠近 REST API ACCESS。当选项被更改后,再次重启 Yún 板。

注意,您有两种方式来编程您的 Yún 板:您可以直接通过 micro USB 将其连接到您的电脑,或者通过 USB 适配器连接到墙上,然后通过 Wi-Fi 上传草图。

本书面向对象

如果您想使用 Arduino 平台构建令人兴奋的物联网应用程序,这本书就是为您准备的。如果您计划构建一些酷炫的项目来自动化您的家庭并远程监控它,您将喜欢这本书。您将学习如何测量数据、控制设备、使用 USB 摄像头远程监控您的家庭,并构建一个 Wi-Fi 控制的移动机器人。

就技能而言,本书假设您已经对 Arduino 平台(例如,使用 Arduino Uno)有一些了解,并且对电子和编程有一些基本知识。请注意,即使没有 Arduino Yún 和板上 Linux 机器的先前经验,本书也可以使用。

惯例

在本书中,您将找到多种文本样式,以区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。

文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名如下所示:“警报机制发生在名为sendTempAlert的新函数中,如果温度低于限制,则会调用此函数。”

代码块设置如下:

[default]
String data = "";
data = data + timeString + "," + String(temperature) + "," + String(humidity) + "," + String(lightLevel);

当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:

[default]
if (client) {// Process requestprocess(client);// Close connection and free resources.client.stop();
}

任何命令行输入或输出都如下所示:

# http://myarduinoyun.local/arduino/digital/8/1

新术语重要词汇以粗体显示。您在屏幕上看到的、在菜单或对话框中的单词,例如,在文本中显示如下:“只需单击interface.html,界面应该打开并调整到您的手机屏幕大小。”

注意

警告或重要注意事项以如下所示的框显示。

提示

技巧和窍门看起来像这样。

读者反馈

我们始终欢迎读者的反馈。请告诉我们您对这本书的看法——您喜欢什么或可能不喜欢什么。读者反馈对我们开发您真正能从中获得最大收益的标题非常重要。

要向我们发送一般反馈,只需发送电子邮件到<feedback@packtpub.com>,并在邮件的主题中提及书名。

如果您在某个主题上具有专业知识,并且您有兴趣撰写或为本书做出贡献,请参阅我们的作者指南www.packtpub.com/authors。

客户支持

现在您是 Packt 图书的骄傲拥有者,我们有一些事情可以帮助您从您的购买中获得最大收益。

下载示例代码

您可以从www.packtpub.com您购买的所有 Packt 书籍的账户中下载示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support,注册以直接将文件通过电子邮件发送给您。

本书四个项目的所有最新代码也可以在github.com/openhomeautomation/geeky-projects-yun找到。

下载本书的彩色图像

我们还为您提供了一个包含本书中使用的截图/图表彩色图像的 PDF 文件。这些彩色图像将帮助您更好地理解输出中的变化。您可以从以下链接下载此文件:www.packtpub.com/sites/default/files/downloads/8007OS_ColoredImages.pdf

错误清单

尽管我们已经尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在我们的书中发现错误——可能是文本或代码中的错误——如果您能向我们报告,我们将不胜感激。这样做可以节省其他读者的挫败感,并帮助我们改进本书的后续版本。如果您发现任何错误清单,请通过访问www.packtpub.com/support,选择您的书籍,点击错误提交表单链接,并输入您的错误详细信息来报告它们。一旦您的错误得到验证,您的提交将被接受,错误将被上传到我们的网站,或添加到该标题的错误清单部分。

盗版

互联网上版权材料的盗版是一个跨所有媒体的持续问题。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上遇到我们作品的任何非法副本,无论形式如何,请立即提供位置地址或网站名称,以便我们可以寻求补救措施。

如果您怀疑有盗版材料,请通过 <copyright@packtpub.com> 联系我们,并提供链接。

我们感谢您在保护我们作者和我们提供有价值内容的能力方面的帮助。

咨询

如果您在本书的任何方面遇到问题,可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决。

第一章:构建连接到云端的气象站

本章将向您介绍 Arduino Yún 微控制器板的功能。在本章中,您将学习如何创建一个简单的气象站,该气象站将使用基于 Web 的服务Temboo的功能将数据发送到云端。Temboo 并非完全免费,但您将能够使用他们的免费计划每月调用 Temboo 1000 次。您将学习如何将测量温度、湿度和光照水平的传感器连接到您的 Arduino Yún。这些传感器将首先分别进行测试,以确保您所做的硬件连接是正确的。

然后,我们将使用 Temboo Arduino 库将这些测量数据发送到云端和不同的 Web 服务,以便无论您在世界上的哪个地方都可以远程访问。Temboo 是一个基于 Web 的服务,允许您将不同的 Web 服务连接在一起,并为 Arduino Yún 提供现成的库。

例如,我们使用 Temboo 的第一件事是将您的测量数据发送到 Google Docs 电子表格中,其中它们将与测量数据一起记录。在这个电子表格中,您可以直接在您的网络浏览器中绘制这些数据,并看到存储在您的 Google Docs 账户中的数据。

然后,我们将再次使用 Temboo 根据记录的数据发送自动电子邮件。例如,您可能希望在室内温度降至某个水平以下时发送警报,这表明需要打开加热器。

最后,我们将使用 Temboo 在 Twitter 账户上定期发布数据,例如每分钟一次。通过这样做,我们可以为您的家庭创建一个专门的 Twitter 账户,家庭成员可以关注以获取有关您家庭的实时信息。

完成本章后,您将能够将您所学的内容应用到其他项目,而不仅仅是与气象相关的测量。您可以将本章中看到的内容应用到任何可以测量数据的项目中,以便在网络上记录这些数据并在 Twitter 上发布。

以下图片显示了 Arduino Yún 板:

构建连接到云端的气象站

所需的硬件和软件组件

当然,您需要在桌子上准备好您的 Arduino Yún 板和一根微型 USB 线,以便进行初始编程和测试。此外,我们建议您准备一个微型 USB 适配器电源插座,这样您可以直接从墙上为 Arduino Yún 供电,而不需要电脑在旁边。这在项目结束时将非常有用,因为您希望 Arduino Yún 板能够自主进行测量。

然后,你需要不同的传感器,这些传感器将用于感应环境数据。对于这个项目,我们将使用 DHT11 传感器来测量温度和湿度,以及一个简单的光敏电阻来测量光强度。DHT11 是一个非常便宜的数字温度和湿度传感器,广泛用于 Arduino 平台。你也可以使用 DHT22 传感器,它更精确,因为 Arduino 库对这两个传感器都是相同的。这些传感器有几个制造商,但你可以在 SparkFun 或 Adafruit 等地方轻松找到它们。对于光敏电阻,你可以使用你想要的任何品牌;只需确保它是一个根据环境光强度改变其电阻的组件。

要使 DHT11 传感器和光敏电阻工作,我们还需要一个 4.7k 欧姆电阻和一个 10k 欧姆电阻。你还需要一个至少有两排电源的小型面包板和一些公对公跳线,以便在各个组件之间进行电气连接。

在软件方面,你需要 Arduino IDE 的最新测试版,这是唯一支持 Arduino Yún 板的 IDE(我们在做这个项目时使用了版本 1.5.5)。你还需要 DHT11 传感器的 DHT 库,可以从github.com/adafruit/DHT-sensor-library下载。

要安装库,只需解压文件并将DHT文件夹提取到你的主 Arduino 文件夹中的libraries文件夹。

将传感器连接到 Arduino Yún 板

在进行任何与网络相关的操作之前,我们首先确保我们的硬件能够正常工作。我们将确保不同组件之间有正确的硬件连接,并编写一个简单的 Arduino 草图来单独测试所有这些传感器。通过这样做,我们将确保你正确地完成了所有硬件连接,如果在本书下一部分使用更复杂的 Arduino 草图时遇到问题,这将非常有帮助。

我们项目所需的硬件连接实际上非常简单。我们必须通过以下步骤连接 DHT11 传感器,然后是负责光强度测量的光敏电阻部分:

  1. 首先,我们将 Arduino Yún 板的+5V 引脚连接到面包板上的红色电源轨,并将地线引脚连接到蓝色电源轨。

  2. 然后,我们将 DHT11 传感器的 1 号引脚连接到面包板上的红色电源轨,4 号引脚连接到蓝色电源轨。同时,将传感器的 2 号引脚连接到 Arduino Yún 板的 8 号引脚。

  3. 要完成 DHT11 传感器的连接,将 4.7k 欧姆电阻夹在传感器的 1 号和 2 号引脚之间。

对于光敏电阻,首先将电阻器串联到面包板上的 10k 欧姆电阻器。这个下拉电阻器将确保在操作期间,如果没有光线,Arduino 板看到的电压将是 0V。然后,将光敏电阻的另一端连接到面包板上的红色轨道,并将电阻器的另一端连接到地。最后,将公共引脚连接到 Arduino Yún 板的模拟引脚 A0。

使用 Fritzing 软件制作的以下图像总结了硬件连接:

将传感器连接到 Arduino Yún 板

现在硬件连接完成,我们将测试传感器,而不上传任何内容到 Web。让我们看一下代码中的重要部分。

首先,我们必须按照以下方式导入 DHT11 传感器的库:

#include "DHT.h"

然后,我们需要声明几个变量来存储测量值,如下面的代码所示。这些变量被声明为浮点数,因为 DHT 传感器库返回的是浮点数。

int lightLevel;
float humidity;
float temperature;

此外,我们可以按照以下方式定义传感器引脚和传感器类型:

#define DHTPIN 8 
#define DHTTYPE DHT11

按照以下方式创建 DHT 实例:

DHT dht(DHTPIN, DHTTYPE);

现在,在代码的setup()部分,我们需要启动串行连接,如下所示:

Serial.begin(115200);

接下来,为了初始化 DHT 传感器,我们有以下代码:

dht.begin();

loop()部分,我们将执行不同的测量。首先,我们将计算温度和湿度,如下所示:

float humidity = dht.readHumidity();
float temperature = dht.readTemperature();

然后,测量光照水平,如下所示:

int lightLevel = analogRead(A0);

最后,我们将在串行监视器中打印所有数据,如下面的代码所示:

Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Light level: ");
Serial.println(lightLevel);
Serial.println("");

每 2 秒重复一次,如下所示:

delay(2000);

该部分的完整代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter1/sensors_test找到。

现在是时候测试代码并将其上传到 Arduino 板上了。然后,打开串行监视器,您应该会看到来自传感器的数据,如下面的截图所示:

将传感器连接到 Arduino Yún 板

如果您可以看到像之前截图那样的不同测量值,这意味着您已经在面包板上正确地完成了硬件连接,并且可以继续本章的下一部分。

如果不是这样,请按照本节中的说明逐个检查所有连接。请确保你没有忘记 DHT 传感器上的 4.7k 欧姆电阻器,因为没有它,这个传感器的测量值将无法工作。

提示

下载示例代码

您可以从您在www.packtpub.com的账户中下载您购买的所有 Packt 书籍的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

本书四个项目的所有最新代码也可以在 github.com/openhomeautomation/geeky-projects-yun 找到。

创建 Temboo 账户

本项目的下一步是在网络服务 Temboo 上创建和设置账户,这样您就可以使用 Temboo 提供的广泛服务将数据上传到 Google Docs,并使用他们的 Gmail 和 Twitter 库。实际上,这个账户将在本书的其余部分的其他项目中也会使用。

要这样做,第一步是简单地访问 Temboo 网站 temboo.com/

在主页上,只需输入您的电子邮件地址进行注册,然后点击 注册,如下面的截图所示:

创建 Temboo 账户

然后,您将被要求输入一些关于您账户的基本信息,例如您的账户名称,如下面的截图所示:

创建 Temboo 账户

然后,您将被提示创建您的第一个应用程序。请确保保存您账户的详细信息,例如您第一个应用程序的名称和将授予您的密钥;我们将在本书的其余部分需要它。

如果您需要再次获取这些值或创建新的应用程序,您可以通过点击以下截图所示的下方的 MANAGE 按钮,在 Temboo 网站的 我的账户 部分始终访问这些数据,就像以下截图所示:

创建 Temboo 账户

现在,我们已经准备好开始使用为 Arduino Yún 板专门制作的 Temboo 库,并将一些数据上传到云端。

将数据发送到 Google Docs 并显示

在本节中,我们将使用我们的第一个 Temboo 库(称为 Choreo)将 Arduino Yún 的测量数据上传到网络,并将数据记录到 Google Docs 电子表格中。

首先,让我们看看什么是 Choreo 以及您如何为您的 Arduino Yún 板生成代码。如果您访问主 Temboo 页面,您会看到您可以选择不同的平台和语言,例如 Arduino、JavaScript 或 Python。每个链接都将允许您选择一个 Choreo,这是一个为所选平台编写的专用库,可以与给定的网络服务(如 Google Docs)接口。

对于 Arduino 平台,Temboo 甚至提供为您生成整个代码的服务。您可以在 Temboo 网站上点击 Arduino 图标,然后点击 Arduino Yún;您将获得一个逐步界面的访问权限来生成代码。然而,由于我们想要完全控制我们的设备并编写自己的代码,我们不会在这个项目中使用此功能。

Google Docs 真的很方便,因为它是由微软流行的 Office 软件的在线(且免费)版本。主要区别在于,因为它全部都在云端,你不需要在本地存储文件或保存它们——所有操作都在线上完成。对于我们项目来说,优势在于你可以从任何网络浏览器远程访问这些文件,即使你不在你常用的电脑上。你只需要你的 Google 账户名和密码,就可以访问所有文件。

如果你还没有 Google 账户,你可以在 drive.google.com/ 在不到五分钟内创建一个。

这也将为 Gmail 服务创建一个账户,我们稍后也会使用它。请确保你有你的 Google Docs 用户名和密码,因为你很快就会需要它们。

在我们开始编写任何 Arduino 代码之前,我们需要准备一个将托管数据的 Google Docs 电子表格。只需在 Google Docs 账户的根目录下创建一个新的即可;你可以给它取任何你想要的名称(例如,Yun)。这可以通过点击 Google Docs 主页上的 创建 来完成。

在电子表格中,你需要设置将要记录的数据的列名;即,时间温度湿度光照水平。这在上面的屏幕截图中有显示:

将数据发送到 Google Docs 并显示

现在,让我们开始在 Arduino IDE 中构建 Arduino 脚本。我们首先需要导入所有必要的库,如下所示:

#include <Bridge.h>
#include <Temboo.h>
#include <Process.h>

Bridge 库是为 Arduino Yún 板引入的,负责在 Yún 的 Linux 机器和 Atmel 处理器之间建立接口,我们的 Arduino 脚本将在其中运行。有了这个库,我们可以在 Arduino 脚本中直接使用 Linux 机器的强大功能。

将使用 Process 库在 Linux 端运行一些程序,而 Temboo 文件将包含所有与你的 Temboo 账户相关的信息。请进入此文件,输入与你自己的账户相对应的信息。这在上面的代码中有所体现:

#define TEMBOO_ACCOUNT "temboo_account_name"  // Your Temboo account name 
#define TEMBOO_APP_KEY_NAME " temboo_app_name "  // Your Temboo app key name
#define TEMBOO_APP_KEY " temboo_api_key "  // Your Temboo app key

注意

注意,我们还在这段代码中包含了一个调试模式,如果你想在串行监视器上打印一些调试输出,可以将它设置为 true。然而,为了板的自主操作,我们建议你禁用此调试模式以节省 Yún 内部的内存。

在脚本中,我们接下来需要输入 Google Docs 的信息。你需要在这里输入你的 Google 用户名和密码,以及你想要记录数据的电子表格名称,如下面的代码所示:

const String GOOGLE_USERNAME = "yourUserName";
const String GOOGLE_PASSWORD = "yourPassword";
const String SPREADSHEET_TITLE = "Yun";

在脚本的 setup() 部分,我们现在通过执行以下代码行来启动 Linux 机器和 Atmel 微控制器之间的桥接:

Bridge.begin();

我们还在启动一个日期处理过程,这样我们也可以记录每次测量的数据,如下面的代码所示:

time = millis();
if (!date.running())  {date.begin("date");date.addParameter("+%D-%T");date.run();
}

日期的格式将是:日期后跟时间。我们在这里使用的日期处理方法实际上是 Linux 中一个非常常见的实用工具,你可以在网上查找这个函数的文档,了解更多关于你可以使用的不同日期和时间格式。

现在,在草图的 loop() 部分中,我们使用以下函数连续发送测量数据:

runAppendRow(lightLevel, temperature, humidity);

让我们深入了解这个函数的细节。它首先声明了我们将要使用的 Choreo(Temboo 服务):

TembooChoreo AppendRowChoreo;

前面的函数是针对 Google Docs 电子表格的特定函数,它通过在给定行上发送由逗号分隔的一组数据来工作。Temboo 连接到每个服务都有 Choreo,例如 Dropbox 和 Twitter。请参阅 Temboo 文档页面以获取有关此特定 Choreo 的详细信息。在声明 Choreo 之后,我们必须添加 Choreo 的不同参数作为输入。例如,Google 用户名,如下面的代码行所示:

AppendRowChoreo.addInput("Username", GOOGLE_USERNAME);

同样,对其他所需的参数也做了同样的处理,如下面的代码所示:

AppendRowChoreo.addInput("Password", GOOGLE_PASSWORD);
AppendRowChoreo.addInput("SpreadsheetTitle", SPREADSHEET_TITLE);

函数的重要部分是我们实际上格式化数据,以便它可以附加到电子表格中。记住,数据需要用逗号分隔,以便正确附加到电子表格的正确列中,如下面的代码所示:

String data = "";
data = data + timeString + "," + String(temperature) + "," + String(humidity) + "," + String(lightLevel);

然后使用以下代码行执行 Choreo:

unsigned int returnCode = AppendRowChoreo.run();

函数然后每 10 分钟重复一次。实际上,这些值通常在一天中缓慢变化,所以这对连续记录的数据来说是无用的。另外,记住 Temboo 的调用次数取决于你选择的计划(免费计划每月 1000 次调用,大约每小时 1 次调用)。这是使用延迟函数完成的,如下所示:

delay(600000);

为了演示目的,数据每 10 分钟记录一次。但是,你可以通过更改 delay() 函数的参数来更改这一点。这部分完整的代码可以在 github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter1/temboo_log 找到。

现在,你可以将草图上传到 Arduino Yún 板上,并打开 Google Docs 电子表格来查看发生了什么。它与 Google Docs 服务器实时同步,所以你不需要刷新任何内容。过了一会儿,你应该会看到第一组测量数据被记录下来,如下面的截图所示:

将数据发送到 Google Docs 并显示

为了展示使用这个项目可以做到什么,我们使用了 Google Docs 的集成图表功能,通过我们获得的超过 24 小时的测量数据来绘制这些数据。以下截图是原始数据的一个提取:

将数据发送到 Google Docs 并显示

现在,要实际绘制一些数据,您只需使用 Google Docs 的插入图表功能。我们为我们的数据选择了简单的折线图。以下截图显示了温度和湿度的结果:

将数据发送到 Google Docs 并显示

我们对光级测量也做了同样的处理,如下面的截图所示:

将数据发送到 Google Docs 并显示

这些图表可以自动放置到电子表格中相应的表格内,并且当然,当有新数据进来时,它们也会自动更新。您还可以使用 Google Docs 的共享功能将这些表格与任何人共享,这样他们也可以跟踪您家的测量情况。

创建自动电子邮件警报

在这部分,我们不仅将基于之前在 Google Docs 中做的操作,还会使用 Google 账户创建一些自动电子邮件警报。这次,我们将使用直接与 Gmail 接口的 Temboo 库,在这种情况下,将自动使用您的账户发送电子邮件。

我们将编程 Arduino Yún 板,当温度低于给定水平时向所选地址发送电子邮件,例如,表示您应该打开家中的暖气。

与之前的 Arduino 草图相比,我们需要添加目标电子邮件地址。我为了测试目的使用了我的电子邮件地址,但当然,这个目标地址可以与您的 Gmail 账户完全不同。例如,如果您想自动向负责您家的人发送电子邮件,如果发生某些情况,请执行以下代码行:

const String TO_EMAIL_ADDRESS = "your_email_address";

请注意,将电子邮件发送给自己可能会被您的 Gmail 账户视为垃圾邮件。因此,建议将这些警报发送到您选择的另一个电子邮件地址,例如,为这些警报设置一个专门的账户。我们还需要在草图中设置一个温度限制。在我的项目版本中,这是 Arduino Yún 将发送电子邮件警报的温度,但当然,您可以修改这个温度限制的含义,如下面的代码行所示:

int temperature_limit = 25.0;

在草图的loop()部分,与上一节的草图相比,我们可以在记录的温度与限制之间进行比较。这是通过一个简单的if语句完成的:

if (temperature < temperature_limit) {if (debug_mode == true){Serial.println("Sending alert");}sendTempAlert("Temperature is too low!");}

然后,当温度低于限制时,会触发新的功能sendTempAlert,该功能会调用。该函数还接受一个字符串作为参数,这是当警报触发时将发送的消息内容。在函数内部,我们再次声明我们将使用的 Choreo 类型。这次,我们将使用的是针对 Gmail 的特定 Choreo,用于发送带有消息主题和正文的电子邮件,如下面的代码行所示:

TembooChoreo SendEmailChoreo;

正如我们用来将数据记录到 Google Docs 的 Choreo 一样,这个新的 Choreo 需要一组在官方 Temboo 文档中定义的参数。我们需要指定 Choreo 的所有必需输入,例如,您可以个性化的电子邮件主题行,如下面的代码行所示:

SendEmailChoreo.addInput("Subject", "ALERT: Home Temperature");

消息正文定义在以下代码行中:

SendEmailChoreo.addInput("MessageBody", message);

注意,message变量是在草图中的loop()部分传递的,也可以个性化,例如,通过添加测量的温度值。最后,使用以下代码行执行 Choreo:

SendEmailChoreo.run();

这一部分的完整代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter1/temboo_alerts找到。

现在,您可以将草图编译并更新到您的 Yún 板上。您还可以访问 Gmail 界面以检查新电子邮件。如果温度确实低于您设置的极限值,您应该在收件箱中收到以下内容:

创建自动化电子邮件警报

再次,您可以玩这个草图,并根据您测量的数据创建更复杂的警报。例如,您可以将湿度和光照水平混合在一起,并为这些值创建专门的限制和警报。您还可以编程 Arduino Yún,使其在达到温度限制之前定期通过电子邮件发送数据。

使您的 Arduino Yún 板发送传感器数据推文

最后,在本项目的最后一部分,我们将使您的 Arduino Yún 板在 Twitter 上发送自己的消息。您甚至可以为您的 Yún 板创建一个新的 Twitter 账户,并告诉您认识的人关注它,这样他们就可以随时了解您家中的情况!

项目从 Twitter 网站开始,因为您必须在 Twitter 上声明一个新的应用。使用您的 Twitter 凭据登录,然后转到apps.twitter.com/

现在,点击创建新应用以开始过程,如下面的截图所示:

使您的 Arduino Yún 板发送传感器数据推文

您需要为您的应用起一个名字。例如,我们将其命名为MyYunTemboo。您需要从 Twitter 网站上获取大量信息。首先需要获取的是 API 密钥和 API 密钥。这些可以在API 密钥选项卡中找到,如下面的截图所示:

使您的 Arduino Yún 板发送传感器数据推文

确保您的应用访问级别设置为读取写入直接消息。这可能不是默认设置,在第一次测试中,我的 Arduino 板没有再响应,因为我没有正确设置这些参数。所以,请确保您的应用具有正确的访问级别。

然后,您还需要为您的应用获取一个令牌。您可以通过访问您的访问令牌部分来完成此操作。从这个部分,您需要获取访问令牌访问令牌密钥。再次确保您的令牌访问级别设置正确。

我们现在可以继续编写 Arduino 草图,以便 Arduino Yún 板可以自动发送推文。Twitter Choreo 因其占用 Yún 大量内存而闻名,因此这个草图只会发送数据而不会将数据记录到您的 Google Docs 账户中。我还建议您禁用串行端口上的任何调试消息以保留 Yún 的内存。在草图中,您首先需要定义您的 Twitter 应用信息,如下面的代码所示:

const String TWITTER_ACCESS_TOKEN = "yourAccessToken";
const String TWITTER_ACCESS_TOKEN_SECRET = " yourAccessTokenSecret";
const String TWITTER_API_KEY = " yourApiKey";
const String TWITTER_API_SECRET = " yourApiKeySecret";

然后,草图将定期使用以下函数发布关于您家的数据:

tweetAlert(lightLevel, temperature, humidity);

这个函数使用delay()函数每分钟重复一次,如下所示:

delay(60000); 

当然,这个延迟可以根据您的需求进行更改。让我们看看这个函数的详细情况。它首先声明了正确的 Choreo 来发送 Twitter 上的更新:

TembooChoreo StatusesUpdateChoreo;

然后,我们构建我们想要推文的文本作为字符串。在这种情况下,我们只是将传感器数据格式化在一个字符串中,如下面的代码所示:

String tweetText = "Temperature: " + String(temperature) + ", Humidity: " + String(humidity) + ", Light level: " + String(light);

我们之前定义的访问令牌和 API 密钥被声明为输入:

StatusesUpdateChoreo.addInput("AccessToken", TWITTER_ACCESS_TOKEN);
StatusesUpdateChoreo.addInput("AccessTokenSecret", TWITTER_ACCESS_TOKEN_SECRET);
StatusesUpdateChoreo.addInput("ConsumerKey", TWITTER_API_KEY);  
StatusesUpdateChoreo.addInput("ConsumerSecret", TWITTER_API_SECRET);

我们想要推文的文本也被简单地声明为 Twitter Choreo 的输入,使用我们之前构建的字符串变量:

StatusesUpdateChoreo.addInput("StatusUpdate", tweetText);

这一部分的完整代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter1/temboo_twitter找到。

现在 Arduino 草图已经准备好了,我们可以对其进行测试。您只需将代码上传到您的 Arduino Yún,稍等片刻。您的板子应该会自动连接到您选择的 Twitter 流,并打印出新的消息,如下面的截图所示:

制作您的 Arduino Yún 板推文传感器数据

如果您的 Twitter 账户中没有显示任何内容,您可以检查几个方面。我已经提到了内存使用;尝试禁用串行端口上的调试输出以释放一些内存。同时,请确保您已经正确输入了关于您的 Twitter 应用的详细信息;在不同的 API 密钥和访问令牌之间出错是很常见的。

对于这个项目,我使用了我的专注于家庭自动化的网站上的 Twitter 账户,但当然,您可以为项目创建一个专门的 Twitter 账户,这样许多人就可以关注您家的最新更新了!

您还可以将这部分代码与上一节的想法结合起来,例如,根据测量的数据创建自动警报并在 Twitter 上相应地发布消息。

摘要

让我们总结一下本章所学的内容。我们基于 Arduino Yún 板构建了一个简单的气象测量站,该站能自动将数据发送到云端。

首先,你学习了如何将简单的传感器连接到你的 Arduino Yún 板,并编写一个用于 Yún 板的测试草图,以确保所有这些传感器都能正常工作。

然后,我们通过使用为 Yún 板定制的 Temboo 库,将 Arduino Yún 板与 Temboo 服务进行接口连接。使用这些库,我们在 Google Docs 电子表格中记录数据,根据我们的测量结果创建自动电子邮件警报,并将这些测量结果发布到 Twitter 上。

要进一步扩展,你可以将这个项目的不同部分组合在一起,也可以在项目的不同区域添加多个 Arduino Yún 板,例如,在你家的两个不同区域。在下一章中,我们将再次利用 Temboo 库的力量,将电力测量数据发送到网络,以便远程监控你家的能源消耗。

第二章:创建一个远程能源监控与控制设备

在本书的第二项目中,我们将继续使用 Arduino Yún 的功能,通过 web 服务 Temboo 连接到网络。人们通常在家庭自动化中想要做的一件事是跟踪他们的电器能源消耗,并远程打开或关闭它们,例如,使用他们的智能手机或平板电脑。

当然,目前许多设备可以测量电源插座上的能源消耗,同时还能开关连接到该插座的设备。这些设备现在非常紧凑,易于连接到本地 Wi-Fi 网络,并且它们还可以通过蓝牙与移动设备通信。许多大型电子产品制造商已经开发了他们自己的解决方案,现在每个人都可以购买这些产品并将它们安装在自己的家中。

在这个项目中,我们将构建我们自己的 DIY 版本这样的设备,并构建一个电源开关和能源计,以便开关电器以及跟踪其能源消耗。

以下本章的主要亮点:

  • 将一个继电器连接到 Arduino Yún 的一个数字输出,并使用 Yún REST API 通过网页浏览器控制这个继电器

  • 使用模拟电流传感器从连接到继电器的设备获取即时电流消耗的测量值,并从该测量值计算即时功耗

  • 将这些数据发送到 Google Docs 电子表格,以便可以从任何网页浏览器或 Google Docs 移动应用程序远程访问,并计算连接到您的项目的设备的能源消耗和一些其他有用的数据,例如设备的总能源成本。

  • 创建一个简单的网页界面,使用您的计算机或任何智能手机或平板电脑来控制灯

所需的硬件和软件组件

本项目的第一部分是获取我们将用于我们的能源消耗计和电源开关项目的所需部件。除了将成为项目“大脑”的 Arduino Yún 板外,在构建项目时,您需要在您的桌子上准备好两个主要部件。这些部件是继电器模块,我们将用它来开关灯,以及模拟电流传感器,它用于测量功率,后来是灯的能源消耗。

继电器基本上是一种电磁开关,用于需要使用小电压(如 Arduino 板上的 5V)作为命令信号来切换大电压(110V 或 230V)的项目。对于继电器,我们使用了一个基本的 5V 继电器模块,来自 Polulu,它可以切换高达 10A,对于许多家用电器如灯具来说已经足够了。(在欧洲,使用 230V,你可以连接高达 2300W。)该模块本身只是一个安装在印刷电路板上的继电器,以及操作继电器所需的必要组件和一些大型的引脚和走线,如果需要的话,可以承载高达 10A。它使用的是 Omron G5LE-14-DC5 继电器。以下图片是所使用的继电器:

所需的硬件和软件组件

当然,你可以使用任何等效的继电器模块。只需确保它可以使用数字 5V 信号进行开关控制,就像我们在 Arduino Yún 板上所做的那样,并且它可以至少切换 5A,以确保这个项目的安全性。我们在这个项目中使用的灯只消耗大约 130 mA,但将来你可能想在项目中连接更大的设备。如果你想从继电器制作自己的模块,你只需要在继电器上串联一个二极管来保护你的 Arduino 板,当继电器切换时。

小贴士

不要尝试在面包板上单独使用继电器及其操作所需的组件。面包板上的小轨道无法支持高电流和高电压,如果你这样做,将会遇到严重的安全问题,例如这些轨道可能发生熔断,这可能导致火灾。因此,使用专门的继电器模块进行此项目。

然后,你需要一个电流传感器来获取灯的即时电流消耗。我们使用了一个来自 ITead Studio 的模块,它基本上是一个 ACS712 传感器的分线板。分线板简单来说就是一个由印刷电路板、芯片本身以及所有使芯片工作的组件(如电阻和电容器)组成的板。这个传感器输出一个模拟信号,该信号与测量的电流成正比。然后,这个信号可以很容易地转换成 Arduino Yún 板上的相应电流。我们将使用 Yún 板的一个集成模拟-数字转换器来获取这个模拟信号。请注意,还有非侵入式电流传感器,你可以简单地将其夹在你想测量的电缆周围,但这些通常更大,并且与 Arduino 项目不太兼容。以下是这个项目所使用的传感器的图片:

所需的硬件和软件组件

就像继电器模块一样,你可以为这个项目使用任何等效的电流传感器。需要考虑的重要参数是传感器能够流过的最大电流(我们使用的为 5A)和传感器的灵敏度(我们使用的为 185 mV/A)。如果这两个参数与我在这个项目中使用的传感器相似,或者更好,你可以使用该传感器。

你还需要以某种方式将灯连接到项目中。当然,一种方法就是直接切断灯的电源线,将灯直接连接到我们的项目中,但我不喜欢这个选项,因为它相当杂乱。正如我在这个项目的介绍中提到的,我不想让你以任何方式触摸你的灯或其他设备,并且如果你想的话,我希望你能将你的灯再次连接到墙上的电源插座。

我使用了两条电源线,这样我就可以将我的项目连接到墙上的插座一侧,并将灯连接到项目另一侧,就像我购买现成的商业设备一样。

以下是我用于插入灯的电源线的组件:

所需的硬件和软件组件

以下是我将用于将项目连接到墙插座的电源线:

所需的硬件和软件组件

注意,一些电源插座有三条线(额外的线用于接地连接),但因为我们将会处理如灯这样的小负载,所以第三条线对这个项目不是必需的。

在硬件方面,我也使用了一小块面包板来制作继电器和电流传感器的电源连接(因为 Arduino Yún 板只有一个 5V 引脚)。当然,你也可以使用全尺寸面包板来制作这些连接。

在软件方面,你需要 Arduino IDE 的最新 beta 版本,这是唯一支持 Arduino Yún 板的版本(我在做这个项目时使用了版本 1.5.5)。

将组件连接到 Yún 板

现在我们将连接继电器模块和电流传感器到 Arduino Yún 板,连接将点亮灯的电源线,最后将所有东西连接到墙上的电源插座。这部分比第一章中硬件连接的部分要复杂一些,因为它涉及更多的步骤,并使用更高的电压,这要求你采取一些预防措施。所以,请小心并遵循所有步骤。

第一步是将 Arduino Yún 板、继电器模块和电流传感器板放在一起,如下面的图片所示:

将组件连接到 Yún 板上

然后,我们将连接继电器模块和电流传感器的电源。正如我在本章前面所说,Arduino Yún 板只有一个 5V 引脚。这就是为什么我将两个模块的 5V 引脚首先连接到一小块面包板上,然后将这个面包板连接到 Arduino 的 5V 引脚,如图所示:

将组件连接到 Yún 板

之后,我们必须将两个模块的地线引脚连接到 Arduino Yún 板上的地线引脚,如图所示。Arduino Yún 板上有两个地线引脚,因此您不需要为此使用面包板。

将组件连接到 Yún 板

为了完成两个模块的连接,我们需要将它们的相应信号引脚连接到 Arduino 板。继电器将通过 Arduino Yún 板的 8 号引脚控制,因此将继电器模块的信号引脚连接到 Yún 板的 8 号引脚。

当前传感器具有模拟输出,因此它必须连接到 Arduino 板上的一个模拟输入,以便使用 Yún 集成的模拟-数字转换器之一来获取信号。此转换器将获取来自传感器的模拟信号并将其转换为从 0 到 1023(对应 10 位精度)的数字值。将电流传感器模块的输出引脚连接到 Arduino Yún 板的 A0 引脚,如图所示:

将组件连接到 Yún 板

这基本上就是低功耗部分的全部内容。现在,我们将专注于将项目连接到两个电源线,以便我们可以将项目插入墙壁插座并将灯泡连接到项目上。我们将首先连接将通往墙壁的电缆,如图所示:

将组件连接到 Yún 板

最后,连接我们将要连接到灯泡的雌性电源插头,如图所示:

将组件连接到 Yún 板

最后,是时候给所有设备供电了。您可以通过 USB 线将 Arduino Yún 板连接到计算机(如果您想直接上传草图并且希望计算机在项目附近)或通过墙壁电源插座连接到 USB 适配器(如果您计划通过 Wi-Fi 上传草图并让项目独立工作)。

然后,将您想要控制的灯泡或设备插入到项目的雌性电源插头中。完成连接后,将雄性电源插头连接到墙壁插座中的电源插座。在执行此步骤时请小心:确保没有电线暴露,所有螺钉端子都正确拧紧并牢固地固定着电缆,并且没有裸露的电线相互接触。

测试您的硬件连接

现在连接完成后,我们在开始将能耗数据发送到云和构建控制继电器的界面之前,将对所有内容进行测试。我们将像项目已经运行一样测试不同的模块。在整个测试期间,我们将把项目连接到墙上的电源插座和我们想要控制的灯。这样,我们就可以在进一步操作之前确保所有硬件连接都是正确的。

例如,继电器将通过 Arduino Yún REST API 通过 Wi-Fi 控制,就像在项目的最终版本中一样。基本上,我们只需从你的网络浏览器发送一个命令来直接设置连接到继电器的引脚的值。在项目的后期,我们将通过图形用户界面来调用这个命令,而不是在浏览器中实际输入命令。

对于电流传感器,我们将简单地读取 Yún 的模拟引脚 A0 上测量的值,使用 Yún 的模数转换器将其转换为可用的电流,然后根据我们已知的有效电压值(根据你所在地区可能是 110V 或 230V)计算有效电流和有效功率。

让我们先看看 Arduino 代码。它首先导入所需的库,如下所示代码所示。我们需要 Bridge 库以便可以使用 Yún 板载 Linux 机的功能,以及 YunServerYunClient 库以便我们可以使用 REST API 接收外部命令。REST API 通常只被网络开发者使用,但 Arduino 实际上提供了一个实现此类 API 的 Arduino Yún 草图的示例。这个草图可以直接在 Arduino Yún 伴随的库中访问,在这个项目中,我使用了这个参考草图的修改版本。

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

要使用 Yún 的 REST API,我们需要创建一个 YunServer 实例,如下所示代码行。这个服务器将连续运行并等待接收到的命令。

YunServer server;

我们还需要定义传感器连接到的引脚,如下所示代码行:

#define CURRENT_SENSOR A0
#define RELAY_PIN 8

草图的一个重要部分是声明有效电压的值,该值将用于稍后计算设备的有效功率,如下所示代码行。这个值取决于你所在的位置(例如,欧洲为 230,美国为 110):

float effective_voltage = 230;

setup() 部分,我们需要启动 Arduino 微控制器和 Linux 机之间的桥接,如下所示:

Bridge.begin();

我们还需要按照以下方式启动网络服务器:

server.listenOnLocalhost();
server.begin();

然后,setup() 函数的最后也是最重要的部分是对传感器进行校准,以确定当电流为零时返回哪个值。这是通过以下代码行完成的:

zero_sensor = getSensorValue();

让我们深入探讨这个函数。我们可以简单地从电流传感器获取一个测量值,但这不是一个好主意。实际上,从传感器获取的值会随时间略有变化,围绕一个我们实际上想要测量的平均值。这是使用具有重要灵敏度的模拟传感器(如我们在这里使用的传感器)时的典型行为。这就是为什么该函数基本上通过以下几行代码在多次测量中对信号进行采样和平均:

for (int i = 0; i < nb_measurements; i++) {sensorValue = analogRead(CURRENT_SENSOR);avgSensor = avgSensor + float(sensorValue);
}  
avgSensor = avgSensor/float(nb_measurements);

在这些测量之后,我们返回平均值,如下所示:

return avgSensor;

这样,我们每次都能确保获得一个稳定的传感器读数。然后,这个值在整个 sketch 中用作电流传感器读数的参考值。例如,如果测量的值等于这个参考值,我们就知道灯中的电流为零。在项目的操作过程中,实际传感器读数使用的是同一个函数,所以我们总是得到一个稳定的测量值。

现在,是 sketch 的loop()部分。它实际上由两部分组成:在第一部分中,我们将接收我们之前启动的 Yún 网络服务器上的传入连接;在第二部分中,我们将打印出来自电流传感器的测量值。

对于网络服务器部分,我们可以按如下方式监听连接:

YunClient client = server.accept();

如果检测到客户端,我们将使用以下代码处理请求:

if (client) {// Process requestprocess(client);// Close connection and free resources.client.stop();
}

我不会详细说明Process函数,因为它与我们在之前的 Arduino Yún Bridge示例中使用的相同(这可以作为示例在 Yún Bridge库中找到)。要了解更多关于 Yún REST API 的信息,您可以访问 Arduino 网站上的官方 Arduino 文档,网址为arduino.cc/en/Guide/ArduinoYun

现在,我们将编写负责电流测量的 sketch 部分。它在你获得稳定测量值时开始,就像我们之前为无电流所做的如下:

float sensor_value = getSensorValue();

我不会详细介绍这个函数,因为它与我们用来获取无电流值的函数相同。现在,我们可以对这个测量值进行一些计算。首先,我们需要将其转换为可用的电流值,如下所示:

amplitude_current=(float)(sensor_value-zero_sensor)/1024*5/185*1000000;

这是电流的幅度,它是一个正弦电流。这个公式可以在传感器的数据表中找到,也可以在 ITead Studio 网站上找到。因为我们知道关于电流的这些信息,为了获取有效电流,我们只需将其除以根号二,如下所示:

effective_value=amplitude_current/1.414;

为了获取有效功率,我们需要将这个安培电流值除以 1000,然后乘以有效电压。我还添加了一个绝对值运算符,这样功率总是正值,即使你连接电流传感器来测量负电流,如下所示:

abs(effective_value*effective_voltage/1000);

草图通过在串行监视器上打印所有这些值并每 50 毫秒重复一次来结束。这部分完整的草图可在本书的 GitHub 存储库中找到:github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter2/sensors_test

现在你可以将草图上传到 Arduino 板。请记住,在这个阶段,Arduino Yún 板应该由你的电脑或 USB 电源适配器供电,灯应该通过母电源线连接到项目中,项目本身应该插入到墙壁插座中。

继电器很容易测试;你只需要在你的网页浏览器中输入正确的命令。Yún 的 REST API 通过输入你的 Arduino Yún 板名称后跟.local(在我的情况下,我将其命名为myarduinoyun)来工作。然后,如果后面跟着arduino/,你可以直接使用命令来改变 Arduino 引脚的值。例如,要将继电器引脚的值更改为 1,你需要添加digital/8/1,如下面的截图所示:

测试你的硬件连接

上述命令意味着你正在使用 REST API 调用digitalWrite(8,HIGH)命令。你应该立即听到继电器切换并看到灯光打开。尝试再次添加命令后面的0而不是1;继电器应该再次切换并关闭灯光。不要担心,在项目的后续部分,我们将构建一个漂亮的图形界面,这样你就不必每次都编写这个命令。

现在我们将检查来自电流传感器的测量值。确保灯是关闭的,重置 Arduino 微控制器以确保草图从开始再次运行,然后打开串行监视器。为此,Arduino Yún 板必须通过 USB 线连接到你的电脑。你应该首先看到以下无电流的测量值:

Sensor value: 493.05

然后,草图会持续显示传感器读数、电流幅度、有效电流和有效功率的值。即使电流为零,也请记住,我们通过多次测量平均传感器读数,因此值可能会有轻微波动,如下面的代码所示:

Sensor value: 492.87
Current amplitude (in mA): 
4.5
Current effective value (in mA)
3.2
Effective power (in W): 
0.7

如果你使用浏览器中的 REST 调用打开灯,你应该立即看到电流和功率读数的变化如下:

Sensor value: 486.52
Current amplitude (in mA): 
-163.1
Current effective value (in mA)
-115.4
Effective power (in W): 
26.5

如果你可以看到这些值,并且你的继电器在浏览器中的 REST 调用中响应,这意味着你的硬件工作正常,你可以继续下一步。如果它不起作用,第一步是检查电流传感器和继电器模块的不同连接。还要检查你在串行监视器中是否选择了正确的串行速度,以确保它与草图定义的速度相匹配。

向 Google Docs 发送数据

第一步是为项目设置一个 Google Docs 电子表格。创建一个新的工作表,给它起个名字(我为此项目命名为 Power,但你可以按你的意愿命名),并为我们将要使用的列设置标题:时间间隔功率能量(将从前两列计算得出),如下面的截图所示:

将数据发送到 Google Docs

我们也可以使用其他测量值来计算能量的值。从理论上讲,我们知道在给定的时间内,能量是功率乘以时间;也就是说,能量 = 功率 * 时间

然而,在我们的情况下,功率是在固定间隔内计算的,我们想要估计每个间隔的能耗。从数学的角度来说,这意味着我们需要计算功率作为时间的函数的积分。

我们没有时间与功率之间的确切函数,因为我们以固定的时间间隔采样这个函数,但我们可以使用称为梯形规则的方法来估计这个积分。这意味着我们基本上通过梯形来估计函数的积分,即功率曲线下的面积。电子表格中 C2 单元的能量由以下公式给出:

能量 = (功率测量值 + 下一个功率测量值) * 时间间隔 / 2

具体来说,在 Google Docs 中,你需要公式 D2 = (B2 + B3)C2/2*。

Arduino Yún 板将提供功率测量,时间间隔由我们在草图中所设置的值给出。然而,两次测量之间的时间可能会因测量而异。这是由于网络引入的延迟造成的。为了解决这个问题,我们将传输确切的值以及功率测量值,以获得对能耗的更好估计。

然后,是时候构建我们将用于项目的草图了。这个草图的目的是基本上等待来自网络的命令,切换继电器的开或关,并且定期将数据发送到 Google Docs 电子表格以跟踪能耗。

我们将在之前构建的草图之上构建草图,所以我将解释需要添加哪些组件。首先,你需要使用以下代码行包含你的 Temboo 凭据:

#include "TembooAccount.h"

由于我们无法连续测量能耗数据(传输的数据量会很大,我们很快就会超过 Temboo 的月度访问限制!),就像在测试草图中所做的那样,我们只需要在给定的间隔内进行测量。然而,同时,我们需要持续检查是否有来自外部的命令来切换继电器的状态。这是通过首先设置正确的定时来完成的,如下面的代码所示:

int server_poll_time = 50;
int power_measurement_delay = 10000;
int power_measurement_cycles_max = power_measurement_delay/server_poll_time;

服务器轮询时间将是检查传入连接的间隔。正如你可以猜到的,功率测量延迟是测量功率的延迟。

然而,我们不能使用简单的延迟函数来完成这个任务,因为这将会使整个草图暂停。我们将要做的是计算主循环的周期数,然后使用简单的if语句在达到正确的周期数时触发测量。正确的周期数由功率测量的cycles_max变量给出。

您还需要使用以下代码行插入您的 Google Docs 凭据:

const String GOOGLE_USERNAME = "yourGoogleUsername";
const String GOOGLE_PASSWORD = "yourGooglePass";
const String SPREADSHEET_TITLE = "Power";

setup()函数中,您需要启动一个日期处理过程,以跟踪测量日期。我们希望跟踪多天的测量,因此我们将传输当天的日期和时间,如下面的代码所示:

time = millis();
if (!date.running())  {date.begin("date");date.addParameter("+%D-%T");date.run();
}

在草图的loop()函数中,我们检查是否是时候从当前传感器执行测量,如下面的代码行所示:

if (power_measurement_cycles > power_measurement_cycles_max)

如果是这样的话,我们将测量传感器值,如下所示:

float sensor_value = getSensorValue();

我们还获得了精确的测量间隔,我们将将其与测量的功率一起传输,以获得能源消耗的正确估计,如下所示:

measurements_interval = millis() - last_measurement;
last_measurement = millis();

然后,我们根据已有的数据计算有效功率。电流的幅度是从之前的传感器测量中获得的。然后,我们可以通过除以根号 2 来得到电流的有效值。最后,因为我们知道有效电压,而功率是电流乘以电压,所以我们可以计算出有效功率,如下面的代码所示:

// Convert to current
amplitude_current=(float)(sensor_value-zero_sensor)/1024*5/185*1000000;
effective_value=amplitude_current/1.414;// Calculate powerfloat effective_power = abs(effective_value * effective_voltage/1000);

然后,我们将数据以时间间隔发送到 Google Docs,并重置功率测量的计数器,如下所示:

runAppendRow(measurements_interval,effective_power);
power_measurement_cycles = 0;

将数据发送到 Google Docs 的函数几乎与我们在第一章中看到的相同,即构建一个连接到云端的气象站。让我们快速进入这个函数的细节。它首先声明我们想要使用的 Temboo 库的类型,如下所示:

TembooChoreo AppendRowChoreo;

从以下代码行开始:

AppendRowChoreo.begin();

我们需要设置与您的 Google 账户相关的数据,例如用户名,如下所示:

AppendRowChoreo.addInput("Username", GOOGLE_USERNAME);

实际的数据格式化是通过以下代码行完成的:

data = data + timeString + "," + String(interval) + "," + String(effectiveValue);

在这里,interval是两次测量之间的时间间隔,而effectiveValue是我们想要记录在 Google Docs 上的测量功率的值。然后,Choreo 将执行以下代码行:

AppendRowChoreo.run();

最后,我们在每 50 毫秒后执行此操作,并且每次都会增加功率测量计数器,如下所示:

delay(server_poll_time);
power_measurement_cycles++; 

本节完整的代码可在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter2/energy_log找到。

这一部分的代码已经完成。现在您可以上传草图,然后打开 Google Docs 电子表格,然后只需等待第一次测量到达。以下截图显示了第一次我得到的测量结果:

将数据发送到 Google Docs

几分钟后,我在我的 Google Docs 电子表格中记录了几次测量。我还通过开关灯来玩了一会儿灯的控制,以便我们实际上可以看到测量数据的变化。以下截图显示了前几次测量:

将数据发送到 Google Docs

在电子表格中记录一些数据是好的,但将数据以图表形式展示则更好。我使用了 Google Docs 内置的绘图功能,在图表上绘制了随时间的功耗,如下面的截图所示:

将数据发送到 Google Docs

使用相同类型的图表,您还可以绘制随时间计算出的能耗数据,如下面的截图所示:

将数据发送到 Google Docs

从您在 Google Docs 电子表格中获得的数据中,也可以轻松地获取其他有趣的数据。例如,您可以估计随时间的总能耗及其成本。第一步是使用 Google Docs 的集成求和功能计算能耗列的总和。

然后,您有了以焦耳为单位的能耗,但这并不是电力公司通常向您收费的单位。相反,他们使用千瓦时(kWh),这基本上是将焦耳值除以 3,600,000。我们最后需要的是每千瓦时的价格。当然,这取决于您所在的国家,但在撰写本书时,美国的电价大约是每千瓦时 0.16 美元。要得到总价格,您只需将总能耗(千瓦时)乘以每千瓦时的价格即可。

这是使用我记录的数据得到的结果。当然,由于我只取了很短的数据样本,最终成本几乎为零,如下面的截图所示:

将数据发送到 Google Docs

您还可以估计您正在测量的设备的开关时间。为此,我在“能量”旁边简单地添加了一个名为“开关”的额外列。我简单地使用了公式 =IF(C2<2;0;1)

这意味着如果功率小于 2W,我们将其视为关闭状态;否则,我们将其视为开启状态。我没有将条件设置为 0W 以将其计为关闭状态,因为电流传感器随时间的小幅波动。然后,当您有了关于不同开关状态的数据时,计算每个状态的出现次数相当简单,例如,使用 =COUNTIF(E:E,"1")

我在我的 Google Docs 电子表格中应用了这些公式,以下截图是使用我记录的样本数据得到的结果:

发送数据到 Google Docs

将这些数据以图表的形式表示也非常方便。为此,我使用了一个饼图,我认为这是最适合这种数据的图表。以下是我测量得到的截图:

发送数据到 Google Docs

使用前面提到的这种图表,你可以比较特定灯具的日间使用情况,例如,了解你是否在不在这里时忘记了开灯。

建立一个远程开关灯的界面

现在我们已经在 Google Docs 上自动记录了有关能源消耗的数据,是时候回到继电器控制上了。到目前为止,我们通过进入网页浏览器并输入正确的 REST 函数以及我们想要更改的引脚名称来测试了继电器。

然而,这并不方便。你不想每次在家想打开灯时都在网页浏览器中输入一些内容。我们真正想要的是一个非常棒的图形界面,带有可以按下以打开或关闭灯的按钮。如果这个界面可以从你的电脑上的网页浏览器访问,也可以从家中的任何智能手机或平板电脑访问,那就更好了。这正是我们现在要构建的。

为了做到这一点,我们需要几个组件,并且我们将混合使用几种编程语言来构建最佳的图形界面。我们将使用 HTML 来构建包含开关按钮的主页,使用 JavaScript 来处理按钮的动作,使用 PHP 将正确的命令发送到 Arduino 服务器。我们还将使用一些 CSS 来使界面看起来更好,并自动适应你使用的设备,例如智能手机。

首先,我们来处理 HTML 代码。我们需要导入 jQuery 库以及包含所有 JavaScript 代码的文件,如下所示:

<script src="img/jquery-2.0.3.min.js"></script>
<script src="img/script.js"></script>

还需要导入 CSS 样式文件,如下所示:

<link rel="stylesheet" type="text/css" href="style.css">

这个 HTML 文件的核心是创建两个按钮;一个按钮用于打开继电器,另一个按钮用于关闭继电器。例如,以下代码是打开按钮的代码:

<input type="button" id="on" class="commandButton" value="On" onClick="relayOn()"/>

现在,如果你直接使用这个文件,按钮的外观会很糟糕,因为一些默认样式会被应用到按钮上。这就是为什么我们附加了一个 CSS 文件,使界面看起来更好。例如,我决定将包含两个按钮的主要表单居中对齐,如下所示:

#relay {text-align: center;
}

我也给按钮本身添加了一些样式,比如橙色背景;我使它们更大,并在它们周围添加了一个漂亮的黑色边框,如下面的代码所示:

.commandButton {background-color: orange;border: 1px solid black; font-size: 40px;cursor: pointer;border-radius: 10px;width: 300px;height: 100px;
}

现在界面在您的计算机上看起来要好得多。但如果有人从智能手机打开它呢?它根本不会适应智能手机的小屏幕。为了自动使界面适应您所使用的设备,我们将使用 CSS3 中的一个属性,称为媒体查询。CSS3 的这个功能可以检测是否使用了较小的屏幕尺寸来访问页面。然后,当您拥有这些信息时,您可以使用它来相应地修改不同元素的风格,例如,我们可能希望使我们的按钮在页面上以不同的方式显示。

在我们的案例中,我们希望按钮能够占据较小屏幕上所有可用的空间。我们还想将每个按钮的高度和字体大小都加倍,以便在像智能手机这样的小屏幕上真正可读。所有这些操作都通过以下代码片段完成:

@media screen and (max-device-width: 400px) {.commandButton {width: 100%;height: 200px;border: 2px solid black; font-size: 80px;margin-bottom: 50px;text-align: center;background-color: orange;}
}

JavaScript 文件简单地建立了我们刚刚设计的 GUI 与将实际连接到 Arduino Yún 板的 PHP 文件之间的接口。例如,以下代码是某个按钮调用的代码:

function relayOn(){$.get( "update_state.php", { command: "1"} );
}

command 变量简单地包含我们想要发送到 Arduino Yún 板的继电器状态,并将设置继电器连接的引脚的值。

现在让我们看看 PHP 文件。代码的第一行从 JavaScript 获取 command 变量,构建将发送到 Yún 的命令,如下所示:

$service_url = 'http://myarduinoyun.local/arduino/digital/8/' . $_GET["command"];

为了实际发送命令,我们将使用一个名为 curl 的 PHP 函数,我们将用它来调用 Yún 的 REST API。我们首先必须用我们之前构建的 URL 初始化这个函数,如下所示:

$curl = curl_init($service_url);

最后,我们通过以下代码实际执行这个命令:

curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 
$curl_response = curl_exec($curl);
curl_close($curl);

代码第一行中的 set 选项用于简单地加快对 Arduino 板的访问速度。在测试接口之前,请确保您的计算机上的网络服务器正在运行,并且项目的所有文件都位于网络服务器文件夹的根目录下。本部分项目的完整代码可在 github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter2/web_interface 找到。

您应该在浏览器中看到界面的两个按钮,如下面的截图所示:

远程开关灯的界面

现在,您可以测试这个简单的接口。只需点击一个按钮,PHP 代码就应该在您的 Arduino Yún 板上给出正确的命令,使开关立即打开或关闭。

您还可以在智能手机或平板电脑上测试界面。我使用了我的手机来这样做。只需打开您喜欢的浏览器,访问您的电脑 IP 地址或网络名称,您应该会看到项目中的不同文件被显示出来。只需点击interface.html,界面应该会打开并调整到您手机的屏幕大小,如下面的截图所示:

远程开关灯光的界面

就像在电脑上的界面一样,您只需按下一个按钮,灯光就会立即打开或关闭。现在,您可以从家中任何地方控制这盏灯;您只需连接到您的本地 Wi-Fi 网络即可。

摘要

让我们看看在这个项目中我们学到了什么。在项目开始时,您看到了如何将这个项目的所需组件连接到 Arduino Yún 板上:一个继电器模块、一个电流传感器和一个将由 Yún 板控制的灯。

然后,我们编写了一个简单的草图来测试项目的不同组件,并确保它们都能正确工作。

然后,我们构建了项目的能耗记录部分,并在 Google Docs 电子表格中记录了功耗。我们还使用了 Google Docs 的内置功能来计算实际能耗、总能耗成本和设备的开关时间。

最后,在项目的最后一部分,我们构建了一个图形用户界面,可以从网页浏览器、您的电脑或智能手机/平板电脑控制继电器。

当然,有许多方法可以将您在这个项目中学到的知识进一步扩展。首先,您可以向项目中添加更多设备。例如,Arduino Yún 总共有六个模拟输入,所以理论上您可以将相同数量的电流传感器插入 Yún。遵循同样的原则,您也可以向项目中添加更多的 Arduino Yún 板。

您还可以使用具有更多 Temboo 功能的该项目,例如将电力测量与社会媒体集成,例如,当功耗超过给定阈值时通过 Twitter 提醒用户。然后,用户可以通过回复这条推文来关闭灯。

在下一章中,我们将使用 Arduino Yún 的其他功能,如 USB 端口和嵌入式 Linux 机器,来创建一个无线安全摄像头。这个摄像头将自动将图片上传到 Dropbox 文件夹,并在 YouTube 上实时直播视频,这样您就可以远程监控您的家。

第三章:制作自己的云连接摄像头

在这个项目中,我们将构建一个自动上传照片到网络的监控摄像头。我们将把摄像头连接到 Arduino Yún 板,并利用其强大的功能轻松控制这个摄像头并上传照片到网络。我们将构建的是一个能够检测运动的系统,如果检测到运动,可以自动拍照,并将照片保存在 Yún 板上的本地 SD 卡和云端存储中;在我们的案例中是 Dropbox。我们还将使摄像头在私人 YouTube 频道上实时直播视频。

开始

让我们更详细地看看这个项目中我们将做什么:

  • 首先,我们将使用一个典型的 USB 摄像头、一个 PIR 运动传感器和一张 SD 卡来构建项目的硬件部分。

  • 然后,我们将编写一些代码来测试项目的所有硬件连接。我们将检查运动传感器是否工作正常,并尝试在连接到 Arduino Yún 板时用摄像头拍照。

  • 在测试硬件之后,我们将构建第一个应用程序,该程序在检测到运动时捕捉照片,并自动将这些照片存储在 SD 卡上。

  • 在构建这个简单的本地应用程序之后,我们将把项目连接到云端。项目将执行与之前案例相同的功能,当检测到运动时拍照,但这次照片也将上传到你的 Dropbox 文件夹。这样,你可以从任何地方实时查看照片,因为你可以从任何网络浏览器登录到 Dropbox。

  • 最后,我们将把视频流式传输到 Web 上,这样你就可以随时随地通过手机或平板电脑检查家里的情况。为此,我们将在 Yún 板上安装一个流媒体库,并使其通过 Wi-Fi 持续流式传输视频。这个流将被你的电脑获取,并通过专用软件发送到 YouTube。在 YouTube 上,我们就可以像观看典型的 YouTube 视频一样访问这个实时流。

所需的硬件和软件组件

首先,让我们看看我们需要哪些组件来完成这个项目。除了 Yún 板之外,你还需要三个组件:一个 USB 摄像头、一个 PIR 运动传感器和一张 SD 卡。在这个部分,我们将直接连接到 Yún,所以你不需要面包板来制作电气连接。

这个项目最重要的组件是 USB 相机。我们使用的是罗技的标准 USB 网络摄像头,型号为 C700,它可以记录高达高清分辨率的图片。当然,如果你已经在你的桌子上有一个相机,你也可以使用其他相机。确保相机与USB 视频类UVC)兼容。大多数最新的网络摄像头都与此协议兼容。它可能也适用于未官方兼容 UVC 的相机,但没有保证。你可以在en.wikipedia.org/wiki/List_of_USB_video_class_devices找到所有 UVC 兼容相机的列表。

此外,尽量选择至少具有高清分辨率的相机,这样你可以获得清晰漂亮的图片。对于流媒体部分来说这并不那么重要,但如果你想将这个项目用于除了安全以外的其他应用,比如创建时间流逝视频,那就太棒了。以下是我们使用的 USB 相机的图片,罗技的 C700 USB 网络摄像头:

所需的硬件和软件组件

然后,还有 PIR 运动传感器。这个传感器是一个非常便宜的传感器,它使用红外图像来检测房间中任何散发热量的物体,例如人类。我们本可以直接使用相机来检测运动,但那样可能不太高效。当相机开启时,它消耗相当多的电力,而 PIR 运动传感器几乎不耗电。从相机记录中高效地检测运动所需的软件编写也会更困难。我们使用了一个来自 Parallax 的 PIR 运动传感器,你可以在下面的图片中看到:

所需的硬件和软件组件

再次强调,你也可以使用其他品牌的 PIR 传感器。主要考虑的是它应该能够与 5V 电压等级工作,因为 Yún 使用的就是这种电压等级。大多数传感器都适用于 3.3V 和 5V 电压等级,所以你应该不会在这个特性上遇到太多问题。当检测到运动时,它应该简单地在其信号引脚上输出逻辑高电平。

对于 SD 卡,我们使用了一个标准的 micro SD 卡。通常,你已经在你的数码相机或智能手机中有一个了。你需要正确格式化它,以便 Yún 可以使用它。我们建议你使用 SD 卡协会的官方 SD 卡格式化工具,请参阅www.sdcard.org/downloads/formatter_4/

现在,在软件方面,你需要的不仅仅是 Arduino IDE。当我们通过 SSH 连接到它时,我们将直接在 Yún 板上安装所需的相机软件。但是,你需要 Temboo Python SDK 来上传图片到 Dropbox。你可以在www.temboo.com/download找到 SDK。

然后,您还需要拥有一个 Dropbox 账户,以便您可以在上面上传图片。您只需访问 www.dropbox.com/home 即可简单地创建一个账户。

一旦您的账户创建完成,您需要创建一个将被您的项目使用的应用。这基本上意味着您必须授权您将在本章中构建的项目,以便自动将图片发送到您的 Dropbox 账户,而无需每次都输入登录名和密码。您还将获得所有所需的信息(例如 API 密钥),我们将在 Yún 上的 Python 脚本中稍后输入。

执行以下步骤以创建应用:

  1. 要创建应用,首先访问 www.dropbox.com/developers/apps

  2. 然后,点击窗口右上角的 创建应用。您现在可以选择要创建的应用类型。在我们的案例中,我们想直接使用 Dropbox API,如下面的截图所示:所需的硬件和软件组件

  3. 然后,您将被提示选择您的应用需要存储的数据类型。我们想上传图片,所以选择 文件和数据存储,如下面的截图所示:所需的硬件和软件组件

  4. 然后,您就可以完成创建 Dropbox 应用的流程。

  5. 在描述应用的确认页面上,您需要记下 应用密钥应用密钥,这些是我们将在整个项目中需要的。

  6. 此外,请确保 权限类型 字段设置为 应用文件夹。这将确保图片被上传到专门为应用设置的文件夹,并且 Yún 不会访问您的 Dropbox 文件夹的其他部分。

  7. 您现在需要获取与您的 Dropbox 应用相关的 Token 密钥和 Token 密钥,以便您可以在我们项目的软件中稍后输入它们。

    要获取这些信息,首先需要访问 Temboo 网站上的 InitializeOAuth Choreo,网址为 temboo.com/library/Library/Dropbox/OAuth/InitializeOAuth/。在这里,您需要输入应用密钥和应用密钥。这将生成一些附加信息,例如回调 ID 和临时令牌密钥。您还将被要求访问 Dropbox 的链接以确认身份验证。

  8. 最后,转到 FinalizeOAuth 页面以完成流程。您将被要求在 temboo.com/library/Library/Dropbox/OAuth/FinalizeOAuth/ 输入您的应用密钥、应用密钥、回调 ID 和临时令牌密钥。

    在此步骤之后,您将获得最终的 Token 密钥和 Token 密钥。请将它们记下来,因为您稍后需要它们。

进行硬件连接

现在是组装我们的项目的时候了。由于我们将使用 Yún 的大部分连接性,例如 USB 端口,因此组装项目将非常简单快捷。首先,只需将格式化的 micro SD 卡放入 Yún 板下方的 SD 卡读卡器中,如下面的图像所示:

制作硬件连接

然后,将 USB 摄像头插入 Yún 的 USB 端口,如下所示:

制作硬件连接

最后,您需要将 PIR 运动传感器连接到 Yún 板。它基本上有三个引脚:VCC、GND 和 SIG(信号引脚)。将 VCC 连接到 Yún 的 5V 引脚,GND 连接到 Yún 的地线,SIG 连接到 Yún 的第 8 号引脚。您应该得到一个类似于以下图像的设置:

制作硬件连接

最后,您可以通过 micro USB 线将 Yún 连接到您的计算机,或者如果您想通过 Wi-Fi 远程使用项目并上传 Arduino 草图,可以使用 USB 适配器为其供电。

测试您的硬件连接

现在所有的连接都已经完成,我们可以测试项目了。为了开始,我们将关注运动传感器。为此,我们将编写一个非常简单的草图,它将仅使用 Yún 板上的嵌入式 Atmel 微控制器。我们首先需要声明传感器连接到的引脚,如下所示:

const int sensor_pin = 8;

然后,在setup()函数中,我们将启动串行连接,如下所示:

Serial.begin(9600);
delay(1000);

我们还可以在从传感器读取数据之前设置一些延迟,因为传感器需要一些时间来初始化并正确工作。在loop()函数中,我们持续从第 8 号引脚读取值。记住,如果检测到运动,传感器将简单地返回逻辑高状态,否则返回低状态。这意味着我们可以将传感器的读数存储到布尔变量中,如下面的代码行所示:

boolean sensor_value = digitalRead(sensor_pin);

每秒钟,这个值将使用以下代码行在串行监视器上打印出来:

Serial.println(sensor_value);
delay(100);

本部分的完整代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter3/pir_test找到。

您现在可以将前面的代码上传到您的 Yún 板上。打开串行监视器,尝试将手放在传感器前;你应该会看到串行监视器上的值立即改变,如下面的截图所示:

测试您的硬件连接

如果你在传感器前移动手时看到值立即改变,这意味着 Yún 的接线是正确的。你也会注意到当检测到运动时,传感器会变红。

现在我们将测试 USB 摄像头。实际上,我们可以在不编写任何 Arduino 脚本的情况下测试摄像头。我们将要做的是通过 SSH 直接连接到 Yún 板。确实,摄像头是通过 USB 端口直接连接到 Yún 的 Linux 机器的,因此 Arduino 脚本稍后必须使用 Bridge 库来访问摄像头。

现在,只需打开一个终端窗口(通常是随操作系统 X 或 Linux 安装的典型终端,或者如果您在 Windows 下,可以安装一个类似 HyperTerminal 的终端),然后输入以下命令:

ssh root@yourYunName.local

当然,您必须将您为您的 Yún 给定的名称替换为 yourYunName。例如,我的 Yún 的名称是 myarduinoyun;因此,我需要输入 myarduinoyun.local。这将建立与 Yún 的 Linux 机器的直接连接。

然后,您将被提示输入为您的 Yún 选择密码。如果一切正常,您应该在终端上看到以下截图显示,这表明您现在正在直接在 Yún 上工作:

测试您的硬件连接

您可以从您的 Yún Linux 机器访问所有功能。我们现在将安装摄像头所需的软件。这需要将 Arduino Yún 连接到互联网,以便它能够获取所需的软件包,具体步骤如下:

  1. 此过程首先通过更新软件包管理器 opkg 来开始,如下所示:

    opkg update
  2. 按照以下步骤安装 UVC 驱动程序:

    opkg install kmod-video-uvc
  3. 安装我们将在项目中使用的 python-openssl 软件包,如下所示:

    opkg install python-openssl
  4. 最后,您可以安装我们将用于拍照的 fswebcam 软件,如下所示:

    opkg install fswebcam
  5. 一旦这部分完成并且软件已安装在 Yún 上,我们就可以测试摄像头并拍照。为了同时测试 SD 卡是否正常工作,请转到 SD 卡文件夹,通常称为 sda1,使用以下命令:

    cd /mnt/sda1
  6. 您现在可以通过输入以下命令来拍照:

    fswebcam test.png
  7. 您应该会看到一些以以下内容开始的打印消息:

    --- Opening /dev/video0...
    Trying source module v4l2...
    /dev/video0 opened. 

可能会打印出一些错误信息,但这对于拍照过程没有影响。

为了检查是否正确工作,您首先可以检查 SD 卡上是否存在名为 test.png 的文件。为此,您可以简单地输入以下命令:

ls

上述命令将打印当前文件夹(在本例中为 SD 卡)中所有文件的列表。您应该至少看到一个名为 test.png 的文件。

现在,为了检查图片是否完好且未被损坏,你可以例如,先使用unmount/dev/sda1命令卸载 Yún 上的 SD 卡,然后使用微型 SD 卡到普通 SD 卡适配器直接将其连接到你的电脑。你应该能在浏览器中看到以下截图(我们已经在这一点上添加了项目下一部分所需的文件,这解释了 SD 卡上其他文件的位置):

测试你的硬件连接

如果你此时在 SD 卡上看到一张图片,请打开它以检查它是否被正确拍摄。如果是这样,恭喜!现在一切都已经设置好了,你可以用这个项目编写令人兴奋的应用程序。如果你此时看不到图片,第一步是重复整个过程。请注意,在拍摄图片后,实际上要卸载 SD 卡。你也可以直接将相机连接到电脑上,以检查问题是否来自相机本身。

检测到运动时记录图片

我们将要使用刚刚搭建好的硬件构建的第一个应用程序将是本地的,所以目前不会将任何内容发送到 Web。在这一节中,我们只想构建一个由运动传感器触发的相机。

通过这种方式,例如,你可以检查在你不在家的时候是否有人进入了你的家,因为 PIR 运动传感器会立即注意到。这一部分实际上是整个项目的基础。我们将在编写将图片上传到 Dropbox 的代码时,重新使用这一部分开发的代码。

对于这个项目的一部分,我们不想再使用 SSH 访问来拍摄图片了;我们需要直接从 Arduino 草图触发相机。为此,我们将使用Bridge库和Process库在 Linux 机器上调用一个命令,就像你在终端窗口中输入一样。

草图首先声明我们需要使用的库:

#include <Bridge.h>
#include <Process.h>

为了在 Yún 的 Linux 机器上调用一些命令,我们需要声明一个进程,这是一个我们将调用来模拟一些终端输入的对象:

Process picture;

我们还将为每张要拍摄的图片构建一个文件名,如下代码所示。实际上,我们之前将文件命名为test.png,但在这个应用中,我们希望项目拍摄的每张图片都有一个不同的名字:

String filename;

声明连接运动传感器的引脚,如下所示:

int pir_pin = 8;

我们还需要定义图片将存储的位置。记住,我们希望将它们全部存储在 SD 卡上,如下所示:

String path = "/mnt/sda1/";

你也可以在 Yún 上本地存储图片,但这会迅速耗尽 Arduino Yún 的内存。

然后,在setup()函数中,我们开始建立 Atmel 微控制器和 Yún 的 Linux 机器之间的桥梁,如下所示:

Bridge.begin();

此外,我们将 PIR 运动传感器的引脚设置为输入,如下所示:

pinMode(pir_pin,INPUT);

loop()函数中,我们想要做的是持续从运动传感器读取数据,并在检测到任何运动时触发相机。

这是通过一个简单的if语句完成的,该语句检查传感器的值,如下所示:

if (digitalRead(pir_pin) == true)

然后,如果检测到运动,我们需要准备拍照。第一步是构建一个包含拍照日期的文件名。为此,我们使用 Linux 日期命令输出当前日期和时间。这很重要,因为我们想知道拍照的时间,并为每张图片提供一个唯一的文件名。最后,我们还想指定这张图片将以PNG格式拍摄。文件名格式化部分是通过以下代码完成的:

filename = "";
picture.runShellCommand("date +%s");
while(picture.running());while (picture.available()>0) {char c = picture.read();filename += c;} 
filename.trim();
filename += ".png";

最后,我们可以拍照。我们在这里要做的是再次调用fswebcam命令,使用我们图片处理的runShellCommand函数来模拟终端输入。

我们还希望使用相机上可用的最大分辨率。在我们选择的相机中,它是 1280 x 720(标准高清分辨率)。我们 SD 卡上有相当多的空间(我使用的是 4 GB),因此你可以使用最大分辨率而不会遇到问题。我们建议你为这个项目使用一个专门的 SD 卡,以免与其他存储在卡上的文件发生问题。为了简单起见,我们不会添加自动检查卡是否已满的功能,但如果你想让项目长时间连续运行,你应该考虑这一点。你可以在调用末尾使用–o命令指定分辨率。最后,我们可以构建完整的代码来拍照:

picture.runShellCommand("fswebcam " + path + filename + " -r 1280x720");
while(picture.running());

注意,我们在这里也使用了一个while()语句,以确保fswebcam工具有足够的时间拍照。完整的代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter3/triggered_camera找到。

你现在可以将代码上传到 Yún 板并测试项目。一旦上传,尝试在传感器前移动你的手。Arduino Yún 应该触发相机拍照并将其保存到 SD 卡。为了确保此时已经拍照,你可以简单地检查相机本身。例如,我使用的罗技网络摄像头有一个小型的 LED 灯,每当它处于活动状态时就会变绿。

一段时间后,将 SD 卡从 Arduino Yún 中取出(如前所述,首先从 Yún 卸载 SD 卡),然后将其插入我们之前使用的适配器中的电脑。你应该在 SD 卡的根目录下看到所有拍摄的图片,如下面的截图所示:

检测到运动时记录图片

再次检查这些图片,确保它们没有被损坏,并且一切按计划进行。

定期将图片发送到 Dropbox

我们现在将扩展上一节构建的代码,并编写一些自动将相机拍摄的图片上传到 Dropbox 的新代码。为此,我们需要构建比上一部分稍微复杂一些的软件。

目前,我们只使用了 Arduino Yún 的 Choreos(Temboo 库)。然而,实际上还有许多其他语言的可用的 Choreos,例如 Python。这是一个好消息,因为 Yún 的 Linux 机器能够直接运行 Python 代码。

实际上,从 Python 访问 Dropbox API 要容易得多,所以我们将在这个部分使用它。我们将构建一个 Python 脚本,将我们拍摄的图片上传到 Dropbox,并使用 Bridge 库和我们的图片处理过程从 Arduino 脚本中调用此脚本。

我现在将解释 Python 脚本的内容。稍后,我们将将这些代码行保存到单独的文件中,并将其与 Temboo Python SDK 一起放置在 SD 卡上。

Python 脚本以以下代码行开始:

from temboo.core.session import TembooSession
from temboo.Library.Dropbox.FilesAndMetadata import UploadFile

Python 脚本还将接受一个参数:要上传的文件名。这样,我们可以直接将文件名(由 Arduino 代码与时间戳一起构建)传递给 Python 脚本。以下代码行正是这样做的:

with open(str(sys.argv[1]), "rb") as image_file:encoded_string = base64.b64encode(image_file.read())

在脚本内部,您需要定义您的 Temboo 凭据,如下所示:

session = TembooSession('yourTembooName', 'yourTembooApp', 'yourTembooKey')

这些正是我们之前用于 Temboo 的相同凭据。然后我们需要声明用于自动上传图片到 Dropbox 的 Python upload file Choreo,如下所示:

uploadFileChoreo = UploadFile(session)
uploadFileInputs = uploadFileChoreo.new_input_set()

下一步是设置不同的输入,这是您在创建 Dropbox 应用时所做的,如下所示:

uploadFileInputs.set_AppSecret("appSecret")
uploadFileInputs.set_AccessToken("accessToken")
uploadFileInputs.set_FileName(str(sys.argv[1]))
uploadFileInputs.set_AccessTokenSecret("accessTokenSecret")
uploadFileInputs.set_AppKey("appKey")
uploadFileInputs.set_FileContents(encoded_string)
uploadFileInputs.set_Root("sandbox")

最后,我们可以调用 uploadFileChoreo 来将文件上传到您应用对应文件夹中的 Dropbox 文件夹,如下所示:

uploadFileResults = uploadFileChoreo.execute_with_results(uploadFileInputs)

您现在可以将此代码保存到名为 upload_picture.py 的文件中,并将其放置在 SD 卡的根目录下。还记得我们之前下载的 Temboo Python 库吗?现在是时候将其解压并放置在 SD 卡的根目录下了。只需确保它在 SD 卡根目录下以 temboo 的名称出现,这样我们刚刚创建的 Python 文件就可以正确访问它。如果尚未记录任何图片,以下截图显示了您的 SD 卡文件夹应该看起来像什么:

定期将图片发送到 Dropbox

我们还需要稍微修改 Arduino 脚本来上传 Dropbox 上的图片。我们使用了与上一节完全相同的代码库,因此我们只需详细说明新添加的代码。

在检测到运动时执行的代码部分,在循环的末尾,您需要再次使用图片处理来执行 Python 脚本,如下面的代码所示:

picture.runShellCommand("python " + path + "upload_picture.py " + path + filename);
while(picture.running());

注意,我们正在传递与 SD 卡上记录的图片相同的文件名和路径,所以相同的图片名称在本地记录并发送到 Dropbox。

本部分的完整代码可以在github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter3/dropbox_log找到。

现在,你可以将 SD 卡放回 Arduino Yún,上传更新的 Arduino 草图,然后前往你的 Dropbox 文件夹。此时,你应该注意在你的Apps文件夹中创建了一个新文件夹,其名称与你在 Dropbox 网站上设置的 Dropbox 应用名称相同,如下面的截图所示:

定期将图片发送到 Dropbox

现在,如果检测到运动,草图不仅应该在 SD 卡上记录图片,还应该在你的 Dropbox 文件夹上。如果一切正常工作,你应该能看到当 Yún 使用 USB 摄像头拍照时,图片实时出现在你的 Dropbox 文件夹中。

我们项目应用的酷炫之处在于,这可以在世界上的任何地方完成。你当然可以从你的电脑上做这件事,也可以从网页浏览器上做。许多移动设备也可以运行 Dropbox 的移动版,所以你可以直接从你的移动设备上查看是否有人进入了你的家。例如,在我的电脑上,Dropbox 也会给我发送通知,告诉我有新文件上传,这样我就可以立即看到我的家里是否发生了什么,并据此采取行动。

通过 Wi-Fi 进行实时视频流

为了完成这一章节,我们将要了解另一个使用 Arduino Yún 和我们的 USB 摄像头可以实现的酷炫应用。请记住,这个摄像头实际上是一个标准的网络摄像头,它也是为了捕捉视频而设计的。在网络上自动流式传输视频到私人视频频道,这样你就可以通过进入网页浏览器在任何地方实时查看你的家,这不是很酷吗?这正是本节我们要做的。

许多商业 IP 摄像头实际上使用专有解决方案来做这件事,但我希望使用常见的工具;这就是我们选择 YouTube 直播事件服务来流式传输视频的原因,这样任何设备都可以访问。

要使应用程序工作,我们首先需要在 Yún 上安装一些额外的软件包,如下面的步骤所示:

  1. 再次使用 Arduino Yún 的用户名和密码通过 SSH 连接到 Yún,并输入以下命令以获取正确的直播流软件包:

    wget http://www.custommobileapps.com.au/downloads/mjpg-streamer.ipk
  2. 注意,如果链接不再有效且你找不到文件,这个包也可以在本章的代码中找到。你现在可以使用以下命令安装它:

    opkg install mjpg-streamer.ipk
  3. 现在,你可以使用以下命令在你的 Arduino Yún 上启动直播流软件:

    mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 25" -o "output_http.so -p 8080 -w /www/webcam" &

    在这里,-h后面的参数是分辨率,而-i后面的参数是流可用的端口。我们还使用-I命令指定了每秒的帧数。其他选项不太重要,你不必担心它们。

注意,我们没有以高清分辨率进行直播;显然这对 Arduino Yún 来说太多了,视频流出现了显著的延迟,并且还有损坏的图像,这根本不是我们想要的。你可以通过在你的网络浏览器中输入 Arduino Yún 的地址后跟8080来指定正确的端口来访问你的流。例如,在我的情况下,它是http://myarduinoyun.local:8080/stream.html

这实际上让你可以直接访问直播流。你应该会看到页面中间的流界面,其中包含直播流,如下面的截图所示:

通过 Wi-Fi 进行实时视频流

你还可以使用左侧菜单的不同元素来探索这个流软件的其他可能性。例如,你可以获取一个VideoLAN的链接,这样你就可以直接从 VLC 播放器访问你的流。

现在,这已经很不错了,你可以在这里停止以从你的本地 Wi-Fi 网络访问你的视频流。但如果流可以在网上访问,那就更好了,这样你就可以从世界任何地方访问它,即使没有连接到本地 Wi-Fi 网络。

第一步是进入你的 YouTube 账户的视频管理器,然后点击左侧的直播活动菜单,如下面的截图所示:

通过 Wi-Fi 进行实时视频流

从这个菜单中,你可以创建你的流,就像创建一个新的 YouTube 视频一样。确保将视频设置为不公开,除非你不想让 YouTube 上的其他人看到你家里的情况。与私密视频相比,你仍然可以通过只给他们提供流的 URL 来与你知道的人分享视频。然后,在下一页,YouTube 会要求你选择你想要使用的编码器。

我从列表中选择了Wirecast并从他们的网站下载了它。在 Wirecast 界面中,你需要设置正确的视频源(默认情况下,它将从你的电脑摄像头进行直播)。在你可以选择视频源的菜单中,选择Web Stream Source并配置它,如下面的截图所示:

通过 Wi-Fi 进行实时视频流

基本上,你需要选择 HTTP 作为协议,使用Motion JPEG作为格式,并将流界面视频标签页中的 URL 放入其中。例如,对于我的项目,它是myarduinoyun.local:8080/?action=stream

一段时间后,如果一切正常,您应该看到来自 USB 摄像头的实时流直接出现在 Wirecast 的主窗口中。如果此时出现一些延迟,请不要担心;这通常只是延迟;在我的情况下,Wirecast 软件中大约有 1-2 秒的延迟。以下是在添加正确的视频流后我在 Wirecast 主界面中获得的图像:

通过 Wi-Fi 进行实时视频直播

此外,请确保此流是唯一一个将被发送到 YouTube 的流。为此,请从 Wirecast 界面删除所有其他流。实际上,Wirecast 默认将来自您的网络摄像头的流放在界面上。

注意

此外,请注意使用 HTTP 流是 Wirecast 付费版本的功能;它在免费版本中运行得很好,但您会在视频上不时地看到水印。不用担心;实际上,监控您家中的情况并不是问题。

下一步是实际上传数据到 YouTube。点击界面顶部的按钮,该按钮应变为红色,之后您将被提示输入您的 YouTube 凭证。然后它应该自动检测您刚刚在 YouTube 上创建的实时事件视频。

接受设置,确保直播来自 Wirecast,然后返回 YouTube 界面。现在您可以进入视频管理器,并转到直播控制室标签。这就是您应该看到 YouTube 实际上正在通过运行在您计算机上的 Wirecast 从您的 Arduino Yún 接收一些数据的地方。它应该指示流状态良好,如下面的截图所示:

通过 Wi-Fi 进行实时视频直播

如果不是这种情况,请回到 Wirecast 应用程序,检查直播过程是否正常工作。此刻,请不要担心;您的直播还没有开始工作。您应该看到如下截图所示的预览按钮现在可用并可点击。只需点击它。

通过 Wi-Fi 进行实时视频直播

YouTube 将准备您的直播,如下面的截图所示,您将需要等待片刻(当我尝试时大约 30 秒):

通过 Wi-Fi 进行实时视频直播

一段时间后,页面将自动更新,以便您可以进入下一步并实际开始直播,如下面的截图所示:

通过 Wi-Fi 进行实时视频直播

注意在将直播流设置为实时之前,您可以使用上一页上的选项预览它。如果看到的内容令人满意,现在您可以点击开始直播以最终完成此过程。然后您将能够在此页面上或直接在直播的专用页面上访问流。以下截图是 YouTube 界面上最终的结果:

通过 Wi-Fi 进行实时视频直播

您可以从视频下方的红点看出,视频正在实时流式传输。因为视频被标记为未列出,只有拥有 URL 的人才能访问它。例如,您可以将视频标记为 YouTube 账户中的收藏夹,然后从任何地方访问它。您还可以与家人和朋友分享,这样他们也可以从他们的浏览器中观看直播。

注意,因为我们使用计算机上的 Wirecast 软件对视频流进行编码以上传到 YouTube,所以我们需要保持计算机开启才能使这个过程工作。在本书编写时,没有软件可以直接在 YouTube 上流式传输视频而不需要计算机的帮助,但这种情况在未来可能会改变,从而不再需要计算机来流式传输视频。

摘要

让我们现在总结一下在这个项目中我们学到了什么。我们在项目中构建的是一个安全摄像头,可以在检测到运动时自动将图片记录到本地和 Dropbox。我们还学会了如何通过 Wi-Fi 将来自这个摄像头的视频实时流式传输到 YouTube。

以下是本项目的主要收获:

  • 在项目的第一部分,我们将 USB 摄像头连接到 Arduino Yún,以及 PIR 运动传感器。我们还连接了一个 micro SD 卡到 Yún,这样我们也可以在互联网连接不可用的情况下本地记录图片。我们还安装了项目所需的软件包,例如驱动程序,以便从终端命令访问 USB 摄像头。

  • 然后,我们通过检查运动传感器是否正常工作,并确保我们可以使用 USB 摄像头实际拍照来测试我们的硬件。

  • 然后,我们使用我们的硬件构建了一个简单的应用程序,当检测到运动时自动拍照并将其存储在 micro SD 卡上。我们在 Yún 上测试了此软件,后来检查时发现确实有一些图片存储在 SD 卡上。

  • 在这个简单的应用之后,我们基于草图自动上传了我们的 Dropbox 文件夹中的图片。为此,我们编写了一个 Python 脚本,该脚本可以自动将文件上传到 Dropbox。然后,我们从 Arduino 草图调用这个脚本,以便在检测到运动时将图片上传到 Dropbox。

  • 最后,在草图的最后一部分,我们使用了摄像头的视频功能,在 YouTube 上实时直播视频。这样,无论您在世界上的哪个地方,都可以监控您家的情况;我们只需要一个互联网连接和一个可以访问 YouTube 的设备,例如智能手机。

当然,您可以根据我们在本章中学到的知识以多种方式改进和扩展这个项目。您当然可以在您的家中安装许多带有摄像头和运动传感器的模块。这样,您就可以拥有一个完整的远程监控系统,以监控您的家。

提高项目的一种方法是将更多的 Choreos 集成到项目中。例如,你可以将我们在第一章中使用过的 Gmail Choreo 注入到项目中,以便在检测到运动时自动发送电子邮件警报。这将为你家的安全增加另一层保障。以类似的方式,你也可以使用 Twilio Choreo,当在家中发现运动时,它会给你发送短信。

你也可以将这个项目用于完全不同的目的。在测试项目时,例如,我们创建了一个定时摄影设备,它以固定的时间间隔拍照(例如,每分钟一次)并将这些照片上传到 Dropbox。

在下一章中,我们将利用 Arduino Yún 的 Wi-Fi 功能进行一个完全不同的应用:控制一个移动机器人。我们将利用 Arduino Yún 的力量远程控制这个机器人,并读取来自机器人的数据,所有这些都在你电脑上运行的一个简单网络应用程序中完成。

第四章. Wi-Fi 控制的移动机器人

在本书的最后一章,我们将使用 Arduino Yún 在完全不同的领域:机器人技术。你将学习如何接口直流电机,以及如何使用 Arduino Yún 作为机器人的大脑、距离传感器,以及使用 Wi-Fi 和简单的 Web 界面进行无线控制。你还将能够实时查看机器人所做的测量,例如,超声波传感器在机器人前方测量的距离。

构建移动机器人

Arduino 板在移动机器人中得到了广泛的应用,因为它们很容易与机器人的不同部分进行接口,如传感器、直流电机等执行器,以及其他如 LCD 屏幕等组件。Arduino 甚至最近发布了他们自己的机器人,让人们可以在一个共同的机器人平台上进行实验。这些机器人通常只编程一次,然后独立执行某些任务,例如移动而不撞到障碍物或捡起物体。

在这个项目中,我们将有所不同。我们想要的是构建一个以 Arduino Yún 作为“大脑”的移动机器人,并通过电脑或移动设备,如智能手机或平板电脑,完全通过 Wi-Fi 来控制它。为此,我们将为机器人编写一个 Arduino 草图,该草图将接收命令并回传数据,并在你的电脑上编写一个图形界面。这样,如果你想在将来构建更复杂的应用程序,你只需更改电脑上运行的软件,而无需触碰机器人。

我们首先将使用一些基本的机械和电气部件来构建机器人。我们不仅会向你展示如何使用特定的套件来构建机器人,还会给你很多关于使用其他等效组件来构建你自己的机器人的建议。为了给你一个我们打算构建的机器人的概念,以下是我们组装好的机器人的图片:

构建移动机器人

在机器人的底部,你大部分的机械部件,如底盘、轮子、直流电机和超声波传感器。你还在机器人的底部中心位置有电池。然后,你可以看到顶部的不同 Arduino 板。从底部开始,你有 Arduino Yún 板、Arduino Uno 板、电机保护罩和一个原型板。

在这个项目中组装组件将略有不同,因为我们实际上将在项目中使用两个 Arduino 板:Yún 板,它将直接从外部世界接收命令,以及一个 Arduino Uno 板,它将连接到电机保护罩。

然后,我们将对机器人的各个部分进行常规测试,例如测试机器人的两个直流电机和位于机器人前端的超声波距离传感器。为了测试电机,我们将简单地让它们逐渐加速,以查看命令电路是否工作正常。从超声波距离传感器接收到的测量值将直接显示在串行监视器上。

下一步是构建 Arduino 软件,该软件将从计算机接收命令并将它们传输到移动机器人的电机。在此阶段,我们还将编写将距离信息传输回计算机的部分。因为我们希望标准化我们的代码并使其可用于其他项目,所以我们将从我们在第二章中使用的 Arduino Yún 板的 REST API 中汲取灵感,创建远程能源监控和控制设备

最后,我们将在您的计算机上构建服务器端图形界面,这样您就可以轻松地从计算机或移动设备控制机器人,并接收一些关于机器人的数据,例如超声波传感器的读数。此服务器端软件将再次使用 HTML 来显示界面,JavaScript 来处理用户的操作,以及 PHP 通过cURL函数直接与您的 Arduino Yún 板通信。

所需的硬件和软件组件

除了 Arduino Yún 之外,您还需要一些机械和电气组件来完成此项目。第一套组件是为机器人本身准备的。您基本上需要三样东西:一个将支持所有组件的机器人底盘或机架,两个带轮子的直流电机,以便机器人可以移动,以及至少一个位于机器人前方的超声波传感器。我们使用了一个来自 DFRobot 的移动机器人套件(www.dfrobot.com/),您可以在下面的图片中看到:

所需的硬件和软件组件

该套件被称为2 轮 miniQ 平衡机器人底盘,在撰写本书时售价为 32.20 美元。当然,您不需要这个套件来构建此项目。只要您有一个包含我们之前提到的三种组件的套件,您可能就可以开始这个项目了。

对于电机,请注意,我们使用的电机保护器电路可以处理高达 12V 的直流电压,因此请使用在 12V 以下电压下工作的电机。此外,请使用具有集成减速器的电机。这样,您将增加电机的可用扭矩(以便机器人更容易移动)。

对于超声波传感器,你有许多选择。我们使用了一个可以通过 Arduino 的pulseIn()函数进行接口的传感器,所以任何以这种方式工作的传感器都应该与我们在本章后面看到的代码兼容。这个传感器在 DFRobot 的参考是 URM37。如果你计划使用其他类型的距离传感器,例如使用 I2C 接口的传感器,你必须相应地修改代码。

然后,你需要一块 Arduino 板,它将通过电机保护罩直接与直流电机接口。在这个阶段,你可能会问为什么我们不直接将所有组件连接到 Arduino Yún,而不使用中间的另一个 Arduino 板。确实,使用机器人的传感器是可以做到的,但电机不行。

我们不能直接将电机连接到 Arduino 板;它们通常需要的电流比 Arduino 引脚能提供的要多。这就是为什么我们将使用专门为此任务设计的电机保护罩。通常,Arduino Yún 在没有损坏的情况下无法使用这些电机保护罩,至少在撰写这本书的时候是这样的。这是因为电机保护罩通常是为 Arduino Uno 板设计的,保护罩上的错误引脚可能会连接到 Yún 的错误引脚。当然,你也可以使用面包板上的外部组件来做这件事,但在这里使用保护罩确实简化了事情。

正因如此,我们将使用标准 Arduino 板将所有组件接口,然后让 Yún 板与标准 Arduino 板通信。我们在这个项目中使用了 DFRduino 板,这是 DFRobot 为这个 Arduino Uno 板的克隆版所取的名字。如下面的图片所示:

所需的硬件和软件组件

当然,任何等效的板都可以工作,只要它与官方 Arduino Uno 板兼容。你也可以使用其他板,例如 Arduino Leonardo,但我们的代码在其他板上尚未经过测试。

然后,你需要一个电机保护罩来将两个直流电机与 Arduino Uno 板接口。我们在这个项目中也使用了 DFRobot 的电机保护罩。在 DFRobot 网站上的参考是Arduino 1A 电机保护罩,如下面的图片所示:

所需的硬件和软件组件

再次强调,大多数电机保护罩都可以用于这个项目。你基本上需要一个可以控制至少两个电机的保护罩。保护罩还需要能够处理你想要控制的电机,包括电压和电流。在我们的例子中,我们需要一个可以处理机器人两个 6V 直流电机的保护罩,最大电流为 1A。

通常,您可以寻找包含 L293D 电机驱动 IC 的电机保护板。这个集成电路是一个专门用于控制直流电机的芯片。它可以处理高达两个 12V 直流电机,电流为 1A,这对于我们试图构建的移动机器人来说将适用。当然,如果你的保护板可以处理更多的电流或电压,那也可以。重要的是要找到如何设置机器人的速度:我提到的 IC 可以直接接收来自 Arduino 板的 PWM 命令,所以如果您想使用本章中规定的代码,您将需要使用使用类似类型命令设置电机速度的保护板。

最后,我们在机器人顶部添加了一个简单的原型板,以便更容易地进行电源连接,并且将来可以添加更多组件,如下面的图片所示:

所需的硬件和软件组件

再次强调,您可以使用任何等效的原型板,例如 Arduino 的官方原型板。这主要是为了避免有很多电缆散落在周围,但您也可以用它来扩展您的机器人项目,添加更多组件,例如加速度计或陀螺仪。

您还需要为您的机器人提供电源。由于直流电机可能需要相当多的电流,我们强烈建议您在测试机器人时不要使用来自计算机 USB 端口的电源,否则您可能会损坏它。这就是为什么我们总是使用电池来处理机器人的电机。我们使用了一个带有直流插头连接器的 7.2V 电池,这样它可以很容易地插入到 Arduino Uno 板上。这个电池组也可以在 DFRobot 网站上找到。您也可以使用一些 AA 电池代替电池组。您必须确保这些电池的总电压大于您直流电机的标称电压。

至于软件本身,您只需要在您的计算机上安装 Arduino IDE 和一个网络服务器。

机器人组装

现在是组装机器人的时候了。我们将向您展示在这个项目中使用的机器人套件所需的步骤,但它们可以应用于任何其他等效的机器人套件。第一步是将电池放置在机器人的底部,如下面的图片所示:

机器人组装

注意,一些金属间隔件也被用于机器人的底部,以保持电池的位置并为其他组件提供支撑。这些间隔件也可以在 DFRobot 网站上找到。然后,您可以在底盘顶部拧上两个更多的间隔件和 Arduino Yún 板,如下面的图片所示:

机器人组装

然后,我们在两个金属间隔件上添加了 Arduino Uno 兼容板。在这个时候,您可以拧上 Arduino Uno 板;所有其他组件都将直接插入到这些板上,如下面的图片所示:

机器人组装

然后,您可以直接将电机保护罩安装在 Arduino Uno 板上。此时,您还可以将来自直流电机的电缆连接到电机保护罩的螺丝端子。请注意这一步;很容易将直流电机的错误电缆插错。您需要将每个电机连接到电机保护罩板上的不同连接器,如下面的图片所示:

机器人组装

最后,您可以将原型板安装在机器人上。到这一步,我们已经连接了超声波传感器:地线连接到 Arduino 的地线,VCC 连接到原型板上的 Arduino 5V 引脚,信号引脚连接到 Arduino 板的 A0 引脚。如果您的超声波传感器使用数字接口,例如,您可能需要使用不同的引脚。请阅读您超声波传感器的数据手册以获取更多信息。以下图片显示了这一步骤的机器人状态:

机器人组装

连接 Arduino Yún 和 Uno 板

我们还没有完成!到目前为止,Arduino Yún 和 Arduino Uno 板之间还没有连接,因此 Yún 板将无法访问直流电机和机器人的传感器。为了解决这个问题,第一步是将 Arduino Uno 板的电源连接到 Yún 板。这样,当我们使用电池为项目供电时,Yún 板也会被供电。

要这样做,只需将地线引脚连接在一起,并将 Arduino Yún 上的 Vin 引脚连接到 Arduino Uno 的 5V 轨,如下面的图片所示:

连接 Arduino Yún 和 Uno 板

要完成连接两块 Arduino 板,我们需要将它们连接起来,以便在项目运行时它们可以相互通信。为此,我们将使用 Arduino 板的 I2C 接口,这样它们就可以相互发送消息。I2C 代表Inter Integrated Circuit,是一种为电路间通信而开发的简单通信协议,在电子学中得到了广泛应用。为此需要连接两根线:SDA 和 SCL。要做到这一点,只需将 Yún 板的 2 号引脚连接到 Uno 板的 A4 号引脚,将 Yún 板的 3 号引脚连接到 Uno 板的 A5 号引脚,如下面的图片所示:

连接 Arduino Yún 和 Uno 板

以下图片总结了两个板之间的连接:

连接 Arduino Yún 和 Uno 板

最后,您可以通过将电池的直流插头连接到 Uno 板上的电源连接器来为项目供电,如下面的图片所示:

连接 Arduino Yún 和 Uno 板

如果这一步操作都正确无误,你应该会看到两个板(Yún 和 Uno)都已上电,其中一些 LED 灯亮着。为了帮助你构建机器人,我们还包含了两个展示机器人不同连接的侧面图片。以下是一张展示机器人侧面电源连接到 Yún 的图片:

连接 Arduino Yún 和 Uno 板

以下图片显示了从 I2C 接口到 Yún 的连接:

连接 Arduino Yún 和 Uno 板

测试机器人的硬件连接

在构建项目的遥控部分之前,我们想确保硬件连接正确,尤其是在 Arduino Uno 板和不同的电机及传感器之间。这就是为什么我们首先将为 Arduino Uno 板构建一个简单的草图来测试不同的组件。

在这个阶段,我们将打开机器人的电机;因此请确保机器人站在一个小平台上,例如,以防你在用 USB 线连接到电脑测试不同的 Arduino 草图时,机器人四处移动。

草图首先声明了电机的引脚,如下面的代码所示。请注意,这些引脚专门用于我们使用的电机保护罩;如果你使用的是不同的保护罩,请参阅你的保护罩数据表。

int speed_motor1 = 6;  
int speed_motor2 = 5;
int direction_motor1 = 7;
int direction_motor2 = 4;

按照以下方式声明超声波传感器使用的引脚:

int distance_sensor = A0;

我们还希望电机在运行过程中速度变化,所以我们按照以下方式声明变量:

int robot_speed;

在草图的setup()部分,我们需要指定电机引脚将作为输出引脚,如下面的代码所示:

for(int i=4;i<=7;i++)
{  pinMode(i, OUTPUT);
}

我们还需要为机器人设置一个起始速度。请注意,每个电机的速度将由来自 Arduino 的 PWM 命令设置,因此我们必须指定一个介于 0(不对电机施加电压)和 255(对电机施加最大电压)之间的值。此外,由于电机上的机械阻力,PWM 命令的值和电机的速度之间没有线性关系。

我们使用 75 作为起始速度,这在我们的直流电机上是一个非常慢的速度。然而,根据你的设置,这个值将产生完全不同的效果。在这个阶段,你也可以进行实验,看看最大 PWM 值是多少,这将使你的直流电机达到正好零速度。请确保机器人还没有放在地板上,因为它会开始向前移动,可能会损坏东西。我们把它放在一个小支架上,这样轮子就不会碰到任何东西。

loop()部分,所有操作都是由send_motor_command函数完成的,该函数将用于两个电机。例如:

send_motor_command(speed_motor1,direction_motor1,robot_speed,1);

让我们看看这个函数的细节。它首先按照以下方式将电机的速度写入正确的引脚:

analogWrite(speed_pin,pwm);

然后,我们需要将方向引脚设置为正确的方向。这是通过一个简单的digitalWrite函数完成的,如下所示:

digitalWrite(direction_pin,dir);

仍然在loop()函数中,我们调用一个函数来测量机器人前面的距离,并将结果打印在Serial端口上:

Serial.println(measure_distance(A0));

让我们看看这个函数的详细情况。它首先使用pulseIn函数从传感器获取原始测量值。基本上,传感器返回一个长度与测量距离成正比的脉冲。脉冲长度是通过以下 Arduino 专用函数测量的:

unsigned long DistanceMeasured=pulseIn(pin,LOW);

然后,我们检查读取是否有效,如果是,我们使用以下公式将其转换为厘米:

Distance=DistanceMeasured/50;

这是通过以下代码返回的:

return Distance;

最后,我们在循环的每次迭代中更新速度,每次增加一个单位,如果它达到 255 则重置,如下所示:

robot_speed++;
if (robot_speed > 255) {robot_speed = 75;}

该部分的代码可在本书的 GitHub 仓库中找到,存储在一个名为robot_test的文件中:github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter4/robot_test

现在是时候将代码上传到机器人上了。在这样做之前,请确保机器人由电池供电。机器人的两个电机应该在达到最大速度时逐渐加速,然后以较低的速度重新开始。

你也可以在这个时候打开串行监视器来检查距离传感器的读数。尝试将你的手或物体放在机器人前面;你应该在串行监视器上看到距离相应地变化。

构建 Arduino 草图

现在是时候构建我们项目的最终草图了。为了更精确,我们应该说草图,因为我们将不得不开发两个:一个用于 Uno 板,一个用于 Yún 板。现在你只需要对硬件进行一个简单的更改:将超声波传感器直接连接到 Yún 板,将信号引脚连接到 Yún 板的 A0 引脚。

让我们首先关注 Arduino Uno 草图。这个草图受到了我们之前编写的测试草图的启发,因此它已经包含了控制两个直流电机的函数。为了在两个板之间进行通信,我们必须包含负责处理 I2C 通信的 Wire 库:

#include <Wire.h>

然后,在草图中的setup()部分,我们需要声明我们正在连接到 I2C 总线并开始监听传入的事件。Arduino 板将被配置为从机,接收来自充当主机的 Yún 板的命令。这是通过以下代码片段完成的:

Wire.begin(4);
Wire.onReceive(receiveEvent);

让我们看看这个receiveEvent部分的细节,这实际上是一个作为参数传递给 Wire 库的onReceive()函数的函数。每当 I2C 总线上接收到事件时,这个函数将被调用。这个函数的基本操作是从 Yún 读取传入的数据,这些数据必须遵循特定的格式,如下面的示例所示:

speed_motor_1,direction_motor_1,speed_motor_2,direction_motor_2

例如,上一条消息的前一部分是通过以下代码读取回的:

int pwm1 = Wire.read();
Serial.print(pwm1);
char c = Wire.read();
Serial.print(c);

这些来自 Yún 的命令随后被应用于电机,如下所示:

send_motor_command(speed_motor1,direction_motor1,pwm1,dir1); send_motor_command(speed_motor2,direction_motor2,pwm2,dir2);

现在,让我们专注于 Yún 草图。这个草图灵感来源于 Arduino IDE 中附带的自带 Bridge 草图,并基于 Arduino Yún 的 REST API。为了简化操作,我们将创建一种新的 REST 调用,命名为 robot。这样,我们就可以通过在浏览器中执行以下调用来控制机器人:

myarduinoyun.local/arduino/robot/stop

首先,我们需要为草图包含正确的库,如下所示:

#include <Wire.h>
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

然后,在板上创建一个网络服务器:

YunServer server;

setup()函数中,我们还将 I2C 总线连接起来:

Wire.begin();

然后,我们启动桥接:

Bridge.begin();

setup()函数通过以下方式启动网络服务器结束:

server.listenOnLocalhost();
server.begin();

然后,loop()函数通过以下方式监听传入的连接:

YunClient client = server.accept();

来自这些客户端的请求可以通过以下命令进行处理:

if (client) {// Process requestprocess(client);// Close connection and free resources.client.stop();}

如果有客户端连接,我们将对其进行处理以检查是否收到了机器人命令,如下所示:

String command = client.readStringUntil('/');if (command == "robot") {   robotCommand(client);
}

这个函数处理 REST 调用,以查看我们需要对机器人的电机做些什么。例如,让我们考虑这样一个情况,我们想让机器人以全速向前行驶。我们需要向 Arduino Uno 板发送以下消息:

255,0,255,0

这是通过以下代码段完成的:

if (command == "fullfw") {Wire.beginTransmission(4);Wire.write(255);Wire.write(",");Wire.write(0);Wire.write(",");Wire.write(255);Wire.write(",");Wire.write(0);Wire.endTransmission();
}

我们为这个简单的 REST API 添加了三个其他命令:stop(显然是停止机器人),turnleft(以中等速度使机器人向左转),turnright(使机器人向右转),以及getdistance以返回超声波传感器的距离。我们还在这个草图中插入了measure_distance函数来读取来自超声波传感器的数据。

现在,我们已经准备好将代码上传到机器人上了。请记住,您必须在这里上传两个草图:一个用于 Uno 板,另一个用于 Yún 板。顺序并不那么重要,只需成功上传两个 Arduino 草图,并仔细确保您上传的是正确的代码到正确的板上。

以下 GitHub 仓库中提供了这两个草图:github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter4/remote_control

您可以测试 Yún 板是否正确地将命令中继到 Uno 板上。在这个时候,您可以断开所有电缆,只用电池为机器人供电。然后,打开一个网页浏览器并输入以下代码:

myarduinoyun.local/arduino/robot/turnright

机器人应该立即开始向右转。要停止机器人,您可以简单地输入以下代码:

myarduinoyun.local/arduino/robot/stop

您也可以输入以下代码:

myarduinoyun.local/arduino/robot/getdistance

这应该在您的网页浏览器上打印出机器人前面的距离值。如果您在网页浏览器上看到打印出的距离是真实的,这意味着命令正在正确工作。

构建计算机界面

我们现在将构建一个界面,让您可以从电脑或移动设备远程控制机器人。这实际上与我们为继电器控制项目所做的工作非常相似,主要区别在于我们还想从机器人(在本例中为超声波传感器的距离测量)读取一些数据。将有一个 HTML 文件来托管界面的不同元素,一些用于与 Yún 板通信的 PHP 代码,一些用于在 HTML 和 PHP 之间建立链接的 JavaScript,以及一些用于给界面添加样式的 CSS。

第一步是创建一个 HTML 文件,它将成为我们访问机器人控制的入口点。该文件基本上托管了四个按钮,我们将使用这些按钮来控制我们的机器人,并有一个字段来持续显示超声波传感器测量的距离。按钮是在一个表单内声明的;以下是一个按钮的代码:

<input type="button" id="stop" class="commandButton" value="Stop" onClick="stopRobot()"/>

距离信息将通过以下代码行显示:

<div id="distanceDisplay"></div>

以下字段将使用一些 JavaScript 进行更新:

<script type="text/javascript">setInterval(function() {$("#distanceDisplay").load('get_distance.php');}, 1000);
</script>

让我们看看这个 PHP 文件的内容。它基本上是对 Yún 板的 REST API 进行调用,并将返回的答案显示在界面上。同样,它将使用 PHP 的curl函数。

它首先通过cURL调用您的 Yún 板,使用我们在之前的草图定义的getdistance参数:

$service_url = 'http://myarduinoyun.local/arduino/robot/getdistance';

然后通过以下代码准备调用:

$curl = curl_init($service_url);

我们使用以下代码获取答案:

$curl_response = curl_exec($curl);

然后,我们使用 PHP 的echo函数将其打印出来:

echo $curl_response;

控制电机的 PHP 脚本也非常相似,所以我们在这里不会详细说明。

让我们看看处理界面不同按钮的 JavaScript 文件。界面的每个按钮基本上都链接到一个 JavaScript 函数,该函数将正确的参数发送到 Arduino Yún,通过 PHP 文件。例如,stop按钮调用以下函数:

function stopRobot(){$.get( "update_state.php", {command: "stop"} );
}

同样,我们使用使机器人全速向前的函数。要使机器人向左或向右转,我们可以实现更复杂的行为。我们通常想要的不是让机器人自己连续转动,而是例如,转动四分之一圈。这就是我们在本项目中采取的方法变得强大的地方。我们可以在服务器端直接这样做,而无需更改 Arduino 板上的草图。

因此,为了在给定的时间内向右转,例如,我们将在服务器端实现一系列命令,然后停止。这是通过以下代码完成的:

function turnRight(){$.get( "update_state.php", { command: "turnright"} );sleep(350);$.get( "update_state.php", { command: "stop"} );
}

sleep函数本身是在同一文件中实现的,它通过比较自函数被调用以来经过的时间来工作,如下面的代码所示:

function sleep(milliseconds) {var start = new Date().getTime();for (var i = 0; i < 1e7; i++) {if ((new Date().getTime() - start) > milliseconds){break;}}
}

当然,我们邀请您玩转这个睡眠功能,以获得期望的角度。例如,我们设置了睡眠函数,每次我们按下向右转按钮时,机器人大约会转动四分之一圈。

界面的代码可在项目的 GitHub 仓库中找到:github.com/openhomeautomation/geeky-projects-yun/tree/master/chapter4/remote_control

现在,是时候开始这个项目了。确保将所有文件放置在您的网络服务器根目录下,并确保网络服务器正在运行。然后,在浏览器中打开您的网络服务器文件夹(通常通过输入localhost)并打开 HTML 文件。该项目还包含一个 CSS 样式表,用于使界面看起来更好。以下是在您的浏览器中应该看到的内容:

构建计算机界面

显示超声波传感器距离读数的字段应该每秒自动更新,这样您可以立即看到它是否工作正常。尝试将您的手或物体放在机器人前面,数值应该相应地改变。

在让机器人移动之前,我们建议您在机器人仍然站在一个小支架上时测试不同的按钮,这样它就不能移动了。确实,如果您的服务器或 Arduino 草图中有错误编码,您的机器人将不再响应,并会在您的家中随机撞击物体。

您现在也可以测试不同的按钮。您可以特别关注使机器人向左或向右转动的按钮,并在 PHP 代码中调整sleep()函数,使它们正好做您想要的事情。请注意,当您的机器人移动时,机器人前方超声波传感器检测到的距离会相应更新。

摘要

让我们看看本章的主要收获是什么:

  • 我们开始这个项目时,是从不同的组件构建机器人的,例如机器人底盘、直流电机、超声波传感器和不同的 Arduino 板。

  • 然后,我们构建了一个简单的草图来测试直流电机和超声波距离传感器。

  • 下一步是构建两个 Arduino 草图来远程控制机器人:一个用于 Arduino Uno 板,另一个用于 Yún 板。

  • 在项目的最后,我们构建了一个简单的网络界面来远程控制机器人。该界面由几个按钮组成,用于使机器人移动,还有一个字段,持续显示机器人前方安装的超声波传感器的测量值。

现在我们来看看您还能做些什么来改进这个项目。例如,您可以使用超声波传感器数据使机器人相应地行动,例如避免撞墙。

最后,你还可以向机器人添加许多硬件组件。你可以做的第一件事是在机器人周围添加更多的超声波传感器,这样你就可以检测到机器人侧面的障碍物。你也可以想象给机器人添加一个加速度计和/或陀螺仪,这样你就可以确切地知道它要去哪里以及以什么速度行驶。

你甚至可以想象将这个项目与第三章中的项目“制作你自己的云连接摄像头”结合起来,并将一个 USB 摄像头连接到机器人上。这样,你就可以通过 Web 界面实时直播机器人所看到的画面,同时控制它!

我希望这本书能给你一个关于 Arduino Yún 可以为你的 Arduino 项目添加什么的良好概述。通过书中的四个项目,我们使用了 Arduino Yún 的三个主要功能:强大的嵌入式 Linux 机器、板载 Wi-Fi 连接以及 Temboo 库来将板子与网络服务接口。现在,你可以利用这本书中学到的知识来构建基于 Arduino Yún 的自己的应用程序!

http://www.hskmm.com/?act=detail&tid=22776

相关文章:

  • 2025雕塑厂家TOP企业品牌推荐排行榜,婚庆泡沫雕塑,玻璃钢,城市地标不锈钢,校园筑铜,道具,文旅,婚礼堂泡沫,直播间实景泡沫,水泥景观,商业美陈发光雕塑公司推荐!
  • Code--Blocks-和-C---应用开发-全-
  • 深入解析:(27)APS.NET Core8.0 堆栈原理通俗理解
  • VMware Service某些服务关闭导致虚拟机开机无法获取IP地址
  • 2025中国无缝钢管厂家 TOP 品牌权威推荐,SA106 无缝钢管,A106B 无缝钢管,SA53B 无缝钢管精选无缝钢管工厂
  • 在AI技术唾手可得的时代,挖掘用户真实需求成为产品成功的关键——某知名设备电量监控工具需求探索
  • 2025 年润滑脂厂家 TOP 企业品牌推荐排行榜,道达尔润滑脂,工业润滑脂,合成润滑脂,高温润滑脂,轴承润滑脂推荐这十家公司!
  • 2025切割机厂家TOP企业品牌推荐排行榜,五轴水刀,大理石水刀,全自动水刀,高压水刀,手持式水刀,高压水刀,大理石水刀,便携式水刀切割机公司推荐!
  • 二十八、API之《System 类》——与框架交互的“桥梁”
  • 2025橡胶木板材厂家TOP企业品牌推荐排行榜,泰国橡胶木板材,橡胶木免漆板,橡胶木 PET,橡胶木门板,AA 橡胶木,橡胶木指接板公司推荐!
  • 2025润滑油供应商最新权威推荐排行榜:聚焦耐磨润滑油、工业润滑油、鑫美工业润滑油、壳牌润滑油、道达尔润滑油助力企业采购决策
  • 多状态循环泵控件开发
  • 2025活塞杆厂家TOP企业品牌推荐排行榜,精密,不锈钢,调制,超长,油缸,气缸,镀铬,大直径,精细活塞杆推荐这十家公司!
  • 2025房屋鉴定机构服务平台推荐排行榜,房屋安全评估,承载力,工程质量,危房,受损伤,舞台架结构安全鉴定,房屋消防电器安全鉴定评估,火灾后房屋安全鉴定推荐这十家公司!
  • 实用指南:WSL2搭建Hadoop伪分布式环境
  • 3整数规划-分支定界法
  • [apple pencil二代充不上电]
  • 分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南
  • 2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选
  • 2025试验机实力厂家品牌公司最新权威推荐榜:精准测试与技术创新标杆之选
  • AI元人文:价值共生体系统——构建人机文明的演进基石——DeeoSeek融合
  • 2025喷涂厂家TOP企业品牌推荐排行榜,喷涂、喷涂设备、 喷涂生产线、喷涂流水线推荐这十家公司!
  • 完整教程:【JAVA】【BUG】经常出现的典型 bug 及解决办法
  • 浅析 AC 自动机
  • 2025百度官网认证作用代理商推荐,北京益百科技通过官网认证,助力企业优化搜索排名,提升用户体验,降低营销成本
  • 读人形机器人28智慧城市2
  • VMware ESXi 9.0.1.0 发布 - 领先的裸机 Hypervisor
  • VMware vSphere 9.0.1.0 发布 - 企业级工作负载平台
  • 《索引实战:结构与场景解析》 - 详解
  • Hadoop完全分布式配置 - 实践