当前位置: 首页 > news >正文

【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官方示例代码     

//以下代码来源于官方示例 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 0x45Serial.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 库源代码

相关文章:

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

今天&#xff0c;我们开始第三个专题&#xff1a;连接SHT30温湿度传感器模块&#xff0c;获取当前环境实时温湿度数据&#xff0c;并显示在1.3寸TFT液晶显示屏上。 第一专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计…...

Unity3D DOTween

简单介绍一下 DOTween 插件的使用。 导入插件 先到 Asset Store 获取 DOTween 插件&#xff0c;然后在 Package Manager 的 My Assets 中搜索&#xff0c;下载并导入插件。 导入后&#xff0c;会自动弹出一个窗口&#xff0c;提示需要先对插件进行配置。 点击上图中的按钮&am…...

罗宾斯《管理学》第13版/教材讲解/考研真题视频课程/网课

本课程是罗宾斯《管理学》&#xff08;第13版&#xff09;精讲班&#xff0c;为了帮助参加研究生招生考试指定考研参考书目为罗宾斯《管理学》&#xff08;第13版&#xff09;的考生复习专业课&#xff0c;我们根据教材和名校考研真题的命题规律精心讲解教材章节内容。 序号名…...

docker-compose启动mysql4.7环境搭建

注意&#xff1a; 下面挂载的目录需要自己创建文件夹比如&#xff1a; /home/dockerInfo/composeInfo/volumes/mysqlVolume/var/log/mysql&#xff08;数据文件&#xff09; /home/dockerInfo/composeInfo/volumes/mysqlVolume/var/lib/mysql&#xff08;日志文件&#xff09;…...

StarryCoding入门教育赛2 题解 C++代码(推荐学习)

比赛地址&#xff1a;https://www.starrycoding.com/contest/6 比赛介绍 系列赛名称&#xff1a;StarryCoding 入门教育赛难度&#xff1a;语法~较低时长&#xff1a; 1.5 1.5 1.5小时比赛时间&#xff1a;约每2-3天一场&#xff0c;一般为晚上18:30~20:00赛后题解&#xff1…...

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…...

实时音视频通信的主要矛盾及解决方法

实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾及解决方法实时音视频通信的主要矛盾矛盾的解决方法增加带宽减少数据量适当增加延时提高网络质量快速准确地评估带宽 总结参考 实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾 实时音视频通信的主…...

【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析

由于官方提供的TXMLDocument组件并不是特别好用&#xff0c;有着体积大&#xff0c;速度慢&#xff0c;调用不方便等缺点。 这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。 文章目录 1、生成XML文件2、解析XML文件3、生成带注释的XML文件4、删除XML文件节点 1、生…...

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…...

神经网络中的归一化

我们今天介绍一下神经网络中的归一化方法~ 之前学到的机器学习中的归一化是将数据缩放到特定范围内&#xff0c;以消除不同特征之间的量纲和取值范围差异。通过将原始数据缩放到一个特定的范围内&#xff0c;比如[0,1]或者[-1,1]&#xff0c;来消除不同特征之间的量纲和取值范围…...

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…...

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤&#xff08;裸光纤&#xff09;由运营商提供&#xff0c;是无中继的光纤线路&#xff0c;仅通过配线架连接。相比传统光纤&#xff0c;裸光纤提供纯粹的物理传输路径&#xff0c;无需额外网…...

MMC设备

MMC&#xff08;MultiMediaCard&#xff09;是一种闪存卡标准&#xff0c;用于作为便携式设备上的存储媒介&#xff0c;例如数码相机、智能手机、平板电脑、个人数字助理&#xff08;PDA&#xff09;以及其他便携式设备。MMC卡最初是由SanDisk和Siemens AG开发的&#xff0c;并…...

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器&#xff0c;配备了干净简洁的用户界面&#xff0c;可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型&#xff0c;包括&#xff1a;WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…...

一些零碎小知识

函数递归复习 #define 的头文件包含 #define定义标识符常量 等define其他用法 斐波那契数列 函数栈帧 青蛙跳台问题 汉诺塔问题 字符“0”与0的计算 “0”-“0”0&#xff1b; 最后一次作业题一道 素数 随机数 strand timer rand 水仙花数 变种随鲜花 斐波那契数…...

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法&#xff0c;允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML&#xff0c;所以能被遵循规范的浏览器和HTML解析器解析。 在前面&#xff0c;我们一直使用的是字符串插…...

