4899|0

1239

帖子

66

TA的资源

纯净的硅(中级)

楼主
 

使用 MCUXpresso Config Tools工具配置FRDM-KW41Z的GPIO驱动DHT22温湿度传感器 [复制链接]

本帖最后由 dql2016 于 2017-6-17 21:58 编辑

DHT22是已校准的数字温湿度传感器,用于检测环境温湿度,采用DHT22(AM2302),标准单总线接口。
相比DHT11,拥有更高的精度和更大的量程。
【参数】
温度
分辨率:0.1°C
精度:±0.5℃
检测范围:-40°C ~ 80°C
湿度
分辨率:0.1%RH
精度:±2%RH (25°C)
检测范围:0%RH ~ 99.9%RH
工作电压 :3.3V ~ 5.5 V
推荐存储环境:
温度:10°C ~40°C
湿度:60%RH以下
【应用】
气象站、湿度调节器和测试及检测设备等
【接口说明】
以接入MCU为例:
VCC:接3.3V ~ 5.5V
GND:接GND
DOUT:接MCU.IO

选择KW41Z的PTC19(对应FRDM-KW41Z板卡的D2)来驱动DHT22,需要把它配置为输入、输出模式;

step1:配置时钟;

step2:配置PTC19为输出;

step3:生成工程Keil MDK;

step4:DHT22驱动代码网上很多,这里只需要做几个接口就行了,分别是设置GPIO输入输出方向,输出时输出高低电平,读取IO值;
现在DHT22.h文件定义下端口:
  1. //choose a gpio pin to drive dht22
  2. //in FRDM-KW41Z board is Arduino UNO R3's D2
  3. #define DHT22_FGPIO FGPIOC  
  4. #define DHT22_GPIO  GPIOC                        
  5. #define DHT22_Port  PORTC                                      
  6. #define DHT22_Pin   19U
复制代码

然后在DHT22.c编写接口函数:
  1. //Set GPIO Direction
  2. void DHT22_IO_IN(void)
  3. {
  4.          /* Input pin configuration */
  5.          gpio_pin_config_t inconfig =
  6.          {
  7.                  kGPIO_DigitalInput,
  8.                  0,
  9.          };
  10.    /* Input pin PORT configuration */
  11.   port_pin_config_t config =
  12.         {
  13.                 kPORT_PullUp,
  14.                 kPORT_FastSlewRate,
  15.                 kPORT_PassiveFilterDisable,                        
  16.                 kPORT_LowDriveStrength,
  17.                 kPORT_MuxAsGpio,
  18.   };
  19.          
  20. PORT_SetPinConfig(DHT22_Port, DHT22_Pin, &config);//config as pull-up                                                         
  21. FGPIO_PinInit(DHT22_FGPIO, DHT22_Pin, &inconfig);//config as input        
  22. }
  23. //Set GPIO Direction
  24. void  DHT22_IO_OUT(void)
  25. {
  26.                 /* Output pin configuration */
  27.          gpio_pin_config_t outconfig =
  28.          {
  29.                  kGPIO_DigitalOutput,
  30.                  0,
  31.          };
  32.           GPIO_PinInit(DHT22_GPIO, DHT22_Pin, &outconfig);//config as output
  33. }
  34. //output 1 or 0
  35. #define        DHT22_DQ_OUT_0  GPIO_WritePinOutput(DHT22_GPIO, DHT22_Pin, 0)
  36. #define        DHT22_DQ_OUT_1  GPIO_WritePinOutput(DHT22_GPIO, DHT22_Pin, 1)
  37. //read 1 or 0
  38. #define        DHT22_DQ_IN     FGPIO_ReadPinInput(DHT22_FGPIO,DHT22_Pin)
复制代码


