Change DHT driver

Change DHT driver to provide better instant results and add decimals to DHT11 (#3164)
This commit is contained in:
Theo Arends 2018-07-09 16:39:24 +02:00
parent d875b0b1ad
commit 0c902b7d64
4 changed files with 48 additions and 61 deletions

View File

@ -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)

View File

@ -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

View File

@ -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++) {

View File

@ -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);