基于IIC总线的温湿度传感器,你用过吗

大家好,我是程序员小哈。

又到了知识分享时间,今天我给大家分享一个温湿度传感器模块,我们之前分享过DHT11和DHT21两款温湿度传感器,它俩是基于单总线输出信号的传感器模块,只需要一个GPIO即可实现温湿度数据的获取。

本文即将介绍的 ZS05 模块,是一个基于IIC总线的温湿度传感器模块。

管脚定义

ZS05温湿度传感器模块

引脚 名称 含义 实际连接
1 VCC 供电,2.7~5.5V 3.3V
2 SDA 数据引脚 PB7
3 GND 电源地 GND
4 SCL 时钟脚 PB6

同类产品对比

已分享的三款温湿度传感器对比:

DHT11 DHT21 ZS05
温度测量范围 0~+50℃ -40~+80℃ -20~+60℃
湿度测量范围 20~90%RH 0~99.9% 20~90%RH
测温精度 ±2℃ ±0.5℃ ±1℃
测湿精度 ±5%RH ±3%RH ±5%RH
价格 3~5元 12~25元 4~6元

注意:数据来源于网络,仅供参考。

原理图

原理图

注意:IIC总线的两个GPIO口需要添加上拉电阻才可。

程序移植

我们之前分享过GY-302 光照传感器模块,这个模块的驱动就是 IIC 总线,我们今天就在它的程序基础上完成本文Demo程序。

修改引脚定义

//IIC总线地址接口定义
#define IIC_SCL PBout(6)
#define IIC_SDA_OUT PBout(7)
#define IIC_SDA_IN PBin(7)
 
#define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}

修改连续读函数

因为这个温湿度传感器模块支持标准的IIC协议,所以IIC总线的 起始信号终止信号发送一个字节接收一个字节发送应答信号接收应答信号 的时序基本都是一样的,我们只要注意一下IIC通信速率满足要求即可。

我们重点需要修改的代码就是多字节的读操作的实现,因为每个传感器模块读取的数据数量不一样,这个温湿度传感器返回的是五个字节的数据,所以我们要对连续读操作的函数进行改写,这部分内容的具体时序可以参考手册中的如下时序图:

具体实现如下:

/*********************************************************
连续读出ZS05内部数据
*********************************************************/
void Multiple_Read_ZS05()
{   
	ZS05_Start();//起始信号
	ZS05_SendByte(SlaveAddress);
	ZS05_RecvACK();
	ZS05_SendByte(0x00);
	ZS05_RecvACK();
    
	ZS05_Start();//起始信号
	ZS05_SendByte(SlaveAddress+1);
	ZS05_RecvACK();
	BUF[0] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[1] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[2] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[3] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[4] = ZS05_RecvByte();
	ZS05_SendACK(1);
	ZS05_Stop();//停止信号
}

其中 #define SlaveAddress 0xB8 // ZS05地址

IIC总线的其他函数实现,请参考公众号内其他相关网文。

处理数据

将采集到的数据,进行校验,校验通过之后,对温湿度数据进行换算并打印输出串口数据。

/*********************************************************
读出数据并合成实际光强值
*********************************************************/
void Get_TEMP_RH_Value()
{
    float Humi,Temprature;
    u8 i=0;
    u8 Humi_H,Humi_L,Temp_H,Temp_L,Temp_CAL,Temp_SUM;
	
    Multiple_Read_ZS05();					//连续读出数据,存储在BUF中 
	
    //打印输出传感器的原始数据,方便调试
    for(i=0;i<5;i++)
        printf("0X%X ",BUF[i]);
    
    printf("\r\n");
    
    Humi_H=BUF[0];   //读取湿度高位
    Humi_L=BUF[1];   //读取湿度低位
    Temp_H=BUF[2];   //读取温度高位
    Temp_L=BUF[3];   //读取温度低位
    Temp_CAL=BUF[4]; //读取校验位
    Temp_SUM = (u8)(Humi_H+Humi_L+Temp_H+Temp_L);//只取低8位
    
    if(Temp_CAL==Temp_SUM)  //校验通过
    {
        Humi=Humi_H*10+Humi_L; //湿度

        if(Temp_L&0X80)	//为负温度
        {
            Temprature =0-(Temp_H*10+((Temp_L&0x7F)));
        }
        else   //为正温度
        {
            Temprature=Temp_H*10+Temp_L;//为正温度
        }
        
        Temprature=Temprature/10;//计算为温度值
        Humi=Humi/10; //计算为湿度值
        printf("温度为:  %.1f ℃ \r\n",Temprature); //显示温度
        printf("湿度为:  %.1f %% RH\r\n\r\n",Humi);//显示湿度		   
    }
}

