GD32F470_SHT20温湿度传感器模块/数字型温湿度测量模块 I2C通讯小体积模块

2.24 SHT20温湿度传感器

由瑞士Sensirion推出的 SHT20数字温湿度传感器,基于领先世界的CMOSens ® 数字传感技术,具有极高的可靠性和卓越的长期稳定性。全量程标定,两线数字接口,可与单片机直接相连,大大缩短研发时间、简化外围电路并降低费用。此外,体积微小、响应迅速、低能耗、可浸没、抗干扰能力强、温湿一体,兼有露点测量,性价比高,使该产品能够适于多种场合的应用。

2.24.1 模块来源

采购链接:
SHT20温湿度传感器模块/数字型温湿度测量模块 I2C通讯小体积模块
资料下载链接:
https://pan.baidu.com/s/1HrQkwECvGgQSHvt_RNdLdA

2.24.2 规格参数

工作电压:2.1~3.6V
工作电流:0.1~1000uA
温度精度:±0.3℃
温度范围:-40~125℃
湿度范围:0~100 %RH
湿度精度:±3%RH
输出方式: IIC
管脚数量:4 Pin

2.24.3 移植过程

我们的目标是在梁山派GD32F470上能够测量环境温湿。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

2.24.3.1 查看资料

开始传输后,随后先传输首字节包括I2C设备地址(7bit)和一个SDA方向位(R:1, W:0)。

在这里插入图片描述
一个时钟发送一个位,在第8个下降沿之后,通过拉低SDA引脚(ACK位 为0),只是传感器数据接收正常。在发出测量命令之后(‘1110’‘0011’代表温度测量,‘1110’‘0101’代表相对湿度测量 ,这种为主机模式),MCU必须等待测量完成。
在这里插入图片描述
主机模式和主机模式:①主机模式:测量过程中,SCL线被封锁(由传感器控制),在测量时,SHT2x将SCL拉低强制主机进入等待状态。当释放SCL线,表示传感器内部工作接收,可以继续进行数据传送

在这里插入图片描述
灰色的部分是传感器控制的,当传感器给MCU返回数据时,每返回一个字节,MCU要返回一个ACK信号,当接收完毕之后,返回一个NACK并接着传输停止时序(P)。
注:校验和可以不需要,不需要则就在数据接收完之后返回NACK

②非主机模式:测量过程中,SCL线是开发状态,可进行其它通信,可以在总线上处理其它I2C总线通信任务。
当MCU要对传感器状态进行查询时,先发起一个开始信号,在发送从机地址和SDA方向位(写),此时从机匹配地址成功,则发送ACK信号,并开始测量。如果传感器完成了测量过程,并且发送ASK信号,那么MCU就可以读取相关数据。如果测量没有完成,传感器发送NACK信号,此时MCU必须重新发送启动传输时序,直至测量完成,MCU读取数据。
注意:测量的数据,温度和湿度均为两个字节。而且无论哪一种传输模式,测量的最大分辨率最大是14bit,数据的第二个字节SDA上最后两位是用来标记相关状态信息。其中bit1表示测量类型(0是温度,1是湿度)

在这里插入图片描述
灰色的区域是传感器控制的,如果不需要校验和,那么在接收完两个字节的数据之后就MCU直接发出NACK信号再接着发出停止时序§,则结束通信。

通常测量的最长时间取决于测量类型和分辨率.
在这里插入图片描述
在计算MCU通信时间时,测量温度选择最长测量时间是85ms,而测量相对湿度选择最长的时间是29ms。

传感器内部设置的默认分辨率为相对湿度12位和温度14位。SDA的输出数据被转换成两个字节的数据包,高字节MSB在前(左对齐)。每个字节后面都跟随一个应答位。两个状态位,即 LSB的后两位在进行物理计算前须置0。
计算湿度:其中SRH表示我们读取到的湿度原始数据。

计算温度:其中ST表示我们读取到的温度原始数据。
在这里插入图片描述

2.24.3.2 引脚选择

在这里插入图片描述

2.24.3.3 移植至工程

移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_sht20.c与bsp_sht20.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_sht20.c中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_sht20.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年04月27日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/

#include "bsp_sht20.h"
#include "systick.h"
#include "stdio.h"

