Homie ESP8266 玩法:发布 DHT22 传感器的 MQTT 测量结果

之前,我们发现了 Homie 库,它简化了 Arduino 代码的编写,可以开发通过 MQTT 消息进行通信的连接对象 ESP8266。在本文中,我们将更详细地讨论如何在 Arduino 程序中使用该库。该库提供了大量的功能,可以最大限度地个性化代码。这可能是编写基于 MQTT 的程序最强大的库。 在这里,我们将只讨论允许用最少代码编写程序的基本功能。从一个例子开始总是比较容易,我们将根据 DHT22 做一个小的温度探头。

本教程使用的硬件

本文中用到的硬件有:

  • Wemos D1 Mini
  • 5/3A micro-usb 充电器
  • 用于 Wemos D1 Mini 的 DHT22 或者 DHT11
  • 探针连接在引脚 D4(GPIO2)

ESP8266 Homie 程序的结构

Homie 是一个简化 Arduino 程序写作的库。它支持这里介绍的 MQTT 通信协议。Homie 支持以下技术方面:

  • 连接到 Wi-Fi 网络和 MQTT 服务器
  • Homie 能够管理与 Wi-Fi 网络、MQTT 服务器的重新连接
  • MQTT 消息的结构化
  • 通过 MQTT 消息进行无线更新

最小程序

这是运行 Homie 的最小程序。

#include <homie.h>

void setup() {
  Serial.begin(115200);
  Serial &lt;&lt; endl &lt;&lt; endl;

  Homie_setFirmware("bare-minimum", "1.0.0"); // The underscore is not a typo! See Magic bytes
  Homie.setup();
}

void loop() {
  Homie.loop();
}

程序开始时必须包含库:

然后在 Arduino 代码的 setup() 循环中:

  • 从版本 2 开始,有必要使用 Serial.begin(115200)函数明确启动串行监视器。Homie 集成了一个消息处理器(记录器),我们将在后面的文章中看到。
  • Homie.setup() 方法初始化库。 调用此方法之前可以指定几个参数。我们将在下一段详细介绍它们。唯一所需的参数和固件名称和版本。 换句话说,你的程序的名字和版本号。

最后,在 Arduino 代码的 loop() 中,用 Homie.loop() 方法更新。

现在,我们将添加一个 DHT22 温度探头,并发布温度和湿度测量。

添加一个节点

每个事件(按开关、按钮、一个受限的传感器…)或测量(温度、湿度、二氧化碳速率、空气中颗粒的数量...)称为节点。要定义一个节点,请使用 HomieNode 方法(文档)。所有节点必须在程序开始时定义(在 Arduino 代码设置之前)。

HomieNode(const char* id, const char* type, std::function<bool(const const="" homierange&="" property,="" range,="" string&="" value)=""> handler = );

构造函数需要以下参数:

  • Id:节点 ID
  • Type:节点类型。 没有强制类型
  • Handler(可选)

这给出了一个发布两个 DHT22 的测量数据:

HomieNode temperatureNode("temperature","temperature");
HomieNode humidityNode("humidity","humidity");

发布数据 - MQTT消息

为了定期发布测量结果,我们将简单地测试一个时间间隔。Homie 库不使用定时器(例如 SimpleTimer 库)。Homie 将被赋予它将在每个周期执行的 Handle r函数。处理程序在 Arduino 的 setup 里显示:

Homie.setLoopFunction(loopHandler);

现在,只需测试函数中两次发送之间所经过的时间。

void loopHandler() {
  if (millis() - lastTemperatureSent &gt;= TEMPERATURE_INTERVAL * 1000UL || lastTemperatureSent == 0) {
    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Affiche les mesures dans le journal - send values to the logger
    Homie.getLogger() &lt;&lt; "Temperature: " &lt;&lt; t &lt;&lt; " °C | humidity: " &lt;&lt; h &lt;&lt; "%" &lt;&lt; endl;
    if ( !isnan(t) ) {
      temperatureNode.setProperty("temperature").send(String(t));
      humidityNode.setProperty("humidity").send(String(h));
    }    
  }
}

