mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-22 18:26:30 +00:00
Change DHT driver
Change DHT driver to provide better instant results and add decimals to DHT11 (#3164)
This commit is contained in:
parent
d875b0b1ad
commit
0c902b7d64
@ -1,4 +1,5 @@
|
|||||||
/* 6.1.0a
|
/* 6.1.0a
|
||||||
|
* Change DHT driver to provide better instant results and add decimals to DHT11 (#3164)
|
||||||
* Change DS18x20 driver to provide better instant results (#3169)
|
* Change DS18x20 driver to provide better instant results (#3169)
|
||||||
* Change DS18B20 driver to provide better instant results
|
* Change DS18B20 driver to provide better instant results
|
||||||
* Remove TSL2561 debug message and update library (#2415)
|
* Remove TSL2561 debug message and update library (#2415)
|
||||||
|
@ -29,9 +29,8 @@
|
|||||||
#define DS18B20_MAX_MISS 5
|
#define DS18B20_MAX_MISS 5
|
||||||
|
|
||||||
float ds18b20_temperature = 0;
|
float ds18b20_temperature = 0;
|
||||||
uint16_t ds18b20_last_result = 0;
|
uint8_t ds18b20_last_result = 0;
|
||||||
uint8_t ds18x20_pin = 0;
|
uint8_t ds18x20_pin = 0;
|
||||||
uint8_t ds18b20_second = 0;
|
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Embedded stripped and tuned OneWire library
|
* Embedded stripped and tuned OneWire library
|
||||||
@ -175,8 +174,7 @@ void Ds18b20Read()
|
|||||||
void Ds18b20EverySecond()
|
void Ds18b20EverySecond()
|
||||||
{
|
{
|
||||||
ds18x20_pin = pin[GPIO_DSB];
|
ds18x20_pin = pin[GPIO_DSB];
|
||||||
ds18b20_second++;
|
if (uptime &1) {
|
||||||
if (ds18b20_second &1) {
|
|
||||||
Ds18b20Convert(); // Start conversion, takes up to one second
|
Ds18b20Convert(); // Start conversion, takes up to one second
|
||||||
} else {
|
} else {
|
||||||
Ds18b20Read(); // Read temperature
|
Ds18b20Read(); // Read temperature
|
||||||
|
@ -36,21 +36,18 @@
|
|||||||
#define DS18X20_MAX_MISS 5
|
#define DS18X20_MAX_MISS 5
|
||||||
#define DS18X20_MAX_SENSORS 8
|
#define DS18X20_MAX_SENSORS 8
|
||||||
|
|
||||||
typedef struct DS18X20SENSORS {
|
|
||||||
uint8_t address[8];
|
|
||||||
uint8_t index;
|
|
||||||
uint8_t result;
|
|
||||||
float temperature;
|
|
||||||
} Ds18x20Sensor;
|
|
||||||
|
|
||||||
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
|
const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
|
||||||
|
|
||||||
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
|
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
|
||||||
|
|
||||||
Ds18x20Sensor ds18x20_sensor[DS18X20_MAX_SENSORS];
|
struct DS18X20STRUCT {
|
||||||
|
uint8_t address[8];
|
||||||
|
uint8_t index;
|
||||||
|
uint8_t result;
|
||||||
|
float temperature;
|
||||||
|
} ds18x20_sensor[DS18X20_MAX_SENSORS];
|
||||||
uint8_t ds18x20_sensors = 0;
|
uint8_t ds18x20_sensors = 0;
|
||||||
uint8_t ds18x20_pin = 0;
|
uint8_t ds18x20_pin = 0;
|
||||||
uint8_t ds18x20_second = 0;
|
|
||||||
char ds18x20_types[9];
|
char ds18x20_types[9];
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
@ -360,8 +357,7 @@ void Ds18x20Read(uint8_t sensor)
|
|||||||
|
|
||||||
void Ds18x20EverySecond()
|
void Ds18x20EverySecond()
|
||||||
{
|
{
|
||||||
ds18x20_second++;
|
if (uptime &1) {
|
||||||
if (ds18x20_second &1) {
|
|
||||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||||
} else {
|
} else {
|
||||||
for (uint8_t i = 0; i < ds18x20_sensors; i++) {
|
for (uint8_t i = 0; i < ds18x20_sensors; i++) {
|
||||||
|
@ -139,45 +139,30 @@ void DhtRead(byte sensor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean DhtReadTempHum(byte sensor, float &t, float &h)
|
void DhtReadTempHum(byte sensor)
|
||||||
{
|
{
|
||||||
if (NAN == Dht[sensor].h) {
|
if ((NAN == Dht[sensor].h) || (Dht[sensor].lastresult > DHT_MAX_RETRY)) { // Reset after 8 misses
|
||||||
t = NAN;
|
|
||||||
h = NAN;
|
|
||||||
} else {
|
|
||||||
if (Dht[sensor].lastresult > DHT_MAX_RETRY) { // Reset after 8 misses
|
|
||||||
Dht[sensor].t = NAN;
|
Dht[sensor].t = NAN;
|
||||||
Dht[sensor].h = NAN;
|
Dht[sensor].h = NAN;
|
||||||
}
|
}
|
||||||
t = Dht[sensor].t;
|
|
||||||
h = Dht[sensor].h;
|
|
||||||
}
|
|
||||||
|
|
||||||
DhtRead(sensor);
|
DhtRead(sensor);
|
||||||
if (!Dht[sensor].lastresult) {
|
if (!Dht[sensor].lastresult) {
|
||||||
switch (Dht[sensor].type) {
|
switch (Dht[sensor].type) {
|
||||||
case GPIO_DHT11:
|
case GPIO_DHT11:
|
||||||
h = dht_data[0];
|
Dht[sensor].h = dht_data[0];
|
||||||
t = dht_data[2];
|
Dht[sensor].t = dht_data[2] + ((float)dht_data[3] * 0.1f); // Issue #3164
|
||||||
break;
|
break;
|
||||||
case GPIO_DHT22:
|
case GPIO_DHT22:
|
||||||
case GPIO_SI7021:
|
case GPIO_SI7021:
|
||||||
h = ((dht_data[0] << 8) | dht_data[1]) * 0.1;
|
Dht[sensor].h = ((dht_data[0] << 8) | dht_data[1]) * 0.1;
|
||||||
t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1;
|
Dht[sensor].t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1;
|
||||||
if (dht_data[2] & 0x80) {
|
if (dht_data[2] & 0x80) {
|
||||||
t *= -1;
|
Dht[sensor].t *= -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
t = ConvertTemp(t);
|
Dht[sensor].t = ConvertTemp(Dht[sensor].t);
|
||||||
if (!isnan(t)) {
|
|
||||||
Dht[sensor].t = t;
|
|
||||||
}
|
}
|
||||||
if (!isnan(h)) {
|
|
||||||
Dht[sensor].h = h;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (!isnan(t) && !isnan(h));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean DhtSetup(byte pin, byte type)
|
boolean DhtSetup(byte pin, byte type)
|
||||||
@ -210,6 +195,17 @@ void DhtInit()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DhtEverySecond()
|
||||||
|
{
|
||||||
|
if (uptime &1) {
|
||||||
|
DhtReadPrep();
|
||||||
|
} else {
|
||||||
|
for (byte i = 0; i < dht_sensors; i++) {
|
||||||
|
DhtReadTempHum(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DhtShow(boolean json)
|
void DhtShow(boolean json)
|
||||||
{
|
{
|
||||||
char temperature[10];
|
char temperature[10];
|
||||||
@ -217,11 +213,8 @@ void DhtShow(boolean json)
|
|||||||
|
|
||||||
byte dsxflg = 0;
|
byte dsxflg = 0;
|
||||||
for (byte i = 0; i < dht_sensors; i++) {
|
for (byte i = 0; i < dht_sensors; i++) {
|
||||||
float t = NAN;
|
dtostrfd(Dht[i].t, Settings.flag2.temperature_resolution, temperature);
|
||||||
float h = NAN;
|
dtostrfd(Dht[i].h, Settings.flag2.humidity_resolution, humidity);
|
||||||
if (DhtReadTempHum(i, t, h)) { // Read temperature
|
|
||||||
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
|
|
||||||
dtostrfd(h, Settings.flag2.humidity_resolution, humidity);
|
|
||||||
|
|
||||||
if (json) {
|
if (json) {
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity);
|
||||||
@ -234,8 +227,8 @@ void DhtShow(boolean json)
|
|||||||
|
|
||||||
#ifdef USE_KNX
|
#ifdef USE_KNX
|
||||||
if (0 == tele_period) {
|
if (0 == tele_period) {
|
||||||
KnxSensor(KNX_TEMPERATURE, t);
|
KnxSensor(KNX_TEMPERATURE, Dht[i].t);
|
||||||
KnxSensor(KNX_HUMIDITY, h);
|
KnxSensor(KNX_HUMIDITY, Dht[i].h);
|
||||||
}
|
}
|
||||||
#endif // USE_KNX
|
#endif // USE_KNX
|
||||||
|
|
||||||
@ -246,7 +239,6 @@ void DhtShow(boolean json)
|
|||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
@ -264,8 +256,8 @@ boolean Xsns06(byte function)
|
|||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
DhtInit();
|
DhtInit();
|
||||||
break;
|
break;
|
||||||
case FUNC_PREP_BEFORE_TELEPERIOD:
|
case FUNC_EVERY_SECOND:
|
||||||
DhtReadPrep();
|
DhtEverySecond();
|
||||||
break;
|
break;
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
DhtShow(1);
|
DhtShow(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user