/******************************************************************
 * 函 数 名 称:SHT20_GPIO_Init
 * 函 数 说 明:对IIC引脚初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC 
 * 备       注:
******************************************************************/
void SHT20_GPIO_Init(void)
{                                
                //打开SDA与SCL的引脚时钟
        rcu_periph_clock_enable(RCU_SCL);
    rcu_periph_clock_enable(RCU_SDA);

        //设置SCL引脚模式为上拉输出
        gpio_mode_set(PORT_SCL, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SCL);
        //设置引脚为开漏模式,翻转速度2MHz
        gpio_output_options_set(PORT_SCL, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_SCL);        
        //设置引脚输出高电平SCL等待信号
        gpio_bit_write(PORT_SCL, GPIO_SCL, SET);
        
        //设置SDA引脚
        gpio_mode_set(PORT_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDA);
        gpio_output_options_set(PORT_SDA, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_SDA);        
        gpio_bit_write(PORT_SDA, GPIO_SDA, SET);

}


/******************************************************************
 * 函 数 名 称:IIC_Start
 * 函 数 说 明:IIC起始信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();
                   
        SDA(1);
        delay_1us(5);
        SCL(1); 
        delay_1us(5);
        
        SDA(0);
        delay_1us(5);
        SCL(0);
        delay_1us(5);
                       
}
/******************************************************************
 * 函 数 名 称:IIC_Stop
 * 函 数 说 明:IIC停止信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        
        SCL(1);
        delay_1us(5);
        SDA(1);
        delay_1us(5);
        
}
/******************************************************************
 * 函 数 名 称:IIC_Send_Ack
 * 函 数 说 明:主机发送应答
 * 函 数 形 参:0应答  1非应答
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Send_Ack(unsigned char ack)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        delay_1us(5);
        if(!ack) SDA(0);
        else         SDA(1);
        SCL(1);
        delay_1us(5);
        SCL(0);
        SDA(1);
}
/******************************************************************
 * 函 数 名 称:IIC_Wait_Ack
 * 函 数 说 明:等待从机应答
 * 函 数 形 参:无
 * 函 数 返 回:1=无应答   0=有应答
 * 作       者:LC
 * 备       注:无
******************************************************************/

unsigned char IIC_Wait_Ack(void)
{
        
        char ack = 0;
        unsigned char ack_flag = 10;
        SDA_IN();
    SDA(1);
        delay_1us(5);
        SCL(1);
        delay_1us(5);
        while( (GETSDA()==1) && ( ack_flag ) )
        {
                ack_flag--;
                delay_1us(5);
        }
        
        if( ack_flag <= 0 )
        {
                IIC_Stop();
                return 1;
        }
        else
        {
                SCL(0);
                SDA_OUT();
        }
        return ack;
}
/******************************************************************
 * 函 数 名 称:IIC_Write
 * 函 数 说 明:IIC写一个字节
 * 函 数 形 参:dat写入的数据
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Write(unsigned char dat)
{
        int i = 0;
        SDA_OUT();
        SCL(0);//拉低时钟开始数据传输
        
        for( i = 0; i < 8; i++ )
        {
                SDA( (dat & 0x80) >> 7 );
                __nop();
        __nop();
        __nop();
        dat<<=1;
        delay_1us(6); 
                SCL(1);
                delay_1us(4);
                SCL(0);
                delay_1us(4);
                
        }        
}

/******************************************************************
 * 函 数 名 称:IIC_Read
 * 函 数 说 明:IIC读1个字节
 * 函 数 形 参:无
 * 函 数 返 回:读出的1个字节数据
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned char IIC_Read(void)
{
        unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        SCL(0);
        delay_1us(5);
        SCL(1);
        delay_1us(5);
        receive<<=1;
        if( GETSDA() )
        {        
            receive|=1;   
        }
        delay_1us(5); 
    }                
  return receive;
}

/******************************************************************
 * 函 数 名 称:SHT20_Read
 * 函 数 说 明:测量温湿度
 * 函 数 形 参:regaddr寄存器地址 regaddr=0xf3测量温度 =0x35测量湿度 
 * 函 数 返 回:regaddr=0xf3时返回温度,regaddr=0xf5时返回湿度
 * 作       者:LC
 * 备       注:无
******************************************************************/
float SHT20_Read(unsigned char regaddr)
{
    unsigned char data_H = 0;
    unsigned char data_L = 0;
    float temp = 0;
    IIC_Start();
    IIC_Write(0x80|0);
    if( IIC_Wait_Ack() == 1 ) printf("error -1\r\n");
    IIC_Write(regaddr);
    if( IIC_Wait_Ack() == 1 ) printf("error -2\r\n");
       
    do{
    delay_1us(10);
    IIC_Start();
    IIC_Write(0x80|1);
    
    }while( IIC_Wait_Ack() == 1 );

    delay_1us(20);
    
    data_H = IIC_Read();
    IIC_Send_Ack(0);
    data_L = IIC_Read();
    IIC_Send_Ack(1);
    IIC_Stop();
    
    if( regaddr == 0xf3 )
    {
        temp = ((data_H<<8)|data_L) / 65536.0 * 175.72 - 46.85;
    }
    if( regaddr == 0xf5 )
    {
        temp = ((data_H<<8)|data_L) / 65536.0 * 125.0 - 6;
    }
   return temp;
}

    

