Program za ispit
Dependencies: mbed
Dht11.cpp@0:ff77d67fd52a, 2019-03-29 (annotated)
- Committer:
- Filip10
- Date:
- Fri Mar 29 18:02:34 2019 +0000
- Revision:
- 0:ff77d67fd52a
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Filip10 | 0:ff77d67fd52a | 1 | #include "Dht11.h" |
Filip10 | 0:ff77d67fd52a | 2 | |
Filip10 | 0:ff77d67fd52a | 3 | Dht11::Dht11(PinName const &p) : _pin(p) { |
Filip10 | 0:ff77d67fd52a | 4 | // Set creation time so we can make |
Filip10 | 0:ff77d67fd52a | 5 | // sure we pause at least 1 second for |
Filip10 | 0:ff77d67fd52a | 6 | // startup. |
Filip10 | 0:ff77d67fd52a | 7 | _timer.start(); |
Filip10 | 0:ff77d67fd52a | 8 | |
Filip10 | 0:ff77d67fd52a | 9 | _temperature = 0; |
Filip10 | 0:ff77d67fd52a | 10 | _humidity = 0; |
Filip10 | 0:ff77d67fd52a | 11 | } |
Filip10 | 0:ff77d67fd52a | 12 | |
Filip10 | 0:ff77d67fd52a | 13 | int Dht11::read() |
Filip10 | 0:ff77d67fd52a | 14 | { |
Filip10 | 0:ff77d67fd52a | 15 | // BUFFER TO RECEIVE |
Filip10 | 0:ff77d67fd52a | 16 | uint8_t bits[5]; |
Filip10 | 0:ff77d67fd52a | 17 | uint8_t cnt = 7; |
Filip10 | 0:ff77d67fd52a | 18 | uint8_t idx = 0; |
Filip10 | 0:ff77d67fd52a | 19 | |
Filip10 | 0:ff77d67fd52a | 20 | // EMPTY BUFFER |
Filip10 | 0:ff77d67fd52a | 21 | for (int i=0; i< 5; i++) bits[i] = 0; |
Filip10 | 0:ff77d67fd52a | 22 | |
Filip10 | 0:ff77d67fd52a | 23 | // Verify sensor settled after boot |
Filip10 | 0:ff77d67fd52a | 24 | while(_timer.read_ms() < 1500) {} |
Filip10 | 0:ff77d67fd52a | 25 | _timer.stop(); |
Filip10 | 0:ff77d67fd52a | 26 | |
Filip10 | 0:ff77d67fd52a | 27 | // Notify it we are ready to read |
Filip10 | 0:ff77d67fd52a | 28 | _pin.output(); |
Filip10 | 0:ff77d67fd52a | 29 | _pin = 0; |
Filip10 | 0:ff77d67fd52a | 30 | wait_ms(18); |
Filip10 | 0:ff77d67fd52a | 31 | _pin = 1; |
Filip10 | 0:ff77d67fd52a | 32 | wait_us(40); |
Filip10 | 0:ff77d67fd52a | 33 | _pin.input(); |
Filip10 | 0:ff77d67fd52a | 34 | |
Filip10 | 0:ff77d67fd52a | 35 | // ACKNOWLEDGE or TIMEOUT |
Filip10 | 0:ff77d67fd52a | 36 | unsigned int loopCnt = 10000; |
Filip10 | 0:ff77d67fd52a | 37 | while(_pin == 0) |
Filip10 | 0:ff77d67fd52a | 38 | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; |
Filip10 | 0:ff77d67fd52a | 39 | |
Filip10 | 0:ff77d67fd52a | 40 | loopCnt = 10000; |
Filip10 | 0:ff77d67fd52a | 41 | while(_pin == 1) |
Filip10 | 0:ff77d67fd52a | 42 | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; |
Filip10 | 0:ff77d67fd52a | 43 | |
Filip10 | 0:ff77d67fd52a | 44 | // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT |
Filip10 | 0:ff77d67fd52a | 45 | for (int i=0; i<40; i++) |
Filip10 | 0:ff77d67fd52a | 46 | { |
Filip10 | 0:ff77d67fd52a | 47 | loopCnt = 10000; |
Filip10 | 0:ff77d67fd52a | 48 | while(_pin == 0) |
Filip10 | 0:ff77d67fd52a | 49 | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; |
Filip10 | 0:ff77d67fd52a | 50 | |
Filip10 | 0:ff77d67fd52a | 51 | //unsigned long t = micros(); |
Filip10 | 0:ff77d67fd52a | 52 | Timer t; |
Filip10 | 0:ff77d67fd52a | 53 | t. start(); |
Filip10 | 0:ff77d67fd52a | 54 | |
Filip10 | 0:ff77d67fd52a | 55 | loopCnt = 10000; |
Filip10 | 0:ff77d67fd52a | 56 | while(_pin == 1) |
Filip10 | 0:ff77d67fd52a | 57 | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; |
Filip10 | 0:ff77d67fd52a | 58 | |
Filip10 | 0:ff77d67fd52a | 59 | if (t.read_us() > 40) bits[idx] |= (1 << cnt); |
Filip10 | 0:ff77d67fd52a | 60 | if (cnt == 0) // next byte? |
Filip10 | 0:ff77d67fd52a | 61 | { |
Filip10 | 0:ff77d67fd52a | 62 | cnt = 7; // restart at MSB |
Filip10 | 0:ff77d67fd52a | 63 | idx++; // next byte! |
Filip10 | 0:ff77d67fd52a | 64 | } |
Filip10 | 0:ff77d67fd52a | 65 | else cnt--; |
Filip10 | 0:ff77d67fd52a | 66 | } |
Filip10 | 0:ff77d67fd52a | 67 | |
Filip10 | 0:ff77d67fd52a | 68 | // WRITE TO RIGHT VARS |
Filip10 | 0:ff77d67fd52a | 69 | // as bits[1] and bits[3] are allways zero they are omitted in formulas. |
Filip10 | 0:ff77d67fd52a | 70 | _humidity = bits[0]; |
Filip10 | 0:ff77d67fd52a | 71 | _temperature = bits[2]; |
Filip10 | 0:ff77d67fd52a | 72 | |
Filip10 | 0:ff77d67fd52a | 73 | uint8_t sum = bits[0] + bits[2]; |
Filip10 | 0:ff77d67fd52a | 74 | |
Filip10 | 0:ff77d67fd52a | 75 | if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; |
Filip10 | 0:ff77d67fd52a | 76 | return DHTLIB_OK; |
Filip10 | 0:ff77d67fd52a | 77 | } |
Filip10 | 0:ff77d67fd52a | 78 | |
Filip10 | 0:ff77d67fd52a | 79 | float Dht11::getFahrenheit() { |
Filip10 | 0:ff77d67fd52a | 80 | return((_temperature * 1.8) + 32); |
Filip10 | 0:ff77d67fd52a | 81 | } |
Filip10 | 0:ff77d67fd52a | 82 | |
Filip10 | 0:ff77d67fd52a | 83 | int Dht11::getCelsius() { |
Filip10 | 0:ff77d67fd52a | 84 | return(_temperature); |
Filip10 | 0:ff77d67fd52a | 85 | } |
Filip10 | 0:ff77d67fd52a | 86 | |
Filip10 | 0:ff77d67fd52a | 87 | int Dht11::getHumidity() { |
Filip10 | 0:ff77d67fd52a | 88 | return(_humidity); |
Filip10 | 0:ff77d67fd52a | 89 | } |