parent
c51eacf06c
commit
49c95d1b6d
@ -0,0 +1,88 @@ |
|||||||
|
#include <avr/io.h> |
||||||
|
#include <util/delay.h> |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
#include "iopins.h" |
||||||
|
#include "dht11.h" |
||||||
|
|
||||||
|
/** Read one bit */ |
||||||
|
bool _dht11_rxbit(const uint8_t pin) |
||||||
|
{ |
||||||
|
// Wait until start of pulse
|
||||||
|
while (is_low_n(pin)); |
||||||
|
|
||||||
|
uint8_t cnt = 0; |
||||||
|
while (is_high_n(pin)) |
||||||
|
{ |
||||||
|
cnt++; |
||||||
|
_delay_us(5); |
||||||
|
} |
||||||
|
|
||||||
|
return (cnt > 8); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Read one byte */ |
||||||
|
uint8_t _dht11_rxbyte(const uint8_t pin) |
||||||
|
{ |
||||||
|
uint8_t byte = 0; |
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 8; i++) |
||||||
|
{ |
||||||
|
if (_dht11_rxbit(pin)) |
||||||
|
byte |= (1 << (7 - i)); |
||||||
|
} |
||||||
|
|
||||||
|
return byte; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Read tehmperature and humidity from the DHT11, returns false on failure */ |
||||||
|
bool dht11_read(const uint8_t pin, dht11_result_t* result) |
||||||
|
{ |
||||||
|
// bus down for > 18 ms
|
||||||
|
as_output_n(pin); |
||||||
|
pin_low_n(pin); |
||||||
|
_delay_ms(20); |
||||||
|
|
||||||
|
// bus up for 20-40us
|
||||||
|
pin_high_n(pin); |
||||||
|
_delay_us(20); |
||||||
|
|
||||||
|
// release
|
||||||
|
as_input_pu_n(pin); |
||||||
|
|
||||||
|
// DHT should send 80us LOW & 80us HIGH
|
||||||
|
|
||||||
|
_delay_us(40); |
||||||
|
if (!is_low_n(pin)) |
||||||
|
return false; // init error
|
||||||
|
|
||||||
|
_delay_us(80); |
||||||
|
if (!is_high_n(pin)) |
||||||
|
return false; // init error
|
||||||
|
|
||||||
|
// skip to start of first bit
|
||||||
|
_delay_us(50); |
||||||
|
|
||||||
|
// Receive 5 data bytes (Rh int, Rh dec, Temp int, Temp dec, Checksum)
|
||||||
|
// Decimal bytes are zero for DHT11 -> we can ignore them.
|
||||||
|
uint8_t bytes[5]; |
||||||
|
uint8_t sum = 0; |
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 5; i++) |
||||||
|
{ |
||||||
|
uint8_t b = _dht11_rxbyte(pin); |
||||||
|
bytes[i] = b; |
||||||
|
if (i < 4) sum += b; |
||||||
|
} |
||||||
|
|
||||||
|
// Verify checksum
|
||||||
|
if (sum != bytes[4]) return false; |
||||||
|
|
||||||
|
result->rh = bytes[0]; |
||||||
|
result->temp = bytes[2]; |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
//
|
||||||
|
// Reading temperature and relative humidity from DHT11
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
int8_t temp; |
||||||
|
int8_t rh; |
||||||
|
} dht11_result_t; |
||||||
|
|
||||||
|
/** Read tehmperature and humidity from the DHT11, returns false on failure */ |
||||||
|
bool dht11_read(const uint8_t pin, dht11_result_t* result); |
Loading…
Reference in new issue