onewire for esp32 improved, retry for sensors

This commit is contained in:
MichaelDvP
2020-08-02 08:54:30 +02:00
parent e735ac0338
commit 91573f5594
4 changed files with 39 additions and 15 deletions

View File

@@ -161,7 +161,11 @@ void OneWire::begin(uint8_t pin) {
// //
// Returns 1 if a device asserted a presence pulse, 0 otherwise. // 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) { uint8_t OneWire::reset(void) {
#endif
IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask;
volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg;
uint8_t r; 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 // Write a bit. Port and bit is used to cut lookup time and provide
// more certain timing. // more certain timing.
// //
#ifdef ARDUINO_ARCH_ESP32
void IRAM_ATTR OneWire::write_bit(uint8_t v) {
#else
void OneWire::write_bit(uint8_t v) { void OneWire::write_bit(uint8_t v) {
#endif
IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask;
volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; 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 // Read a bit. Port and bit is used to cut lookup time and provide
// more certain timing. // more certain timing.
// //
#ifdef ARDUINO_ARCH_ESP32
uint8_t IRAM_ATTR OneWire::read_bit(void) {
#else
uint8_t OneWire::read_bit(void) { uint8_t OneWire::read_bit(void) {
#endif
IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask;
volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg; volatile IO_REG_TYPE * reg IO_REG_BASE_ATTR = baseReg;
uint8_t r; uint8_t r;
@@ -473,6 +485,7 @@ bool OneWire::search(uint8_t * newAddr, bool search_mode /* = true */) {
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
newAddr[i] = ROM_NO[i]; newAddr[i] = ROM_NO[i];
} }
// depower(); // https://github.com/PaulStoffregen/OneWire/pull/80
return search_result; return search_result;
} }

View File

@@ -78,7 +78,11 @@ class OneWire {
// Perform a 1-Wire reset cycle. Returns 1 if a device responds // 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 // with a presence pulse. Returns 0 if there is no device or the
// bus is shorted or otherwise held low for more than 250uS // 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); uint8_t reset(void);
#endif
// Issue a 1-Wire rom select command, you do the reset first. // Issue a 1-Wire rom select command, you do the reset first.
void select(const uint8_t rom[8]); 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 // Write a bit. The bus is always left powered at the end, see
// note in write() about that. // 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. // Read a bit.
#ifdef ARDUINO_ARCH_ESP32
uint8_t IRAM_ATTR read_bit(void);
#else
uint8_t read_bit(void); uint8_t read_bit(void);
#endif
// Stop forcing power onto the bus. You only need to do this if // 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 // 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 // and aren't about to do another read or write. You would rather

View File

@@ -72,7 +72,6 @@ void Sensors::loop() {
YIELD; YIELD;
bus_.skip(); bus_.skip();
bus_.write(CMD_CONVERT_TEMP); bus_.write(CMD_CONVERT_TEMP);
state_ = State::READING; state_ = State::READING;
} else { } else {
// no sensors found // no sensors found
@@ -86,20 +85,15 @@ void Sensors::loop() {
// LOG_DEBUG(F("Scanning for sensors")); // uncomment for debug // LOG_DEBUG(F("Scanning for sensors")); // uncomment for debug
bus_.reset_search(); bus_.reset_search();
found_.clear(); found_.clear();
state_ = State::SCANNING;
state_ = State::SCANNING;
last_activity_ = time_now;
} else if (time_now - last_activity_ > READ_TIMEOUT_MS) { } else if (time_now - last_activity_ > READ_TIMEOUT_MS) {
LOG_ERROR(F("Sensor read timeout")); LOG_ERROR(F("Sensor read timeout"));
state_ = State::IDLE;
state_ = State::IDLE;
last_activity_ = time_now;
} }
} else if (state_ == State::SCANNING) { } else if (state_ == State::SCANNING) {
if (time_now - last_activity_ > SCAN_TIMEOUT_MS) { if (time_now - last_activity_ > SCAN_TIMEOUT_MS) {
LOG_ERROR(F("Sensor scan timeout")); LOG_ERROR(F("Sensor scan timeout"));
state_ = State::IDLE; state_ = State::IDLE;
last_activity_ = time_now;
} else { } else {
uint8_t addr[ADDR_LEN] = {0}; uint8_t addr[ADDR_LEN] = {0};
@@ -133,11 +127,15 @@ void Sensors::loop() {
} }
} else { } else {
bus_.depower(); bus_.depower();
devices_ = std::move(found_); if ((found_.size() >= devices_.size()) || (retrycnt_ > 5)) {
devices_ = std::move(found_);
retrycnt_ = 0;
} else {
retrycnt_++;
}
found_.clear(); found_.clear();
// LOG_DEBUG(F("Found %zu sensor(s). Adding them."), devices_.size()); // uncomment for debug // LOG_DEBUG(F("Found %zu sensor(s). Adding them."), devices_.size()); // uncomment for debug
state_ = State::IDLE; state_ = State::IDLE;
last_activity_ = time_now;
} }
} }
} }

View File

@@ -90,7 +90,7 @@ class Sensors {
static constexpr uint32_t READ_INTERVAL_MS = 5000; // 5 seconds static constexpr uint32_t READ_INTERVAL_MS = 5000; // 5 seconds
static constexpr uint32_t CONVERSION_MS = 1000; // 1 seconds static constexpr uint32_t CONVERSION_MS = 1000; // 1 seconds
static constexpr uint32_t READ_TIMEOUT_MS = 2000; // 2 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_CONVERT_TEMP = 0x44;
static constexpr uint8_t CMD_READ_SCRATCHPAD = 0xBE; static constexpr uint8_t CMD_READ_SCRATCHPAD = 0xBE;
@@ -111,6 +111,8 @@ class Sensors {
std::vector<Device> devices_; std::vector<Device> devices_;
uint8_t mqtt_format_; uint8_t mqtt_format_;
uint8_t retrycnt_ = 0;
}; };
} // namespace emsesp } // namespace emsesp