在文件bsp_sht20.h中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_sht20.h
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2022年04月27日
  * 功能介绍:          
  ******************************************************************************
  * 开发板官网:www.lckfb.com        
*********************************************************************************/

#ifndef _BSP_SHT20_H_
#define _BSP_SHT20_H_
 
#include "gd32f4xx.h"


#define RCU_SCL  RCU_GPIOA
#define PORT_SCL GPIOA
#define GPIO_SCL GPIO_PIN_5

#define RCU_SDA  RCU_GPIOA
#define PORT_SDA GPIOA
#define GPIO_SDA GPIO_PIN_6


#define SDA_IN()  {gpio_mode_set(PORT_SDA, GPIO_MODE_INPUT,  GPIO_PUPD_PULLUP, GPIO_SDA);}        //SDA输入模式
#define SDA_OUT() {gpio_mode_set(PORT_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDA);}  //SDA输出模式

#define SCL(BIT)  gpio_bit_write( PORT_SCL, GPIO_SCL, BIT?SET:RESET)
#define SDA(BIT)  gpio_bit_write( PORT_SDA, GPIO_SDA, BIT?SET:RESET)
#define GETSDA()  gpio_input_bit_get( PORT_SDA, GPIO_SDA)


void SHT20_GPIO_Init(void);
float SHT20_Read(unsigned char regaddr);
#endif


2.24.4 移植验证

在自己工程中的main主函数中,编写如下。

/********************************************************************************
  * 文 件 名: main.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2022年04月27日
  * 功能介绍:          
  ******************************************************************************
  * 开发板官网:www.lckfb.com        
*********************************************************************************/

#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "bsp_sht20.h"


int main(void)
{
        nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
        systick_config();                //滴答定时器初始化 1ms
        usart_gpio_config(115200);
        SHT20_GPIO_Init();
        delay_1ms(1000);
        printf("demo start\r\n");
        while(1) 
        {
            printf("temperature = %.2f ℃\r\n",SHT20_Read(0xf3));
            printf("humidity = %.2f %%RH\r\n",SHT20_Read(0xf5));
            delay_1ms(1000);
        }
}




移植现象:每隔一秒测量一次温湿度,并发送至串口0。

在这里插入图片描述

移植成功示例,见文件2.24.4-1 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网数据服务平台

随着物联网技术的迅猛发展&#xff0c;海量数据的产生和应用成为推动工业数字化转型的核心动力。在这个数据为王的时代&#xff0c;如何高效地收集、处理、分析并应用这些数据&#xff0c;成为了企业关注的焦点。物联网数据服务平台应运而生&#xff0c;为企业提供了全面、高效…

考研数学|打基础看张宇《30讲》还是武忠祥《基础篇》?

这题我会啊&#xff0c;基础阶段我还是推荐张宇老师 因为张宇老师和武忠祥老师的实力都很厉害&#xff0c;最主要的区别就是讲课的风格。我比较喜欢张宇老师的讲课风格&#xff0c;比较幽默风趣&#xff0c;能够调动课堂氛围了和学生思维。这一点在考研初期&#xff0c;帮助我…

区块链与数字身份:探索Facebook的新尝试

在数字化时代&#xff0c;随着区块链技术的崛起&#xff0c;数字身份成为了一个备受关注的话题。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在探索如何利用区块链技术来改善数字身份管理和用户数据安全。本文将深入探讨Facebook在这一领域的新尝试&#xff0c;探…

AI大模型基石:文字与数字的起源与演变

AI大模型基石&#xff1a;文字与数字的起源与演变 1、文字 1.1、起源 我们的祖先在还没有发明文字和语言之前就已经开始使用“咿咿呀呀”的声音来传播信息了&#xff0c;比如在野外活动遇到危险&#xff0c;然后发出“咿咿呀呀”的声音来提醒同伴小心&#xff0c;同伴在接收到…

u-tabs徽标改颜色并随着鼠标点击而改色

在uview官网中没找到改色的api&#xff0c;然后就查看源码&#xff0c;发现通过修改源码能实现上图效果&#xff0c;本次组件用的uview 2x版本 修改文件u-tabs文件&#xff0c;然后把依赖文件带过来&#xff0c;如图下&#xff1a; 然后修改my_tabs.vue文件&#xff08;即原u-…

一站式解读多模态——Transformer、Embedding、主流模型与通用任务实战(下)

