【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)

今天,我们开始第三个专题:连接SHT30温湿度传感器模块,获取当前环境实时温湿度数据,并显示在1.3寸TFT液晶显示屏上。

第一专题内容,请参考

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客

第二专题内容,请参考

【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接-CSDN博客

一、硬件需求------温湿度传感器模块SHT3X系列

SHT3x DIS是Sensirion's新一代温度和湿度传感器。它建立在一个新的CMOSens®传感器芯片上,该芯片是Sensirion's新的湿度和温度平台的核心。与前代相比,SHT3x DIS具有更高的智能性、可靠性和更高的精度规格。它的功能包括增强的信号处理、两个独特的用户可选择的 I2C 地址和高达1MHz的通信速率。

DFN封装规格为为 2.5mm x 2.5mm x 0.9mm(Height),这就很方便将SHT3x DIS集成到各种应用中。另外,2.4伏至5.5伏的宽电源电压范围保证了与各种组装情况的兼容性。

总之,SHT3x DIS融合了作为湿度传感器行业的领导者Sensirion's15年来丰富的经验沉淀。

SHT30-31-35资料:点击下载 提取码:369r。

本项目采用的型号为:SHT30

二、硬件连接关系

|---------|-----|-----|-----|-----|
| NodeMCU | 3V3 | GND | D1 | D2 |
| SHT30 | vcc | gnd | scl | sda |

三、添加ClosedCube SHT31D库

ClosedCube SHT31D,是支持 Sensirion SHT30-D, SHT31-D and SHT35-D温湿度传感器的Arduino框架库,适用于I2C接口。

方法:直接打开 PlatformIO 界面,选择 Libraries 图标,在搜索栏内输入 ClosedCube SHT31D,添加到本项目中。

四、ClosedCube SHT31D官方示例代码

cpp 复制代码
//以下代码来源于官方示例 periodicmode.info 的代码
//为了能在[vscode + platformIO]平台正常运行,主要修改了三个位置的代码,均已在程序中加注释说明。
//在本项目中,重新定义了 I2C 通信引脚

#include <Wire.h>
#include "ClosedCube_SHT31D.h"

ClosedCube_SHT31D sht3xd;

// 新增: 定义 I2C 引脚
const int SHT_SCL = D1;
const int SHT_SDA = D2;

void printResult(String text, SHT31D result) ;  //新增:函数预先声明

void setup()
{
	//Wire.begin();----------这行是原代码,已加注释标志
    //定义I2C通讯的引脚
    Wire.begin(SHT_SDA, SHT_SCL);//新增:替换上一行代码,主要是定义启用I2C引脚

	Serial.begin(9600);
	Serial.println("ClosedCube SHT3X-D Periodic Mode Example");
	Serial.println("supports SHT30-D, SHT31-D and SHT35-D");

	sht3xd.begin(0x44); // I2C address: 0x44 or 0x45

	Serial.print("Serial #");
	Serial.println(sht3xd.readSerialNumber());

	if (sht3xd.periodicStart(SHT3XD_REPEATABILITY_HIGH, SHT3XD_FREQUENCY_10HZ) != SHT3XD_NO_ERROR)
		Serial.println("[ERROR] Cannot start periodic mode");

}

void loop()
{
	printResult("Periodic Mode", sht3xd.periodicFetchData());
	delay(250);
}

void printResult(String text, SHT31D result) {
	if (result.error == SHT3XD_NO_ERROR) {
		Serial.print(text);
		Serial.print(": T=");
		Serial.print(result.t);
		Serial.print("C, RH=");
		Serial.print(result.rh);
		Serial.println("%");
	} else {
		Serial.print(text);
		Serial.print(": [ERROR] Code #");
		Serial.println(result.error);
	}
}

将此代码复制到项目 main.cpp 中,编译上传成后,如果在串口监视器输出如下信息,那就说明 SHT30 温湿度传感器已。

五、在项目中使用SHT30采集温湿度实时数据的代码

使用SHT30采集温湿度实时数据的代码,都封装在 sht30.h 文件中,分别定义了3个函数:

(1)void sht30_setup(),开机时调用,设置SHT30的I2C引脚、地址和工作模式。

(2)void saveResult(SHT31D result),用于保存结果到指定的数据结构,如果传感器断开,则尝试重载。

(3)void sht30(),在主程序/循环体loop中调用。

本程序主要内容,来源于网络大神,如有异议,请及时联系作者。