(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型

文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段&#xff1a;输出阶段&#xff1a;步骤说明&#xff1a; 第一阶段&#xff1a;通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…...

区块链 | 一文了解 NFT 的生态系统(上)

&#x1f436;原文&#xff1a; Understanding Security Issues in the NFT Ecosystem &#x1f436;写在前面&#xff1a; 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中&#xff0c;我们将介绍以太坊生态系统的构建模块&#xff0c;重点关注「NFT&#xff0c;…...

为什么centos官方版不支持arm架构?

为什么centos官方版不支持arm架构&#xff1f; 1、资源限制&#xff1a;CentOS是由社区维护的开源操作系统&#xff0c;其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少&#xff0c;社区资源有限&#xff0c;因此官方版CentOS选择集中精力在x86架构上进行开发…...

awk小尝试2(随手记)

文章目录 需求1解法 需求2解法&#xff08;3种-grep/sed/awk&#xff09; 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意&#xff0c;这里的.txt前有一个空格&#xff0c;需要去掉&#xff0c;不然就是两个文件名解法 echo hostname -I…...

基于Function Calling的智能对话客户端:让大语言模型从“能说”到“会做”

1. 项目概述&#xff1a;一个能“动手”的智能对话客户端 最近在折腾大语言模型应用的时候&#xff0c;我发现了一个挺有意思的开源项目&#xff1a;chat-xiuliu。它本质上是一个本地运行的LLM客户端&#xff0c;但和那些只能“动嘴皮子”的聊天工具不同&#xff0c;它的核心亮…...

手把手教你用Simulink搭建Buck变换器:从元件库搜索到波形分析(MATLAB 2023b)

手把手教你用Simulink搭建Buck变换器&#xff1a;从元件库搜索到波形分析&#xff08;MATLAB 2023b&#xff09; 在电力电子领域&#xff0c;Buck变换器作为最基础的DC-DC降压拓扑&#xff0c;其仿真验证是每个工程师的必修课。MATLAB 2023b中的Simulink环境提供了高度可视化的…...

2026年株洲老人小孩都能用专业床垫有哪些?

引言随着生活水平的提高&#xff0c;人们对床垫的要求也越来越高。特别是对于老人和小孩这两类特殊人群&#xff0c;选择一款合适的床垫尤为重要。本文将介绍几款适合老人和小孩使用的专业床垫&#xff0c;其中包括德国美得丽&#xff08;Musterring&#xff09;床垫。德国美得…...

Java 时间日期 API - SimpleDateFormat 创建、Java 日期时间 API 推荐

SimpleDateFormat 创建 1、构造方法 &#xff08;1&#xff09;基本介绍 默认构造方法&#xff0c;使用默认格式和默认区域设置 public SimpleDateFormat()使用指定格式和默认区域设置 public SimpleDateFormat(String pattern)使用指定格式和指定区域设置 public SimpleDateFo…...

Next.js SEO优化实战:用next-seo库高效管理元标签与结构化数据

1. 项目概述&#xff1a;SEO 优化的现代 React 解决方案 如果你正在用 Next.js 开发一个需要被搜索引擎收录的网站&#xff0c;比如企业官网、博客或者电商平台&#xff0c;那么“SEO”这个词一定让你又爱又恨。爱的是&#xff0c;它意味着流量和用户&#xff1b;恨的是&#…...

AI API中转服务全解析:从概念到实战,轻松接入GPT-4与Claude

1. 项目概述&#xff1a;一个关于AI API服务的开源项目最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;名字叫“-chatgpt4.0-api-key”。点进去一看&#xff0c;这其实是一个围绕“云雾API”服务的资源汇总和指南仓库。说白了&#xff0c;它不是一个能直接…...

五分钟用Python为嵌入式应用接入Taotoken大模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 五分钟用Python为嵌入式应用接入Taotoken大模型服务 为嵌入式设备或物联网项目添加智能对话能力&#xff0c;可以极大地提升产品的…...

Zig语言构建工具zcc详解:依赖管理与项目构建实践

1. 项目概述&#xff1a;一个为Zig语言量身打造的构建系统最近在折腾Zig语言项目时&#xff0c;发现了一个挺有意思的工具&#xff1a;git-on-my-level/zcc。乍一看这个名字&#xff0c;可能会让人联想到经典的C编译器gcc&#xff0c;或者猜测它是一个Zig语言的C编译器前端。但…...

OpenCorpo开源企业情报工具:从数据抓取到关系图谱构建实战

1. 项目概述&#xff1a;当开源情报遇上企业数据最近在开源情报&#xff08;OSINT&#xff09;的圈子里&#xff0c;一个名为 OpenCorpo 的项目引起了我的注意。它不是一个传统意义上的商业数据库&#xff0c;而是一个由社区驱动的、旨在聚合和解析全球企业公开信息的工具集。简…...

GPU加速时序驱动布局优化技术解析

1. 时序驱动布局优化&#xff1a;GPU加速的创新实践 在超大规模集成电路&#xff08;VLSI&#xff09;物理设计中&#xff0c;时序驱动布局&#xff08;Timing-Driven Placement&#xff09;一直是决定芯片性能的关键环节。随着工艺节点不断缩小&#xff0c;设计复杂度呈指数级…...