ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=19) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 本小节将讲解如何使用DHT11温湿度传感器来感知环境温湿度,并且把数据在屏幕中显示出来。许多传感器的使用方法都是类似的,通过学习使用DHT11,相信读者可以做到举一反三,能够使用更多种类的传感器。 <br/> ## **DHT11 简介** &emsp;&emsp;DHT11数字温湿度传感器是一款能够检测温湿度的复合传感器,其内置一个测温元件、一个电阻式感湿元件和一个单片机。以奥松公司生产的DHT11温湿度传感器为例,其有效测量范围为: * 温度:0~50℃ * 湿度:20~95% DHT11实物如图所示。 ![](https://img.kancloud.cn/16/a4/16a4b1f9bbabb9913f971ab7de82e8fe_742x520.png =200x) ### 可以看到,DHT11带有4个引脚,其功能说明见下表。 | PIN(引脚) | 名称 | 说明 | | --- | --- | --- | | 1 | VCC | 供电引脚,3~5.5VDC | | 2 | DATA | 温湿度数据输出 | | 3 | NC | 空置引脚 | | 4 | GND | 地线引脚,接电源负极 | 可以从DATA引脚来获取温湿度数据,下面简单讲解一下其通信协议。 <br/> ## **DATA引脚的通信协议分析** 从DHT11中获取温湿度数据的方法较比简单,首先是CC2530与DHT11配对(握手),然后按照特定的协议从DATA引脚接收数据。 <br/> **配对(握手)** 在发送数据前,DHT11需要先和CC2530配对,配对的协议如下: (1)DATA引脚在初始的默认状态时处于高电平(3.3v)。 (2)CC2530拉低DATA引脚的电平18ms毫秒以上,接着拉高电平20~40us,DHT11就会被激活。 (3)DHT11会主动拉低DATA引脚的电平,并且持续80us,表示已经收到了CC2530的指令并且配对成功。 (4)接着DHT11会再次拉高电平,80us后就开始发送温湿度数据给CC2530了。 这个配对过程如图所示。 ![](https://img.kancloud.cn/b1/12/b112e61b33912209659467f879bcdd83_832x316.png =600x) <br/> **接收收据** DHT11的温湿度数据是以二进制数据表示的,这些二进制数据是按照一个比特位接着一个比特位这样顺序发送到CC2530的,具体的原理如下: (1)在发送每个比特位之前,DHT11都会把DATA引脚的电平拉低50us,以此告诉CC2530:“我接着要发送一个比特位了”。 (2)接着,DHT11把DATA引脚的电平拉高,如果持续拉高26~28us,表示发送的是数据0;如果持续拉高70us,表示发送的是数据1,如图所示。 ![](https://img.kancloud.cn/6d/a9/6da98583ae91c5608033e24f37bc2850_830x288.png =600x) ![](https://img.kancloud.cn/2c/13/2c13178cbfcc1184074b7fc4dc211520_794x246.png =600x) ### 通过这个方式,温湿度数据就发送给了CC2530了。DHT11的通信协议大致上介绍完毕,但还有多个细节还没讲解到,有兴趣的读者可查阅更多相关的资料或仔细研究一下接下来介绍的API的源代码。 <br/> ## **DHT11驱动API简介** 基于以上原理,笔者设计了一套DHT11驱动API,使用起来非常方便。打开配套工程中的DHT11文件夹,即可找到DHT11驱动API,如图所示。 ![](https://img.kancloud.cn/4b/3a/4b3a0884d6b8fd1890bf4147906a4c07_324x239.png =200x) ### 打开hal_dht11.h文件,可以找到API定义代码: ``` //2. 51单片机入门/7. 外设实验/7.1 温湿度传感器DHT11/Workspace/code/DHT11_MAIN/hal_dht11.h /** * @fn halDHT11Init * * @brief 初始化函数,使用DHT11前必须先调用此函数 */ void halDHT11Init(void); /** * @fn halDHT11GetData * * @brief 获取DHT11的温湿度数据 * * @return 温湿度数据值 */ halDHT11Data_t halDHT11GetData(void); ``` 其中的halDHT11Data_t是一个结构体,用于保存温湿度数据,其定义代码如下: ``` 1./** @brief   用于表示DHT11温湿度数据 */   2.typedef struct  {   3.    unsigned char ok;   //ok的值非0时温湿度数据才有效 4.    unsigned char temp; //温度值,取值范围:0~50 5.    unsigned char humi; //湿度值,取值范围:20~95 6.} halDHT11Data_t; ``` <br/> ## **使用DHT11驱动API** **引脚配置** 调用API前,需要先把DATA引脚与CC2530的IO口配对起来。ZigBee标准板是使用CC2530的P0\_6引脚与DHT11的DATA引脚连接,可在hal\_dht11.h文件中找到如下配置代码: ``` 1.#define HAL_DHT11_PORT  0 //Port0.   2.#define HAL_DHT11_PIN   6 //Pin6. ``` 如果在硬件上DATA引脚需要与CC2530的其他引脚连接的话,只需要在这里修改引脚编号即可。 <br/> **API调用示例** 打开main.c文件,可以看到API调用示例代码: ``` //2. 51单片机入门/7. 外设实验/7.1 温湿度传感器DHT11/Workspace/code/DHT11_MAIN/main.c void main(void) { halDHT11Data_t dht11Dat;//定义温湿度数据结构体 uint8 tempStr[50], humiStr[50]; setSystemClk32MHZ();//初始化系统时钟频率 //初始化显示器 #ifdef LCD_OLED12864 //初始化OLED12864屏幕 halOLED12864Init() #else //初始化TFT屏幕 halTFTInit(HAL_TFT_PIXEL_WHITE); #endif halDHT11Init();//初始化DHT11温湿度传感器 while(1) { dht11Dat = halDHT11GetData();//获取温湿度数据 if (dht11Dat.ok) {//如果数据正确获取 sprintf((char *)tempStr, "Temp: %d", dht11Dat.temp);//显示温度 sprintf((char *)humiStr, "Humi: %d", dht11Dat.humi);//显示湿度 //把数据显示到屏幕中 #ifdef LCD_OLED12864 //显示到OLED12863屏幕 halOLED12864ShowX16(0,0, tempStr); halOLED12864ShowX16(1,0, humiStr); #else //显示到TFT屏幕 halTFTShowX16(0,0, HAL_TFT_PIXEL_RED, HAL_TFT_PIXEL_WHITE, tempStr); halTFTShowX16(0,16, HAL_TFT_PIXEL_RED, HAL_TFT_PIXEL_WHITE, humiStr); #endif } delayMs(SYSCLK_32MHZ, 4000);//延迟 } /* while */ } ``` <br/> ## **调试仿真** 可以运行本实验代码以观察运行结果,操作步骤如下: (1)编译链接工程代码后,把程序烧录到配套的ZigBee开发板中。 ### (2)由于本实验需要用到DHT11温湿度传感器,ZigBee标准板中已经集成了DHT11温湿度传感器,并且DATA引脚默认连接着P0_6引脚,如图所示。 ![](https://img.kancloud.cn/3c/a8/3ca871ac68eb6a4f84933e0128441b97_2344x2028.png =300x) ### 如果使用ZigBee Mini测试,需要在P0_6引脚处外接DHT11的DATA引脚,并且把该DHT11的VCC和GND引脚分别接入接入3.3v~5.5v的电源和地线。 ### (3)把OLED屏幕插入到标准板或者Mini板中,如图所示。 ![](https://img.kancloud.cn/93/15/93156ba0c66abaa69a32fd977ea3fd56_3100x2107.png =350x) ![](https://img.kancloud.cn/a0/ae/a0aed6596df9438ddc67bcc45469416e_2526x2067.png =250x) ### (4)给开发板上电,屏幕中即会显示环境温湿度数据。 <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持