【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的性能。发现数据变化的速度非常快,基本手指触碰到传感器后,数据就已经开始上涨了。
|