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