Revert HLW8012 to use pulse counter (#537)

This commit is contained in:
Otto Winter 2019-05-10 22:13:43 +02:00 committed by GitHub
parent 7bab279c6a
commit 23dcfe5075
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 27 deletions

View file

@ -13,8 +13,8 @@ void HLW8012Component::setup() {
ESP_LOGCONFIG(TAG, "Setting up HLW8012..."); ESP_LOGCONFIG(TAG, "Setting up HLW8012...");
this->sel_pin_->setup(); this->sel_pin_->setup();
this->sel_pin_->digital_write(this->current_mode_); this->sel_pin_->digital_write(this->current_mode_);
this->cf_store_.setup(this->cf_pin_); this->cf_store_.pulse_counter_setup(this->cf_pin_);
this->cf1_store_.setup(this->cf1_pin_); this->cf1_store_.pulse_counter_setup(this->cf1_pin_);
} }
void HLW8012Component::dump_config() { void HLW8012Component::dump_config() {
ESP_LOGCONFIG(TAG, "HLW8012:"); ESP_LOGCONFIG(TAG, "HLW8012:");
@ -32,18 +32,18 @@ void HLW8012Component::dump_config() {
float HLW8012Component::get_setup_priority() const { return setup_priority::DATA; } float HLW8012Component::get_setup_priority() const { return setup_priority::DATA; }
void HLW8012Component::update() { void HLW8012Component::update() {
// HLW8012 has 50% duty cycle // HLW8012 has 50% duty cycle
const uint32_t last_rise_cf = this->cf_store_.get_last_rise(); pulse_counter::pulse_counter_t raw_cf = this->cf_store_.read_raw_value();
const uint32_t last_rise_cf1 = this->cf1_store_.get_last_rise(); pulse_counter::pulse_counter_t raw_cf1 = this->cf1_store_.read_raw_value();
const uint32_t now = micros(); float cf_hz = raw_cf / (this->get_update_interval() / 1000.0f);
float full_cycle_cf = this->cf_store_.get_pulse_width_s() * 2; if (raw_cf <= 1) {
float full_cycle_cf1 = this->cf1_store_.get_pulse_width_s() * 2; // don't count single pulse as power
float cf_hz = 0.0f, cf1_hz = 0.0f; cf_hz = 0.0f;
auto update_interval_micros = static_cast<uint32_t>(this->update_interval_ * 1e3f); }
float cf1_hz = raw_cf1 / (this->get_update_interval() / 1000.0f);
if (full_cycle_cf != 0.0f && now - last_rise_cf < update_interval_micros * 3) if (raw_cf1 <= 1) {
cf_hz = 1.0f / full_cycle_cf; // don't count single pulse as anything
if (full_cycle_cf1 != 0.0f && now - last_rise_cf1 < update_interval_micros * 3) cf1_hz = 0.0f;
cf1_hz = 1.0f / full_cycle_cf1; }
if (this->nth_value_++ < 2) { if (this->nth_value_++ < 2) {
return; return;

View file

@ -3,7 +3,7 @@
#include "esphome/core/component.h" #include "esphome/core/component.h"
#include "esphome/core/esphal.h" #include "esphome/core/esphal.h"
#include "esphome/components/sensor/sensor.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 esphome {
namespace hlw8012 { namespace hlw8012 {
@ -34,9 +34,9 @@ class HLW8012Component : public PollingComponent {
float voltage_divider_{2351}; float voltage_divider_{2351};
GPIOPin *sel_pin_; GPIOPin *sel_pin_;
GPIOPin *cf_pin_; GPIOPin *cf_pin_;
pulse_width::PulseWidthSensorStore cf_store_; pulse_counter::PulseCounterStorage cf_store_;
GPIOPin *cf1_pin_; GPIOPin *cf1_pin_;
pulse_width::PulseWidthSensorStore cf1_store_; pulse_counter::PulseCounterStorage cf1_store_;
sensor::Sensor *voltage_sensor_{nullptr}; sensor::Sensor *voltage_sensor_{nullptr};
sensor::Sensor *current_sensor_{nullptr}; sensor::Sensor *current_sensor_{nullptr};
sensor::Sensor *power_sensor_{nullptr}; sensor::Sensor *power_sensor_{nullptr};

View file

@ -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, \ CONF_CURRENT_RESISTOR, CONF_ID, CONF_POWER, CONF_SEL_PIN, CONF_VOLTAGE, CONF_VOLTAGE_DIVIDER, \
ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT ICON_FLASH, UNIT_VOLT, UNIT_AMPERE, UNIT_WATT
AUTO_LOAD = ['pulse_width'] AUTO_LOAD = ['pulse_counter']
hlw8012_ns = cg.esphome_ns.namespace('hlw8012') hlw8012_ns = cg.esphome_ns.namespace('hlw8012')
HLW8012Component = hlw8012_ns.class_('HLW8012Component', cg.PollingComponent) HLW8012Component = hlw8012_ns.class_('HLW8012Component', cg.PollingComponent)

View file

@ -28,7 +28,9 @@ void ICACHE_RAM_ATTR PulseCounterStorage::gpio_intr(PulseCounterStorage *arg) {
break; 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->isr_pin = this->pin->to_isr();
this->pin->attach_interrupt(PulseCounterStorage::gpio_intr, this, CHANGE); this->pin->attach_interrupt(PulseCounterStorage::gpio_intr, this, CHANGE);
return true; return true;
@ -42,7 +44,9 @@ pulse_counter_t PulseCounterStorage::read_raw_value() {
#endif #endif
#ifdef ARDUINO_ARCH_ESP32 #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; this->pcnt_unit = next_pcnt_unit;
next_pcnt_unit = pcnt_unit_t(int(next_pcnt_unit) + 1); // NOLINT 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() { void PulseCounterSensor::setup() {
ESP_LOGCONFIG(TAG, "Setting up pulse counter '%s'...", this->name_.c_str()); ESP_LOGCONFIG(TAG, "Setting up pulse counter '%s'...", this->name_.c_str());
this->pin_->setup(); if (!this->storage_.pulse_counter_setup(this->pin_)) {
this->storage_.pin = this->pin_;
if (!this->storage_.pulse_counter_setup()) {
this->mark_failed(); this->mark_failed();
return; return;
} }

View file

@ -25,7 +25,7 @@ using pulse_counter_t = int32_t;
#endif #endif
struct PulseCounterStorage { struct PulseCounterStorage {
bool pulse_counter_setup(); bool pulse_counter_setup(GPIOPin *pin);
pulse_counter_t read_raw_value(); pulse_counter_t read_raw_value();
static void gpio_intr(PulseCounterStorage *arg); static void gpio_intr(PulseCounterStorage *arg);
@ -42,9 +42,9 @@ struct PulseCounterStorage {
#ifdef ARDUINO_ARCH_ESP8266 #ifdef ARDUINO_ARCH_ESP8266
ISRInternalGPIOPin *isr_pin; ISRInternalGPIOPin *isr_pin;
#endif #endif
PulseCounterCountMode rising_edge_mode{}; PulseCounterCountMode rising_edge_mode{PULSE_COUNTER_INCREMENT};
PulseCounterCountMode falling_edge_mode{}; PulseCounterCountMode falling_edge_mode{PULSE_COUNTER_DISABLE};
uint32_t filter_us{}; uint32_t filter_us{0};
pulse_counter_t last_value{0}; pulse_counter_t last_value{0};
}; };