280|0

219

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

Follow me 第二季第2期+扩展任务二:通过外部SHT40温湿度传感器,上传HA并显示 [复制链接]

 

通过外部SHT40温湿度传感器,将温湿度数据上传到Home Assistant(HA)并在HA面板上显示。

 

一、准备工作

连接SHT40温湿度传感器

使用4885(SHT40温湿度传感器扩展板)将SHT40温湿度传感器与Arduino UNO R4 WiFi连接起来。

SHT40传感器通常具有VCC、GND、SCK(时钟线)和SDA(数据线)四个引脚,正确对应连接到扩展板和Arduino J2上。

 

在Arduino IDE中,通过库管理器搜索并安装Adafruit_SHT4x库。这个库提供了与SHT40传感器通信所需的函数和接口。

编写Arduino程序

初始化WiFi连接,并配置MQTT客户端以连接到HA的MQTT服务器。

使用Adafruit_SHT4x库读取温湿度数据。

将读取到的温湿度数据序列化为JSON格式,并通过MQTT协议发送到HA。

 

 

 

 

二、代码:

#include "Adafruit_SHT4x.h" // 引入Adafruit SHT4x库  
#include <ArduinoMqttClient.h> // 引入Arduino MQTT客户端库  
#include <WiFiS3.h> // 引入WiFi库(适用于ESP32)  
#include <WiFiClient.h> // 引入WiFi客户端库  
#include <Arduino_JSON.h> // 引入Arduino JSON库  
  
Adafruit_SHT4x sht4; // 创建SHT4x对象  
  
char ssid[] = "CMCC-c6tG"; // WiFi网络的SSID  
char pass[] = "mei13728232960"; // WiFi网络的密码  
int status = WL_IDLE_STATUS; // WiFi连接状态  
  
const char broker[] = "192.168.1.113"; // MQTT代理的IP地址  
int port = 1883; // MQTT代理的端口号  
const char command_topic[] = "office/sensor1"; // MQTT主题  
  
WiFiClient wifiClient; // 创建WiFi客户端对象  
MqttClient mqttClient(wifiClient); // 创建MQTT客户端对象  
  
JSONVar dataObj; // 创建JSON对象用于存储数据  
  
void setup() {  
  Serial.begin(115200); // 初始化串口通信  
    
  // 设置SHT4x的精度为高精度  
  sht4.setPrecision(SHT4X_HIGH_PRECISION);  
  // 打印当前设置的精度  
  switch (sht4.getPrecision()) {  
    case SHT4X_HIGH_PRECISION:   
      Serial.println(F("SHT40 set to High precision"));  
      break;  
    case SHT4X_MED_PRECISION:   
      Serial.println(F("SHT40 set to Medium precision"));  
      break;  
    case SHT4X_LOW_PRECISION:   
      Serial.println(F("SHT40 set to Low precision"));  
      break;  
  }  
  
  // 关闭SHT4x的加热器  
  sht4.setHeater(SHT4X_NO_HEATER);  
  // 打印当前加热器的状态  
  switch (sht4.getHeater()) {  
    case SHT4X_NO_HEATER:   
      Serial.println(F("SHT40 Heater turned OFF"));  
      break;  
    // 其他加热器状态...  
  }  
  
  // 初始化SHT4x传感器  
  if (!sht4.begin(&Wire1)) {  
    Serial.println(F("SHT40 sensor not found!"));  
    while (1); // 如果传感器未找到,则停止程序  
  } else {  
    Serial.print(F("SHT40 detected!\t"));  
    Serial.print(F("Serial number:\t"));  
    Serial.println(sht4.readSerial(), HEX); // 打印传感器的序列号  
  }  
  Serial.println(F("----------------------------------"));  
  
  // 检查WiFi固件版本  
  String fv = WiFi.firmwareVersion();  
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {  
    Serial.println("Please upgrade the firmware");  
  }  
  
  // 连接到WiFi网络  
  while (status != WL_CONNECTED) {  
    Serial.print("Attempting to connect to WPA SSID: ");  
    Serial.println(ssid);  
    status = WiFi.begin(ssid, pass);  
    delay(10000); // 等待10秒尝试连接  
  }  
  Serial.print("You're connected to the network");  
  printCurrentNet(); // 打印当前网络的信息  
  printWifiData(); // 打印WiFi数据  
  
  // 连接到MQTT代理  
  if (!mqttClient.connect(broker, port)) {  
    Serial.print("MQTT connection failed! Error code = ");  
    Serial.println(mqttClient.connectError());  
    while (1); // 如果连接失败,则停止程序  
  }  
  Serial.println("You are connected to MQTT");  
  
  // 检查WiFi模块是否通信正常  
  if (WiFi.status() == WL_NO_MODULE) {  
    Serial.println("Communication with WiFi module failed!");  
    while (true); // 如果通信失败,则停止程序  
  }  
}  
  
