基于IIC总线的温湿度传感器,你用过吗
时间:2023-10-14 09:07:00
大家好,我是程序员小哈。
是时候分享知识了。今天,我想和大家分享一个温湿度传感器模块。我们以前分享过DHT11和DHT21两个温湿度传感器,它们是基于单总线输出信号的传感器模块,只需要一个GPIO可获取温湿度数据。
本文即将介绍 ZS05 模块,是基础IIC总线温湿度传感器模块。
管脚定义

| 引脚 | 名称 | 含义 | 实际连接 | 
|---|---|---|---|
| 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");          Hmi_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

