From 91573f55947a6c2ff1f62bdbfb8cd039de178dfe Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 2 Aug 2020 08:54:30 +0200 Subject: [PATCH] onewire for esp32 improved, retry for sensors --- lib/OneWire/OneWire.cpp | 13 +++++++++++++ lib/OneWire/OneWire.h | 15 +++++++++++++-- src/sensors.cpp | 22 ++++++++++------------ src/sensors.h | 4 +++- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/OneWire/OneWire.cpp b/lib/OneWire/OneWire.cpp index 5828e804d..cd9dc8448 100644 --- a/lib/OneWire/OneWire.cpp +++ b/lib/OneWire/OneWire.cpp @@ -161,7 +161,11 @@ void OneWire::begin(uint8_t pin) { // // Returns 1 if a device asserted a presence pulse, 0 otherwise. // +#ifdef ARDUINO_ARCH_ESP32 +uint8_t IRAM_ATTR OneWire::reset(void) { +#else uint8_t OneWire::reset(void) { +#endif IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; uint8_t r; @@ -195,7 +199,11 @@ uint8_t OneWire::reset(void) { // Write a bit. Port and bit is used to cut lookup time and provide // more certain timing. // +#ifdef ARDUINO_ARCH_ESP32 +void IRAM_ATTR OneWire::write_bit(uint8_t v) { +#else void OneWire::write_bit(uint8_t v) { +#endif IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; @@ -222,7 +230,11 @@ void OneWire::write_bit(uint8_t v) { // Read a bit. Port and bit is used to cut lookup time and provide // more certain timing. // +#ifdef ARDUINO_ARCH_ESP32 +uint8_t IRAM_ATTR OneWire::read_bit(void) { +#else uint8_t OneWire::read_bit(void) { +#endif IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; uint8_t r; @@ -473,6 +485,7 @@ bool OneWire::search(uint8_t * newAddr, bool search_mode /* = true */) { for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i]; } + // depower(); // https://github.com/PaulStoffregen/OneWire/pull/80 return search_result; } diff --git a/lib/OneWire/OneWire.h b/lib/OneWire/OneWire.h index 4b1933060..436eecd1f 100644 --- a/lib/OneWire/OneWire.h +++ b/lib/OneWire/OneWire.h @@ -78,7 +78,11 @@ class OneWire { // Perform a 1-Wire reset cycle. Returns 1 if a device responds // with a presence pulse. Returns 0 if there is no device or the // bus is shorted or otherwise held low for more than 250uS +#ifdef ARDUINO_ARCH_ESP32 + uint8_t IRAM_ATTR reset(void); +#else uint8_t reset(void); +#endif // Issue a 1-Wire rom select command, you do the reset first. void select(const uint8_t rom[8]); @@ -101,11 +105,18 @@ class OneWire { // Write a bit. The bus is always left powered at the end, see // note in write() about that. - void write_bit(uint8_t v); + #ifdef ARDUINO_ARCH_ESP32 + void IRAM_ATTR write_bit(uint8_t v); + #else + void write_bit(uint8_t v); +#endif // Read a bit. +#ifdef ARDUINO_ARCH_ESP32 + uint8_t IRAM_ATTR read_bit(void); +#else uint8_t read_bit(void); - +#endif // Stop forcing power onto the bus. You only need to do this if // you used the 'power' flag to write() or used a write_bit() call // and aren't about to do another read or write. You would rather diff --git a/src/sensors.cpp b/src/sensors.cpp index 76bf98c39..26a0a1223 100644 --- a/src/sensors.cpp +++ b/src/sensors.cpp @@ -72,7 +72,6 @@ void Sensors::loop() { YIELD; bus_.skip(); bus_.write(CMD_CONVERT_TEMP); - state_ = State::READING; } else { // no sensors found @@ -86,20 +85,15 @@ void Sensors::loop() { // LOG_DEBUG(F("Scanning for sensors")); // uncomment for debug bus_.reset_search(); found_.clear(); - - state_ = State::SCANNING; - last_activity_ = time_now; + state_ = State::SCANNING; } else if (time_now - last_activity_ > READ_TIMEOUT_MS) { LOG_ERROR(F("Sensor read timeout")); - - state_ = State::IDLE; - last_activity_ = time_now; + state_ = State::IDLE; } } else if (state_ == State::SCANNING) { if (time_now - last_activity_ > SCAN_TIMEOUT_MS) { LOG_ERROR(F("Sensor scan timeout")); - state_ = State::IDLE; - last_activity_ = time_now; + state_ = State::IDLE; } else { uint8_t addr[ADDR_LEN] = {0}; @@ -133,11 +127,15 @@ void Sensors::loop() { } } else { bus_.depower(); - devices_ = std::move(found_); + if ((found_.size() >= devices_.size()) || (retrycnt_ > 5)) { + devices_ = std::move(found_); + retrycnt_ = 0; + } else { + retrycnt_++; + } found_.clear(); // LOG_DEBUG(F("Found %zu sensor(s). Adding them."), devices_.size()); // uncomment for debug - state_ = State::IDLE; - last_activity_ = time_now; + state_ = State::IDLE; } } } diff --git a/src/sensors.h b/src/sensors.h index 07a1d0793..7ec37d6d3 100644 --- a/src/sensors.h +++ b/src/sensors.h @@ -90,7 +90,7 @@ class Sensors { static constexpr uint32_t READ_INTERVAL_MS = 5000; // 5 seconds static constexpr uint32_t CONVERSION_MS = 1000; // 1 seconds static constexpr uint32_t READ_TIMEOUT_MS = 2000; // 2 seconds - static constexpr uint32_t SCAN_TIMEOUT_MS = 30000; // 30 seconds + static constexpr uint32_t SCAN_TIMEOUT_MS = 3000; // 3 seconds static constexpr uint8_t CMD_CONVERT_TEMP = 0x44; static constexpr uint8_t CMD_READ_SCRATCHPAD = 0xBE; @@ -111,6 +111,8 @@ class Sensors { std::vector devices_; uint8_t mqtt_format_; + uint8_t retrycnt_ = 0; + }; } // namespace emsesp