376|5

27

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

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

 
这次的扩展任务选择了温湿度传感器SHT40,之前使用过SHT30,想体验一下SHT40与之前的传感器有什么区别。除此之外还选购了一条线(为了逼近300块钱,但是又不超过300,究极白嫖怪,hhh),但是就是这个多买的线,坑了我一个小时,还好查看了一下相关的文档,解决了这个问题。
SHT40的通讯协议是IIC,按照以前的思路,找一个SHT40的库,然后改一下代码,加入串口打印就可以实现SHT40数据的获取,但是我找了一个大佬的测试例程,串口打印SHT40设备无法找到,我以为我SHT40插反了,然后又重新接线测试,发现还是不行,我一度以为这个模块是不是有问题。
后来查看文档发现,Arduino R4 WIFI上能与这个线完美结合的那个接口是QWIIC,用的是wire1,我测试的例程使用的IIC是wire0。发现问题,开始解决问题。首先查询了一下QWIIC怎么使用,发现还是比较简单的。
只需要调用Wire1.begin();然后在传感器初始化的函数中添加wire1的参数即可。
#include <Wire.h>
#include "Adafruit_SHT4x.h"

Adafruit_SHT4x sht4 = Adafruit_SHT4x();

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Wire1.begin();
  if(sht4.begin(&Wire1) == false)
  {
    Serial.println("SHT40 not detected. Please check wiring. Freezing.");
    while (1)
      ;
  }

  sht4.setPrecision(SHT4X_HIGH_PRECISION);
  sht4.setHeater(SHT4X_NO_HEATER);
  Serial.println("SHT40 acknowledged.");
}

void loop() {
  // put your main code here, to run repeatedly:
  sensors_event_t humidity, temp;

  sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  Serial.print("Temperature: "); 
  Serial.print(temp.temperature); 
  Serial.println("℃");
  Serial.print("Humidity: "); 
  Serial.print(humidity.relative_humidity); 
  Serial.println("%");
  delay(1000);
}

 

测试代码下载到板子上,打开串口监视器查看一下数据。
数据可以正常获取,完美!
下面开始将SHT40获取数据和HA结合在一起。首先是用MQTTX在创建一个条目。按照上一篇帖子的方法进行创建即可。(不仅要修改发送的信息,还要修改topic,别忘记)创建完成后检查一下HA有无问题。
然后将两个代码进行整合。得到最终的代码。依旧记得更改信息连接自己的WIFI和MQTT。
#include <Wire.h>
#include "Adafruit_SHT4x.h"
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

Adafruit_SHT4x sht4 = Adafruit_SHT4x();

// 替换为你的网络信息
const char* ssid = "WIFI名称";
const char* password = "WIFI密码";

// 替换为你的Mosquitto broker信息
const char* mqtt_server = "IPV4地址";
const int mqtt_port = 1883;
const char* mqtt_user = "HA用户名";
const char* mqtt_password = "HA密码";

// 初始化WiFi和MQTT客户端
WiFiClient espClient;
PubSubClient client(espClient);

// 传感器数据发布主题
const char* topic = "homeassistant/sensor/sensorBedroom/state";

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);

  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);

  Wire1.begin();
  if(sht4.begin(&Wire1) == false)
  {
    Serial.println("SHT40 not detected. Please check wiring. Freezing.");
    while (1)
      ;
  }

  sht4.setPrecision(SHT4X_HIGH_PRECISION);
  sht4.setHeater(SHT4X_NO_HEATER);
  Serial.println("SHT40 acknowledged.");
}

void loop() {
  // put your main code here, to run repeatedly:
  
  delay(1000);

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // 假设你有一个温度传感器,获取温度数据
  float temperature = readTemperature();
  float humidity = readHumidity();

  StaticJsonDocument<200> jsonDoc;
  jsonDoc["humidity"] = humidity;
  jsonDoc["temperature"] = temperature;

  char jsonBuffer[512];
  serializeJson(jsonDoc, jsonBuffer);

  client.publish(topic, jsonBuffer);

  // 每隔5秒发送一次数据
  delay(5000);
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ArduinoClient", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
    }
  }
}

float readTemperature() {
  // 在这里读取实际传感器的数据
  // 示例中返回一个固定值

  sensors_event_t humidity,temp;

  sht4.getEvent(&humidity,&temp);// populate temp and humidity objects with fresh data
  // Serial.print("Temperature: "); 
  // Serial.print(temp.temperature); 
  // Serial.println("℃");
  // Serial.print("Humidity: "); 
  // Serial.print(humidity.relative_humidity); 
  // Serial.println("%");

  return temp.temperature;
}

float readHumidity() {
  // 在这里读取实际传感器的数据
  // 示例中返回一个固定值

  sensors_event_t humidity,temp;

  sht4.getEvent(&humidity,&temp);// populate temp and humidity objects with fresh data
  // Serial.print("Temperature: "); 
  // Serial.print(temp.temperature); 
  // Serial.println("℃");
  // Serial.print("Humidity: "); 
  // Serial.print(humidity.relative_humidity); 
  // Serial.println("%");

  return humidity.relative_humidity;
}
下载程序,然后打开HA进行查看,发现数据已经可以正常进行上传了。测试一下SHT40的性能。发现数据变化的速度非常快,基本手指触碰到传感器后,数据就已经开始上涨了。

最新回复

本帖最后由 damiaa 于 2024-9-11 14:03 编辑 这个湿度精度±1.8%,温度精度0.2°C 所以小数点后留一位就行了。其他都是吓人的。   详情 回复 发表于 2024-9-11 14:02
点赞 关注
 
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

需要调用Wire1.begin();然后在传感器初始化的函数中添加wire1的参数即可

这个可以收藏

拍个视频记录下更好

点评

这个确实坑了我好久,后来查原理图发现Arduino上留的那个接口是Wire1的。争取在最后的汇总视频里拍视频记录一下,hhhh  详情 回复 发表于 2024-9-11 01:13
 
 
 

回复

6060

帖子

6

TA的资源

版主

板凳
 

你这个精度高这么高,估计传感器也没有这么大的精度吧

点评

这个没研究过,直接调的库里的函数,估计只有前两位是准的,后面的应该都不准,只是猜测。  详情 回复 发表于 2024-9-11 01:14
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

27

帖子

1

TA的资源

一粒金砂(中级)

4
 
Jacktang 发表于 2024-9-10 07:28 需要调用Wire1.begin();然后在传感器初始化的函数中添加wire1的参数即可 这个可以收藏 拍个视频记录 ...

这个确实坑了我好久,后来查原理图发现Arduino上留的那个接口是Wire1的。争取在最后的汇总视频里拍视频记录一下,hhhh

 
 
 

回复

27

帖子

1

TA的资源

一粒金砂(中级)

5
 
秦天qintian0303 发表于 2024-9-10 09:11 你这个精度高这么高,估计传感器也没有这么大的精度吧

这个没研究过,直接调的库里的函数,估计只有前两位是准的,后面的应该都不准,只是猜测。

 
 
 

回复

6069

帖子

4

TA的资源

版主

6
 
本帖最后由 damiaa 于 2024-9-11 14:03 编辑

这个湿度精度±1.8%,温度精度0.2°C

所以小数点后留一位就行了。其他都是吓人的。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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