@@ -148,11 +148,11 @@ bool Mycila::DS18::read() {
148148 // read is valid, record the time
149149 _lastTime = millis ();
150150
151- const bool changed = std::abs (read - _temperature) >= MYCILA_DS18_RELEVANT_TEMPERATURE_CHANGE || !isValid ();
151+ const bool changed = std::abs (read - _temperature) > _threshold || !isValid ();
152152
153153 if (changed) {
154154 _temperature = read;
155- ESP_LOGD (TAG, " %s 0x%llx @ pin %d: %.2f °C" , _name, _deviceAddress, _pin, read);
155+ ESP_LOGD (TAG, " %s 0x%llx @ pin %d: %f °C" , _name, _deviceAddress, _pin, read);
156156 }
157157
158158 if (_callback)
@@ -161,6 +161,57 @@ bool Mycila::DS18::read() {
161161 return true ;
162162}
163163
164+ bool Mycila::DS18::setResolution (DS18::Resolution resolution) {
165+ if (!_enabled)
166+ return false ;
167+
168+ std::lock_guard<std::mutex> lock (_mutex);
169+
170+ OneWire32::Resolution owRes;
171+ switch (resolution) {
172+ case DS18::Resolution::RESOLUTION_9_BIT:
173+ owRes = OneWire32::RESOLUTION_9_BIT;
174+ break ;
175+ case DS18::Resolution::RESOLUTION_10_BIT:
176+ owRes = OneWire32::RESOLUTION_10_BIT;
177+ break ;
178+ case DS18::Resolution::RESOLUTION_11_BIT:
179+ owRes = OneWire32::RESOLUTION_11_BIT;
180+ break ;
181+ case DS18::Resolution::RESOLUTION_12_BIT:
182+ owRes = OneWire32::RESOLUTION_12_BIT;
183+ break ;
184+ default :
185+ return false ;
186+ }
187+
188+ if (_oneWire->setResolution (_deviceAddress, owRes)) {
189+ _resolution = resolution;
190+ ESP_LOGI (TAG, " %s 0x%llx @ pin %d: Resolution set to %d-bit (%d ms conversion time)" , _name, _deviceAddress, _pin, static_cast <int >(resolution), getConversionTime ());
191+ return true ;
192+ }
193+
194+ return false ;
195+ }
196+
197+ Mycila::DS18::Resolution Mycila::DS18::getResolution () const {
198+ return _resolution;
199+ }
200+
201+ uint16_t Mycila::DS18::getConversionTime () const {
202+ switch (_resolution) {
203+ case DS18::Resolution::RESOLUTION_9_BIT:
204+ return 94 ;
205+ case DS18::Resolution::RESOLUTION_10_BIT:
206+ return 188 ;
207+ case DS18::Resolution::RESOLUTION_11_BIT:
208+ return 375 ;
209+ case DS18::Resolution::RESOLUTION_12_BIT:
210+ default :
211+ return 750 ;
212+ }
213+ }
214+
164215#ifdef MYCILA_JSON_SUPPORT
165216void Mycila::DS18::toJson (const JsonObject& root) const {
166217 root[" enabled" ] = _enabled;
@@ -171,5 +222,7 @@ void Mycila::DS18::toJson(const JsonObject& root) const {
171222 root[" temp" ] = getTemperature ().value_or (0 );
172223 root[" time" ] = _lastTime;
173224 root[" valid" ] = isValid ();
225+ root[" resolution" ] = static_cast <int >(_resolution);
226+ root[" conversion_time" ] = getConversionTime ();
174227}
175228#endif
0 commit comments