0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32模块使用 SHT20温湿度传感器

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2024-12-05 12:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

一、模块来源

模块实物展示:

wKgZO2dRKKyAIO6_AAAfhHrgIiQ054.jpg


资料下载链接:
https://pan.baidu.com/s/1HrQkwECvGgQSHvt_RNdLdA

二 、规格参数

工作电压:2.1~3.6V

工作电流:0.1~1000uA

温度精度:±0.3℃

温度范围:-40~125℃

湿度范围:0~100 %RH

湿度精度:±3%RH

输出方式: IIC

管脚数量:4 Pin

以上信息见厂家资料文件

三、移植过程

我们的目标是将例程移植至CW32F030C8T6开发板上【能够测量环境温湿度】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。

3.1查看资料

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

wKgZPGdRKKyAKSFzAACC6HuC4lo524.jpg

一个时钟发送一个位,在第8个下降沿之后,通过拉低SDA引脚(ACK位 为0),只是传感器数据接收正常。在发出测量命令之后(‘1110’‘0011’代表温度测量,‘1110’‘0101’代表相对湿度测量 ,这种为主机模式),MCU必须等待测量完成。

wKgZO2dRKKyAKZiaAAB_fLtHH34993.jpg

主机模式:

测量过程中,SCL线被封锁(由传感器控制),在测量时,SHT2x将SCL拉低强制主机进入等待状态。当释放SCL线,表示传感器内部工作接收,可以继续进行数据传送

wKgZPGdRKK2AUVsoAAA_wrbcH2c867.jpg

灰色的部分是传感器控制的,当传感器给MCU返回数据时,每返回一个字节,MCU要返回一个ACK信号,当接收完毕之后,返回一个NACK并接着传输停止时序(P)。

注:校验和可以不需要,不需要则就在数据接收完之后返回NACK

非主机模式:

测量过程中,SCL线是开发状态,可进行其他通信,可以在总线上处理其他I2C总线通信任务。

当MCU要对传感器状态进行查询时,先发起一个开始信号,在发送从机地址和SDA方向位(写),此时从机匹配地址成功,则发送ACK信号,并开始测量。如果传感器完成了测量过程,并且发送ASK信号,那么MCU就可以读取相关数据。如果测量没有完成,传感器发送NACK信号,此时MCU必须重新发送启动传输时序,直至测量完成,MCU读取数据。

注意:测量的数据,温度和湿度均为两个字节。而且无论哪一种传输模式,测量的最大分辨率最大是14bit,数据的第二个字节SDA上最后两位是用来标记相关状态信息。其中bit1表示测量类型(0是温度,1是湿度)

wKgZO2dRKK2Aai9wAABNpkqliYw573.jpg

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

通常测量的最长时间取决于测量类型和分辨率.

wKgZPGdRKK2AZ08xAAAeEAbaEhQ623.jpg

在计算MCU通信时间时,测量温度选择最长测量时间是85ms,而测量相对湿度选择最长的时间是29ms。

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

wKgZO2dRKK6AO55YAAAE5Js2Rwo979.jpg

计算温度:其中ST表示我们读取到的温度原始数据。

wKgZPGdRKK6AGH71AAAGJuiVaI4140.jpg

3.2引脚选择

wKgZO2dRKK-ANulgAAEy_rc0LtI178.jpg

模块接线图

3.3移植至工程

移植步骤中的导入.c和.h文件与【CW32模块使用】DHT11温湿度传感器相同,只是将.c和.h文件更改为bsp_sht20.c与bsp_sht20.h。这里不再过多讲述,移植完成后面修改相关代码。

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

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#include "bsp_sht20.h"
#include "board.h"
#include "stdio.h"

void SHT20_GPIO_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体

    RCC_SHT20_ENABLE();        // 使能GPIO时钟

    GPIO_InitStruct.Pins = GPIO_SDA|GPIO_SCL;   // GPIO引脚
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 开漏输出
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;    // 输出速度高
    GPIO_Init(PORT_SHT20, &GPIO_InitStruct);   // 初始化
}