源码获取

小哈哥 微信群 中提供本文实例的测试Demo,公众号后台回复:加群,获取小哈哥联系方式。

结果展示

实际硬件连接

串口输出

总结

怎么样?有没有收获?IIC总线经常用到,属于必会技能哈,大家可以像我一样移植一下代码,练练手。

有什么问题可以文末留言交流一下哈,或者加小哈哥微信,我们群里聊。

好了,今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见!~

参考阅读

DHT11及DHT21温湿度传感器时序图解析(STM32)

GY-302 数字光照传感器光照模块驱动

欢迎加入

小哈哥的小密圈已经创建半年了,里面有更多技术解读和资料分享,并与小哈哥一对一交流,欢迎加入知识星球「小哈和他的朋友们」,一个关乎技术成长的圈子。

优惠劵还有一些,早加入,早陪同,小哈哥期待与你一同成长。

知识星球简介链接:
https://mp.weixin.qq.com/s/LIZlGiqExmSVohLgkUbkoA

版权声明:本文为CSDN博主「程序员小哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rsd102/article/details/122445874

大家好,我是程序员小哈。

又到了知识分享时间,今天我给大家分享一个温湿度传感器模块,我们之前分享过DHT11和DHT21两款温湿度传感器,它俩是基于单总线输出信号的传感器模块,只需要一个GPIO即可实现温湿度数据的获取。

本文即将介绍的 ZS05 模块,是一个基于IIC总线的温湿度传感器模块。

管脚定义

ZS05温湿度传感器模块

引脚 名称 含义 实际连接
1 VCC 供电,2.7~5.5V 3.3V
2 SDA 数据引脚 PB7
3 GND 电源地 GND
4 SCL 时钟脚 PB6

同类产品对比

已分享的三款温湿度传感器对比:

DHT11 DHT21 ZS05
温度测量范围 0~+50℃ -40~+80℃ -20~+60℃
湿度测量范围 20~90%RH 0~99.9% 20~90%RH
测温精度 ±2℃ ±0.5℃ ±1℃
测湿精度 ±5%RH ±3%RH ±5%RH
价格 3~5元 12~25元 4~6元

注意:数据来源于网络,仅供参考。

原理图

原理图

注意:IIC总线的两个GPIO口需要添加上拉电阻才可。

程序移植

我们之前分享过GY-302 光照传感器模块,这个模块的驱动就是 IIC 总线,我们今天就在它的程序基础上完成本文Demo程序。

修改引脚定义

//IIC总线地址接口定义
#define IIC_SCL PBout(6)
#define IIC_SDA_OUT PBout(7)
#define IIC_SDA_IN PBin(7)
 
#define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}

修改连续读函数

因为这个温湿度传感器模块支持标准的IIC协议,所以IIC总线的 起始信号终止信号发送一个字节接收一个字节发送应答信号接收应答信号 的时序基本都是一样的,我们只要注意一下IIC通信速率满足要求即可。

我们重点需要修改的代码就是多字节的读操作的实现,因为每个传感器模块读取的数据数量不一样,这个温湿度传感器返回的是五个字节的数据,所以我们要对连续读操作的函数进行改写,这部分内容的具体时序可以参考手册中的如下时序图:

具体实现如下:

