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
* Change DHT driver to provide better instant results and add decimals to DHT11 (#3164)
* Change DS18x20 driver to provide better instant results (#3169)
* Change DS18B20 driver to provide better instant results
* Remove TSL2561 debug message and update library (#2415)

View File

@ -29,9 +29,8 @@
#define DS18B20_MAX_MISS 5
float ds18b20_temperature = 0;
uint16_t ds18b20_last_result = 0;
uint8_t ds18b20_last_result = 0;
uint8_t ds18x20_pin = 0;
uint8_t ds18b20_second = 0;
/*********************************************************************************************\
* Embedded stripped and tuned OneWire library
@ -175,8 +174,7 @@ void Ds18b20Read()
void Ds18b20EverySecond()
{
ds18x20_pin = pin[GPIO_DSB];
ds18b20_second++;
if (ds18b20_second &1) {
if (uptime &1) {
Ds18b20Convert(); // Start conversion, takes up to one second
} else {
Ds18b20Read(); // Read temperature

View File

@ -36,21 +36,18 @@
#define DS18X20_MAX_MISS 5
#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";
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_pin = 0;
uint8_t ds18x20_second = 0;
char ds18x20_types[9];
/*********************************************************************************************\
@ -360,8 +357,7 @@ void Ds18x20Read(uint8_t sensor)
void Ds18x20EverySecond()
{
ds18x20_second++;
if (ds18x20_second &1) {
if (uptime &1) {
Ds18x20Convert(); // Start conversion, takes up to one second
} else {
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) {
t = NAN;
h = NAN;
} else {
if (Dht[sensor].lastresult > DHT_MAX_RETRY) { // Reset after 8 misses
Dht[sensor].t = NAN;
Dht[sensor].h = NAN;
}
t = Dht[sensor].t;
h = Dht[sensor].h;
if ((NAN == Dht[sensor].h) || (Dht[sensor].lastresult > DHT_MAX_RETRY)) { // Reset after 8 misses
Dht[sensor].t = NAN;
Dht[sensor].h = NAN;
}
DhtRead(sensor);
if (!Dht[sensor].lastresult) {
switch (Dht[sensor].type) {
case GPIO_DHT11:
h = dht_data[0];
t = dht_data[2];
Dht[sensor].h = dht_data[0];
Dht[sensor].t = dht_data[2] + ((float)dht_data[3] * 0.1f); // Issue #3164
break;
case GPIO_DHT22:
case GPIO_SI7021:
h = ((dht_data[0] << 8) | dht_data[1]) * 0.1;
t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1;
Dht[sensor].h = ((dht_data[0] << 8) | dht_data[1]) * 0.1;
Dht[sensor].t = (((dht_data[2] & 0x7F) << 8 ) | dht_data[3]) * 0.1;
if (dht_data[2] & 0x80) {
t *= -1;
Dht[sensor].t *= -1;
}
break;
}
t = ConvertTemp(t);
if (!isnan(t)) {
Dht[sensor].t = t;
}
if (!isnan(h)) {
Dht[sensor].h = h;
}
Dht[sensor].t = ConvertTemp(Dht[sensor].t);
}
return (!isnan(t) && !isnan(h));
}
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)
{
char temperature[10];
@ -217,34 +213,30 @@ void DhtShow(boolean json)
byte dsxflg = 0;
for (byte i = 0; i < dht_sensors; i++) {
float t = NAN;
float h = NAN;
if (DhtReadTempHum(i, t, h)) { // Read temperature
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
dtostrfd(h, Settings.flag2.humidity_resolution, humidity);
dtostrfd(Dht[i].t, Settings.flag2.temperature_resolution, temperature);
dtostrfd(Dht[i].h, Settings.flag2.humidity_resolution, humidity);
if (json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity);
if (json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, Dht[i].stype, temperature, humidity);
#ifdef USE_DOMOTICZ
if ((0 == tele_period) && !dsxflg) {
DomoticzTempHumSensor(temperature, humidity);
dsxflg++;
}
if ((0 == tele_period) && !dsxflg) {
DomoticzTempHumSensor(temperature, humidity);
dsxflg++;
}
#endif // USE_DOMOTICZ
#ifdef USE_KNX
if (0 == tele_period) {
KnxSensor(KNX_TEMPERATURE, t);
KnxSensor(KNX_HUMIDITY, h);
}
if (0 == tele_period) {
KnxSensor(KNX_TEMPERATURE, Dht[i].t);
KnxSensor(KNX_HUMIDITY, Dht[i].h);
}
#endif // USE_KNX
#ifdef USE_WEBSERVER
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, Dht[i].stype, temperature, TempUnit());
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, Dht[i].stype, humidity);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, Dht[i].stype, temperature, TempUnit());
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, Dht[i].stype, humidity);
#endif // USE_WEBSERVER
}
}
}
}
@ -264,8 +256,8 @@ boolean Xsns06(byte function)
case FUNC_INIT:
DhtInit();
break;
case FUNC_PREP_BEFORE_TELEPERIOD:
DhtReadPrep();
case FUNC_EVERY_SECOND:
DhtEverySecond();
break;
case FUNC_JSON_APPEND:
DhtShow(1);