【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 库源代码

相关推荐
哇咔咔哇咔10 小时前
使用Markdown编写适用于GitHub的README.md文件的目录结构
vscode·markdown
羊小猪~~15 小时前
神经网络基础--什么是神经网络?? 常用激活函数是什么???
人工智能·vscode·深度学习·神经网络·机器学习
Eiceblue16 小时前
Python 在PDF中绘制形状(线条、矩形、椭圆形等)
vscode·python·pycharm·pdf
tekin1 天前
vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例
ide·vscode·php·launch.json·runtimeargs·php内置服务自定义参数
曹申阳1 天前
vscode 创建 vue 项目时,配置文件为什么收缩到一起展示了?
ide·vue.js·vscode
丶Darling.1 天前
vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别
linux·windows·vscode
羊小猪~~2 天前
前端入门一之CSS知识详解
前端·javascript·css·vscode·前端框架·html·javas
Wx120不知道取啥名2 天前
微控制器(MCU)如何运行存储在Flash的程序???
单片机·嵌入式硬件·mcu
CyberSecurity_zhang2 天前
多核架构的基本概念
mcu·汽车·amp·smp·同构多核·异构多核
苏三有春2 天前
【解决办法】无法使用右键“通过VSCode打开文件夹”
ide·vscode·编辑器