DHT22.c文件如下,采用接口形式很容易移植到其它MCU:

  1. #include "DHT22.h"


  2. //follow are 4 gpio interface
  3. //Set GPIO Direction
  4. void DHT22_IO_IN(void)
  5. {
  6.          /* Input pin configuration */
  7.          gpio_pin_config_t inconfig =
  8.          {
  9.                  kGPIO_DigitalInput,
  10.                  0,
  11.          };
  12.    /* Input pin PORT configuration */
  13.   port_pin_config_t config =
  14.         {
  15.                 kPORT_PullUp,
  16.                 kPORT_FastSlewRate,
  17.                 kPORT_PassiveFilterDisable,                        
  18.                 kPORT_LowDriveStrength,
  19.                 kPORT_MuxAsGpio,
  20.   };
  21.          
  22. PORT_SetPinConfig(DHT22_Port, DHT22_Pin, &config);//config as pull-up                                                         
  23. FGPIO_PinInit(DHT22_FGPIO, DHT22_Pin, &inconfig);//config as input        
  24. }
  25. //Set GPIO Direction
  26. void  DHT22_IO_OUT(void)
  27. {
  28.                 /* Output pin configuration */
  29.          gpio_pin_config_t outconfig =
  30.          {
  31.                  kGPIO_DigitalOutput,
  32.                  0,
  33.          };
  34.           GPIO_PinInit(DHT22_GPIO, DHT22_Pin, &outconfig);//config as output
  35. }
  36. //output 1 or 0
  37. #define        DHT22_DQ_OUT_0  GPIO_WritePinOutput(DHT22_GPIO, DHT22_Pin, 0)
  38. #define        DHT22_DQ_OUT_1  GPIO_WritePinOutput(DHT22_GPIO, DHT22_Pin, 1)
  39. //read 1 or 0
  40. #define        DHT22_DQ_IN     FGPIO_ReadPinInput(DHT22_FGPIO,DHT22_Pin)

  41. //4 gpio interface end

  42. //2 delay interface begin
  43. static void delay_ms(unsigned long xms)
  44. {
  45.         volatile uint32_t i = 0;
  46.         while(xms--)
  47.   {
  48.     for (i = 0; i < 100; ++i)
  49.     {
  50.       __asm("nop"); /* delay */
  51.     }
  52.   }
  53. }
  54. static void delay_us(unsigned long xus)
  55. {
  56.         volatile uint32_t i = 0;
  57.         while(xus--)
  58.   {
  59.     for (i = 0; i < 3; ++i)
  60.     {
  61.       __asm("nop"); /* delay */
  62.     }
  63.   }
  64. }
  65. //2 delay interface end





  66. //Reset DHT22
  67. void DHT22_Rst(void)           
  68. {                 
  69.                 DHT22_IO_OUT();         //SET OUTPUT
  70.     DHT22_DQ_OUT_0;         //GPIOA.0=0
  71.     delay_ms(30);            //Pull down Least 800us
  72.     DHT22_DQ_OUT_1;         //GPIOA.0=1
  73.                 delay_us(30);             //Pull up 20~40us
  74. }

  75. u8 DHT22_Check(void)            
  76. {   
  77.         u8 retry=0;
  78.         DHT22_IO_IN();//SET INPUT         
  79.     while (DHT22_DQ_IN&&retry<100)//DHT22 Pull down 40~80us
  80.         {
  81.                 retry++;
  82.                 delay_us(1);
  83.         };         
  84.         if(retry>=100)
  85.         {
  86.                 return 1;        
  87.         }
  88.         else
  89.                 retry=0;
  90.     while (!DHT22_DQ_IN&&retry<100)//DHT22 Pull up 40~80us
  91.         {
  92.                 retry++;
  93.                 delay_us(1);
  94.         };
  95.         if(retry>=100)
  96.   {
  97.                 return 1;//chack error        
  98.                                 
  99.   }        
  100.         return 0;
  101. }

  102. u8 DHT22_Read_Bit(void)                          
  103. {
  104.          u8 retry=0;
  105.         while(DHT22_DQ_IN&&retry<100)//wait become Low level
  106.         {
  107.                 retry++;
  108.                 delay_us(1);
  109.         }
  110.         retry=0;
  111.         while(!DHT22_DQ_IN&&retry<100)//wait become High level
  112.         {
  113.                 retry++;
  114.                 delay_us(1);
  115.         }
  116.         delay_us(40);//wait 40us
  117.         if(DHT22_DQ_IN)
  118.                 return 1;
  119.         else
  120.                 return 0;                  
  121. }

  122. u8 DHT22_Read_Byte(void)   
  123. {        
  124.     u8 i,dat;
  125.     dat=0;
  126.         for (i=0;i<8;i++)
  127.         {
  128.                    dat<<=1;
  129.             dat|=DHT22_Read_Bit();
  130.     }                                                   
  131.     return dat;
  132. }

  133. u8 DHT22_Read_Data(float *temperature,float *humidity)   
  134. {        
  135.          u8 buf[5];
  136.         u8 i;
  137.         u8 sum;
  138.         *humidity=0;
  139.         *temperature=0;
  140.         DHT22_Rst();
  141.         if(DHT22_Check()==0)
  142.         {
  143.                 for(i=0;i<5;i++)
  144.                 {
  145.                         buf[i]=DHT22_Read_Byte();
  146.                 }
  147.                 sum = buf[0]+buf[1]+buf[2]+buf[3];
  148.                 if(sum == buf[4])
  149.                 {
  150.                         *humidity=(float)((buf[0]<<8)+buf[1])/10;
  151.                         *temperature=(float)((buf[2]<<8)+buf[3])/10;
  152.                 }
  153.                 else
  154.                 {
  155.                         *humidity=(float)((buf[0]<<8)+buf[1])/10;
  156.                         *temperature=(float)((buf[2]<<8)+buf[3])/10;
  157.                 }
  158.         }
  159.         else
  160.         {
  161.                 return 1;
  162.         }
  163.         return 0;            
  164. }
  165.          
  166. u8 DHT22_Init(void)
  167. {         
  168.                                  
  169.         DHT22_IO_OUT();
  170.             
  171.         DHT22_Rst();  
  172.         return DHT22_Check();
  173. }






