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

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

时间:2024-09-13 22:25:07浏览次数:14  
标签:BH1750 Assistant bedroom mqtt MQTT IPV6 println Serial include

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

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 themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

# Example configuration.yaml entry

mqtt:
  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();
  
  // 初始化 I2C
  Wire.begin(21, 22); // 对于 ESP32,指定 SDA 和 SCL 引脚
  
  // 初始化 BH1750
  if (lightSensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23)) {
    Serial.println("BH1750 initialized successfully");
  } else {
    Serial.println("Failed to initialize BH1750!");
  }

  // 连接到 Wi-Fi
  connectToWiFi();
  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(); // 摄氏度

  // 如果读取失败,返回 NAN
  if (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 数据到 MQTT
  if (!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);

    // 发布光照强度数据到 MQTT
    if (!lightDataPub.publish(lightLevel)) {
      Serial.println("Failed to publish light data.");
    }
  }
}

5 实现效果

  • 采集数据的趋势图:

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

  • 串口打印输出:

在这里插入图片描述

标签:BH1750,Assistant,bedroom,mqtt,MQTT,IPV6,println,Serial,include
From: https://blog.csdn.net/qq_46079439/article/details/142218807

相关文章

  • 搭建ipv6并发代理池
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!学习目标ounter(lineipv6代理池学习前置环境配置要求linux系统。我是pve下的ubuntugolang的环境我......
  • BitComet比特彗星解决端口阻塞问题/黄灯问题,如何使用IPv6实现公网访问
    分析根据其本身的描述,就可以知道,黄灯的本质是端口对外网不公开。因此我们需要做以下工作:拥有一个外网IP/公网IP一般都是不给分配IPv4的,所以我们可以使用IPv6,这个默认都是开的。一般光猫默认的设置就是ipv4/ipv6,两种都开放使用。开放对应端口的防火墙说起来简单,实际上......
  • 网站支持IPv6和不支持有什么区别?
    在当今数字化时代,互联网已经成为人们生活和工作中不可或缺的一部分。随着互联网的不断发展,IPv6作为新一代互联网协议,正逐渐被广泛应用。网站支持IPv6和不支持IPv6究竟有什么区别呢?一、IPv6的背景与优势IPv6是“InternetProtocolVersion6”的缩写,即互联网协议第六版。它是为了......
  • uAI - AI Assistant 人工智能辅助助手插件
    uAI助手支持GPT3.5Turbo、GPT3.5Turbo16K、GPT4-8k和GPT4Turbo-128k什么是uAI助理?uAIAssistant是Unity游戏引擎的强大扩展,它使用GPTAI帮助游戏开发人员轻松创建专业代码和引人入胜的游戏内容。你需要一个OpenAI密钥才能使用uAI助手!阅读我们的文档以获取更多说明。......
  • IPv6的优势分析
    本文分享自天翼云开发者社区《IPv6的优势分析》,作者:没烦恼IPv6的优势分析1.更大的地址空间IPv6中IP地址的长度为128位,其地址容量则达到了2^128个,远远大于IPv4地址容量,足以满足日益增长的互联网用户以及未来物联网地址的分配需求。2.报文结构更精简IPv4的报文长度不固定,且有一......
  • IPv6协议——互联网通信协议第六版
    引言  IPv6是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。近些年,随着我国大力推动IPv6规模部署和应用,目前中国的IPv6渗透率已超过70%。对于车载以太网来说,目前IPv4是车载IP通信的主流协议,但随着车辆的智能化、网联化程度不断提高,IPv6协议应......
  • IPv6基于策略的地址分配
    IPv6基于策略的地址分配RA的周期性发送使用的是组播方式,但是针对RS的回复使用组播和单播两种可能;如果RA都是以组播方式发送,那么同一个广播域下的所有终端都可以收到,如果要基于终端mac/link-local地址来控制分配策略,则应该使用单播方式回复,以限制RA被接收的范围。关闭周期性......
  • 基于STM32F407ZGT6用BH1750在OLED显示屏上显示光照数据,根据光照强度控制小灯亮灭(路灯
    占空比:高电平占整个电平周期的持续时长,从而控制小灯的亮度,小灯亮度的控制需用定时器的输出比较功能。PWM部分可以参考这篇文章PWM——基于STM32F407ZGT6开发板-CSDN博客此外我们还需要了解IIC的工作原理1.pwm.c   #include"public.h"/*pwm控制led实现呼吸灯1.......
  • 如何开启让设备获取到IPv6?
    前言现在许多小伙伴拉的宽带基本上都是光猫进行拨号的。这个就导致很多小伙伴不知道如何让设备获取IPv6。但好像还有小伙伴分不清光猫拨号和光猫桥接的区别,其实它们的区别就在于让设备直连光猫的网口或者光猫的Wi-Fi,就会出现两种情况:如果设备能上网,那就是光猫拨号模式;如......
  • [计算机网络] IPv6
    1IPv6概述引言近期突发奇想,能不能用IPv6的公网地址,给家里的NAS做内网穿透。技术上是可行的。只是必须确保是IPv6的公网地址。大学学的IPv6的知识,早就抛到九霄云外了,故此需要重新学习,并记录之。1.1诞生的由来:32位的IPv4数量受限,已分配殆尽192.168.1.1,这......