DTH22, RHT03 and DTH11 sensors can be read with this code!

This DHT22 sensor reading class works with the mbed LPC1768. The code is time dependent but has been tested with mbed LPC1768 currently. I may add timing defines for other platforms if needed but i currently only use the mbed LPC1768 platform. Please feel free to import the code and modify it for other platforms if needed. BITREADTIME define and STARTTRANSBITSIZE define would be the main items to change for any other platform to operate properly. BITREADTIME is the us time value used in a basic look for a wait value to get next reading. This may work simply on other platforms at other system speeds but it may not. A more general solution maybe to add another calculation that generates these defines based on some platform speed value. At this writing the code performs very well with little to no read failures(in fact i have not seen a read failure yet in testing). The issues that i have seen with other classes and this sensor is the fact that the sensor always produces the correct Temperature and Humidity output values on the io pin but the class reading these values miss many reading causing errors. This class avoids this because it reads the output from the DTH22 sensor completely and then processes the values from a run length bit measurement perspective that i feel is far more accurate. Anyways the results speak for them self.

I have now added a member function for reading the DTH11 sensor as it is read the same way as the DTH22 sensor. The only difference is the final use of the retrieved bytes from the sensor for calculating the temperature and humidity. Note the DTH11 sensor has less range and less accuracy but it also can be found for less money!