本文章由飞桨星河社区开发者高宏伟贡献。高宏伟&#xff0c;飞桨开发者技术专家&#xff08;PPDE&#xff09;&#xff0c;飞桨领航团团长&#xff0c;长期在自媒体领域分享AI技术知识&#xff0c;博客粉丝9w&#xff0c;飞桨星河社区ID为GoAI 。分享分为上下两期&#xff0c;本…

Windows下的ASLR保护机制详解及其绕过

写在前面&#xff1a; 本篇博客为本人原创&#xff0c;但非首发&#xff0c;首发在先知社区 原文链接&#xff1a; https://xz.aliyun.com/t/13924?time__1311mqmxnQ0%3DqGwx2DBqDTlpzeG%3DKT8qQTID&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣的…

设计模式总结-抽象工厂模式

抽象工厂模式 模式动机模式定义模式结构模式分析模式实例与解析实例一&#xff1a;电器工厂 模式动机 在工厂方法模式中具体工厂负责生产具体的产品&#xff0c;每一个具体工厂对应一种具体产品&#xff0c;工厂方法也具有唯一性&#xff0c;一般情况下&#xff0c;一个具体工…

4.8QT

将按钮3&#xff0c;基于qt4版本连接实现点击按钮3&#xff0c;实现关闭窗口。 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), btn3(new QPushButton(this)) {ui->s…

D1084 5A低压差电压调整器应用方案,内含电流限制和热保护功能,防止任何过载时产生过高的结温。

1、 概述&#xff1a; D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。输出电压可通过电位器调节或1.5V, 1.8V, 3.3V三个固定电压版。内含电流限制和热保护功能&#xff0c;防止任何过载时产生过高的结温。D1084系列电路有标准TO-220、TO-263和TO-252封装形式。 2、 典…

代码随想录训练营day32

第八章 贪心算法 part02 1.LeetCode. 买卖股票的最佳时机II 1.1题目链接&#xff1a;122.买卖股票的最佳时机 II 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;本题首先要清楚两点&#xff1a;只有一只股票&#xff01;当前只有买股…

02_物联网感知技术

物联网感知技术 物联网感知技术 物联网感知技术

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

漫谈GIS和空间数据库技术

1 GIS和CAD有啥区别 地理信息系统&#xff08;GIS&#xff09;和计算机辅助设计&#xff08;CAD&#xff09;是两种不同的技术&#xff0c;它们在功能、应用和数据处理方面有着显著的区别。以下是根据搜索结果得出的GIS和CAD的主要区别&#xff1a; 1. **数据处理的侧重点不同…

Redis-底层数据结构

Redis-底层数据结构 redisObject对象机制对象共享引用计数以及对象的消毁 动态字符串SDS链表链表的优缺点: 压缩链表ziplist的缺点 字典-Dictrehash渐进式rehash 整数集-intSet内存分布图整数集合的升级 跳表 - ZSkipList快表-quicklistlistpack redisObject对象机制 typedef s…

【神经网络】生成对抗网络GAN

生成对抗网络GAN 欢迎访问Blog总目录&#xff01; 文章目录 生成对抗网络GAN1.学习链接2.GAN结构2.1.生成模型Generator2.2.判别模型Discrimintor2.3.伪代码 3.优缺点3.1.优势3.2.缺点 4.pytorch GAN4.1.API4.2.GAN的搭建4.2.1.结果4.2.2.代码 4.3.示意图:star: 1.学习链接 …

浅析安全传输协议HTTPS之“S”

当前互联网&#xff0c;在各大浏览器厂商和CA厂商的推动下&#xff0c;掀起了一股HTTPS应用浪潮。为了让大家更好的了解HTTPS&#xff0c;本文给大家介绍关于HTTPS 中的S一个整体的认识。从其产生的历史背景、设计目标说起&#xff0c;到分析其协议设计结构、交互流程是如何实现…

kernel32.dll文件丢失的几种相应解决办法,成功解决丢失难题

当启动计算机并尝试运行某个应用程序时&#xff0c;屏幕上突然弹出一条醒目的错误提示&#xff1a;“电脑显示kernel32.dll丢失”。这也就意味着操作系统在当前环境下无法找到名为“kernel32.dll”的动态链接库文件。这个问题可能会导致一些应用程序无法正常运行&#xff0c;给…

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口&#xff1a; Text(content?: string | Resource) 参数&#xff1a; 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效&#xff0c;显示Span内容&#xff0c;并且此时text组件的样式不…

模型优化和调整(2)

接模型优化和调整&#xff08;1&#xff09; 调整反向传播 梯度消失和梯度爆炸 梯度消失和梯度爆炸都和计算出来的“delta”有关。理想的delta应该是逐渐减小的。如果delta一直太小&#xff0c;则会导致下降太慢&#xff0c;甚至对于权重没有改变&#xff0c;此时形成了梯度…