之前,我们发现了 Homie 库,它简化了 Arduino 代码的编写,可以开发通过 MQTT 消息进行通信的连接对象 ESP8266。在本文中,我们将更详细地讨论如何在 Arduino 程序中使用该库。该库提供了大量的功能,可以最大限度地个性化代码。这可能是编写基于 MQTT 的程序最强大的库。 在这里,我们将只讨论允许用最少代码编写程序的基本功能。从一个例子开始总是比较容易,我们将根据 DHT22 做一个小的温度探头。
本文中用到的硬件有:
Homie 是一个简化 Arduino 程序写作的库。它支持这里介绍的 MQTT 通信协议。Homie 支持以下技术方面:
这是运行 Homie 的最小程序。
#include <homie.h>
void setup() {
Serial.begin(115200);
Serial << endl << 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()
循环中:
最后,在 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 = );
构造函数需要以下参数:
这给出了一个发布两个 DHT22 的测量数据:
HomieNode temperatureNode("temperature","temperature");
HomieNode humidityNode("humidity","humidity");
为了定期发布测量结果,我们将简单地测试一个时间间隔。Homie 库不使用定时器(例如 SimpleTimer 库)。Homie 将被赋予它将在每个周期执行的 Handle r函数。处理程序在 Arduino 的 setup
里显示:
Homie.setLoopFunction(loopHandler);
现在,只需测试函数中两次发送之间所经过的时间。
void loopHandler() {
if (millis() - lastTemperatureSent >= 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() << "Temperature: " << t << " °C | humidity: " << h << "%" << endl;
if ( !isnan(t) ) {
temperatureNode.setProperty("temperature").send(String(t));
humidityNode.setProperty("humidity").send(String(h));
}
}
}
要发布测量数据,您必须使用 setProperty
方法("通用名".send(价值)。
现在,是时候看看 Homie 的消息是什么样子了。 一般来说,它采取以下形式:
homie / 设备名 / 节点名 / 属性名和值
或者更正式的:
homie / 设备 ID / 节点 ID / 属性值
setProperty()
方法分配属性以下是我们将要举的例子:
homie/demohomie-projetsdiy/temperature/temperature 27.50
如果您想以 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"
以下是你完全需要在 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 >= 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() << "Temperature: " << t << " °C | humidity: " << h << "%" << 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 << endl << 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/
观光\评论区