在 ESP8266 上制作一个 Web 物体

今天,我将引导您使用廉价的 现成的 ESP8266 板 创建一个简单的Web 物体

Lamp example running on the ESP8266

Web 物体的强大功能来自它们连接网页数字世界与物体物理世界的能力。我们最近发布了 Things 框架,这是一个旨在简化创建新 Web 物体过程的软件集合。此示例中相关的库是 webthing-esp8266 库,它使 Arduino 编程的 ESP8266 板连接到 Web of Things 变得轻而易举。我们希望这能够降低创建使用我们的网关和 Web Thing API 的引人入胜的体验的门槛。

我们旅程的第一步是安装 Arduino IDE 及其 ESP8266 板支持。访问 Adafruit 的 ESP8266 文档,其中包含有关设置的非常详细的演练。在设置结束时,您应该安装了 Arduino IDE,它提供了 ESP8266WiFi、ESP8266mDNS 和 ESP8266WebServer 库。

System diagram

接下来,让我们安装 ArduinoJson 和 webthing-esp8266 库。要安装 ArduinoJson,请转到草图 > 包含库 > 管理库,搜索 ArduinoJson,然后单击安装按钮。

Install ArduinoJson library

下载 webthing-esp8266 的过程稍微复杂一些。从 GitHub 发布页面 下载库的 zip 文件,然后使用 Arduino IDE 的草图 > 包含库 > 添加 ZIP 库选项添加它。

Add library and open LED example

如果您更喜欢使用 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 中创建一个新的草图。现在我们有了编写代码的地方,我们需要包含此草图使用的所有库。这些库是 ESP8266WiFiWiFiClient(用于连接到我们的 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());

完成这些样板代码后,我们可以将 ThingPropertiesThingDeviceWebThingAdapter 绑定在一起。灯需要知道它拥有 lampOnlampLevel 属性,而适配器需要知道灯的存在。

  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 级计算机向导。

更多由 James Hobin 撰写的文章……


3 则评论

  1. James Hobin

    webthing-esp8266 库也已在 PlatformIO 上发布:https://platformio.org/lib/show/5397/webthing-esp8266

    2018 年 4 月 26 日 下午 11:04

  2. Ian

    不错,但为什么延迟如此之长?一个简单的开/关命令需要 6 秒。

    2018 年 4 月 26 日 下午 2:24

    1. James Hobin

      好问题!ESP8266 的 mDNS 库指示其客户端在每次查找 esp8266.local 主机名后刷新其缓存,这意味着在每个请求的开头,网关都需要重新执行查询以确定哪个设备拥有 esp8266.local。此查询需要 5 秒,然后实际的服务器请求需要大约 0.05 秒。我今天将发布网关事物代理支持的新版本,该版本将执行自己的 mDNS 缓存并具有更正确的响应时间。

      编辑:更新,此行为仅发生在 Mac OS 上,在 Raspberry Pi 上,mDNS 按照预期进行缓存。我将上传一个在错误较少的操作系统上的行为新视频。

      2018 年 4 月 27 日 上午 7:10

本文的评论已关闭。