复制代码



主函数测试代码如下:
  1. /**
  2. * This is template for main module created by MCUXpresso Project Generator. Enjoy!
  3. **/

  4. #include "board.h"
  5. #include "pin_mux.h"
  6. #include "clock_config.h"

  7. //user code begin
  8. #include "fsl_gpio.h"
  9. #include "fsl_port.h"

  10. #include "DHT22.h"

  11. float temperature = 0;              
  12. float humidity = 0;

  13. static void mydelay_ms(unsigned long xms)        
  14. {        
  15.           volatile uint32_t i = 0;
  16.         while(xms--)
  17.         {
  18.     for (i = 0; i < 4000; ++i)
  19.     {
  20.         __asm("nop"); /* delay */
  21.     }
  22.         }
  23. }
  24. //user code end

  25. /*!
  26. * [url=home.php?mod=space&uid=159083]@brief[/url] Application entry point.
  27. */
  28. int main(void) {
  29.   /* Init board hardware. */
  30.   BOARD_InitBootPins();
  31.   BOARD_InitBootClocks();
  32.   BOARD_InitDebugConsole();

  33.   /* Add your code here */
  34.         
  35. //user code begin        

  36.          while(DHT22_Init());//init DHT22

  37.          printf("Hell EEworld!\r\n");
  38.          DbgConsole_Printf("Hell FRDM-KW41Z!\r\n");        
  39.          
  40. //user code end        

  41.   for(;;) { /* Infinite loop to avoid leaving the main function */
  42.     __asm("NOP"); /* something to use as a breakpoint stop while looping */
  43. //user code begin               

  44.                 mydelay_ms(500);
  45.                
  46.                 DHT22_Read_Data(&temperature,&humidity);        

  47.                 printf("temperature = %.2f    humidity = %.2f%%\r\n",temperature,humidity);
  48.                
  49. //user code end               
  50.   }
  51. }
复制代码


精度还是不错的:




DHT22数据手册:
AM2302_V1.1.pdf (865.45 KB, 下载次数: 1, 售价: 1 分芯积分)
工程源码:
KW41Z_Test.zip (10.89 MB, 下载次数: 41, 售价: 1 分芯积分)



此帖出自NXP MCU论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表