/*********************************************************
连续读出ZS05内部数据
*********************************************************/
void Multiple_Read_ZS05()
{   
	ZS05_Start();//起始信号
	ZS05_SendByte(SlaveAddress);
	ZS05_RecvACK();
	ZS05_SendByte(0x00);
	ZS05_RecvACK();
    
	ZS05_Start();//起始信号
	ZS05_SendByte(SlaveAddress+1);
	ZS05_RecvACK();
	BUF[0] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[1] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[2] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[3] = ZS05_RecvByte();
	ZS05_SendACK(0);
	BUF[4] = ZS05_RecvByte();
	ZS05_SendACK(1);
	ZS05_Stop();//停止信号
}

其中 #define SlaveAddress 0xB8 // ZS05地址

IIC总线的其他函数实现,请参考公众号内其他相关网文。

处理数据

将采集到的数据,进行校验,校验通过之后,对温湿度数据进行换算并打印输出串口数据。

/*********************************************************
读出数据并合成实际光强值
*********************************************************/
void Get_TEMP_RH_Value()
{
    float Humi,Temprature;
    u8 i=0;
    u8 Humi_H,Humi_L,Temp_H,Temp_L,Temp_CAL,Temp_SUM;
	
    Multiple_Read_ZS05();					//连续读出数据,存储在BUF中 
	
    //打印输出传感器的原始数据,方便调试
    for(i=0;i<5;i++)
        printf("0X%X ",BUF[i]);
    
    printf("\r\n");
    
    Humi_H=BUF[0];   //读取湿度高位
    Humi_L=BUF[1];   //读取湿度低位
    Temp_H=BUF[2];   //读取温度高位
    Temp_L=BUF[3];   //读取温度低位
    Temp_CAL=BUF[4]; //读取校验位
    Temp_SUM = (u8)(Humi_H+Humi_L+Temp_H+Temp_L);//只取低8位
    
    if(Temp_CAL==Temp_SUM)  //校验通过
    {
        Humi=Humi_H*10+Humi_L; //湿度

        if(Temp_L&0X80)	//为负温度
        {
            Temprature =0-(Temp_H*10+((Temp_L&0x7F)));
        }
        else   //为正温度
        {
            Temprature=Temp_H*10+Temp_L;//为正温度
        }
        
        Temprature=Temprature/10;//计算为温度值
        Humi=Humi/10; //计算为湿度值
        printf("温度为:  %.1f ℃ \r\n",Temprature); //显示温度
        printf("湿度为:  %.1f %% RH\r\n\r\n",Humi);//显示湿度		   
    }
}

源码获取

小哈哥 微信群 中提供本文实例的测试Demo,公众号后台回复:加群,获取小哈哥联系方式。

结果展示

实际硬件连接

串口输出

总结

怎么样?有没有收获?IIC总线经常用到,属于必会技能哈,大家可以像我一样移植一下代码,练练手。

有什么问题可以文末留言交流一下哈,或者加小哈哥微信,我们群里聊。

好了,今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见!~

参考阅读

DHT11及DHT21温湿度传感器时序图解析(STM32)

GY-302 数字光照传感器光照模块驱动

欢迎加入

小哈哥的小密圈已经创建半年了,里面有更多技术解读和资料分享,并与小哈哥一对一交流,欢迎加入知识星球「小哈和他的朋友们」,一个关乎技术成长的圈子。

优惠劵还有一些,早加入,早陪同,小哈哥期待与你一同成长。

知识星球简介链接:
https://mp.weixin.qq.com/s/LIZlGiqExmSVohLgkUbkoA

版权声明:本文为CSDN博主「程序员小哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rsd102/article/details/122445874

生成海报
点赞 0

程序员小哈

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于IIC总线的温湿度传感器,你用过吗

大家好,我是程序员小哈。 又到了知识分享时间,今天我给大家分享一个温湿度传感器模块,我们之前分享过DHT11和DHT21两款温湿度传感器,它俩是基于单总线输出信号的传感器模块&#xff0

韦东山物联网学习第一课

今天我重温习了一下STM32的物联网编程。主要重新温故了一下STM32的时钟设置,并放上了注释: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_