DHT.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /* DHT library
  2. MIT license
  3. written by Adafruit Industries
  4. */
  5. #include "DHT.h"
  6. DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
  7. _pin = pin;
  8. _type = type;
  9. _count = count;
  10. firstreading = true;
  11. }
  12. void DHT::begin(void) {
  13. // set up the pins!
  14. pinMode(_pin, INPUT);
  15. digitalWrite(_pin, HIGH);
  16. _lastreadtime = 0;
  17. }
  18. //boolean S == Scale. True == Farenheit; False == Celcius
  19. float DHT::readTemperature(bool S) {
  20. float f;
  21. if (read()) {
  22. switch (_type) {
  23. case DHT11:
  24. f = data[2];
  25. if(S)
  26. f = convertCtoF(f);
  27. return f;
  28. case DHT22:
  29. case DHT21:
  30. f = data[2] & 0x7F;
  31. f *= 256;
  32. f += data[3];
  33. f /= 10;
  34. if (data[2] & 0x80)
  35. f *= -1;
  36. if(S)
  37. f = convertCtoF(f);
  38. return f;
  39. }
  40. }
  41. Serial.print("Read fail");
  42. return NAN;
  43. }
  44. float DHT::convertCtoF(float c) {
  45. return c * 9 / 5 + 32;
  46. }
  47. float DHT::readHumidity(void) {
  48. float f;
  49. if (read()) {
  50. switch (_type) {
  51. case DHT11:
  52. f = data[0];
  53. return f;
  54. case DHT22:
  55. case DHT21:
  56. f = data[0];
  57. f *= 256;
  58. f += data[1];
  59. f /= 10;
  60. return f;
  61. }
  62. }
  63. Serial.print("Read fail");
  64. return NAN;
  65. }
  66. boolean DHT::read(void) {
  67. uint8_t laststate = HIGH;
  68. uint8_t counter = 0;
  69. uint8_t j = 0, i;
  70. unsigned long currenttime;
  71. // pull the pin high and wait 250 milliseconds
  72. digitalWrite(_pin, HIGH);
  73. delay(250);
  74. currenttime = millis();
  75. if (currenttime < _lastreadtime) {
  76. // ie there was a rollover
  77. _lastreadtime = 0;
  78. }
  79. if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
  80. return true; // return last correct measurement
  81. //delay(2000 - (currenttime - _lastreadtime));
  82. }
  83. firstreading = false;
  84. /*
  85. Serial.print("Currtime: "); Serial.print(currenttime);
  86. Serial.print(" Lasttime: "); Serial.print(_lastreadtime);
  87. */
  88. _lastreadtime = millis();
  89. data[0] = data[1] = data[2] = data[3] = data[4] = 0;
  90. // now pull it low for ~20 milliseconds
  91. pinMode(_pin, OUTPUT);
  92. digitalWrite(_pin, LOW);
  93. delay(20);
  94. cli();
  95. digitalWrite(_pin, HIGH);
  96. delayMicroseconds(40);
  97. pinMode(_pin, INPUT);
  98. // read in timings
  99. for ( i=0; i< MAXTIMINGS; i++) {
  100. counter = 0;
  101. while (digitalRead(_pin) == laststate) {
  102. counter++;
  103. delayMicroseconds(1);
  104. if (counter == 255) {
  105. break;
  106. }
  107. }
  108. laststate = digitalRead(_pin);
  109. if (counter == 255) break;
  110. // ignore first 3 transitions
  111. if ((i >= 4) && (i%2 == 0)) {
  112. // shove each bit into the storage bytes
  113. data[j/8] <<= 1;
  114. if (counter > _count)
  115. data[j/8] |= 1;
  116. j++;
  117. }
  118. }
  119. sei();
  120. /*
  121. Serial.println(j, DEC);
  122. Serial.print(data[0], HEX); Serial.print(", ");
  123. Serial.print(data[1], HEX); Serial.print(", ");
  124. Serial.print(data[2], HEX); Serial.print(", ");
  125. Serial.print(data[3], HEX); Serial.print(", ");
  126. Serial.print(data[4], HEX); Serial.print(" =? ");
  127. Serial.println(data[0] + data[1] + data[2] + data[3], HEX);
  128. */
  129. // check we read 40 bits and that the checksum matches
  130. if ((j >= 40) &&
  131. (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
  132. return true;
  133. }
  134. return false;
  135. }