点击上方“嵌入式从0到1”,选择“星标公众号”
大家好,我是程序员小哈。
又到了知识分享时间,今天我给大家分享一个温湿度传感器模块,我们之前分享过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");
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 数字光照传感器光照模块驱动
end
一口Linux
关注,回复【1024】海量Linux资料赠送
精彩文章合集
文章推荐
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看