v5.7.1b - Add timeout to some sensors

5.7.1b
 * Add timeout to DHT and DS18B20 sensors (#852)
This commit is contained in:
arendst 2017-09-10 17:20:03 +02:00
parent 0151188652
commit 105c5d7129
5 changed files with 34 additions and 18 deletions

View File

@ -1,7 +1,7 @@
## Sonoff-Tasmota ## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
Current version is **5.7.1a** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. Current version is **5.7.1b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions ### ATTENTION All versions

View File

@ -1,4 +1,7 @@
/* 5.7.1a /* 5.7.1b
* Add timeout to DHT and DS18B20 sensors (#852)
*
* 5.7.1a
* Fix Domoticz loop when Emulation is selected * Fix Domoticz loop when Emulation is selected
* Add GPIO14 to Sonoff Dual (#797, #839) * Add GPIO14 to Sonoff Dual (#797, #839)
* Add support for Witty Cloud (#794) * Add support for Witty Cloud (#794)

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)" - Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/ ====================================================*/
#define VERSION 0x05070101 // 5.7.1a #define VERSION 0x05070102 // 5.7.1b
enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
enum week_t {Last, First, Second, Third, Fourth}; enum week_t {Last, First, Second, Third, Fourth};

View File

@ -38,7 +38,7 @@ struct DHTSTRUCT {
byte type; byte type;
char stype[10]; char stype[10];
uint32_t lastreadtime; uint32_t lastreadtime;
bool lastresult; uint16_t lastresult;
float t; float t;
float h = 0; float h = 0;
} dht[DHT_MAX_SENSORS]; } dht[DHT_MAX_SENSORS];
@ -62,14 +62,14 @@ uint32_t dht_expectPulse(byte sensor, bool level)
return count; return count;
} }
boolean dht_read(byte sensor) void dht_read(byte sensor)
{ {
char log[LOGSZ]; char log[LOGSZ];
uint32_t cycles[80]; uint32_t cycles[80];
uint32_t currenttime = millis(); uint32_t currenttime = millis();
if ((currenttime - dht[sensor].lastreadtime) < 2000) { if ((currenttime - dht[sensor].lastreadtime) < 2000) {
return dht[sensor].lastresult; return;
} }
dht[sensor].lastreadtime = currenttime; dht[sensor].lastreadtime = currenttime;
@ -89,13 +89,13 @@ boolean dht_read(byte sensor)
delayMicroseconds(10); delayMicroseconds(10);
if (0 == dht_expectPulse(sensor, LOW)) { if (0 == dht_expectPulse(sensor, LOW)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE)); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult++;
return dht[sensor].lastresult; return;
} }
if (0 == dht_expectPulse(sensor, HIGH)) { if (0 == dht_expectPulse(sensor, HIGH)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE)); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult++;
return dht[sensor].lastresult; return;
} }
for (int i = 0; i < 80; i += 2) { for (int i = 0; i < 80; i += 2) {
cycles[i] = dht_expectPulse(sensor, LOW); cycles[i] = dht_expectPulse(sensor, LOW);
@ -108,8 +108,8 @@ boolean dht_read(byte sensor)
uint32_t highCycles = cycles[2*i+1]; uint32_t highCycles = cycles[2*i+1];
if ((0 == lowCycles) || (0 == highCycles)) { if ((0 == lowCycles) || (0 == highCycles)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE)); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult++;
return dht[sensor].lastresult; return;
} }
dht_data[i/8] <<= 1; dht_data[i/8] <<= 1;
if (highCycles > lowCycles) { if (highCycles > lowCycles) {
@ -122,12 +122,11 @@ boolean dht_read(byte sensor)
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) { if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) {
dht[sensor].lastresult = true; dht[sensor].lastresult = 0;
} else { } else {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE)); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE));
dht[sensor].lastresult = false; dht[sensor].lastresult++;
} }
return dht[sensor].lastresult;
} }
boolean dht_readTempHum(byte sensor, float &t, float &h) boolean dht_readTempHum(byte sensor, float &t, float &h)
@ -136,11 +135,16 @@ boolean dht_readTempHum(byte sensor, float &t, float &h)
t = NAN; t = NAN;
h = NAN; h = NAN;
} else { } else {
if (dht[sensor].lastresult > 8) { // Reset after 8 misses
dht[sensor].t = NAN;
dht[sensor].h = NAN;
}
t = dht[sensor].t; t = dht[sensor].t;
h = dht[sensor].h; h = dht[sensor].h;
} }
if (dht_read(sensor)) { dht_read(sensor);
if (!dht[sensor].lastresult) {
switch (dht[sensor].type) { switch (dht[sensor].type) {
case GPIO_DHT11: case GPIO_DHT11:
h = dht_data[0]; h = dht_data[0];
@ -193,7 +197,8 @@ void dht_init()
for (byte i = 0; i < dht_sensors; i++) { for (byte i = 0; i < dht_sensors; i++) {
pinMode(dht[i].pin, INPUT_PULLUP); pinMode(dht[i].pin, INPUT_PULLUP);
dht[i].lastreadtime = -MIN_INTERVAL; dht[i].lastreadtime -= MIN_INTERVAL;
dht[i].lastresult = 0;
switch (dht[i].type) { switch (dht[i].type) {
case GPIO_DHT11: case GPIO_DHT11:
strcpy_P(dht[i].stype, PSTR("DHT11")); strcpy_P(dht[i].stype, PSTR("DHT11"));

View File

@ -25,6 +25,7 @@
\*********************************************************************************************/ \*********************************************************************************************/
float dsb_mt = 0; float dsb_mt = 0;
uint16_t dsb_lastresult = 0;
uint8_t dsb_reset() uint8_t dsb_reset()
{ {
@ -131,6 +132,10 @@ boolean dsb_readTemp(float &t)
if (!dsb_mt) { if (!dsb_mt) {
t = NAN; t = NAN;
} else { } else {
dsb_lastresult++;
if (dsb_lastresult > 8) { // Reset after 8 misses
dsb_mt = NAN;
}
t = dsb_mt; t = dsb_mt;
} }
@ -168,8 +173,11 @@ boolean dsb_readTemp(float &t)
sign = -1; sign = -1;
} }
t = convertTemp((float)sign * DSTemp * 0.0625); t = convertTemp((float)sign * DSTemp * 0.0625);
dsb_lastresult = 0;
}
if (!isnan(t)) {
dsb_mt = t;
} }
if (!isnan(t)) dsb_mt = t;
return !isnan(t); return !isnan(t);
} }