准备资料

  1. 传感器硬件(DHT22 AM2302)

    线路连接

    将 DHT22 OUT链接到 14 PIN

部分代码

read_dht.c

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"
  5. #include "wifiiot_gpio.h"
  6. #include "wifiiot_gpio_ex.h"
  7. #include "dht/DHT.h"
  8. static void DHT22_InitX(void)
  9. {
  10. float temperature = 0;
  11. float humidity = 0;
  12. // GPIO 初始化
  13. GpioInit();
  14. // 初始化 DHT 引脚(设置引脚功能为GPIO:有些引脚是复合功能)
  15. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_GPIO);
  16. usleep(1000000);
  17. while(DHT22_Init()){
  18. usleep(500000);
  19. printf("DHT22_Check Error !\r\n");
  20. }
  21. DHT22_Read_Data(&temperature, &humidity);
  22. while (1)
  23. {
  24. usleep(1000000);
  25. usleep(1000000);
  26. DHT22_Read_Data(&temperature, &humidity);
  27. printf("\r\ntemperrature = %.2f\r\n", temperature);
  28. printf("humidity = %.2f\r\n", humidity);
  29. }
  30. }
  31. APP_FEATURE_INIT(DHT22_InitX);

DHT.c

  1. #include "DHT.h"
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include "ohos_init.h"
  5. #include "cmsis_os2.h"
  6. #include "wifiiot_gpio.h"
  7. #include "wifiiot_gpio_ex.h"
  8. #include <stdbool.h>
  9. int pinNo = WIFI_IOT_IO_NAME_GPIO_14;
  10. //复位DHT22
  11. void DHT22_Rst(void)
  12. {
  13. GpioSetDir(pinNo, WIFI_IOT_GPIO_DIR_OUT);
  14. GpioSetOutputVal(pinNo, 0);
  15. //拉低至少18ms
  16. usleep(30000);
  17. //DQ=1
  18. GpioSetOutputVal(pinNo, 1);
  19. usleep(30); //主机拉高20~40us
  20. }
  21. //等待DHT22的回应
  22. //返回0:未检测到DHT22的存在
  23. //返回1:存在
  24. uint8_t DHT22_Check(void)
  25. {
  26. uint8_t retry = 0;
  27. WifiIotGpioValue inputVal = {0};
  28. GpioSetDir(pinNo, WIFI_IOT_GPIO_DIR_IN);
  29. while (!inputVal&&retry < 100) //DHT22会拉低40~80us
  30. {
  31. retry++;
  32. usleep(1);
  33. GpioGetInputVal(pinNo, &inputVal);
  34. };
  35. if (retry >= 100)
  36. return 0; // check error
  37. else
  38. retry = 0;
  39. while (inputVal && retry < 100) //DHT22拉低后会再次拉高40~80us
  40. {
  41. retry++;
  42. usleep(1);
  43. GpioGetInputVal(pinNo, &inputVal);
  44. };
  45. if (retry >= 100)
  46. return 0; // check error
  47. return 1;
  48. }
  49. //从DHT22读取一个位
  50. //返回值:1/0
  51. uint8_t DHT22_Read_Bit(void)
  52. {
  53. uint8_t retry = 0;
  54. WifiIotGpioValue val = {0};
  55. while (val && retry < 100) //等待变为低电平
  56. {
  57. retry++;
  58. usleep(1);
  59. GpioGetInputVal(pinNo, &val);
  60. }
  61. retry = 0;
  62. while (!val && retry < 100) //等待变高电平
  63. {
  64. retry++;
  65. usleep(1);
  66. GpioGetInputVal(pinNo, &val);
  67. }
  68. usleep(40); //等待40us
  69. GpioGetInputVal(pinNo, &val);
  70. if (val)
  71. {
  72. return 1;
  73. }
  74. else
  75. {
  76. return 0;
  77. }
  78. }
  79. //从DHT22读取一个字节
  80. //返回值:读到的数据
  81. uint8_t DHT22_Read_Byte(void)
  82. {
  83. uint8_t i, dat;
  84. dat = 0;
  85. for (i = 0; i < 8; i++)
  86. {
  87. dat<<=1;
  88. dat|=DHT22_Read_Bit();
  89. }
  90. return dat;
  91. }
  92. //从DHT22读取一次数据
  93. //temp:温度值(范围:0~50°)
  94. //humi:湿度值(范围:20%~90%)
  95. //返回值:0,正常;1,读取失败
  96. void DHT22_Read_Data(float *temperature, float *humidity)
  97. {
  98. uint8_t buf[5];
  99. uint8_t i;
  100. uint8_t sum;
  101. *humidity=0;
  102. *temperature=0;
  103. DHT22_Rst();
  104. uint8_t check = DHT22_Check();
  105. printf("check %d",check);
  106. if (check)
  107. {
  108. for (i = 0; i < 5; i++) //读取40位数据
  109. {
  110. buf[i] = DHT22_Read_Byte();
  111. }
  112. //校验和累加时存在相当概率会超出8位(即值大于1个char,故做强制类型转换,只考虑低8位)
  113. sum = buf[0] + buf[1] + buf[2] + buf[3];
  114. if (sum == buf[4])
  115. {
  116. *humidity = (float)((buf[0] << 8) + buf[1]) / 10;
  117. *temperature = (float)((buf[2] << 8) + buf[3]) / 10;
  118. }
  119. else
  120. {
  121. *humidity = (float)((buf[0] << 8) + buf[1]) / 10;
  122. *temperature = (float)((buf[2] << 8) + buf[3]) / 10;
  123. }
  124. }
  125. }
  126. //初始化DHT22的IO口 DQ 同时检测DHT22的存在
  127. //返回0:未检测到DHT22的存在
  128. //返回1:存在
  129. uint8_t DHT22_Init(void)
  130. {
  131. GpioSetDir(pinNo, WIFI_IOT_GPIO_DIR_OUT);
  132. GpioSetOutputVal(pinNo, 0);
  133. DHT22_Rst();
  134. return DHT22_Check();
  135. }

DHT.h

  1. #ifndef __DHT22_H
  2. #define __DHT22_H
  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"
  5. #include "wifiiot_gpio.h"
  6. #include "wifiiot_gpio_ex.h"
  7. uint8_t DHT22_Init(void); //初始化DHT22
  8. void DHT22_Read_Data(float *temperature, float *humidity); //读取温湿度
  9. uint8_t DHT22_Read_Byte(void); //读出一个字节
  10. uint8_t DHT22_Read_Bit(void); //读出一个位
  11. uint8_t DHT22_Check(void); //检测是否存在DHT22
  12. void DHT22_Rst(void); //复位DHT22
  13. #endif

参考资料

  1. 参考部分代码
  2. Adafruit_Python_DHT【github】

    附件

    AM2302模块资料.zip