如何从Arduino控制飞利浦Hue灯(以及添加运动传感器)

飞利浦Hue灯系列肯定不便宜(有一些替代方案可以制作自己的Hue应用程序。今天我将向您展示如何通过Arduino控制Hue灯-然后添加一个简单的运动传感器。<

我们为什么要这样做?因为家庭自动化系统非常僵化和昂贵,通过学习如何从Arduino控制Hue,您可以打开各种定制的家庭自动化项目的门,不要被现成的组件所击败。如果不是一起黑客,那就试试这8个出色的Hue应用吧。

The Hue System

让我们掌握技术稍等一下,您便会知道正在使用的底层系统。Hue light使用称为ZigBee的短程无线协议创建了一个网状网络-具体来说,它们已通过ZigBee Light Link认证,这意味着其他ZLL产品也应能工作(在理论上)与色相。

尽管基本上,ZigBee的网状联网功能意味着每个新灯泡都会扩展网络,并将消息中继到其他灯泡。这意味着,如果您在控制房子另一侧的照明时遇到麻烦,请尝试在两者之间放置另一个照明。

Zigbee是一个很好的协议,但是与Wi-Fi完全不同或有线计算机网络,因此我们需要飞利浦色相桥将两者结合在一起。色相桥运行经过修改的开放源代码Linux固件,该固件广播基本的Web服务器。

通过与该本地Web服务器进行交互,您可以找出灯的当前状态并进行控制。

这是一个非常简单的系统,已经可以用于DIY项目。飞利浦(Philips)使这件事变得如此容易受黑客攻击。

入门

在访问API文档之前,您需要注册为开发人员。它是免费的,但您需要接受条款和条件。立即进行操作。

熟悉标准Web服务或Javascript的任何人都应该可以使用Hue:所有数据都以JSON数据包的形式进行传递和接收。

看看实际上,您需要知道色相桥的IP地址。有几种方法可以做到这一点:

  • 在路由器的管理界面中查看DHCP地址分配表
  • 运行诸如IP Scanner Home之类的网络映射程序
  • Ping“ philips-hue.home"
  • 完成后,继续使用并在浏览器地址栏中输入该字符附加到URL的debug / clip.html 。就我而言,这是:

    http://192.168.1.216/debug/clip.html

    这是一个调试工具,可让您通过简单的网络界面发送和接收JSON数据包。第一步是在Hue Bridge本身上启用开发人员配置文件-出于安全原因默认情况下将其禁用。将以下内容粘贴到BODY字段中,将URL保留为 / api / ,然后通过单击 post按钮发送POST请求:

    {"devicetype":"test user","username":"newdeveloper"}

    第一次执行此操作时,您会在响应中的某处看到“未按下链接按钮"。这是一项安全功能,要求您使用的每个新应用程序都经过物理授权。去找到您的网桥,按一下按钮,然后在30秒内再次发送相同的请求。这次您将获得不同的响应,并且该用户将得到授权。如果您想使用其他用户名,请阅读有关创建用户的API文档。

    现在就足够了。

    设置用户之后,您应该与之交互的基本URL就会变为 / api / newdeveloper / 。您可以发送GET请求以查找Bridge当前知道的有关连续的灯光,警报,场景以及已使用的应用程序简短日志的所有信息。这是单个灯泡包含的一些状态信息的示例。

    "state": {	"on": true,	"bri": 254,	"hue": 14910,	"sat": 144,	"effect": "none",	"xy": [		0.4596,		0.4105	],	"ct": 369,	"alert": "none",	"colormode": "ct",	"reachable": false	},"type": "Extended color light","name": "Bedroom 1","modelid": "LCT001",

    请注意,如果灯泡打开,则“ on":true 状态实际上不会显示给您或不;仅根据网桥设置,应该处于启用状态。 “ reachable":false 可以指示灯泡太远,或者只是在电源开关处关闭了灯泡。

    将其集成到Arduino中的最后一个示例:确保其中一个灯可见且亮着,并且知道它是哪个数字。将URL更改为 / api / newdevelopers / lights / 1 / state (将数字更改为light),并发送包含以下数据的PUT请求:

    {"hue": 50100,"sat":255,"bri":255}

    您应该看到您的灯像这样反应:

    您要做的是将新状态推入灯泡。您还可以添加“过渡时间",这是一种原始的动画方法,指示您希望状态更改花费多少秒。

    颜色可以通过多种方式设置,但不幸的是没有简单的方法来发送RGB值。在上面的示例中,我们发送了色调饱和度 bri ghtness。尝试更改色相值并再次发送PUT请求。

    从Arduino工作

    有一个名为ArduinoHue的现有Hue / Arduino库,Philips自己在API文档中链接到该库,但是该库的问题在于它通过USB连接与您的PC进行通信,这也需要不断运行Python应用程序。 Eugh 。您最好在那时候让计算机运行整个过程,然后完全切掉Arduino。

    相反,我将向您展示如何使用以太网从Arduino 控制色相盾。您的Arduino无需连接到计算机,因此您可以在任何可以放置以太网电缆的地方独立运行。实际上,它也可以与Wi-Fi防护罩一起使用,但我没有一个防护罩。

    如果您想跳过,请在下面嵌入完整的示例代码,或在这里可用。我改编自Gilson Oguime发布的示例。如果您以前从未玩过以太网屏蔽,则可能想快速浏览一下Web客户端教程-我假定对此有所了解,并且不会涉及用于建立网络的代码IP等。我们还向您展示了如何使用以太网屏蔽创建一个小型Web服务器。

    创建状态更改

    创建一个新状态以推送到灯泡创建新的 String 变量并转义所有双引号的简单情况。我还在其中添加了 random()函数,以创建具有一定动态性的动画。尝试对不同的颜色也使色相变量也随机化。

    String command = "{\"on":true,\"hue\":50100,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";

    发送命令

    要实际发送命令,您需要一个名为setHue()的辅助函数,该函数将灯号和将命令字符串作为参数,如下所示:

    setHue(1,command);

    然后它所做的就是将其连接到网桥,将命令作为PUT请求吐出,以及所有其他涉及创建HTTP请求的废话。

    client.print("PUT /api/");client.print(hueUsername);client.print("/lights/");client.print(lightNum);client.println("/state HTTP/1.1");client.println("keep-alive");client.print("Host: ");client.println(hueHubIP);client.print("Content-Length: ");client.println(command.length());client.println("Content-Type: text/plain;charset=UTF-8");client.println(); // blank line before bodyclient.println(command); // Hue command

    添加运动传感器

    最后,我将一个简单的HC-SR501运动传感器连接到数字I / O引脚2。检测到运动时,会推入一系列状态到桥上放两个灯泡,以创建缓慢的动态动画。当运动传感器停用时,将向两个发送单个关闭命令。理想情况下,它们会恢复为在检测到运动之前所处的状态,但是逻辑并不是那么聪明-我们只是打开和关闭它们。

    限制

    尽管公认的未优化代码,但Arduino的网络接口几乎要花一秒钟的时间发送单个命令请求。我在Mac上使用相同的以太网连接测试了相同的命令,它的速度是它的十到二十倍(如果您要测试,这里是AppleScript)。因此,Arduino无法实现任何类型的快速动画(我试图创建闪烁的烛光效果)。对于大多数项目而言,对于高速灯光动画而言,这应该不是问题,但是意识到这一限制是一件好事。

    要完全解析从网桥返回的任何JSON响应也很困难; Arduino上没有足够的RAM来存储所有原始数据。因此,您可能希望将自己限制在发送范围内。

    了解色相

    现在,您已经掌握了如何完全独立地控制色相的知识,它将打开顺化家庭自动化黑客世界。真正的问题是:你会做什么?

    标签: Arduino Philips Hue 智能照明