cpp 复制代码
//********sht30 温湿度传感器***************

#include <Wire.h>
#include "ClosedCube_SHT31D.h"
ClosedCube_SHT31D sht3xd;

// 配置引脚
const int SHT_SCL = D1;
const int SHT_SDA = D2;

const int SHT_ADDRESS = 0x44;

//定义保存采集数据结果的数据结构,并设置读取频率

struct SHT_DATA{
  int8_t temperature = -99;
  int8_t humidity = -99;
  unsigned long sht30_last = 0;
  const long sht30_interval = 1000; //每秒读取一次

} sht_data;

//开机函数
void sht30_setup() {
  
  //定义I2C通讯的引脚
  Wire.begin(SHT_SDA, SHT_SCL);
  
  //准备读取sht3x传感器
  sht3xd.begin(SHT_ADDRESS);
  if (sht3xd.periodicStart(SHT3XD_REPEATABILITY_HIGH, SHT3XD_FREQUENCY_10HZ) != SHT3XD_NO_ERROR){
    Serial.println("[ERROR] 读取sht30数据失败,可能是传感器没插好");
  }
}

//保存结果到指定的数据结构,如果传感器断开,则尝试重载
void saveResult(SHT31D result) {
  if (result.error == SHT3XD_NO_ERROR) {
    sht_data.temperature = result.t;
    sht_data.humidity = result.rh;
  } else {  
    sht_data.temperature = -99;
    sht_data.humidity = -99;
    sht30_setup();
  }
}

//循环体函数,放在loop中
void sht30() {
  unsigned long currentMillis = millis();
  if (currentMillis - sht_data.sht30_last >= sht_data.sht30_interval) {
    sht_data.sht30_last = currentMillis;
    saveResult(sht3xd.periodicFetchData());
    Serial.print("T:");
    Serial.print(sht_data.temperature);
    Serial.print(" H:");
    Serial.println(sht_data.humidity);
  }
}

六、运行结果展示

(1) 依据硬件连接关系,在面包板上接入SHT30温湿度传感器;

(2)设置每隔500ms调用一次sht30()函数;

(3)修改主程序 main.cpp 内容,实现在TFT液晶屏显示的目标。

(4)编译上传后,就可以在TFT屏幕上看到实时采集到的温湿度数据了。

(以下视频,是使用电热风机模拟来观察采集显示的结果)

sht30_test

七、项目资源下载

百度网盘下载链接:

https://pan.baidu.com/s/1Rk5OBIxZ-BtUMQqG8TjUag?pwd=vo5t,提取码:vo5t

八、编译不通过的解决办法

本项目需要导入ClosedCube SHT31D库以支持SHT30正常工作。在编译时,您可能会遇到如下图所示的错误信息。

解决方法是, 请将箭头所指方框内的内容修改成: return returnError(error);

cpp 复制代码
return returnError(error);

修改后的内容,如下图所示。再次编译,就可以顺利通过了。

参考资料

1.ClosedCube SHT31D 库源代码

相关推荐
清晨朝暮7 小时前
vscode不满足先决条件问题的解决——vscode的老版本安装与禁止更新(附安装包)
ide·vscode·编辑器
扮作大侠7 小时前
VScode自动添加指定内容
ide·vscode·编辑器
Eric.Lee20217 小时前
vscode实时预览编辑markdown
ide·vscode·编辑器·markdown
BIBI204910 小时前
Windows 下彻底删除 VsCode
windows·vscode
湮雨塵飛11 小时前
ESP32开发之LED闪烁和呼吸的实现
vscode·嵌入式硬件·esp32·freertos·呼吸灯
咏颜11 小时前
ESP32对接巴法云实现配网
经验分享·mcu·物联网·iot
xiaobobo333015 小时前
解决vscode打开一个单片机工程文件(IAR/keil MDK)因无法找到头文件导致的结构体成员不自动补全问题。
vscode·stm32·无法找到头文件·结构体成员不补全
BIBI204915 小时前
VsCode 安装 Cline 插件并使用免费模型(例如 DeepSeek)
vscode·deepseek·cline
iCxhust18 小时前
Prj09--8088单板机C语言8253产生1KHz方波(1)
c语言·开发语言·c++·单片机·嵌入式硬件·mcu
chenzhanpeng_1 天前
vscode 配置 QtCreat Cmake项目
ide·vscode·qt·编辑器·qt6.3