mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 11:46:31 +00:00
Change DS18B20 driver
Change DS18B20 driver to provide better instant results
This commit is contained in:
parent
cc24dd11ce
commit
fb41466cb7
@ -1,4 +1,5 @@
|
|||||||
/* 6.1.0a
|
/* 6.1.0a
|
||||||
|
* Change DS18B20 driver to provide instant results
|
||||||
* Remove TSL2561 debug message and update library (#2415)
|
* Remove TSL2561 debug message and update library (#2415)
|
||||||
* Change SHT1x sensor initialization from pre-teleperiod to once during restart to fix I2C interference
|
* Change SHT1x sensor initialization from pre-teleperiod to once during restart to fix I2C interference
|
||||||
* Add wifi and mqtt status led blinkyblinky to be disabled by SetOption31 1. Does not work when LedPower is On (deliberate) (#871, #2230, #3114, #3155)
|
* Add wifi and mqtt status led blinkyblinky to be disabled by SetOption31 1. Does not work when LedPower is On (deliberate) (#871, #2230, #3114, #3155)
|
||||||
|
@ -26,9 +26,12 @@
|
|||||||
#define W1_CONVERT_TEMP 0x44
|
#define W1_CONVERT_TEMP 0x44
|
||||||
#define W1_READ_SCRATCHPAD 0xBE
|
#define W1_READ_SCRATCHPAD 0xBE
|
||||||
|
|
||||||
float ds18b20_last_temperature = 0;
|
#define DS18B20_MAX_MISS 5
|
||||||
|
|
||||||
|
float ds18b20_temperature = 0;
|
||||||
uint16_t ds18b20_last_result = 0;
|
uint16_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
|
||||||
@ -126,12 +129,7 @@ boolean OneWireCrc8(uint8_t *addr)
|
|||||||
|
|
||||||
/********************************************************************************************/
|
/********************************************************************************************/
|
||||||
|
|
||||||
void Ds18x20Init()
|
void Ds18b20Convert()
|
||||||
{
|
|
||||||
ds18x20_pin = pin[GPIO_DSB];
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ds18x20Convert()
|
|
||||||
{
|
{
|
||||||
OneWireReset();
|
OneWireReset();
|
||||||
OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus
|
OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus
|
||||||
@ -139,25 +137,16 @@ void Ds18x20Convert()
|
|||||||
// delay(750); // 750ms should be enough for 12bit conv
|
// delay(750); // 750ms should be enough for 12bit conv
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean Ds18b20Read(float &t)
|
void Ds18b20Read()
|
||||||
{
|
{
|
||||||
uint8_t data[9];
|
uint8_t data[9];
|
||||||
int8_t sign = 1;
|
int8_t sign = 1;
|
||||||
|
|
||||||
if (!ds18b20_last_temperature) {
|
if (ds18b20_last_result) { ds18b20_last_result--; }
|
||||||
t = NAN;
|
|
||||||
} else {
|
|
||||||
ds18b20_last_result++;
|
|
||||||
if (ds18b20_last_result > 4) { // Reset after 4 misses
|
|
||||||
ds18b20_last_temperature = NAN;
|
|
||||||
}
|
|
||||||
t = ds18b20_last_temperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (!OneWireReadBit()) { //check measurement end
|
if (!OneWireReadBit()) { // Check end of measurement
|
||||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
|
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
|
||||||
return !isnan(t);
|
return;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
for (uint8_t retry = 0; retry < 3; retry++) {
|
for (uint8_t retry = 0; retry < 3; retry++) {
|
||||||
@ -173,36 +162,40 @@ boolean Ds18b20Read(float &t)
|
|||||||
temp12 = (~temp12) +1;
|
temp12 = (~temp12) +1;
|
||||||
sign = -1;
|
sign = -1;
|
||||||
}
|
}
|
||||||
t = ConvertTemp(sign * temp12 * 0.0625);
|
ds18b20_temperature = ConvertTemp(sign * temp12 * 0.0625);
|
||||||
ds18b20_last_result = 0;
|
ds18b20_last_result = DS18B20_MAX_MISS;
|
||||||
}
|
return;
|
||||||
if (!isnan(t)) {
|
|
||||||
ds18b20_last_temperature = t;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
|
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
|
||||||
return !isnan(t);
|
}
|
||||||
|
|
||||||
|
/********************************************************************************************/
|
||||||
|
|
||||||
|
void Ds18b20EverySecond()
|
||||||
|
{
|
||||||
|
ds18x20_pin = pin[GPIO_DSB];
|
||||||
|
ds18b20_second++;
|
||||||
|
if (ds18b20_second &1) {
|
||||||
|
Ds18b20Convert(); // Start conversion, takes up to one second
|
||||||
|
} else {
|
||||||
|
Ds18b20Read(); // Read temperature
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ds18b20Show(boolean json)
|
void Ds18b20Show(boolean json)
|
||||||
{
|
{
|
||||||
float t;
|
if (ds18b20_last_result) { // Check for valid temperature
|
||||||
|
|
||||||
if (Ds18b20Read(t)) { // Check if read failed
|
|
||||||
char temperature[10];
|
char temperature[10];
|
||||||
|
|
||||||
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
|
dtostrfd(ds18b20_temperature, Settings.flag2.temperature_resolution, temperature);
|
||||||
|
|
||||||
if(json) {
|
if(json) {
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"DS18B20\":{\"" D_JSON_TEMPERATURE "\":%s}"), mqtt_data, temperature);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"DS18B20\":{\"" D_JSON_TEMPERATURE "\":%s}"), mqtt_data, temperature);
|
||||||
#ifdef USE_DOMOTICZ
|
#ifdef USE_DOMOTICZ
|
||||||
if (0 == tele_period) DomoticzSensor(DZ_TEMP, temperature);
|
if (0 == tele_period) { DomoticzSensor(DZ_TEMP, temperature); }
|
||||||
#endif // USE_DOMOTICZ
|
#endif // USE_DOMOTICZ
|
||||||
#ifdef USE_KNX
|
#ifdef USE_KNX
|
||||||
if (0 == tele_period) {
|
if (0 == tele_period) { KnxSensor(KNX_TEMPERATURE, ds18b20_temperature); }
|
||||||
KnxSensor(KNX_TEMPERATURE, t);
|
|
||||||
}
|
|
||||||
#endif // USE_KNX
|
#endif // USE_KNX
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
} else {
|
} else {
|
||||||
@ -210,7 +203,6 @@ void Ds18b20Show(boolean json)
|
|||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
@ -225,11 +217,8 @@ boolean Xsns05(byte function)
|
|||||||
|
|
||||||
if (pin[GPIO_DSB] < 99) {
|
if (pin[GPIO_DSB] < 99) {
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_INIT:
|
case FUNC_EVERY_SECOND:
|
||||||
Ds18x20Init();
|
Ds18b20EverySecond();
|
||||||
break;
|
|
||||||
case FUNC_PREP_BEFORE_TELEPERIOD:
|
|
||||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
|
||||||
break;
|
break;
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
Ds18b20Show(1);
|
Ds18b20Show(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user