大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞+,各位的是本人持续输出的动力,多谢多谢!#30天学会STM32##STM32单片机##单片机#
SHT20是一款性价比很高的温湿度传感器模块,内部集成了电容式湿度传感器、带隙温度传感器和专用模拟和数字集成电路,具有良好的精度、长期稳定性和超低功耗。其最受欢迎的地方在于,它是通过I2C总线实现功能配置和送出数据,数据格式简单,编程方便。因此,前面的“I2C通信入门”也是为了该传感器的应用进行铺垫。
【学习目标】
继续锻炼阅读器件数据手册的能力了解SHT20的工作模式和数据规范模仿和学习功能时序向驱动代码的转换本章如何调用前面编写的I2C驱动程序来完成对SHT20的读写,为了不让篇幅太长,本章打算分两个部分来讲解,本文是第二部分。
三、温湿度采集与显示实验
了解了SHT20的关键信息和工作时序,结合I2C基础,接下来我们就可以开始进行编程实践了。
3.1 任务描述
我们实时采集开发板所处环境的温度和湿度数据,并将其显示在LCD1602和串口助手上,具体效果如图7所示。
图7 实时采集和显示温湿度
3.2 工程文件清单
如图8所示,本工程在“I2C通信入门”工程基础上添加了SHT20的驱动文件sht20.c和sht20.h,同时将前面用过的LCD1602驱动文件也添加进来。
图8 温湿度采集与显示工程文件清单
3.3 工程代码剖析
这里为了突出功能细节和排版之需,以下主要针对各函数源码进行详细分析。
1)sht20.h源码剖析
该文件源码见代码清单1,第6~13行将SHT20手册中的命令码以宏的形式定义下来。对于温湿度数据,这里以SHT20_INFO结构体的形式保存(第16~21行),其实用两个独立的变量保存也是可以的,只不过结构体更体现了两个数据是一个整体,这一点在设备参数较多时体现的更明显。此外,虽然该文件里只声明了一个获取温湿度值的函数(第23行),但并不意味着驱动文件里只有这一个函数,其实它里面还调用了其他函数,详见下面的sht20.c的源码剖析。
代码清单1 sht20.h文件源码
2)sht20.c源码剖析
该文件是根据前面所述的SHT20基本功能和对应时序来编写的,基本上是每一项功能对应一个函数,下面就由易到难来逐个剖析。
SHT20_Reset()函数源码
从名字上很容易看出该函数用于SHT20的复位,因为软复位的时序最简单,所以我们把它作为第一个函数,如代码清单2所示。此外,我们将头文件和全局变量定义也一起放了这个代码清单里。
代码清单2 全局变量和SHT20_Reset()函数源码
SHT20_ReadUserReg()函数源码
该函数用来读SHT20用户寄存器,读到的数据即为返回值,源码详见代码清单3。
代码清单3 SHT20_ReadUserReg()函数源码
SHT20_CheckCrc()函数源码
该函数是使用CRC8算法检查数据的正确性,这个算法的说明文档可以在厂家官网(https://sensirion.com/cn/products/technical-download/)下载得到,如图9所示。这里不对算法原理展开,感兴趣的朋友可以阅读相应文档,或搜索CRC算法的描述。
图9 厂家对SHT2x数据校验的说明文档
该函数见代码清单4,它有三个参数:读取到的数据data、需要校验的数量nbrOfBytes、读取到的校对比验值checksum。校验成功返回0,校验失败返回1。
代码清单4 SHT20_CheckCrc()函数源码
SHT20_CalcRH()函数源码
该函数是湿度计算函数,它有一个参数sRH,代表读取到的湿度原始数据,按照手册里的湿度换算公式,返回计算结果,见代码清单5。
代码清单5 SHT20_CalcRH()函数源码
SHT20_CalcTemperatureC()函数源码
该函数是温度计算函数,它有一个参数sT,代表读取到的温度原始数据,按照手册里的湿度换算公式,返回计算结果,见代码清单6。
代码清单6 SHT20_CalcTemperatureC()函数源码
SHT20_MeasureHM()函数源码
该函数是根据测量温(湿)度的完整时序而编写的,它有两个参数:cmd表示测量的是温度还是湿度、pMeasured是保存计算结果的地址,返回值是温度或湿度的测量结果。详细源码见代码清单7。
代码清单7 SHT20_MeasureHM()函数源码
SHT20_GetValue()函数源码
经过前面若干个函数的层层迭代和封装,SHT20_GetValue()是最终获取温湿度数据的函数,结果保存在SHT20结构体里,如代码清单8所示。此外,根据手册对用户寄存器的描述:在进行任何写寄存器的操作之前,必须先读预留位的默认值。因此,我们可以看到其中有多处读用户寄存器的操作。
代码清单8 SHT20_GetValue()函数源码
3)main.c源码剖析
主程序在完成必要的初始化后,每隔一定时间获取一次温湿度数据,送上LCD1602的第二行显示,同时也“打印”在串口助手上,详见代码清单9。
代码清单9 main.c文件源码
图7已经呈现了本实验的效果,大家在测量时可以将手指轻轻按压在SHT20传感器上,可以看到湿度上升明显(一般皮肤上有汗),温度也缓慢上升至接近体温。
(第二部分完,共两部分)