这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【RaspberryPi5开发板方案创意赛】基于树莓派5的智能家居系统-过程贴-

共2条 1/1 1 跳转至

【RaspberryPi5开发板方案创意赛】基于树莓派5的智能家居系统-过程贴-插件安装及温湿度数据获取

工程师
2025-12-28 16:23:13     打赏

上期 笔者 已经初步搭建好了 home assistant 智能家居环境系统

本期我们继续安装必要插件及进行相关配置,以满足传感器接入条件


本次项目计划使用ESP8266、ESP32无线开发板作为主控单元

计划使用3块开发板

第一块开发板连接dht11温湿度传感器,读取温湿度并上传至home assistant

第二块连接电容触摸板,用作智能开关应用,连接home assistant后可控制灯光亮灭

第三块连接WS2812灯板,作为台灯使用;额外连接ltr329模块实现本地动态调整光亮


要想实现以上功能,

首先需要确认数据上传方案

笔者目前所知有两种

    一种是通过ESPHome方案实现

    一种是通过ArduinoHa协议库,配合mqtt server方案实现


鉴于笔者对ESPHome接触比较少,而来插件安装不太顺利


此处笔者选用了ArduinoHa协议库及MQTT server方案


既然软件方案已经确定,那么我们就开始安装所需插件并进行必要配置

emqx.PNG

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

账号默认admin

密码默认public

这两个我们后续编写程序时需要填写

接下来点击“设置”->"设备与服务"

set-up.PNG

添加“MQTT”集成

mqtt-1.PNG

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

mqtt-setup.PNG

到此软件配置已经完成,接下来涉及硬件选型及固件烧录

因为手头有一块Arduino扩展板及esp8266开发板,遂将其组合在一起用于实现温湿度传感器的功能

20251227181317.jpg

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

20251227181628.jpg

好了,硬件准备已经就绪,到了固件 编译及烧录的环节了

我们本次主要使用的库连接如下:

https://dawidchyrzynski.github.io/arduino-home-assistant/

https://github.com/dawidchyrzynski/arduino-home-assistant

这个库可通过arduino ide直接安装

arduino-lib-ha.PNG

安装完成之后就可以编写程序了

编写程序的话可以借助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地址

运行好的效果如图

image.png

至此温湿度传感器添加完毕,下期添加开关模块





专家
2025-12-29 08:51:28     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]