mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 00:48:19 +01:00
Revert HLW8012 to use pulse counter (#537)
This commit is contained in:
parent
7bab279c6a
commit
23dcfe5075
5 changed files with 29 additions and 27 deletions
|
@ -13,8 +13,8 @@ void HLW8012Component::setup() {
|
|||
ESP_LOGCONFIG(TAG, "Setting up HLW8012...");
|
||||
this->sel_pin_->setup();
|
||||
this->sel_pin_->digital_write(this->current_mode_);
|
||||
this->cf_store_.setup(this->cf_pin_);
|
||||
this->cf1_store_.setup(this->cf1_pin_);
|
||||
this->cf_store_.pulse_counter_setup(this->cf_pin_);
|
||||
this->cf1_store_.pulse_counter_setup(this->cf1_pin_);
|
||||
}
|
||||
void HLW8012Component::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "HLW8012:");
|
||||
|
@ -32,18 +32,18 @@ void HLW8012Component::dump_config() {
|
|||
float HLW8012Component::get_setup_priority() const { return setup_priority::DATA; }
|
||||
void HLW8012Component::update() {
|
||||
// HLW8012 has 50% duty cycle
|
||||
const uint32_t last_rise_cf = this->cf_store_.get_last_rise();
|
||||
const uint32_t last_rise_cf1 = this->cf1_store_.get_last_rise();
|
||||
const uint32_t now = micros();
|
||||
float full_cycle_cf = this->cf_store_.get_pulse_width_s() * 2;
|
||||
float full_cycle_cf1 = this->cf1_store_.get_pulse_width_s() * 2;
|
||||
float cf_hz = 0.0f, cf1_hz = 0.0f;
|
||||
auto update_interval_micros = static_cast<uint32_t>(this->update_interval_ * 1e3f);
|
||||
|
||||
if (full_cycle_cf != 0.0f && now - last_rise_cf < update_interval_micros * 3)
|
||||
cf_hz = 1.0f / full_cycle_cf;
|
||||
if (full_cycle_cf1 != 0.0f && now - last_rise_cf1 < update_interval_micros * 3)
|
||||
cf1_hz = 1.0f / full_cycle_cf1;
|
||||
pulse_counter::pulse_counter_t raw_cf = this->cf_store_.read_raw_value();
|
||||
pulse_counter::pulse_counter_t raw_cf1 = this->cf1_store_.read_raw_value();
|
||||
float cf_hz = raw_cf / (this->get_update_interval() / 1000.0f);
|
||||
if (raw_cf <= 1) {
|
||||
// don't count single pulse as power
|
||||
cf_hz = 0.0f;
|
||||
}
|
||||
float cf1_hz = raw_cf1 / (this->get_update_interval() / 1000.0f);
|
||||
if (raw_cf1 <= 1) {
|
||||
// don't count single pulse as anything
|
||||
cf1_hz = 0.0f;
|
||||
}
|
||||
|
||||
if (this->nth_value_++ < 2) {
|
||||
return;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "esphome/core/component.h"
|
||||
#include "esphome/core/esphal.h"
|
||||
#include "esphome/components/sensor/sensor.h"
|
||||
#include "esphome/components/pulse_width/pulse_width.h"
|
||||
#include "esphome/components/pulse_counter/pulse_counter_sensor.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace hlw8012 {
|
||||
|
@ -34,9 +34,9 @@ class HLW8012Component : public PollingComponent {
|
|||
float voltage_divider_{2351};
|
||||
GPIOPin *sel_pin_;
|
||||
GPIOPin *cf_pin_;
|
||||
pulse_width::PulseWidthSensorStore cf_store_;
|
||||
pulse_counter::PulseCounterStorage cf_store_;
|
||||
GPIOPin *cf1_pin_;
|
||||
pulse_width::PulseWidthSensorStore cf1_store_;
|
||||
pulse_counter::PulseCounterStorage cf1_store_;
|
||||
sensor::Sensor *voltage_sensor_{nullptr};
|
||||
sensor::Sensor *current_sensor_{nullptr};
|
||||
sensor::Sensor *power_sensor_{nullptr};
|
||||
|
|
|
@ -6,7 +6,7 @@ from esphome.const import CONF_CHANGE_MODE_EVERY, CONF_CURRENT, \
|
|||
CONF_CURRENT_RESISTOR, CONF_ID, CONF_POWER, CONF_SEL_PIN, CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER, \
|
||||
ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT
|
||||
|
||||
AUTO_LOAD = ['pulse_width']
|
||||
AUTO_LOAD = ['pulse_counter']
|
||||
|
||||
hlw8012_ns = cg.esphome_ns.namespace('hlw8012')
|
||||
HLW8012Component = hlw8012_ns.class_('HLW8012Component', cg.PollingComponent)
|
||||
|
|
|
@ -28,7 +28,9 @@ void ICACHE_RAM_ATTR PulseCounterStorage::gpio_intr(PulseCounterStorage *arg) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
bool PulseCounterStorage::pulse_counter_setup() {
|
||||
bool PulseCounterStorage::pulse_counter_setup(GPIOPin *pin) {
|
||||
this->pin = pin;
|
||||
this->pin->setup();
|
||||
this->isr_pin = this->pin->to_isr();
|
||||
this->pin->attach_interrupt(PulseCounterStorage::gpio_intr, this, CHANGE);
|
||||
return true;
|
||||
|
@ -42,7 +44,9 @@ pulse_counter_t PulseCounterStorage::read_raw_value() {
|
|||
#endif
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
bool PulseCounterStorage::pulse_counter_setup() {
|
||||
bool PulseCounterStorage::pulse_counter_setup(GPIOPin *pin) {
|
||||
this->pin = pin;
|
||||
this->pin->setup();
|
||||
this->pcnt_unit = next_pcnt_unit;
|
||||
next_pcnt_unit = pcnt_unit_t(int(next_pcnt_unit) + 1); // NOLINT
|
||||
|
||||
|
@ -133,9 +137,7 @@ pulse_counter_t PulseCounterStorage::read_raw_value() {
|
|||
|
||||
void PulseCounterSensor::setup() {
|
||||
ESP_LOGCONFIG(TAG, "Setting up pulse counter '%s'...", this->name_.c_str());
|
||||
this->pin_->setup();
|
||||
this->storage_.pin = this->pin_;
|
||||
if (!this->storage_.pulse_counter_setup()) {
|
||||
if (!this->storage_.pulse_counter_setup(this->pin_)) {
|
||||
this->mark_failed();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ using pulse_counter_t = int32_t;
|
|||
#endif
|
||||
|
||||
struct PulseCounterStorage {
|
||||
bool pulse_counter_setup();
|
||||
bool pulse_counter_setup(GPIOPin *pin);
|
||||
pulse_counter_t read_raw_value();
|
||||
|
||||
static void gpio_intr(PulseCounterStorage *arg);
|
||||
|
@ -42,9 +42,9 @@ struct PulseCounterStorage {
|
|||
#ifdef ARDUINO_ARCH_ESP8266
|
||||
ISRInternalGPIOPin *isr_pin;
|
||||
#endif
|
||||
PulseCounterCountMode rising_edge_mode{};
|
||||
PulseCounterCountMode falling_edge_mode{};
|
||||
uint32_t filter_us{};
|
||||
PulseCounterCountMode rising_edge_mode{PULSE_COUNTER_INCREMENT};
|
||||
PulseCounterCountMode falling_edge_mode{PULSE_COUNTER_DISABLE};
|
||||
uint32_t filter_us{0};
|
||||
pulse_counter_t last_value{0};
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue