DHT11 Temperature & Humidity Sensor features a temperature & humidity sensor complex with a calibrated digital signal output.

Committer:
mcm
Date:
Fri Aug 09 07:39:17 2019 +0000
Revision:
4:889926e2b6a5
Parent:
3:082a970dca06
An example was added in order to show how to use this driver.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:9fe166c478b7 1 /**
mcm 2:9fe166c478b7 2 * @brief DHT11.cpp
mcm 2:9fe166c478b7 3 * @details Temperature & humidity sensor complex with a calibrated digital signal output.
mcm 2:9fe166c478b7 4 * Functions file.
mcm 2:9fe166c478b7 5 *
mcm 2:9fe166c478b7 6 *
mcm 2:9fe166c478b7 7 * @return N/A
mcm 2:9fe166c478b7 8 *
mcm 2:9fe166c478b7 9 * @author Manuel Caballero
mcm 2:9fe166c478b7 10 * @date 08/August/2019
mcm 2:9fe166c478b7 11 * @version 08/August/2019 The ORIGIN
mcm 2:9fe166c478b7 12 * @pre N/A
mcm 2:9fe166c478b7 13 * @warning N/A
mcm 2:9fe166c478b7 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:9fe166c478b7 15 */
mcm 2:9fe166c478b7 16
mcm 2:9fe166c478b7 17 #include "DHT11.h"
mcm 2:9fe166c478b7 18
mcm 2:9fe166c478b7 19
mcm 2:9fe166c478b7 20 DHT11::DHT11 ( PinName dht11 )
mcm 2:9fe166c478b7 21 : _dht11Pin ( dht11 )
mcm 2:9fe166c478b7 22 {
mcm 2:9fe166c478b7 23
mcm 2:9fe166c478b7 24 }
mcm 2:9fe166c478b7 25
mcm 2:9fe166c478b7 26
mcm 2:9fe166c478b7 27 DHT11::~DHT11()
mcm 2:9fe166c478b7 28 {
mcm 2:9fe166c478b7 29 }
mcm 2:9fe166c478b7 30
mcm 2:9fe166c478b7 31
mcm 2:9fe166c478b7 32
mcm 2:9fe166c478b7 33 /**
mcm 3:082a970dca06 34 * @brief DHT11_Init ( void )
mcm 2:9fe166c478b7 35 *
mcm 2:9fe166c478b7 36 * @details It sets the pin 'high' level to release the bus.
mcm 2:9fe166c478b7 37 *
mcm 3:082a970dca06 38 * @param[in] N/A.
mcm 2:9fe166c478b7 39 *
mcm 2:9fe166c478b7 40 * @param[out] N/A.
mcm 2:9fe166c478b7 41 *
mcm 2:9fe166c478b7 42 *
mcm 2:9fe166c478b7 43 * @return Status of DHT11_Init.
mcm 2:9fe166c478b7 44 *
mcm 2:9fe166c478b7 45 *
mcm 2:9fe166c478b7 46 * @author Manuel Caballero
mcm 2:9fe166c478b7 47 * @date 08/August/2019
mcm 3:082a970dca06 48 * @version 09/August/2019 The driver was dapated to the mBed´s HAL layer.
mcm 3:082a970dca06 49 * 08/August/2019 The ORIGIN
mcm 2:9fe166c478b7 50 * @pre N/A
mcm 2:9fe166c478b7 51 * @warning N/A.
mcm 2:9fe166c478b7 52 */
mcm 3:082a970dca06 53 DHT11::DHT11_status_t DHT11::DHT11_Init ( void )
mcm 2:9fe166c478b7 54 {
mcm 2:9fe166c478b7 55 DHT11_status_t aux = DHT11_SUCCESS;
mcm 2:9fe166c478b7 56
mcm 3:082a970dca06 57 _dht11Pin.output();
mcm 3:082a970dca06 58 _dht11Pin = 1U;
mcm 2:9fe166c478b7 59
mcm 2:9fe166c478b7 60
mcm 2:9fe166c478b7 61
mcm 2:9fe166c478b7 62 return aux;
mcm 2:9fe166c478b7 63 }
mcm 2:9fe166c478b7 64
mcm 2:9fe166c478b7 65
mcm 2:9fe166c478b7 66
mcm 2:9fe166c478b7 67 /**
mcm 3:082a970dca06 68 * @brief DHT11_GetRawData ( DHT11_data_t* )
mcm 2:9fe166c478b7 69 *
mcm 2:9fe166c478b7 70 * @details It gets the raw data: Temperature, Humidity and Checksum.
mcm 2:9fe166c478b7 71 *
mcm 3:082a970dca06 72 * @param[in] N/A.
mcm 2:9fe166c478b7 73 *
mcm 2:9fe166c478b7 74 * @param[out] myRawData: Raw data: Temperature, Humidity and Checksum.
mcm 2:9fe166c478b7 75 *
mcm 2:9fe166c478b7 76 *
mcm 2:9fe166c478b7 77 * @return Status of DHT11_GetRawData.
mcm 2:9fe166c478b7 78 *
mcm 2:9fe166c478b7 79 *
mcm 2:9fe166c478b7 80 * @author Manuel Caballero
mcm 2:9fe166c478b7 81 * @date 08/August/2019
mcm 3:082a970dca06 82 * @version 09/August/2019 The driver was dapated to the mBed´s HAL layer.
mcm 3:082a970dca06 83 * 08/August/2019 The ORIGIN
mcm 2:9fe166c478b7 84 * @pre N/A
mcm 2:9fe166c478b7 85 * @warning N/A.
mcm 2:9fe166c478b7 86 */
mcm 3:082a970dca06 87 DHT11::DHT11_status_t DHT11::DHT11_GetRawData ( DHT11_data_t* myRawData )
mcm 2:9fe166c478b7 88 {
mcm 2:9fe166c478b7 89 uint8_t auxChecksum = 0U;
mcm 2:9fe166c478b7 90 uint8_t countData = 0U;
mcm 2:9fe166c478b7 91 uint64_t rawAuxData = 0UL;
mcm 2:9fe166c478b7 92 uint32_t timeoutDHT11 = 0UL;
mcm 2:9fe166c478b7 93 DHT11_device_bus_status_t pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 94 DHT11_status_t aux = DHT11_SUCCESS;
mcm 2:9fe166c478b7 95
mcm 2:9fe166c478b7 96 /* The communication starts with the bus on 'high' level */
mcm 3:082a970dca06 97 _dht11Pin.output();
mcm 3:082a970dca06 98 _dht11Pin = 1U;
mcm 2:9fe166c478b7 99
mcm 2:9fe166c478b7 100 /* 1. MCU sends a start signal */
mcm 3:082a970dca06 101 _dht11Pin = 0U;
mcm 3:082a970dca06 102 wait_us ( DHT11_START_SIGNAL );
mcm 2:9fe166c478b7 103
mcm 2:9fe166c478b7 104 /* 2. MCU waits for DHT11 response */
mcm 3:082a970dca06 105 _dht11Pin = 1U;
mcm 3:082a970dca06 106 _dht11Pin.input();
mcm 2:9fe166c478b7 107
mcm 2:9fe166c478b7 108 pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 109 timeoutDHT11 = DHT11_TIMEOUT;
mcm 2:9fe166c478b7 110 do{
mcm 3:082a970dca06 111 /* Get current value of the pin */
mcm 3:082a970dca06 112 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 113 {
mcm 3:082a970dca06 114 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 115 }
mcm 3:082a970dca06 116 else
mcm 3:082a970dca06 117 {
mcm 3:082a970dca06 118 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 119 }
mcm 2:9fe166c478b7 120 timeoutDHT11--;
mcm 2:9fe166c478b7 121 }while ( ( pinStatus == DHT11_PIN_HIGH ) && ( timeoutDHT11 > 0UL ) );
mcm 2:9fe166c478b7 122
mcm 2:9fe166c478b7 123 /* If timeout means that the device does not work properly, it may be stuck */
mcm 2:9fe166c478b7 124 if ( timeoutDHT11 == 0UL )
mcm 2:9fe166c478b7 125 {
mcm 2:9fe166c478b7 126 return DHT11_BUS_TIMEOUT;
mcm 2:9fe166c478b7 127 }
mcm 2:9fe166c478b7 128
mcm 2:9fe166c478b7 129 /* 3. DHT11 sends out response signal */
mcm 2:9fe166c478b7 130 pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 131 timeoutDHT11 = DHT11_TIMEOUT;
mcm 2:9fe166c478b7 132 do{
mcm 3:082a970dca06 133 /* Get current value of the pin */
mcm 3:082a970dca06 134 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 135 {
mcm 3:082a970dca06 136 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 137 }
mcm 3:082a970dca06 138 else
mcm 3:082a970dca06 139 {
mcm 3:082a970dca06 140 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 141 }
mcm 2:9fe166c478b7 142 timeoutDHT11--;
mcm 2:9fe166c478b7 143 }while ( ( pinStatus == DHT11_PIN_LOW ) && ( timeoutDHT11 > 0UL ) );
mcm 2:9fe166c478b7 144
mcm 2:9fe166c478b7 145 /* If timeout means that the device does not work properly, it may be stuck */
mcm 2:9fe166c478b7 146 if ( timeoutDHT11 == 0UL )
mcm 2:9fe166c478b7 147 {
mcm 2:9fe166c478b7 148 return DHT11_BUS_TIMEOUT;
mcm 2:9fe166c478b7 149 }
mcm 2:9fe166c478b7 150
mcm 2:9fe166c478b7 151 pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 152 timeoutDHT11 = DHT11_TIMEOUT;
mcm 2:9fe166c478b7 153 do{
mcm 3:082a970dca06 154 /* Get current value of the pin */
mcm 3:082a970dca06 155 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 156 {
mcm 3:082a970dca06 157 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 158 }
mcm 3:082a970dca06 159 else
mcm 3:082a970dca06 160 {
mcm 3:082a970dca06 161 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 162 }
mcm 2:9fe166c478b7 163 timeoutDHT11--;
mcm 2:9fe166c478b7 164 }while ( ( pinStatus == DHT11_PIN_HIGH ) && ( timeoutDHT11 > 0UL ) );
mcm 2:9fe166c478b7 165
mcm 2:9fe166c478b7 166 /* If timeout means that the device does not work properly, it may be stuck */
mcm 2:9fe166c478b7 167 if ( timeoutDHT11 == 0UL )
mcm 2:9fe166c478b7 168 {
mcm 2:9fe166c478b7 169 return DHT11_BUS_TIMEOUT;
mcm 2:9fe166c478b7 170 }
mcm 2:9fe166c478b7 171
mcm 2:9fe166c478b7 172 /* 4. DHT11 sends output data */
mcm 2:9fe166c478b7 173 for ( countData = 0U; countData < 40U; countData++ )
mcm 2:9fe166c478b7 174 {
mcm 2:9fe166c478b7 175 /* Next bit */
mcm 2:9fe166c478b7 176 rawAuxData <<= 1UL;
mcm 2:9fe166c478b7 177
mcm 2:9fe166c478b7 178 /* 4.1. DHT11 starts transmit 1-bit */
mcm 2:9fe166c478b7 179 pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 180 timeoutDHT11 = DHT11_TIMEOUT;
mcm 2:9fe166c478b7 181 do{
mcm 3:082a970dca06 182 /* Get current value of the pin */
mcm 3:082a970dca06 183 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 184 {
mcm 3:082a970dca06 185 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 186 }
mcm 3:082a970dca06 187 else
mcm 3:082a970dca06 188 {
mcm 3:082a970dca06 189 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 190 }
mcm 2:9fe166c478b7 191 timeoutDHT11--;
mcm 2:9fe166c478b7 192 }while ( ( pinStatus == DHT11_PIN_LOW ) && ( timeoutDHT11 > 0UL ) );
mcm 2:9fe166c478b7 193
mcm 2:9fe166c478b7 194 /* If timeout means that the device does not work properly, it may be stuck */
mcm 2:9fe166c478b7 195 if ( timeoutDHT11 == 0UL )
mcm 2:9fe166c478b7 196 {
mcm 2:9fe166c478b7 197 return DHT11_BUS_TIMEOUT;
mcm 2:9fe166c478b7 198 }
mcm 2:9fe166c478b7 199
mcm 2:9fe166c478b7 200 /* 4.2. MCU wait for sampling data */
mcm 3:082a970dca06 201 wait_us ( DHT11_SAMPLE_DATA );
mcm 2:9fe166c478b7 202
mcm 2:9fe166c478b7 203 /* 4.3. MCU samples data */
mcm 2:9fe166c478b7 204 pinStatus = DHT11_PIN_UNKNOWN;
mcm 3:082a970dca06 205 /* Get current value of the pin */
mcm 3:082a970dca06 206 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 207 {
mcm 3:082a970dca06 208 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 209 }
mcm 3:082a970dca06 210 else
mcm 3:082a970dca06 211 {
mcm 3:082a970dca06 212 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 213 }
mcm 2:9fe166c478b7 214 if ( pinStatus == DHT11_PIN_LOW )
mcm 2:9fe166c478b7 215 {
mcm 2:9fe166c478b7 216 /* Data means '0' */
mcm 2:9fe166c478b7 217 rawAuxData |= 0UL;
mcm 2:9fe166c478b7 218 }
mcm 2:9fe166c478b7 219 else
mcm 2:9fe166c478b7 220 {
mcm 2:9fe166c478b7 221 /* Data means '1' */
mcm 2:9fe166c478b7 222 rawAuxData |= 1UL;
mcm 2:9fe166c478b7 223
mcm 3:082a970dca06 224 /* Wait for sync */
mcm 2:9fe166c478b7 225 pinStatus = DHT11_PIN_UNKNOWN;
mcm 2:9fe166c478b7 226 timeoutDHT11 = DHT11_TIMEOUT;
mcm 2:9fe166c478b7 227 do{
mcm 3:082a970dca06 228 /* Get current value of the pin */
mcm 3:082a970dca06 229 if ( _dht11Pin.read() == 1U )
mcm 3:082a970dca06 230 {
mcm 3:082a970dca06 231 pinStatus = DHT11_PIN_HIGH;
mcm 3:082a970dca06 232 }
mcm 3:082a970dca06 233 else
mcm 3:082a970dca06 234 {
mcm 3:082a970dca06 235 pinStatus = DHT11_PIN_LOW;
mcm 3:082a970dca06 236 }
mcm 2:9fe166c478b7 237 timeoutDHT11--;
mcm 2:9fe166c478b7 238 }while ( ( pinStatus == DHT11_PIN_HIGH ) && ( timeoutDHT11 > 0UL ) );
mcm 2:9fe166c478b7 239
mcm 2:9fe166c478b7 240 /* If timeout means that the device does not work properly, it may be stuck */
mcm 2:9fe166c478b7 241 if ( timeoutDHT11 == 0UL )
mcm 2:9fe166c478b7 242 {
mcm 2:9fe166c478b7 243 return DHT11_BUS_TIMEOUT;
mcm 2:9fe166c478b7 244 }
mcm 2:9fe166c478b7 245 }
mcm 2:9fe166c478b7 246 }
mcm 2:9fe166c478b7 247
mcm 2:9fe166c478b7 248
mcm 2:9fe166c478b7 249 /* Parse data */
mcm 2:9fe166c478b7 250 myRawData->rawHumidity = (uint16_t)( ( rawAuxData & 0xFFFF000000 ) >> 24U );
mcm 2:9fe166c478b7 251 myRawData->rawTemperature = (uint16_t)( ( rawAuxData & 0x0000FFFF00 ) >> 8U );
mcm 2:9fe166c478b7 252 myRawData->checksum = (uint8_t)( rawAuxData & 0x00000000FF );
mcm 2:9fe166c478b7 253
mcm 2:9fe166c478b7 254 /* Check checksum */
mcm 2:9fe166c478b7 255 auxChecksum = (uint8_t)( ( ( myRawData->rawHumidity & 0xFF00 ) >> 8U ) + ( myRawData->rawHumidity & 0x00FF ) + ( ( myRawData->rawTemperature & 0xFF00 ) >> 8U ) ) + ( myRawData->rawTemperature & 0x00FF );
mcm 2:9fe166c478b7 256 if ( auxChecksum == myRawData->checksum )
mcm 2:9fe166c478b7 257 {
mcm 2:9fe166c478b7 258 myRawData->checksumStatus = DHT11_CHECKSUM_OK;
mcm 2:9fe166c478b7 259 }
mcm 2:9fe166c478b7 260 else
mcm 2:9fe166c478b7 261 {
mcm 2:9fe166c478b7 262 myRawData->checksumStatus = DHT11_CHECKSUM_ERROR;
mcm 2:9fe166c478b7 263 }
mcm 2:9fe166c478b7 264
mcm 2:9fe166c478b7 265
mcm 2:9fe166c478b7 266
mcm 2:9fe166c478b7 267 if ( myRawData->checksumStatus == DHT11_CHECKSUM_ERROR )
mcm 2:9fe166c478b7 268 {
mcm 2:9fe166c478b7 269 return DHT11_DATA_CORRUPTED;
mcm 2:9fe166c478b7 270 }
mcm 2:9fe166c478b7 271 else
mcm 2:9fe166c478b7 272 {
mcm 2:9fe166c478b7 273 return aux;
mcm 2:9fe166c478b7 274 }
mcm 2:9fe166c478b7 275 }
mcm 2:9fe166c478b7 276
mcm 2:9fe166c478b7 277
mcm 2:9fe166c478b7 278
mcm 2:9fe166c478b7 279 /**
mcm 3:082a970dca06 280 * @brief DHT11_GetData ( DHT11_data_t* )
mcm 2:9fe166c478b7 281 *
mcm 2:9fe166c478b7 282 * @details It gets the current data: Temperature, Humidity and Checksum.
mcm 2:9fe166c478b7 283 *
mcm 3:082a970dca06 284 * @param[in] N/A.
mcm 2:9fe166c478b7 285 *
mcm 2:9fe166c478b7 286 * @param[out] myData: Current data: Temperature, Humidity and Checksum.
mcm 2:9fe166c478b7 287 *
mcm 2:9fe166c478b7 288 *
mcm 2:9fe166c478b7 289 * @return Status of DHT11_GetData.
mcm 2:9fe166c478b7 290 *
mcm 2:9fe166c478b7 291 *
mcm 2:9fe166c478b7 292 * @author Manuel Caballero
mcm 2:9fe166c478b7 293 * @date 08/August/2019
mcm 3:082a970dca06 294 * @version 09/August/2019 The driver was dapated to the mBed´s HAL layer.
mcm 3:082a970dca06 295 * 08/August/2019 The ORIGIN
mcm 2:9fe166c478b7 296 * @pre N/A
mcm 2:9fe166c478b7 297 * @warning N/A.
mcm 2:9fe166c478b7 298 */
mcm 3:082a970dca06 299 DHT11::DHT11_status_t DHT11::DHT11_GetData ( DHT11_data_t* myData )
mcm 2:9fe166c478b7 300 {
mcm 2:9fe166c478b7 301 DHT11_status_t aux = DHT11_SUCCESS;
mcm 2:9fe166c478b7 302
mcm 2:9fe166c478b7 303 /* Get the raw data to be processed */
mcm 3:082a970dca06 304 aux = DHT11_GetRawData ( &(*myData) );
mcm 2:9fe166c478b7 305
mcm 2:9fe166c478b7 306 /* Parse the data */
mcm 2:9fe166c478b7 307 myData->humidity = (uint8_t)( myData->rawHumidity >> 8U );
mcm 2:9fe166c478b7 308 myData->temperature = (uint8_t)( myData->rawTemperature >> 8U );
mcm 2:9fe166c478b7 309
mcm 2:9fe166c478b7 310
mcm 2:9fe166c478b7 311 return aux;
mcm 2:9fe166c478b7 312 }