要发布测量数据,您必须使用 setProperty 方法("通用名".send(价值)。

MQTT Homie 消息的结构

现在,是时候看看 Homie 的消息是什么样子了。 一般来说,它采取以下形式:

homie / 设备名 / 节点名 / 属性名和值

或者更正式的:

homie / 设备 ID / 节点 ID / 属性值
  • homie 的前缀和设备 ID 是在配置时定义的。
  • 节点 ID 由 HomieNode 方法分配
  • 最后在发布的时候,通过 setProperty() 方法分配属性

以下是我们将要举的例子:

homie/demohomie-projetsdiy/temperature/temperature 27.50

以 JSON 格式发布数据

如果您想以 JSON 格式检索数据,Homie 没有提供以 JSON 格式对数据进行分组和结构化的功能。这并不构成任何问题,因为它足以构建自己的链。 您也可以使用本教程中介绍的 ArduinoJSON 库。 小心,但是,性能就。。。 库不同步地进行许多测量。如果测量频率太快,则发送 MQTT 消息可能会变慢。

这是一小段代码,将温度和测量单位转换为 JSON 格式:

temperatureNode.setProperty("json").send("{\"t:\"" + String(t) + ", \"unit\":\"c\"}");

这就是我们通过以下命令订阅主题 homie/# 所得到的结果:

mosquitto_sub -h localhost -t "homie/#" -v

如果您已经设置了身份验证,请使用以下的命令运行:

mosquitto_sub -h localhost -t "homie/#" -v -u "USER" -P "PASSWORD"

Homie MQTT 库订阅 moquitto

完整的项目代码:Homie + DHT22

以下是你完全需要在 ESP8266 上反转(reverse)的项目的完整代码。不要忘记更换 DHT22 连接的引脚。在这里它被连接到了 D4 引脚,因为我使用了一个用于 Wemos d1 mini 的 DHT22 扩展板。

#include <homie.h>
#include <dht.h>

const int TEMPERATURE_INTERVAL = 300;
unsigned long lastTemperatureSent = 0;

const int PIN_DHT22 = D4;    // Broche - Pin DHT22
DHT dht(PIN_DHT22, DHT22);

HomieNode temperatureNode("temperature", "temperature");
HomieNode humidityNode("humidity", "humidity");

void loopHandler() {
  if (millis() - lastTemperatureSent &gt;= TEMPERATURE_INTERVAL * 1000UL || lastTemperatureSent == 0) {
    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Affiche les mesures dans le journal - send values to the logger
    Homie.getLogger() &lt;&lt; "Temperature: " &lt;&lt; t &lt;&lt; " °C | humidity: " &lt;&lt; h &lt;&lt; "%" &lt;&lt; endl;
    if ( !isnan(t) ) {
      temperatureNode.setProperty("temperature").send(String(t));
      temperatureNode.setProperty("json").send("{\"t\":" + String(t) + ",\"unit\":\"c\"}");
      humidityNode.setProperty("humidity").send(String(h));
      humidityNode.setProperty("json").send("{\"h\":" + String(t) + ",\"unit\":\"%\"}");
      lastTemperatureSent = millis();
    }
    lastTemperatureSent = millis();
  }
}

void setup() {
  Serial.begin(115200);
  Serial &lt;&lt; endl &lt;&lt; endl;

  Homie_setFirmware("demo-dht22", "1.0.0");
  Homie.setLoopFunction(loopHandler);

  Homie.setup();
}

void loop() {
  Homie.loop();
}

在这里你可以用这个代码库实现大量的项目。

原文链接:https://diyprojects.io/first-project-homie-esp8266-publish-mqtt-measurements-dht22-probe/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.