/******************************************************************
 * 函 数 名 称:IIC_Start
 * 函 数 说 明:IIC起始信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();

        SCL(0);
        SDA(1);
        SCL(1);

        delay_us(5);

        SDA(0);
        delay_us(5);
        SCL(0);
        delay_us(5);


}

/******************************************************************
 * 函 数 名 称:IIC_Stop
 * 函 数 说 明:IIC停止信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();

        SCL(0);
        SDA(0);

        SCL(1);
        delay_us(5);
        SDA(1);
        delay_us(5);

}

/******************************************************************
 * 函 数 名 称:IIC_Send_Ack
 * 函 数 说 明:主机发送应答
 * 函 数 形 参:0应答  1非应答
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Send_Ack(uint8_t ack)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        delay_us(5);
        if(!ack) SDA(0);
        else         SDA(1);
        SCL(1);
        delay_us(5);
        SCL(0);
        SDA(1);
}

/******************************************************************
 * 函 数 名 称:IIC_Wait_Ack
 * 函 数 说 明:等待从机应答
 * 函 数 形 参:无
 * 函 数 返 回:1=无应答   0=有应答
 * 作       者:LC
 * 备       注:无
******************************************************************/
uint8_t IIC_Wait_Ack(void)
{
        char ack = 0;
        unsigned char ack_flag = 10;
        SDA_IN();
    SDA(1);
        delay_us(5);
        SCL(1);
        delay_us(5);
        while( (SDA_GET()==1) && ( ack_flag ) )
        {
                ack_flag--;
                delay_us(5);
        }

        if( ack_flag <= 0 )
        {
                IIC_Stop();
                return 1;
        }
        else
        {
                SCL(0);
                SDA_OUT();
        }
        return ack;
}
/******************************************************************
 * 函 数 名 称:IIC_Write
 * 函 数 说 明:IIC写一个字节
 * 函 数 形 参:dat写入的数据
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Write(uint8_t data)
{
        int i = 0;
        SDA_OUT();
        SCL(0);//拉低时钟开始数据传输

        for( i = 0; i < 8; i++ )
        {
                SDA( (data & 0x80) >> 7 );
                delay_us(2);
        data< <=1;
        delay_us(6);
                SCL(1);
                delay_us(4);
                SCL(0);
                delay_us(4);

        }
}

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


/******************************************************************
 * 函 数 名 称:SHT20_Read
 * 函 数 说 明:测量温湿度
 * 函 数 形 参:regaddr寄存器地址 regaddr=0xE3测量温度 =0xE5测量湿度
 * 函 数 返 回:regaddr=0xE3时返回温度,regaddr=0xE5时返回湿度
 * 作       者:LC
 * 备       注:无
******************************************************************/
float SHT20_Read(uint8_t 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 -1rn");
    IIC_Write(regaddr);
    if( IIC_Wait_Ack() == 1 ) printf("error -2rn");

    do{
    delay_us(10);
    IIC_Start();
    IIC_Write(0x80|1);

    }while( IIC_Wait_Ack() == 1 );

    delay_us(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中,编写如下代码。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#ifndef __BSP_SHT20_H__
#define __BSP_SHT20_H__

#include "board.h"


//端口移植
#define RCC_SHT20_ENABLE()  __RCC_GPIOB_CLK_ENABLE()
#define PORT_SHT20          CW_GPIOB


#define GPIO_SDA            GPIO_PIN_9
#define GPIO_SCL            GPIO_PIN_8


//设置SDA输出模式
#define SDA_OUT()   {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;      
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_SHT20, &GPIO_InitStruct);       
                     }
//设置SDA输入模式
#define SDA_IN()    {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;         
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_SHT20, &GPIO_InitStruct);       
                    }
//获取SDA引脚的电平变化
#define SDA_GET()       GPIO_ReadPin(PORT_SHT20, GPIO_SDA)
//SDA与SCL输出
#define SDA(x)          GPIO_WritePin(PORT_SHT20, GPIO_SDA, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )
#define SCL(x)          GPIO_WritePin(PORT_SHT20, GPIO_SCL, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )


void SHT20_GPIO_INIT(void);
float SHT20_Read(unsigned char regaddr);




#endif

四、移植验证

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

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_sht20.h"

#define T_ADDR     0xf3   // 温度
#define PH_ADDR    0xf5   // 湿度

int32_t main(void)
{
    board_init();        // 开发板初始化

    uart1_init(115200);        // 串口1波特率115200

    SHT20_GPIO_INIT();
    delay_ms(1000);
    printf("SHT20 Start!!rn");

    while(1)
    {
        printf("温度 = %.2f ℃rn",  SHT20_Read(T_ADDR) );
        printf("湿度 = %.2f %%RHrn",SHT20_Read(PH_ADDR) );

        printf("n");
        delay_ms(1000);
    }
}

上电现象:

wKgZPGdRKK-AOrSBAADUohjlzOo526.jpg

模块移植成功案例代码:

链接:https://pan.baidu.com/s/13EW713tzDGwSDVUw--ouJQ?pwd=LCKF

