mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-24 23:07:17 +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
|
||||
* 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)
|
||||
|
@ -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
|
||||
|
@ -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++) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user