Add DS18x20 parasitic power usage on ESP32

This commit is contained in:
Norbert Richter 2022-11-17 11:36:08 +01:00
parent c304319f5d
commit b149da46c6
No known key found for this signature in database
GPG Key ID: 6628701A626FA674
2 changed files with 31 additions and 1 deletions

View File

@ -24,6 +24,7 @@ All notable changes to this project will be documented in this file.
- WS2812 sends signal to only ``Pixels`` leds instead of sending to 512 leds (#17055)
- Zigbee improved Aqara plug support and completed cluster 0x0702 (#17073)
- ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change)
- Add parasitic power usage for DS18x20 on ESP32 defining W1_PARASITE_POWER
### Fixed
- SenseAir S8 module detection (#17033)

View File

@ -51,6 +51,9 @@ const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850";
uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID };
struct {
#ifdef W1_PARASITE_POWER
float temperature;
#endif
float temp_sum;
uint16_t numread;
uint8_t address[8];
@ -130,9 +133,15 @@ void Ds18x20Convert(void) {
for (uint32_t i = 0; i < DS18X20Data.gpios; i++) {
ds = ds18x20_gpios[i];
ds->reset();
#ifdef W1_PARASITE_POWER
// With parasite power held wire high at the end for parasitically powered devices
ds->write(W1_SKIP_ROM, 1); // Address all Sensors on Bus
ds->write(W1_CONVERT_TEMP, 1); // start conversion, no parasite power on at the end
#else
ds->write(W1_SKIP_ROM); // Address all Sensors on Bus
ds->write(W1_CONVERT_TEMP); // start conversion, no parasite power on at the end
// delay(750); // 750ms should be enough for 12bit conv
#endif
// delay(750); // 750ms should be enough for 12bit conv
}
}
@ -147,7 +156,12 @@ bool Ds18x20Read(uint8_t sensor, float &t) {
ds = ds18x20_gpios[ds18x20_sensor[index].pins_id];
ds->reset();
ds->select(ds18x20_sensor[index].address);
#ifdef W1_PARASITE_POWER
// With parasite power held wire high at the end for parasitically powered devices
ds->write(W1_READ_SCRATCHPAD, 1); // Read Scratchpad
#else
ds->write(W1_READ_SCRATCHPAD); // Read Scratchpad
#endif
for (uint32_t i = 0; i < 9; i++) {
data[i] = ds->read();
@ -157,6 +171,9 @@ bool Ds18x20Read(uint8_t sensor, float &t) {
case DS18S20_CHIPID: {
int16_t tempS = (((data[1] << 8) | (data[0] & 0xFE)) << 3) | ((0x10 - data[6]) & 0x0F);
t = ConvertTemp(tempS * 0.0625f - 0.250f);
#ifdef W1_PARASITE_POWER
ds18x20_sensor[index].temperature = t;
#endif
ds18x20_sensor[index].valid = SENSOR_MAX_MISS;
return true;
}
@ -168,12 +185,18 @@ bool Ds18x20Read(uint8_t sensor, float &t) {
sign = -1;
}
t = ConvertTemp(sign * temp12 * 0.0625f); // Divide by 16
#ifdef W1_PARASITE_POWER
ds18x20_sensor[index].temperature = t;
#endif
ds18x20_sensor[index].valid = SENSOR_MAX_MISS;
return true;
}
case MAX31850_CHIPID: {
int16_t temp14 = (data[1] << 8) + (data[0] & 0xFC);
t = ConvertTemp(temp14 * 0.0625f); // Divide by 16
#ifdef W1_PARASITE_POWER
ds18x20_sensor[index].temperature = t;
#endif
ds18x20_sensor[index].valid = SENSOR_MAX_MISS;
return true;
}
@ -244,7 +267,13 @@ void Ds18x20Show(bool json) {
uint8_t dsxflg = 0;
for (uint32_t i = 0; i < DS18X20Data.sensors; i++) {
#ifdef W1_PARASITE_POWER
// With parasite power read one sensor at a time
if (ds18x20_sensor[i].valid) {
t = ds18x20_sensor[i].temperature;
#else
if (Ds18x20Read(i, t)) { // Check if read failed
#endif
Ds18x20Name(i);
if (json) {