DHT11(Temp and Humidity sensor) test

Dependencies:   mbed

Committer:
akkera102
Date:
Tue Dec 16 16:36:17 2014 +0000
Revision:
1:89cfea395009
Parent:
0:7780b0dfed46
dht11

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akkera102 0:7780b0dfed46 1 /*
akkera102 0:7780b0dfed46 2 * 2014/12/16 Modified by akkera102
akkera102 0:7780b0dfed46 3 *
akkera102 0:7780b0dfed46 4 * DHT Library for Digital-output Humidity and Temperature sensors
akkera102 0:7780b0dfed46 5 *
akkera102 0:7780b0dfed46 6 * Works with DHT11
akkera102 0:7780b0dfed46 7 * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio)
akkera102 0:7780b0dfed46 8 *
akkera102 0:7780b0dfed46 9 * Copyright (C) Wim De Roeve
akkera102 0:7780b0dfed46 10 * based on DHT22 sensor library by HO WING KIT
akkera102 0:7780b0dfed46 11 * Arduino DHT11 library
akkera102 0:7780b0dfed46 12 *
akkera102 0:7780b0dfed46 13 * Permission is hereby granted, free of charge, to any person obtaining a copy
akkera102 0:7780b0dfed46 14 * of this software and associated documnetation files (the "Software"), to deal
akkera102 0:7780b0dfed46 15 * in the Software without restriction, including without limitation the rights
akkera102 0:7780b0dfed46 16 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
akkera102 0:7780b0dfed46 17 * copies of the Software, and to permit persons to whom the Software is
akkera102 0:7780b0dfed46 18 * furished to do so, subject to the following conditions:
akkera102 0:7780b0dfed46 19 *
akkera102 0:7780b0dfed46 20 * The above copyright notice and this permission notice shall be included in
akkera102 0:7780b0dfed46 21 * all copies or substantial portions of the Software.
akkera102 0:7780b0dfed46 22 *
akkera102 0:7780b0dfed46 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
akkera102 0:7780b0dfed46 24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
akkera102 0:7780b0dfed46 25 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
akkera102 0:7780b0dfed46 26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
akkera102 0:7780b0dfed46 27 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
akkera102 0:7780b0dfed46 28 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
akkera102 0:7780b0dfed46 29 * THE SOFTWARE.
akkera102 0:7780b0dfed46 30 */
akkera102 0:7780b0dfed46 31
akkera102 0:7780b0dfed46 32 #include "mbed.h"
akkera102 0:7780b0dfed46 33
akkera102 0:7780b0dfed46 34 Serial pc(USBTX, USBRX);
akkera102 0:7780b0dfed46 35 DigitalInOut pin(p8);
akkera102 0:7780b0dfed46 36
akkera102 0:7780b0dfed46 37 enum {
akkera102 0:7780b0dfed46 38 SUCCESS,
akkera102 0:7780b0dfed46 39 ERROR_TIMEOUT,
akkera102 0:7780b0dfed46 40 ERROR_BUS_BUSY,
akkera102 0:7780b0dfed46 41 ERROR_NOT_PRESENT,
akkera102 0:7780b0dfed46 42 ERROR_NO_PATIENCE,
akkera102 0:7780b0dfed46 43 ERROR_SYNC_TIMEOUT,
akkera102 0:7780b0dfed46 44 ERROR_DATA_TIMEOUT,
akkera102 0:7780b0dfed46 45 ERROR_CHECKSUM
akkera102 0:7780b0dfed46 46 };
akkera102 0:7780b0dfed46 47
akkera102 0:7780b0dfed46 48 float Temperature;
akkera102 0:7780b0dfed46 49 float Humidity;
akkera102 0:7780b0dfed46 50
akkera102 0:7780b0dfed46 51
akkera102 0:7780b0dfed46 52 int Stall(int usTimeMax, int level)
akkera102 0:7780b0dfed46 53 {
akkera102 0:7780b0dfed46 54 int usTime = 0;
akkera102 0:7780b0dfed46 55
akkera102 0:7780b0dfed46 56 while(usTime < usTimeMax)
akkera102 0:7780b0dfed46 57 {
akkera102 0:7780b0dfed46 58 if(pin == level)
akkera102 0:7780b0dfed46 59 {
akkera102 0:7780b0dfed46 60 return SUCCESS;
akkera102 0:7780b0dfed46 61 }
akkera102 0:7780b0dfed46 62
akkera102 0:7780b0dfed46 63 usTime++;
akkera102 0:7780b0dfed46 64 wait_us(1);
akkera102 0:7780b0dfed46 65 }
akkera102 0:7780b0dfed46 66
akkera102 0:7780b0dfed46 67 return ERROR_TIMEOUT;
akkera102 0:7780b0dfed46 68 }
akkera102 0:7780b0dfed46 69
akkera102 0:7780b0dfed46 70 int WaitPinHigh(int usTimeOut)
akkera102 0:7780b0dfed46 71 {
akkera102 0:7780b0dfed46 72 return Stall(usTimeOut, 1);
akkera102 0:7780b0dfed46 73 }
akkera102 0:7780b0dfed46 74
akkera102 0:7780b0dfed46 75 int WaitPinLow(int usTimeOut)
akkera102 0:7780b0dfed46 76 {
akkera102 0:7780b0dfed46 77 return Stall(usTimeOut, 0);
akkera102 0:7780b0dfed46 78 }
akkera102 0:7780b0dfed46 79
akkera102 0:7780b0dfed46 80 int ReadDHT11(void)
akkera102 0:7780b0dfed46 81 {
akkera102 0:7780b0dfed46 82 // IO must be in hi state to start
akkera102 0:7780b0dfed46 83 if(WaitPinHigh(250) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 84 {
akkera102 0:7780b0dfed46 85 return ERROR_BUS_BUSY;
akkera102 0:7780b0dfed46 86 }
akkera102 0:7780b0dfed46 87
akkera102 0:7780b0dfed46 88 // start the transfer
akkera102 0:7780b0dfed46 89 pin.output();
akkera102 0:7780b0dfed46 90 pin = 0;
akkera102 0:7780b0dfed46 91 wait_ms(18);
akkera102 0:7780b0dfed46 92
akkera102 0:7780b0dfed46 93 pin = 1;
akkera102 0:7780b0dfed46 94 wait_us(30);
akkera102 0:7780b0dfed46 95
akkera102 0:7780b0dfed46 96 pin.input();
akkera102 0:7780b0dfed46 97
akkera102 0:7780b0dfed46 98 // wait till the sensor grabs the bus
akkera102 0:7780b0dfed46 99 if(WaitPinLow(40) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 100 {
akkera102 0:7780b0dfed46 101 return ERROR_NOT_PRESENT;
akkera102 0:7780b0dfed46 102 }
akkera102 0:7780b0dfed46 103
akkera102 0:7780b0dfed46 104 // sensor should signal low 80us and then hi 80us
akkera102 0:7780b0dfed46 105 if(WaitPinHigh(100) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 106 {
akkera102 0:7780b0dfed46 107 return ERROR_SYNC_TIMEOUT;
akkera102 0:7780b0dfed46 108 }
akkera102 0:7780b0dfed46 109 if(WaitPinLow(100) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 110 {
akkera102 0:7780b0dfed46 111 return ERROR_NO_PATIENCE;
akkera102 0:7780b0dfed46 112 }
akkera102 0:7780b0dfed46 113
akkera102 0:7780b0dfed46 114 int i, bit;
akkera102 0:7780b0dfed46 115 uint8_t buf[5];
akkera102 0:7780b0dfed46 116
akkera102 0:7780b0dfed46 117 // capture the data(40 bit)
akkera102 0:7780b0dfed46 118 for(i=0; i<5; i++)
akkera102 0:7780b0dfed46 119 {
akkera102 0:7780b0dfed46 120 buf[i] = 0;
akkera102 0:7780b0dfed46 121
akkera102 0:7780b0dfed46 122 for(bit=0; bit<8; bit++)
akkera102 0:7780b0dfed46 123 {
akkera102 0:7780b0dfed46 124 if(WaitPinHigh(75) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 125 {
akkera102 0:7780b0dfed46 126 return ERROR_DATA_TIMEOUT;
akkera102 0:7780b0dfed46 127 }
akkera102 0:7780b0dfed46 128
akkera102 0:7780b0dfed46 129 // logic 0 is 28us max, 1 is 70us
akkera102 0:7780b0dfed46 130 wait_us(40);
akkera102 0:7780b0dfed46 131 buf[i] |= pin << (7 - bit);
akkera102 0:7780b0dfed46 132
akkera102 0:7780b0dfed46 133 if(WaitPinLow(50) == ERROR_TIMEOUT)
akkera102 0:7780b0dfed46 134 {
akkera102 0:7780b0dfed46 135 return ERROR_DATA_TIMEOUT;
akkera102 0:7780b0dfed46 136 }
akkera102 0:7780b0dfed46 137 }
akkera102 0:7780b0dfed46 138 }
akkera102 0:7780b0dfed46 139
akkera102 0:7780b0dfed46 140 for(i=0; i<5; i++)
akkera102 0:7780b0dfed46 141 {
akkera102 0:7780b0dfed46 142 printf("buf[%d] = 0x%02x\n", i, buf[i]);
akkera102 0:7780b0dfed46 143 }
akkera102 0:7780b0dfed46 144
akkera102 0:7780b0dfed46 145 // valid check
akkera102 0:7780b0dfed46 146 if(buf[4] != buf[0] + buf[1] + buf[2] + buf[3])
akkera102 0:7780b0dfed46 147 {
akkera102 0:7780b0dfed46 148 return ERROR_CHECKSUM;
akkera102 0:7780b0dfed46 149 }
akkera102 0:7780b0dfed46 150
akkera102 0:7780b0dfed46 151 Temperature = float(buf[2]);
akkera102 0:7780b0dfed46 152 Humidity = float(buf[0]);
akkera102 0:7780b0dfed46 153
akkera102 0:7780b0dfed46 154 return SUCCESS;
akkera102 0:7780b0dfed46 155 }
akkera102 0:7780b0dfed46 156
akkera102 0:7780b0dfed46 157 int main(void)
akkera102 0:7780b0dfed46 158 {
akkera102 0:7780b0dfed46 159 int ret;
akkera102 0:7780b0dfed46 160
akkera102 0:7780b0dfed46 161 for(;;)
akkera102 0:7780b0dfed46 162 {
akkera102 0:7780b0dfed46 163 ret = ReadDHT11();
akkera102 0:7780b0dfed46 164
akkera102 0:7780b0dfed46 165 if(ret == SUCCESS)
akkera102 0:7780b0dfed46 166 {
akkera102 0:7780b0dfed46 167 printf("Temperature : %4.2f\n", Temperature);
akkera102 0:7780b0dfed46 168 printf("Humidity : %4.2f\n", Humidity);
akkera102 0:7780b0dfed46 169 }
akkera102 0:7780b0dfed46 170 else
akkera102 0:7780b0dfed46 171 {
akkera102 1:89cfea395009 172 printf("Error : %d\n", ret);
akkera102 0:7780b0dfed46 173 }
akkera102 0:7780b0dfed46 174
akkera102 0:7780b0dfed46 175 wait(2);
akkera102 0:7780b0dfed46 176 }
akkera102 0:7780b0dfed46 177 }