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