mirror of https://github.com/arendst/Tasmota.git
Merge pull request #3955 from zuckschwerdt/feat-w1parasite
Add W1_PARASITE_POWER optimization for DS18X20
This commit is contained in:
commit
c0117e5315
|
@ -271,6 +271,7 @@
|
||||||
// -- One wire sensors ----------------------------
|
// -- One wire sensors ----------------------------
|
||||||
// WARNING: Select none for default one DS18B20 sensor or enable one of the following two options for multiple sensors
|
// WARNING: Select none for default one DS18B20 sensor or enable one of the following two options for multiple sensors
|
||||||
#define USE_DS18x20 // Optional for more than one DS18x20 sensors with id sort, single scan and read retry (+1k3 code)
|
#define USE_DS18x20 // Optional for more than one DS18x20 sensors with id sort, single scan and read retry (+1k3 code)
|
||||||
|
//#define W1_PARASITE_POWER // If using USE_DS18x20 then optimize for parasite powered sensors
|
||||||
//#define USE_DS18x20_LEGACY // Optional for more than one DS18x20 sensors with dynamic scan using library OneWire (+1k5 code)
|
//#define USE_DS18x20_LEGACY // Optional for more than one DS18x20 sensors with dynamic scan using library OneWire (+1k5 code)
|
||||||
|
|
||||||
// -- I2C sensors ---------------------------------
|
// -- I2C sensors ---------------------------------
|
||||||
|
|
|
@ -49,6 +49,10 @@ struct DS18X20STRUCT {
|
||||||
uint8_t ds18x20_sensors = 0;
|
uint8_t ds18x20_sensors = 0;
|
||||||
uint8_t ds18x20_pin = 0;
|
uint8_t ds18x20_pin = 0;
|
||||||
char ds18x20_types[12];
|
char ds18x20_types[12];
|
||||||
|
#ifdef W1_PARASITE_POWER
|
||||||
|
uint8_t ds18x20_sensor_curr = 0;
|
||||||
|
unsigned long w1_power_until = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Embedded tuned OneWire library
|
* Embedded tuned OneWire library
|
||||||
|
@ -285,7 +289,14 @@ void Ds18x20Init()
|
||||||
void Ds18x20Convert()
|
void Ds18x20Convert()
|
||||||
{
|
{
|
||||||
OneWireReset();
|
OneWireReset();
|
||||||
|
#ifdef W1_PARASITE_POWER
|
||||||
|
// With parasite power address one sensor at a time
|
||||||
|
if (++ds18x20_sensor_curr >= ds18x20_sensors)
|
||||||
|
ds18x20_sensor_curr = 0;
|
||||||
|
OneWireSelect(ds18x20_sensor[ds18x20_sensor_curr].address);
|
||||||
|
#else
|
||||||
OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus
|
OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus
|
||||||
|
#endif
|
||||||
OneWireWrite(W1_CONVERT_TEMP); // start conversion, no parasite power on at the end
|
OneWireWrite(W1_CONVERT_TEMP); // start conversion, no parasite power on at the end
|
||||||
// delay(750); // 750ms should be enough for 12bit conv
|
// delay(750); // 750ms should be enough for 12bit conv
|
||||||
}
|
}
|
||||||
|
@ -334,6 +345,9 @@ bool Ds18x20Read(uint8_t sensor)
|
||||||
OneWireWrite(data[4]); // Configuration Register
|
OneWireWrite(data[4]); // Configuration Register
|
||||||
OneWireSelect(ds18x20_sensor[index].address);
|
OneWireSelect(ds18x20_sensor[index].address);
|
||||||
OneWireWrite(W1_WRITE_EEPROM); // Save scratchpad to EEPROM
|
OneWireWrite(W1_WRITE_EEPROM); // Save scratchpad to EEPROM
|
||||||
|
#ifdef W1_PARASITE_POWER
|
||||||
|
w1_power_until = millis() + 10; // 10ms specified duration for EEPROM write
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
temp12 = (data[1] << 8) + data[0];
|
temp12 = (data[1] << 8) + data[0];
|
||||||
if (temp12 > 2047) {
|
if (temp12 > 2047) {
|
||||||
|
@ -374,7 +388,18 @@ void Ds18x20Name(uint8_t sensor)
|
||||||
|
|
||||||
void Ds18x20EverySecond()
|
void Ds18x20EverySecond()
|
||||||
{
|
{
|
||||||
if (uptime &1) {
|
#ifdef W1_PARASITE_POWER
|
||||||
|
// skip access if there is still an eeprom write ongoing
|
||||||
|
unsigned long now = millis();
|
||||||
|
if (now < w1_power_until)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
if (uptime & 1
|
||||||
|
#ifdef W1_PARASITE_POWER
|
||||||
|
// if more than 1 sensor and only parasite power: convert every cycle
|
||||||
|
|| ds18x20_sensors >= 2
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
// 2mS
|
// 2mS
|
||||||
Ds18x20Convert(); // Start conversion, takes up to one second
|
Ds18x20Convert(); // Start conversion, takes up to one second
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue