mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-06-06 02:36:49 +08:00
171 lines
5.8 KiB
C++
171 lines
5.8 KiB
C++
/******************************************************************
|
|
DHT Temperature & Humidity Sensor library for Arduino & ESP32.
|
|
|
|
Features:
|
|
- Support for DHT11 and DHT22/AM2302/RHT03
|
|
- Auto detect sensor model
|
|
- Very low memory footprint
|
|
- Very small code
|
|
|
|
https://github.com/beegee-tokyo/arduino-DHTesp
|
|
|
|
Written by Mark Ruys, mark@paracas.nl.
|
|
Updated to work with ESP32 by Bernd Giesecke, bernd@giesecke.tk
|
|
|
|
GNU General Public License, check LICENSE for more information.
|
|
All text above must be included in any redistribution.
|
|
|
|
Datasheets:
|
|
- http://www.micro4you.com/files/sensor/DHT11.pdf
|
|
- http://www.adafruit.com/datasheets/DHT22.pdf
|
|
- http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf
|
|
- http://meteobox.tk/files/AM2302.pdf
|
|
|
|
Changelog:
|
|
2013-06-10: Initial version
|
|
2013-06-12: Refactored code
|
|
2013-07-01: Add a resetTimer method
|
|
2017-12-12: Added task switch disable
|
|
Added computeHeatIndex function from Adafruit DNT library
|
|
2017-12-14: Added computeDewPoint function from idDHTLib Library
|
|
Added getComfortRatio function from libDHT Library
|
|
2017-12-15: Added computePerception function
|
|
2018-01-02: Added example for multiple sensors usage.
|
|
2018-01-03: Added function getTempAndHumidity which returns temperature and humidity in one call.
|
|
2018-01-03: Added retry in case the reading from the sensor fails with a timeout.
|
|
2018-01-08: Added ESP8266 (and probably AVR) compatibility.
|
|
******************************************************************/
|
|
|
|
#ifndef dhtesp_h
|
|
#define dhtesp_h
|
|
|
|
#if ARDUINO < 100
|
|
#include <WProgram.h>
|
|
#else
|
|
#include <Arduino.h>
|
|
#endif
|
|
|
|
// Reference: http://epb.apogee.net/res/refcomf.asp (References invalid)
|
|
enum ComfortState {
|
|
Comfort_OK = 0,
|
|
Comfort_TooHot = 1,
|
|
Comfort_TooCold = 2,
|
|
Comfort_TooDry = 4,
|
|
Comfort_TooHumid = 8,
|
|
Comfort_HotAndHumid = 9,
|
|
Comfort_HotAndDry = 5,
|
|
Comfort_ColdAndHumid = 10,
|
|
Comfort_ColdAndDry = 6
|
|
};
|
|
|
|
// References https://en.wikipedia.org/wiki/Dew_point ==> Relationship to human comfort
|
|
enum PerceptionState {
|
|
Perception_Dry = 0,
|
|
Perception_VeryComfy = 1,
|
|
Perception_Comfy = 2,
|
|
Perception_Ok = 3,
|
|
Perception_UnComfy = 4,
|
|
Perception_QuiteUnComfy = 5,
|
|
Perception_VeryUnComfy = 6,
|
|
Perception_SevereUncomfy = 7
|
|
};
|
|
|
|
struct TempAndHumidity {
|
|
float temperature;
|
|
float humidity;
|
|
};
|
|
|
|
struct ComfortProfile
|
|
{
|
|
//Represent the 4 line equations:
|
|
//dry, humid, hot, cold, using the y = mx + b formula
|
|
float m_tooHot_m, m_tooHot_b;
|
|
float m_tooCold_m, m_tooHCold_b;
|
|
float m_tooDry_m, m_tooDry_b;
|
|
float m_tooHumid_m, m_tooHumid_b;
|
|
|
|
inline bool isTooHot(float temp, float humidity) {return (temp > (humidity * m_tooHot_m + m_tooHot_b));}
|
|
inline bool isTooHumid(float temp, float humidity) {return (temp > (humidity * m_tooHumid_m + m_tooHumid_b));}
|
|
inline bool isTooCold(float temp, float humidity) {return (temp < (humidity * m_tooCold_m + m_tooHCold_b));}
|
|
inline bool isTooDry(float temp, float humidity) {return (temp < (humidity * m_tooDry_m + m_tooDry_b));}
|
|
|
|
inline float distanceTooHot(float temp, float humidity) {return temp - (humidity * m_tooHot_m + m_tooHot_b);}
|
|
inline float distanceTooHumid(float temp, float humidity) {return temp - (humidity * m_tooHumid_m + m_tooHumid_b);}
|
|
inline float distanceTooCold(float temp, float humidity) {return (humidity * m_tooCold_m + m_tooHCold_b) - temp;}
|
|
inline float distanceTooDry(float temp, float humidity) {return (humidity * m_tooDry_m + m_tooDry_b) - temp;}
|
|
};
|
|
|
|
class DHTesp
|
|
{
|
|
public:
|
|
|
|
typedef enum {
|
|
AUTO_DETECT,
|
|
DHT11,
|
|
DHT22,
|
|
AM2302, // Packaged DHT22
|
|
RHT03 // Equivalent to DHT22
|
|
}
|
|
DHT_MODEL_t;
|
|
|
|
typedef enum {
|
|
ERROR_NONE = 0,
|
|
ERROR_TIMEOUT,
|
|
ERROR_CHECKSUM
|
|
}
|
|
DHT_ERROR_t;
|
|
|
|
TempAndHumidity values;
|
|
|
|
void setup(uint8_t pin, DHT_MODEL_t model=AUTO_DETECT);
|
|
void resetTimer();
|
|
|
|
float getTemperature();
|
|
float getHumidity();
|
|
TempAndHumidity getTempAndHumidity();
|
|
|
|
DHT_ERROR_t getStatus() { return error; };
|
|
const char* getStatusString();
|
|
|
|
DHT_MODEL_t getModel() { return model; }
|
|
|
|
int getMinimumSamplingPeriod() { return model == DHT11 ? 1000 : 2000; }
|
|
|
|
int8_t getNumberOfDecimalsTemperature() { return model == DHT11 ? 0 : 1; };
|
|
int8_t getLowerBoundTemperature() { return model == DHT11 ? 0 : -40; };
|
|
int8_t getUpperBoundTemperature() { return model == DHT11 ? 50 : 125; };
|
|
|
|
int8_t getNumberOfDecimalsHumidity() { return 0; };
|
|
int8_t getLowerBoundHumidity() { return model == DHT11 ? 20 : 0; };
|
|
int8_t getUpperBoundHumidity() { return model == DHT11 ? 90 : 100; };
|
|
|
|
static float toFahrenheit(float fromCelcius) { return 1.8 * fromCelcius + 32.0; };
|
|
static float toCelsius(float fromFahrenheit) { return (fromFahrenheit - 32.0) / 1.8; };
|
|
|
|
float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=false);
|
|
float computeDewPoint(float temperature, float percentHumidity, bool isFahrenheit=false);
|
|
float getComfortRatio(ComfortState& destComfStatus, float temperature, float percentHumidity, bool isFahrenheit=false);
|
|
ComfortProfile getComfortProfile() {return m_comfort;}
|
|
void setComfortProfile(ComfortProfile& c) {m_comfort = c;}
|
|
inline bool isTooHot(float temp, float humidity) {return m_comfort.isTooHot(temp, humidity);}
|
|
inline bool isTooHumid(float temp, float humidity) {return m_comfort.isTooHumid(temp, humidity);}
|
|
inline bool isTooCold(float temp, float humidity) {return m_comfort.isTooCold(temp, humidity);}
|
|
inline bool isTooDry(float temp, float humidity) {return m_comfort.isTooDry(temp, humidity);}
|
|
byte computePerception(float temperature, float percentHumidity, bool isFahrenheit=false);
|
|
protected:
|
|
void readSensor();
|
|
|
|
float temperature;
|
|
float humidity;
|
|
|
|
uint8_t pin;
|
|
|
|
private:
|
|
DHT_MODEL_t model;
|
|
DHT_ERROR_t error;
|
|
unsigned long lastReadTime;
|
|
ComfortProfile m_comfort;
|
|
};
|
|
|
|
#endif /*dhtesp_h*/
|