上期 笔者 已经初步搭建好了 home assistant 智能家居环境系统
本期我们继续安装必要插件及进行相关配置,以满足传感器接入条件
本次项目计划使用ESP8266、ESP32无线开发板作为主控单元
计划使用3块开发板
第一块开发板连接dht11温湿度传感器,读取温湿度并上传至home assistant
第二块连接电容触摸板,用作智能开关应用,连接home assistant后可控制灯光亮灭
第三块连接WS2812灯板,作为台灯使用;额外连接ltr329模块实现本地动态调整光亮
要想实现以上功能,
首先需要确认数据上传方案
笔者目前所知有两种
一种是通过ESPHome方案实现
一种是通过ArduinoHa协议库,配合mqtt server方案实现
鉴于笔者对ESPHome接触比较少,而来插件安装不太顺利
此处笔者选用了ArduinoHa协议库及MQTT server方案
既然软件方案已经确定,那么我们就开始安装所需插件并进行必要配置

首先安装emqx插件,插件安装后需要启动运行


账号默认admin
密码默认public
这两个我们后续编写程序时需要填写
接下来点击“设置”->"设备与服务"

添加“MQTT”集成

添加完成后,进行如下配置

到此软件配置已经完成,接下来涉及硬件选型及固件烧录
因为手头有一块Arduino扩展板及esp8266开发板,遂将其组合在一起用于实现温湿度传感器的功能

上图是两块板子分开的状态,接下来将其对插

好了,硬件准备已经就绪,到了固件 编译及烧录的环节了
我们本次主要使用的库连接如下:
https://dawidchyrzynski.github.io/arduino-home-assistant/
https://github.com/dawidchyrzynski/arduino-home-assistant
这个库可通过arduino ide直接安装

安装完成之后就可以编写程序了
编写程序的话可以借助AI平台辅助,笔者这里使用的是豆包
将需求发送给豆包,基本上就能得到需要的代码
编译偶尔有报错的话,只需将错误信息发送给AI再简单改一改,基本就能满足项目需求
话不多说,直接上代码。
#include <ESP8266WiFi.h> // ESP8266 WiFi库
#include <ArduinoHA.h> // Home Assistant MQTT库
#include <DHT.h> // DHT传感器库
// -------------------------- 配置参数 --------------------------
#define DHT_PIN 4 // ESP8266的Pin4(D2)连接DHT11的数据引脚
#define DHT_TYPE DHT11 // 传感器类型为DHT11
// WiFi配置
#define SECRET_SSID "wiif"
#define SECRET_PASS "password"
// MQTT配置(Home Assistant的MQTT服务器信息)
#define BROKER_ADDR "192.168.1.100" // 如192.168.1.100
#define BROKER_PORT 1883 // MQTT默认端口
#define MQTT_USER "admin" // HA的MQTT认证用户名
#define MQTT_PASS "public" // HA的MQTT认证密码
// -------------------------- 设备初始化 --------------------------
// 初始化DHT11
DHT dht(DHT_PIN, DHT_TYPE);
// WiFi客户端
WiFiClient client;
// 设备MAC地址(ESP8266可自动获取,也可手动定义)
byte mac[] = {0x00, 0x10, 0xFA, 0x6E, 0x38, 0x4B};
unsigned long lastReadAt = 0; // 上次读取传感器的时间
float lastTemp = -999; // 上次温度值(用于判断是否变化)
float lastHum = -999; // 上次湿度值(用于判断是否变化)
// Home Assistant设备和传感器初始化
HADevice device(mac, sizeof(mac));
HAMqtt mqtt(client, device);
// 温度传感器(唯一ID,避免与其他设备冲突)
HASensorNumber tempSensor("dht11_temperature");
// 湿度传感器
HASensorNumber humSensor("dht11_humidity");
/* -------------------------------------------------------------------------- */
void setup() {
/* -------------------------------------------------------------------------- */
// 初始化串口(ESP8266推荐115200波特率)
Serial.begin(115200);
while (!Serial) {
delay(10);
}
// 初始化DHT11传感器
dht.begin();
Serial.println("DHT11传感器初始化成功!");
// 连接WiFi
Serial.print("正在连接WiFi: ");
Serial.println(SECRET_SSID);
WiFi.begin(SECRET_SSID, SECRET_PASS);
// 等待WiFi连接
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi连接成功!");
printWifiStatus();
// 配置Home Assistant设备信息(自动发现用)
device.setName("ESP8266_DHT11");
device.setSoftwareVersion("1.0.0");
device.setManufacturer("ESP8266");
device.setModel("DHT11_Sensor");
// 配置温度传感器属性
tempSensor.setIcon("mdi:thermometer");
tempSensor.setName("温度");
tempSensor.setUnitOfMeasurement("°C"); // 摄氏度单位
// 配置湿度传感器属性
humSensor.setIcon("mdi:water-percent");
humSensor.setName("湿度");
humSensor.setUnitOfMeasurement("%"); // 百分比单位
// 连接MQTT服务器
Serial.print("正在连接MQTT服务器: ");
Serial.println(BROKER_ADDR);
mqtt.begin(BROKER_ADDR, BROKER_PORT, MQTT_USER, MQTT_PASS);
}
/* -------------------------------------------------------------------------- */
void loop() {
/* -------------------------------------------------------------------------- */
// 处理MQTT通信(必须循环调用)
mqtt.loop();
// 定时读取传感器数据(每2秒读取一次,DHT11不建议频繁读取)
if (millis() - lastReadAt > 2000) {
// 读取温湿度
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
Serial.println("读取DHT11数据失败!");
lastReadAt = millis();
return;
}
// 打印数据到串口
Serial.print("湿度: ");
Serial.print(humidity);
Serial.print("%\t温度: ");
Serial.print(temperature);
Serial.println("°C");
// 只有当值变化时才上传(减少MQTT流量)
if (temperature != lastTemp) {
tempSensor.setValue(temperature);
lastTemp = temperature;
}
if (humidity != lastHum) {
humSensor.setValue(humidity);
lastHum = humidity;
}
lastReadAt = millis();
}
delay(50);
}
/* -------------------------------------------------------------------------- */
void printWifiStatus() {
/* -------------------------------------------------------------------------- */
// 打印WiFi连接信息
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// 打印设备IP地址
IPAddress ip = WiFi.localIP();
Serial.print("IP地址: ");
Serial.println(ip);
// 打印WiFi信号强度
long rssi = WiFi.RSSI();
Serial.print("信号强度(RSSI): ");
Serial.print(rssi);
Serial.println(" dBm");
}各位根据自家实际wifi填入对应信息即可
// WiFi配置 #define SECRET_SSID "wiif" #define SECRET_PASS "password" // MQTT配置(Home Assistant的MQTT服务器信息) #define BROKER_ADDR "192.168.1.100" // 如192.168.1.100 #define BROKER_PORT 1883 // MQTT默认端口 #define MQTT_USER "admin" // HA的MQTT认证用户名 #define MQTT_PASS "public" // HA的MQTT认证密码
对应的 BRIKER_ADDR需要填写树莓派的实际IP地址
运行好的效果如图

至此温湿度传感器添加完毕,下期添加开关模块
我要赚赏金