提取码:LCKF

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2573

    文章

    54377

    浏览量

    786094
  • 温湿度传感器

    关注

    6

    文章

    627

    浏览量

    37364
  • CW32
    +关注

    关注

    1

    文章

    281

    浏览量

    1677
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于芯源CW32F030 MCU低功耗温湿度监测系统设计

    的项目。 系统概述 功能描述:实时监测环境温湿度,并通过串口输出结果。采用SHT30传感器进行数据采集。系统闲置时进入低功耗模式,延长电池寿命。 硬件组成: MCU:CW32F03
    发表于 12-03 06:20

    应用于智能门锁的温湿度传感器解决方案

    智能传感器已广泛应用于我们生活的方方面面,从智能开关(86盒)、电子温湿度计到智能窗帘盒、烟感等,无处不在。其中,温湿度传感器芯片凭借其高
    的头像 发表于 11-28 15:03 154次阅读

    CW32F030做温湿度采集,ADC读数跳变超过±3LSB正常吗?

    CW32F030做温湿度采集,ADC读数跳变超过±3LSB正常吗?已排除传感器问题,参考电压用LDO单独供电还是波动明显,是否需要外接精密基准源?
    发表于 11-20 07:47

    温湿度传感器HTU31D在温湿度中的应用优势

    温湿度控制是一种用于监测和调节环境温度与湿度的设备,广泛应用于农业、仓储、工业生产、家庭等多个领域。其主要功能是维持特定环境条件,以确保产品质量和舒适的居住环境。 温湿度控制
    的头像 发表于 11-06 14:38 134次阅读
    <b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>HTU31D在<b class='flag-5'>温湿度</b>控<b class='flag-5'>器</b>中的应用优势

    工业烘干机中使用SHT30温湿度传感器的注意事项

    工业烘干机内部是一个极端恶劣的环境,使用SHT30-DIS这样的传感器监测温湿度,需要注意以下方面:挑战具体描述对SHT30-DIS的影响高温工业烘干机的工作温度通常在60°C至120
    的头像 发表于 10-09 12:07 292次阅读
    工业烘干机中使用<b class='flag-5'>SHT</b>30<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>的注意事项

    中科银河芯GXHT30温湿度传感器的卓越性能

    在工业自动化、智能家居、医疗设备等领域,温湿度数据的精准采集直接影响系统性能与决策质量。传统传感器往往面临精度不足、稳定性差、适配性有限等痛点,而中科银河芯推出的 GXHT30 温湿度传感器
    的头像 发表于 08-08 17:09 1839次阅读

    什么是温湿度传感器的水合?

    温湿度传感器需要进行水合处理(Hydration),主要是为了优化传感器的性能、稳定性和长期可靠性。以下是具体原因和作用的详细解释:1.稳定湿度敏感材料电容式
    的头像 发表于 07-11 12:10 727次阅读
    什么是<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>的水合?

    零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

    目基于STM32F407VET6零知增强板,实现SHT41高精度温湿度传感器的驱动和数据采集。SHT41是Sensirion推出的新一代数字温湿度
    发表于 07-10 12:01

    零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

    摘要:本项目基于STM32F407VET6零知增强板驱动SHT41高精度温湿度传感器,实现±0.2℃温度精度和±1.8%RH湿度精度的数据采集。硬件连接采用I2C接口(SCL:PB6,
    的头像 发表于 07-09 18:53 913次阅读
    零知开源——STM32F407VET6驱动<b class='flag-5'>SHT</b>41<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>完整教程

    Sensirion 推出带保护盖的新型数字温湿度传感器

    Sensirion 新推出 SHT40-AD1P-R2和SHT41-AD1P-R2 两款数字温湿度传感器,现已通过其全球代理网络销售。这两款传感器
    发表于 06-26 17:56 1461次阅读
    Sensirion 推出带保护盖的新型数字<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>

    常见的温湿度传感器类型?

    温湿度传感器是一种用于测量环境温度和湿度的设备,广泛应用于工业、农业、气象等领域。以下是几种常见的温湿度传感器类型及其优缺点: 电容式
    发表于 06-24 09:24

    温湿度传感器:核心原理与跨领域应用解析

    、农业种植、医疗仓储等领域。根据市场研究机构的数据,2025 年全球温湿度传感器市场规模预计突破 50 亿美元,年复合增长率达 8.7%。 二、工作原理与技术分类 温度测量模块 热电偶技术 :利用两种不同金属的热电效应,将温度差
    的头像 发表于 03-27 11:21 1463次阅读
    <b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>:核心原理与跨领域应用解析

    温湿度传感器:生活中的“小气候专家”

    你有没有想过,为什么家里的空调总能自动调节到最舒适的温度和湿度?或者,为什么博物馆里的珍贵文物能在恒定的环境中保存完好?这一切的背后,都离不开一个默默无闻的“小气候专家”——温湿度传感器。 今天
    的头像 发表于 02-27 16:36 849次阅读

    NB温湿度传感器:无线传输,便捷安装

    在现代环境监测与控制领域,温湿度传感器扮演着至关重要的角色。而 NB 温湿度传感器凭借其无线传输特性和便捷的安装方式,正逐渐成为众多应用场景中的设备,为人们的生活和生产带来了极大的便利
    的头像 发表于 12-29 09:31 995次阅读

    安科瑞开关柜用无线温湿度传感器AHE100 提高设备使用寿命

    安科瑞开关柜用无线温湿度传感器主要用于中高压开关柜、端子箱、环网柜、箱变等设备内部及配电室环境的温湿度的检测。模块采用专用外壳,通风效果好,外观精致,能有效保护内部元件,提高使用寿命。
    的头像 发表于 12-20 10:00 998次阅读
    安科瑞开关柜用无线<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>AHE100 提高设备使用寿命