#include "hx711.h" #include "esphome/core/log.h" #include "esphome/core/helpers.h" namespace esphome { namespace hx711 { static const char *TAG = "hx711"; void HX711Sensor::setup() { ESP_LOGCONFIG(TAG, "Setting up HX711 '%s'...", this->name_.c_str()); this->sck_pin_->setup(); this->dout_pin_->setup(); this->sck_pin_->digital_write(false); // Read sensor once without publishing to set the gain this->read_sensor_(nullptr); } void HX711Sensor::dump_config() { LOG_SENSOR("", "HX711", this); LOG_PIN(" DOUT Pin: ", this->dout_pin_); LOG_PIN(" SCK Pin: ", this->sck_pin_); LOG_UPDATE_INTERVAL(this); } float HX711Sensor::get_setup_priority() const { return setup_priority::DATA; } void HX711Sensor::update() { uint32_t result; if (this->read_sensor_(&result)) { int32_t value = static_cast(result); ESP_LOGD(TAG, "'%s': Got value %d", this->name_.c_str(), value); this->publish_state(value); } } bool HX711Sensor::read_sensor_(uint32_t *result) { if (this->dout_pin_->digital_read()) { ESP_LOGW(TAG, "HX711 is not ready for new measurements yet!"); this->status_set_warning(); return false; } this->status_clear_warning(); uint32_t data = 0; disable_interrupts(); for (uint8_t i = 0; i < 24; i++) { this->sck_pin_->digital_write(true); delayMicroseconds(1); data |= uint32_t(this->dout_pin_->digital_read()) << (23 - i); this->sck_pin_->digital_write(false); delayMicroseconds(1); } // Cycle clock pin for gain setting for (uint8_t i = 0; i < this->gain_; i++) { this->sck_pin_->digital_write(true); delayMicroseconds(1); this->sck_pin_->digital_write(false); delayMicroseconds(1); } enable_interrupts(); if (data & 0x800000ULL) { data |= 0xFF000000ULL; } if (result != nullptr) *result = data; return true; } } // namespace hx711 } // namespace esphome