您的位置:首页 > 科技 > 能源 > 【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测

【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测

2024/10/5 19:16:37 来源:https://blog.csdn.net/qq_46079439/article/details/142218807  浏览:    关键词:【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测

IPV6+Home Assistant[ESP32+MQTT+DHT11+BH1750]传感器采集上传监测

  • 1 背景
  • 2 实现效果
  • 3 Home Assistant配置
    • 3-1 MQTT配置
    • 3-2 yaml 配置
    • 3-3 加载配置
  • 4 ESP32搭建
    • 4-1 开发环境
    • 4-2 工程代码
  • 5 实现效果

1 背景

在上一小节【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)我们在docker搭建了Home Assistant,需要有设备才能让系统跑起来。

我手上有一块ESP32开发板,以及两个我们熟悉的传感器:DHT11和BH1750,在这一节我们实现将ESP32接入Home Assistant,让传感器采集的数据通过ESP32上传到Home Assistant。

在这里我们需要一个辅助的工具:MQTT。
MQTT的搭建可参考我的博客 阿里云服务器centos7上手安装-6使用EMQ搭建MQTT服务器。

2 实现效果

在教程开始之前,可以先看一下我现在的页面效果,这是手机Home Assistant的效果。

关键信息有以下几点:
1 - 手机没有连接WIFI,所以我现在是通过公网IPV6访问我的服务器。
2 - 接入的传感器有三项:湿度、光照强度、温度,这些都是实时采集的数据。

在这里插入图片描述
下面开始配置我们的Home Assistant。

3 Home Assistant配置

3-1 MQTT配置

1、添加 MQTT 集成
添加你电脑搭建的MQTT服务器
在这里插入图片描述

2、(非必须)禁用自发现
在这里插入图片描述

3-2 yaml 配置

我这里是使用 bt 的 docker 安装的,关键的配置在这里
/config/configuration.yaml

在这里插入图片描述
新旧版本的yaml配置可能有差异,我这里的是2024.9.1版本。

在这里插入图片描述

以下是我的配置

# Loads default set of integrations. Do not remove.
default_config:# Load frontend themes from the themes folder
frontend:themes: !include_dir_merge_named themesautomation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml# Example configuration.yaml entrymqtt:sensor:- name: "Bedroom Light"state_topic: "home/bedroom/light"unit_of_measurement: "lx"  # 光照强度单位unique_id: "bedroom_light_level_01"- name: "Bedroom Temperature"state_topic: "home/bedroom/data"value_template: "{{ value_json.temperature }}"unit_of_measurement: "°C"icon: "mdi:thermometer"  # 设置图标device_class: "temperature"  # 设置设备类别unique_id: "bedroom_temperature_01"- name: "Bedroom Humidity"state_topic: "home/bedroom/data"value_template: "{{ value_json.humidity }}"unit_of_measurement: "%"icon: "mdi:water-percent"  # 设置图标device_class: "humidity"  # 设置设备类别unique_id: "bedroom_humidity_01"

其中:
1- 注意yaml的格式!添加实体到mqtt->sensor节点下
2- name :在系统上显示的实体名字
3- state_topic:指定数据上传到哪个Topic下
4- unit_of_measurement:单位
5- unique_id:全局唯一ID
6- icon:显示的图标
7- device_class:设备类型
8- value_template:可解析json数据

9- BH1750采集的光照强度我们直接将采集到的数值上传到mqtt相应的主题即可,这里是 home/bedroom/light
10- DHT11具有温度和湿度,可以将数据上传到单个Topic,也可以分成两个Topic,这里用前者作为例子,使用json打包上传数据,然后通过"{{ value_json.temperature }}""{{ value_json.humidity }}"解析数据进行渲染,系统自动解析。
11- 给每个实体一个 unique_id

其他字段我们后续慢慢探索

3-3 加载配置

可以在界面中重新加载配置
在这里插入图片描述
然后可以在MQTT看到3个实体了

在这里插入图片描述

4 ESP32搭建

4-1 开发环境

编程软件:Arduino
开发板:ESP-WROOM-32
硬件1:DHT11
硬件2:BH1750
杜邦线:若干
老演员了
(都是老演员了)

4-2 工程代码

Arduino相关的库自己下载哈

#include <Wire.h>
#include <WiFi.h>
#include <BH1750.h>
#include <DHT.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <ArduinoJson.h>#define DHTPIN 4          // DHT11 数据引脚连接到 GPIO 4
#define DHTTYPE DHT11     // DHT 11// Wi-Fi 和 MQTT Broker 配置
const char* ssid = "mywifi_2.4G";            // 替换为你的 Wi-Fi SSID
const char* password = "12345666";           // 替换为你的 Wi-Fi 密码
const char* mqttServer = "192.168.66.118";   // 替换为你的 MQTT Broker IP
const int mqttPort = 1883;                    // 默认 MQTT 端口
const char* mqttUser = "YOUR_MQTT_USERNAME"; // 如果需要,替换为你的用户名
const char* mqttPassword = "YOUR_MQTT_PASSWORD"; // 如果需要,替换为你的密码DHT dht(DHTPIN, DHTTYPE);
WiFiClient wifiClient;
Adafruit_MQTT_Client mqtt(&wifiClient, mqttServer, mqttPort, mqttUser, mqttPassword);// 初始化 BH1750
BH1750 lightSensor;// MQTT 主题
Adafruit_MQTT_Publish sensorDataPub = Adafruit_MQTT_Publish(&mqtt, "home/bedroom/data"); // 温湿度主题
Adafruit_MQTT_Publish lightDataPub = Adafruit_MQTT_Publish(&mqtt, "home/bedroom/light"); // 光照强度主题void setup() {Serial.begin(115200);dht.begin();// 初始化 I2CWire.begin(21, 22); // 对于 ESP32,指定 SDA 和 SCL 引脚// 初始化 BH1750if (lightSensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23)) {Serial.println("BH1750 initialized successfully");} else {Serial.println("Failed to initialize BH1750!");}// 连接到 Wi-FiconnectToWiFi();mqtt.connected();delay(1000);
}void loop() {// 确保 Wi-Fi 连接if (WiFi.status() != WL_CONNECTED) {connectToWiFi();}// 确保 MQTT 客户端连接if (!mqtt.connected()) {reconnectMQTT();}mqtt.processPackets(10000); // 处理 MQTT 数据包// 上传温湿度数据publishTemperatureAndHumidity();// 上传光照强度数据publishLightData();delay(5000); // 每5秒读取一次
}// 连接到 Wi-Fi
void connectToWiFi() {Serial.print("Connecting to WiFi...");WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("Connected to WiFi!");
}// 重新连接到 MQTT Broker
void reconnectMQTT() {while (!mqtt.connected()) {Serial.println("Attempting MQTT connection...");// 尝试连接if (mqtt.connect()) {Serial.println("connected");} else {Serial.println("failed, try again in 5 seconds");delay(5000); // 等待 5 秒后重试}}
}// 上传温湿度数据
void publishTemperatureAndHumidity() {// 读取温度和湿度float h = dht.readHumidity();float t = dht.readTemperature(); // 摄氏度// 如果读取失败,返回 NANif (isnan(h) || isnan(t)) {Serial.println("Failed to read from DHT sensor!");return;}// 控制温度和湿度在一位小数t = round(t * 10) / 10.0; // 保留一位小数h = round(h * 10) / 10.0; // 保留一位小数// 创建 JSON 数据StaticJsonDocument<512> jsonDoc; // 增加文档大小jsonDoc["temperature"] = t;jsonDoc["humidity"] = h;// 使用 String 类型存储序列化后的 JSON 数据String jsonString;serializeJson(jsonDoc, jsonString); // 将 JSON 数据序列化到 String// 打印主题和发布的消息Serial.print("Publishing to topic: home/bedroom/data");Serial.print(", Message: ");Serial.println(jsonString);// 发布 JSON 数据到 MQTTif (!sensorDataPub.publish(jsonString.c_str())) {Serial.println("Failed to publish sensor data.");}// 打印到串口监视器Serial.print("Temperature: ");Serial.print(t);Serial.print(" °C, Humidity: ");Serial.print(h);Serial.println(" %");
}// 上传光照强度数据
void publishLightData() {// 读取光照数据float lightLevel = lightSensor.readLightLevel(); // 读取光照数据if (lightLevel == -1 || lightLevel == -2) {Serial.println("Failed to read light level!");} else {// 打印主题和光照强度Serial.print("Publishing to topic: home/bedroom/light");Serial.print(", Light Level: ");Serial.println(lightLevel);// 发布光照强度数据到 MQTTif (!lightDataPub.publish(lightLevel)) {Serial.println("Failed to publish light data.");}}
}

5 实现效果

  • 采集数据的趋势图:

在这里插入图片描述
在这里插入图片描述

  • 串口打印输出:

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com