Committer:
harrypowers
Date:
Tue Dec 03 09:14:49 2013 +0000
Revision:
3:57c9abcd9646
Parent:
2:4d307eacba27
Child:
4:85dd45e5ab32
first commit fully working and tested in mostly final form.  all that is needed now is more documenting for auto library creation and completeness for readers.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
harrypowers 0:92ba381d5432 1 #ifndef DTH22_h
harrypowers 0:92ba381d5432 2 #define DTH22_h
harrypowers 0:92ba381d5432 3
harrypowers 0:92ba381d5432 4 /* DTH22/RHT03 sensor class for use with Mbed LPC1768 and other platforms
harrypowers 0:92ba381d5432 5 * Copyright (c) 2013 Philip King Smith
harrypowers 0:92ba381d5432 6 *
harrypowers 0:92ba381d5432 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
harrypowers 0:92ba381d5432 8 * of this software and associated documentation files (the "Software"), to deal
harrypowers 0:92ba381d5432 9 * in the Software without restriction, including without limitation the rights
harrypowers 0:92ba381d5432 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
harrypowers 0:92ba381d5432 11 * copies of the Software, and to permit persons to whom the Software is
harrypowers 0:92ba381d5432 12 * furnished to do so, subject to the following conditions:
harrypowers 0:92ba381d5432 13 *
harrypowers 0:92ba381d5432 14 * The above copyright notice and this permission notice shall be included in
harrypowers 0:92ba381d5432 15 * all copies or substantial portions of the Software.
harrypowers 0:92ba381d5432 16 *
harrypowers 0:92ba381d5432 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
harrypowers 0:92ba381d5432 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
harrypowers 0:92ba381d5432 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
harrypowers 0:92ba381d5432 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
harrypowers 0:92ba381d5432 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
harrypowers 0:92ba381d5432 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
harrypowers 0:92ba381d5432 23 * THE SOFTWARE.
harrypowers 0:92ba381d5432 24 *
harrypowers 0:92ba381d5432 25 * A DTH22/RHT03 sensor data sheet is at: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf
harrypowers 0:92ba381d5432 26 * I made this software because the classes that others have made seemed to suffer from many errors.
harrypowers 0:92ba381d5432 27 * I have used my rasbpery Pi code writen in Forth as the basis for this code.
harrypowers 0:92ba381d5432 28 * Like the other code i have found my first attempt in Forth to get this too work suffered from the same errors!
harrypowers 0:92ba381d5432 29 * I have since worked out the following code that works with the idea of a run lenght timing method thus removing
harrypowers 0:92ba381d5432 30 * the time sensitive error issues that seem to plauge this low cost sensor.
harrypowers 0:92ba381d5432 31 */
harrypowers 0:92ba381d5432 32
harrypowers 0:92ba381d5432 33 #include "mbed.h"
harrypowers 0:92ba381d5432 34
harrypowers 1:d41fcc541836 35 /** DTH22 Digital Temperature Humidity class
harrypowers 0:92ba381d5432 36 *
harrypowers 0:92ba381d5432 37 * Example:
harrypowers 0:92ba381d5432 38 * @code
harrypowers 0:92ba381d5432 39 * // show how the DTH22_RHT03 class works
harrypowers 0:92ba381d5432 40 * #include "mbed.h"
harrypowers 3:57c9abcd9646 41 * #include "DTH22.h"
harrypowers 0:92ba381d5432 42 * int main()
harrypowers 0:92ba381d5432 43 * {
harrypowers 1:d41fcc541836 44 *
harrypowers 0:92ba381d5432 45 * int temp ;
harrypowers 0:92ba381d5432 46 * int humidity;
harrypowers 0:92ba381d5432 47 * int error ;
harrypowers 3:57c9abcd9646 48 * DTH22 myhumtemp(p24);
harrypowers 0:92ba381d5432 49 * while(1) {
harrypowers 0:92ba381d5432 50 * error = myhumtemp.getTH(&temp,&humidity);
harrypowers 0:92ba381d5432 51 * printf("Temp is %ld\r\n",temp);
harrypowers 0:92ba381d5432 52 * printf("Humidity is %ld\r\n",humidity);
harrypowers 0:92ba381d5432 53 * printf("Error is %d\r\n\r\n",error);
harrypowers 0:92ba381d5432 54 * wait(2);
harrypowers 0:92ba381d5432 55 * }
harrypowers 0:92ba381d5432 56 * }
harrypowers 0:92ba381d5432 57 * @endcode
harrypowers 0:92ba381d5432 58 */
harrypowers 0:92ba381d5432 59
harrypowers 1:d41fcc541836 60 #define MAXRAWDATA 1300
harrypowers 2:4d307eacba27 61 #define DATABITS 40
harrypowers 1:d41fcc541836 62 #define BITREADTIME 3
harrypowers 1:d41fcc541836 63 #define MAXBITCOUNT 30
harrypowers 2:4d307eacba27 64 #define STARTTRANSBITSIZE 14
harrypowers 2:4d307eacba27 65 #define DATANOISE 2000
harrypowers 2:4d307eacba27 66 #define STIMINGFAIL 2001
harrypowers 2:4d307eacba27 67 #define DATANOISE2 2002
harrypowers 2:4d307eacba27 68 #define CHECKSUMFAIL 2003
harrypowers 1:d41fcc541836 69
harrypowers 0:92ba381d5432 70 class DTH22
harrypowers 0:92ba381d5432 71 {
harrypowers 0:92ba381d5432 72 public:
harrypowers 0:92ba381d5432 73 /** Create object connected to DTH22 pin ( remember io pin needs pull up resister)
harrypowers 0:92ba381d5432 74 *
harrypowers 1:d41fcc541836 75 * Ensure the pull up resistors are used on this pin.
harrypowers 0:92ba381d5432 76 * Any pin can be used but the pin can only be used on one DTH22 sensor and nothing else.
harrypowers 0:92ba381d5432 77 *
harrypowers 0:92ba381d5432 78 * @param sda pin that BMP180 connected to (p9 or p28 as defined on LPC1768)
harrypowers 0:92ba381d5432 79 * @param slc pin that BMP180 connected to (p10 or p27 ad defined on LPC1768)
harrypowers 0:92ba381d5432 80 */
harrypowers 0:92ba381d5432 81 DTH22(PinName DATAsignal ); // Constructor
harrypowers 0:92ba381d5432 82
harrypowers 0:92ba381d5432 83 ~DTH22(); // Destructor
harrypowers 1:d41fcc541836 84
harrypowers 1:d41fcc541836 85 /** Read Temperature and Humidity
harrypowers 0:92ba381d5432 86 *
harrypowers 1:d41fcc541836 87 * This function will return when it has readings.
harrypowers 0:92ba381d5432 88 *
harrypowers 0:92ba381d5432 89 * @param temp the temperature returned in this variable. Degrees celsius with one decimal so 253 is 25.3 C.
harrypowers 0:92ba381d5432 90 * @param humidity the humidity is returned in this variable. Humidity is in rH with one decimal so 288 is 28.8 rH.
harrypowers 0:92ba381d5432 91 * @param returns 0 for no errors. Any other number is some type of communication error and data might not be valid!
harrypowers 0:92ba381d5432 92 */
harrypowers 0:92ba381d5432 93 int getTH(int *temp,int *humidity); // get both temperature and pressure fully compensated values! Note this only returns when measurements are complete
harrypowers 3:57c9abcd9646 94
harrypowers 0:92ba381d5432 95 protected:
harrypowers 0:92ba381d5432 96 DigitalInOut DTH22pin;
harrypowers 1:d41fcc541836 97 bool rawdata[MAXRAWDATA];
harrypowers 2:4d307eacba27 98 unsigned short int timingData[100];
harrypowers 2:4d307eacba27 99 bool rawdatabits[DATABITS];
harrypowers 3:57c9abcd9646 100
harrypowers 3:57c9abcd9646 101 int testing(bool *bits,signed short int *data,int *temp,int *humidity);
harrypowers 2:4d307eacba27 102 void getraw();
harrypowers 2:4d307eacba27 103 void getrawbits();
harrypowers 1:d41fcc541836 104 int transistionCount(int index);
harrypowers 2:4d307eacba27 105 int transmissionErrors();
harrypowers 0:92ba381d5432 106 };
harrypowers 0:92ba381d5432 107
harrypowers 0:92ba381d5432 108 #endif