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

news2024/11/24 8:40:01

        今天,我们开始第三个专题:连接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官方示例代码     

//以下代码来源于官方示例 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中调用。
        本程序主要内容,来源于网络大神,如有异议,请及时联系作者。

//********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);    

return returnError(error);

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

        参考资料

        1. ClosedCube SHT31D 库源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8个手机宝藏App,建议收藏!

AI故事视频生成&#xff0c;一站式生成小说漫画推文、儿童故事、民间故事等https://aitools.jurilu.com/ 1.地图车机版——百度地图 百度地图&#xff0c;作为新一代的人工智能地图&#xff0c;以其智能语音、智能导航系统、智能路线规划和智能推荐方案而著称。它不仅提供传统…

spring bean生命周期全部过程

Spring Bean的生命周期包括以下全部过程&#xff1a; 实例化&#xff1a;在Spring容器启动时&#xff0c;根据配置文件或注解等信息创建Bean的实例。属性赋值&#xff1a;如果Bean有属性需要进行初始化&#xff0c;Spring容器会自动为这些属性进行赋值。自定义初始化方法&…

【网站项目】SpringBoot792考试系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

css 步骤条虚线渐变色效果实现

效果如图所示&#xff1a; 思路&#xff1a; 使用元素覆盖的方式实现视觉上虚线的效果 实现代码&#xff1a; html布局 <ul class"details-cont"><li class"details-li" v-for"item in 3" :key"item"><div class&qu…

C/C++开发工具CLion全新发布v2024.1——提升CMake编辑体验

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中&#xff0c;合合信息智能…

企业信息系统的总体框架

1.信息系统体系结构的总体参考框架 信息系统的架构&#xff08;Information System Architecture&#xff0c;ISA&#xff09;中的Architecture含义具有丰富内涵和作用&#xff0c;相比计算机领域的Architecture来说它的单一性、片面性模型是难以描述ISA的全部的&#xff0c;IS…

【SAP-FICO】SAP-FICO生产订单-结算规则配置路径(OKO7)

需求&#xff1a; 作为一个ABAPer&#xff0c;有接到一个狗屁倒灶的配置需求&#xff0c;要求如下&#xff0c;给生产订单的结算规则显示出来 图1&#xff1a;找一个生产订单&#xff0c;显示其结算规则 CO03→菜单栏-表头→结算规则 图2&#xff1a;查看该生产订单&#xff0c…

仿TCMalloc高并发内存池项目介绍

TCMalloc项目介绍 TCMalloc介绍 Thread-Caching Malloc&#xff08;TCMalloc&#xff09;&#xff0c;即线程缓存的malloc&#xff0c;是一种高性能的内存分配器&#xff0c;由Google开发并作为gperftools项目的一部分。TCMalloc旨在提高多线程程序的内存分配性能&#xff0c;通…

smardaten让原型不仅只有原型!

smardaten面向软件研发全流程&#xff0c;从设计、开发、测试、到运维人员均可以基于平台完成一体化的开发工作。 随着平台设计场景下功能与组件的不断完善&#xff0c;在面对招投标、售前演示、需求确认的诉求时&#xff0c;已经有不少企业将软件原型设计的主战场转移至smard…

【进程替换】自定义程序替换 | 替换函数execleexecvpe | execve

目录 自定义程序替换 Makefile mypragma.cc☞mypragma testexec.c☞testexec test.py&test.sh execle&execvpe 1.自定义 testexec.c☞testexec mypragma.cc☞mypragma 2.系统 3.系统修改putenv execve 替换函数总结 自定义程序替换 前面我们举例进程程…

PythonStudio 控件使用常用方式(十一)MessageBox

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 MessageBox是一个消息对话框&…

docker八大架构之应用服务集群架构

应用服务集群架构 在之前&#xff0c;一个应用层要负责所有的用户操作&#xff0c;但是有时用户增加后就会导致供不应求的现象&#xff08;单个应用不足以支持海量的并发请求&#xff0c;高并发的时候站点响应变慢&#xff09;&#xff0c;这时就需要增加应用层服务器&#xf…

报表-设计器的使用

1、设计器目录结构 报表设计器以压缩包的方式提供&#xff0c;解压后&#xff0c;目录结构如下&#xff1a; 目录说明&#xff1a; 1、jdk-17&#xff1a;压缩包中自带的windows平台下的jdk17 2、lite-report&#xff1a;报表文件和数据源配置文件的保存位置 3、lite-repor…

无人售货机零售项目ECharts展现(最全!!,文档放最后哦!)

目录 背景 数据表 框架分析 可视化展示销售情况总分析 1、绘制仪表盘展示各特征及其环比增长率&#xff08;仪表盘&#xff09; 1. 销售金额及其环比增长率 2. 订单量及其环比增长率 3. 毛利率及其环比增长率 4.售货机数量及其环比增长率 2、绘制簇状柱状-折线图展示…

Controlnet作者张吕敏又一强力新作IC-Light,对图像进行重打光操作,不要太贴心了!

不论是否玩过AI绘画&#xff0c;光照/光照会影响一张照片的质量及完美度&#xff0c;好的光影对照片起到了画龙点睛的作用&#xff0c;更有助于提升电影质感 而在AI绘画中光影控制仅凭提示词&#xff0c;并不能准确细致满足我们的需要。所以Controlnet作者张吕敏新开发了一个重…

【Pychart】jupyter中pyecharts无法显示问题无法使用/No module named pyecharts

无法显示或No module&#xff0c;一般就是更换python版本后&#xff0c;没有在新的python里安装jupyter&#xff1b;另外原因就是引用方式问题&#xff0c;就是import方式不对&#xff1b;都解决后&#xff0c;有报错没有add&#xff0c;或者str问题。 最后的解决方案竟然是bin…

如何通过iptables配置URL过滤黑名单?

正文共&#xff1a;1555 字 16 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们前面曾经简单介绍过URL过滤功能&#xff08;URL过滤功能了解一下&#xff1f;&#xff09;&#xff0c;并且以H3C VFW为例简单配置了一下URL过滤功能。 首先回顾一下&#xff0c;URL过滤&#…

Linux线程(三)死锁与线程同步

目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念&#xff0c;…

C++指针和动态内存分配细节,反汇编,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…