// 打印当前网络的信息  
void printCurrentNet() {  
  Serial.print("SSID: ");  
  Serial.println(WiFi.SSID());  
  byte bssid[6];  
  WiFi.BSSID(bssid);  
  Serial.print("BSSID: ");  
  printMacAddress(bssid);  
  long rssi = WiFi.RSSI();  
  Serial.print("signal strength (RSSI):");  
  Serial.println(rssi);  
  byte encryption = WiFi.encryptionType();  
  Serial.print("Encryption Type:");  
  Serial.println(encryption, HEX);  
  Serial.println();  
}  
  
// 打印MAC地址  
void printMacAddress(byte mac[]) {  
  for (int i = 0; i < 6; i++) {  
    if (i > 0) {  
      Serial.print(":");  
    }  
    if (mac[i] < 16) {  
      Serial.print("0");  
    }  
    Serial.print(mac[i], HEX);  
  }  
  Serial.println();  
}  
  
// 打印WiFi数据  
void printWifiData() {  
  IPAddress ip = WiFi.localIP();  
  Serial.print("IP Address: ");  
  Serial.println(ip);  
  byte mac[6];  
  WiFi.macAddress(mac);  
  Serial.print("MAC address: ");  
  printMacAddress(mac);  
}  
  
void loop() {  
  sensors_event_t humidity, temp; // 创建用于存储温度和湿度数据的结构体  
  sht4.getEvent(&humidity, &temp); // 从传感器获取最新的温度和湿度数据  
  
  float t = temp.temperature; // 获取温度值  
  Serial.println("Temp *C = " + String(t)); // 打印温度值  
  float h = humidity.relative_humidity; // 获取湿度值  
  Serial.println("Hum. % = " + String(h)); // 打印湿度值  
  
  // 将温度和湿度数据添加到JSON对象中  
  dataObj["temperature"] = t;  
  dataObj["humidity"] = h;  
  // 将JSON对象转换为字符串  
  String jsonString = JSON.stringify(dataObj);  
  // 通过MQTT发送数据  
  mqttClient.beginMessage(command_topic);  
  mqttClient.print(jsonString);  
  mqttClient.endMessage();  
  delay(500); // 等待500毫秒后再次读取数据  
}

 

 

代码解释:

加入库文件
Adafruit_SHT4x.h:用于与 Adafruit SHT4x 温湿度传感器进行交互。
ArduinoMqttClient.h:用于实现 MQTT 通信。
WiFiS3.h和WiFiClient.h:用于连接 WiFi 网络。
Arduino_JSON.h:用于处理 JSON 数据。

 

定义变量和对象
Adafruit_SHT4x sht4:创建 SHT4x 温湿度传感器对象。
char ssid[]和char pass[]:存储 WiFi 网络的名称和密码。
int status:用于存储 WiFi 连接状态。
const char broker[]和int port:MQTT 服务器的地址和端口。
const char command_topic[]:MQTT 的主题。
WiFiClient wifiClient和MqttClient mqttClient(wifiClient):创建 WiFi 客户端和 MQTT 客户端对象。
JSONVar dataObj:用于存储要发送的 JSON 数据。

 

setup 函数
初始化串口通信,设置波特率为 115200。
设置 SHT4x 传感器的精度为高精度,并打印当前精度。
关闭 SHT4x 传感器的加热器,并打印当前加热器状态。
初始化 SHT4x 传感器,如果未找到传感器则进入死循环;如果找到传感器,则打印传感器是否被检测到以及传感器的序列号。
检查 WiFi 固件版本,如果不是最新版本则提示升级。
尝试连接到指定的 WiFi 网络,直到连接成功。
连接 MQTT 服务器,如果连接失败则打印错误信息并进入死循环。
检查 WiFi 模块状态,如果通信失败则进入死循环。

 

printCurrentNet 函数
打印当前连接的 WiFi 网络的 SSID。
打印当前连接的路由器的 MAC 地址。
打印接收到的信号强度(RSSI)。
打印加密类型。

 

printMacAddress 函数
遍历传入的 MAC 地址数组,将每个字节转换为十六进制格式并打印,中间用冒号分隔。

 

printWifiData 函数
打印开发板的 IP 地址。
打印开发板的 MAC 地址,调用printMacAddress函数实现。

 

loop 函数
创建用于存储温度和湿度数据的结构体sensors_event_t humidity, temp。
从传感器获取最新的温度和湿度数据。
获取温度和湿度值,并打印出来。
将温度和湿度数据添加到dataObj中,将其转换为 JSON 字符串,并通过 MQTT 客户端发送到指定主题。
延迟 500 毫秒后再次读取数据。

 

 

三、实现效果

 

 

 

 

 

 

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表