今天,我将引导您使用廉价的 现成的 ESP8266 板 创建一个简单的Web 物体。
Web 物体的强大功能来自它们连接网页数字世界与物体物理世界的能力。我们最近发布了 Things 框架,这是一个旨在简化创建新 Web 物体过程的软件集合。此示例中相关的库是 webthing-esp8266 库,它使 Arduino 编程的 ESP8266 板连接到 Web of Things 变得轻而易举。我们希望这能够降低创建使用我们的网关和 Web Thing API 的引人入胜的体验的门槛。
我们旅程的第一步是安装 Arduino IDE 及其 ESP8266 板支持。访问 Adafruit 的 ESP8266 文档,其中包含有关设置的非常详细的演练。在设置结束时,您应该安装了 Arduino IDE,它提供了 ESP8266WiFi、ESP8266mDNS 和 ESP8266WebServer 库。
接下来,让我们安装 ArduinoJson 和 webthing-esp8266 库。要安装 ArduinoJson,请转到草图 > 包含库 > 管理库,搜索 ArduinoJson,然后单击安装按钮。
下载 webthing-esp8266 的过程稍微复杂一些。从 GitHub 发布页面 下载库的 zip 文件,然后使用 Arduino IDE 的草图 > 包含库 > 添加 ZIP 库选项添加它。
如果您更喜欢使用 PlatformIO 而不是 Arduino IDE,则可以从 PlatformIO 注册表 安装 webthing-esp8266。
现在我们已经完成了所有先决条件,让我们开始有趣的部分。webthing-esp8266 库的工作原理是组装一组组件,这些组件协同工作以公开 Web Thing API。主要协调器是 WebThingAdapter
,它跟踪 ThingDevice
,而 ThingDevice
又包含各种 ThingProperties
。
WebThingAdapter
知道如何与我们的网关进行 Web of Things API 通信,并处理网关发现和与 ThingDevice
交互所需的所有转换。ThingDevice
代表我们要放在网络上的物理对象。在一个简单的案例中,这可能是一些 LED。一旦我们变得更加复杂,这可能是一架四旋翼飞行器、一个 OLED 显示器,甚至是一个特斯拉线圈。在我们深入研究之前,让我们逐步了解一个基本示例,它公开 ESP8266 的内置 LED。
首先,在 Arduino IDE 中创建一个新的草图。现在我们有了编写代码的地方,我们需要包含此草图使用的所有库。这些库是 ESP8266WiFi
和 WiFiClient
(用于连接到我们的 WiFi 网络)、Thing
(用于创建兼容 Web of Things 的对象)以及 WebThingAdapter
(用于将这些对象转换为 Web 服务器)。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Thing.h>
#include <WebThingAdapter.h>
下一步是配置我们使用的常量。这些常量是 ssid
(用于我们的 WiFi 网络名称)、password
(用于其密码)和 lampPin
(用于我们要控制的 LED 的引脚)。
const char* ssid = "......";
const char* password = "..........";
const int lampPin = LED_BUILTIN;
现在,我们要指定我们要创建的 Web 物体的类型。首先,我们创建适配器,它设置板的名称。如果您希望在同一网络上拥有多个 ESP8266 板,则需要确保它们的名称是唯一的。
WebThingAdapter adapter("esp8266");
然后,我们需要指定要在网关上拥有的 ThingDevice
。在本例中,我们要将 LED 作为 dimmableLight
公开,称为“我的灯”,这将允许我们从网关打开和控制其亮度。
ThingDevice lamp("lamp", "My Lamp", "dimmableLight");
接下来,我们定义了我们希望 ThingDevice
拥有的属性。一个 dimmableLight
需要两个属性:“on”和“level”。
ThingProperty lampOn("on", "Whether the lamp is turned on", BOOLEAN);
ThingProperty lampLevel("level", "The level of light from 0-100", NUMBER);
在设置函数的开头,我们初始化 LED,连接到我们的 WiFi 网络,并打开串行端口以进行调试。
void setup() {
pinMode(lampPin, OUTPUT);
digitalWrite(lampPin, HIGH);
analogWriteRange(255);
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
完成这些样板代码后,我们可以将 ThingProperties
、ThingDevice
和 WebThingAdapter
绑定在一起。灯需要知道它拥有 lampOn
和 lampLevel
属性,而适配器需要知道灯的存在。
lamp.addProperty(&lampOn);
lamp.addProperty(&lampLevel);
adapter.addDevice(&lamp);
adapter.begin();
Serial.println("HTTP server started");
}
在我们的持续运行的 loop
函数中,我们首先更新适配器,以便它可以处理与网关或任何其他 Web of Things 客户端的通信。接下来,我们根据属性值更新灯光。请注意,我们将 0-100 的亮度级别从 255-0 映射,因为 ESP8266 内置 LED 的亮度是反转的。
void loop() {
adapter.update();
if (lampOn.getValue().boolean) {
int level = map(lampLevel.getValue().number, 0, 100, 255, 0);
analogWrite(lampPin, level);
} else {
analogWrite(lampPin, 255);
}
}
我们的草图完成了!如果您将其上传到您的 ESP8266,您应该能够在网关的“添加物体”列表中看到“我的灯”物体。然后,您可以单击打开和关闭 LED,或单击“splat”图标来控制其亮度级别。
您还可以通过向http://esp8266.local/发出 HTTP 请求来直接控制您的 Web 物体。例如,您可以使用此 curl 命令从终端打开 LED。
curl -X PUT http://esp8266.local/things/lamp/properties/on -H 'Content-Type: application/json' -d '{"on":true}'
这仅仅是您可以使用 Web Thing API 做到的起步。如果您更喜欢在更高级的语言中工作,请查看我们的 其他 Web 物体示例。如果您认为开/关和级别本身不够酷,我们还支持 字符串属性!
关于 James Hobin
致力于使物联网保持自由和开放的 25 级计算机向导。
3 则评论