From 8b7d7634f4d6fe233f7e882e9cb00d1ca9101caa Mon Sep 17 00:00:00 2001 From: Matti Airas Date: Fri, 11 Oct 2024 23:15:04 +0300 Subject: [PATCH] Allow setting the resolution and conversion delay for OneWire temperature sensors --- src/sensesp_onewire/onewire_temperature.cpp | 15 +++++++++++---- src/sensesp_onewire/onewire_temperature.h | 14 ++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/sensesp_onewire/onewire_temperature.cpp b/src/sensesp_onewire/onewire_temperature.cpp index 1027db6..1d248d6 100644 --- a/src/sensesp_onewire/onewire_temperature.cpp +++ b/src/sensesp_onewire/onewire_temperature.cpp @@ -29,8 +29,12 @@ bool string_to_owda(OWDevAddr* addr, const char* str) { return num_items == 8; } -DallasTemperatureSensors::DallasTemperatureSensors(int pin, String config_path) - : Sensor(config_path) { +DallasTemperatureSensors::DallasTemperatureSensors( + int pin, String config_path, DSTherm::Resolution resolution, + uint32_t conversion_delay) + : Sensor(config_path), + resolution_{resolution}, + conversion_delay_{conversion_delay} { onewire_ = new OneWireNg_CurrentPlatform(pin, false // disable internal pull-up ); @@ -60,7 +64,7 @@ DallasTemperatureSensors::DallasTemperatureSensors(int pin, String config_path) // Set common max. resolution (12-bits) for all handled sensors. // The configuration will be valid until subsequent power cut-off. drv.writeScratchpad(addr, 0, 0, // disable alarm notifications - DSTherm::RES_12_BIT); + resolution_); } } @@ -95,7 +99,10 @@ bool DallasTemperatureSensors::get_next_address(OWDevAddr* addr) { OneWireTemperature::OneWireTemperature(DallasTemperatureSensors* dts, uint read_delay, String config_path) - : sensesp::FloatSensor(config_path), dts_{dts}, read_delay_{read_delay} { + : sensesp::FloatSensor(config_path), + dts_{dts}, + read_delay_{read_delay}, + conversion_delay_{dts->get_conversion_delay()} { load(); if (address_ == null_ow_addr) { // previously unconfigured sensor diff --git a/src/sensesp_onewire/onewire_temperature.h b/src/sensesp_onewire/onewire_temperature.h index 8297035..9ea6833 100644 --- a/src/sensesp_onewire/onewire_temperature.h +++ b/src/sensesp_onewire/onewire_temperature.h @@ -29,15 +29,21 @@ typedef std::array OWDevAddr; **/ class DallasTemperatureSensors : public sensesp::Sensor { public: - DallasTemperatureSensors(int pin, String config_path = ""); + DallasTemperatureSensors(int pin, String config_path = "", + DSTherm::Resolution resolution = DSTherm::RES_12_BIT, + uint32_t conversion_delay = 750); bool register_address(const OWDevAddr& addr); bool get_next_address(OWDevAddr* addr); DSTherm get_dallas_driver() { return DSTherm{*onewire_}; } + uint32_t get_conversion_delay() { return conversion_delay_; } + private: OneWireNg* onewire_; std::set known_addresses_; std::set registered_addresses_; + DSTherm::Resolution resolution_; + uint32_t conversion_delay_; }; /** @@ -70,15 +76,15 @@ class DallasTemperatureSensors : public sensesp::Sensor { **/ class OneWireTemperature : public sensesp::FloatSensor { public: - OneWireTemperature(DallasTemperatureSensors* dts, uint read_delay = 1000, + OneWireTemperature(DallasTemperatureSensors* dts, uint32_t read_delay = 1000, String config_path = ""); virtual bool to_json(JsonObject& doc) override final; virtual bool from_json(const JsonObject& config) override final; private: DallasTemperatureSensors* dts_; - uint conversion_delay_ = DSTherm::MAX_CONV_TIME; - uint read_delay_; + uint32_t conversion_delay_ = DSTherm::MAX_CONV_TIME; + uint32_t read_delay_; bool found_ = true; OWDevAddr address_ = {}; void update();