mirror of
https://github.com/arendst/Tasmota.git
synced 2025-08-02 23:47:42 +00:00
Housekeeping - Documentation
This commit is contained in:
parent
cb8963a7bf
commit
e9c687cf09
@ -37,35 +37,36 @@
|
||||
#define HJL_UREF 822
|
||||
#define HJL_IREF 3300
|
||||
|
||||
#define HLW_POWER_PROBE_TIME 10 // Number of seconds to probe for power before deciding none used
|
||||
#define HLW_PROBE_COUNT 10 // Max number of probes per cycle
|
||||
#define HLW_POWER_PROBE_TIME 10 // Number of seconds to probe for power before deciding none used (low power pulse can take up to 10 seconds)
|
||||
#define HLW_SAMPLE_COUNT 10 // Max number of samples per cycle
|
||||
|
||||
byte hlw_select_ui_flag;
|
||||
byte hlw_ui_flag = 1;
|
||||
byte hlw_model_type = 0;
|
||||
byte hlw_load_off;
|
||||
byte hlw_cf1_timer;
|
||||
unsigned long hlw_cf_pulse_length;
|
||||
unsigned long hlw_cf_pulse_last_time;
|
||||
unsigned long hlw_cf_power_pulse_length;
|
||||
//#define HLW_DEBUG
|
||||
#ifdef HLW_DEBUG
|
||||
unsigned long hlw_debug[HLW_SAMPLE_COUNT];
|
||||
#endif
|
||||
|
||||
unsigned long hlw_cf1_pulse_length;
|
||||
unsigned long hlw_cf1_pulse_last_time;
|
||||
unsigned long hlw_cf1_summed_pulse_length;
|
||||
unsigned long hlw_cf1_pulse_counter;
|
||||
unsigned long hlw_cf1_voltage_pulse_length;
|
||||
unsigned long hlw_cf1_current_pulse_length;
|
||||
unsigned long hlw_cf_pulse_length = 0;
|
||||
unsigned long hlw_cf_pulse_last_time = 0;
|
||||
unsigned long hlw_cf_power_pulse_length = 0;
|
||||
|
||||
unsigned long hlw_energy_period_counter;
|
||||
unsigned long hlw_cf1_pulse_length = 0;
|
||||
unsigned long hlw_cf1_pulse_last_time = 0;
|
||||
unsigned long hlw_cf1_summed_pulse_length = 0;
|
||||
unsigned long hlw_cf1_pulse_counter = 0;
|
||||
unsigned long hlw_cf1_voltage_pulse_length = 0;
|
||||
unsigned long hlw_cf1_current_pulse_length = 0;
|
||||
|
||||
unsigned long hlw_energy_period_counter = 0;
|
||||
|
||||
unsigned long hlw_power_ratio = 0;
|
||||
unsigned long hlw_voltage_ratio = 0;
|
||||
unsigned long hlw_current_ratio = 0;
|
||||
|
||||
unsigned long hlw_cf1_voltage_max_pulse_counter;
|
||||
unsigned long hlw_cf1_current_max_pulse_counter;
|
||||
|
||||
//unsigned long hlw_debug[HLW_PROBE_COUNT];
|
||||
byte hlw_select_ui_flag = 0;
|
||||
byte hlw_ui_flag = 1;
|
||||
byte hlw_model_type = 0;
|
||||
byte hlw_load_off = 1;
|
||||
byte hlw_cf1_timer = 0;
|
||||
|
||||
#ifndef USE_WS2812_DMA // Collides with Neopixelbus but solves exception
|
||||
void HlwCfInterrupt(void) ICACHE_RAM_ATTR;
|
||||
@ -94,12 +95,12 @@ void HlwCf1Interrupt(void) // Service Voltage and Current
|
||||
hlw_cf1_pulse_last_time = us;
|
||||
if ((hlw_cf1_timer > 2) && (hlw_cf1_timer < 8)) { // Allow for 300 mSec set-up time and measure for up to 1 second
|
||||
hlw_cf1_summed_pulse_length += hlw_cf1_pulse_length;
|
||||
|
||||
// hlw_debug[hlw_cf1_pulse_counter] = hlw_cf1_pulse_length;
|
||||
|
||||
#ifdef HLW_DEBUG
|
||||
hlw_debug[hlw_cf1_pulse_counter] = hlw_cf1_pulse_length;
|
||||
#endif
|
||||
hlw_cf1_pulse_counter++;
|
||||
if (HLW_PROBE_COUNT == hlw_cf1_pulse_counter) {
|
||||
hlw_cf1_timer = 8; // We need up to HLW_PROBE_COUNT samples within 1 second (low current could take up to 0.3 second)
|
||||
if (HLW_SAMPLE_COUNT == hlw_cf1_pulse_counter) {
|
||||
hlw_cf1_timer = 8; // We need up to HLW_SAMPLE_COUNT samples within 1 second (low current could take up to 0.3 second)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -113,7 +114,6 @@ void HlwEvery200ms(void)
|
||||
unsigned long hlw_u = 0;
|
||||
unsigned long hlw_i = 0;
|
||||
|
||||
|
||||
if (micros() - hlw_cf_pulse_last_time > (HLW_POWER_PROBE_TIME * 1000000)) {
|
||||
hlw_cf_pulse_length = 0; // No load for some time
|
||||
hlw_load_off = 1;
|
||||
@ -121,7 +121,7 @@ void HlwEvery200ms(void)
|
||||
hlw_cf_power_pulse_length = hlw_cf_pulse_length;
|
||||
|
||||
if (hlw_cf_power_pulse_length && energy_power_on && !hlw_load_off) {
|
||||
hlw_w = (hlw_power_ratio * Settings.energy_power_calibration) / hlw_cf_power_pulse_length;
|
||||
hlw_w = (hlw_power_ratio * Settings.energy_power_calibration) / hlw_cf_power_pulse_length; // W *10
|
||||
energy_active_power = (float)hlw_w / 10;
|
||||
} else {
|
||||
energy_active_power = 0;
|
||||
@ -137,32 +137,31 @@ void HlwEvery200ms(void)
|
||||
cf1_pulse_length = hlw_cf1_summed_pulse_length / hlw_cf1_pulse_counter;
|
||||
}
|
||||
|
||||
/*
|
||||
// Debugging for calculating mean and median
|
||||
char stemp[100];
|
||||
stemp[0] = '\0';
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s %d"), stemp, hlw_debug[i]);
|
||||
}
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
for (uint8_t j = i + 1; j < hlw_cf1_pulse_counter; j++) {
|
||||
if (hlw_debug[i] > hlw_debug[j]) { // Sort ascending
|
||||
std::swap(hlw_debug[i], hlw_debug[j]);
|
||||
#ifdef HLW_DEBUG
|
||||
// Debugging for calculating mean and median
|
||||
char stemp[100];
|
||||
stemp[0] = '\0';
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("%s %d"), stemp, hlw_debug[i]);
|
||||
}
|
||||
for (uint8_t i = 0; i < hlw_cf1_pulse_counter; i++) {
|
||||
for (uint8_t j = i + 1; j < hlw_cf1_pulse_counter; j++) {
|
||||
if (hlw_debug[i] > hlw_debug[j]) { // Sort ascending
|
||||
std::swap(hlw_debug[i], hlw_debug[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
unsigned long median = hlw_debug[(hlw_cf1_pulse_counter +1) / 2];
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR("NRG: power %d, ui %d, count %d, samples%s, sum %d, mean %d, median %d"),
|
||||
hlw_cf_power_pulse_length, hlw_select_ui_flag, hlw_cf1_pulse_counter, stemp, hlw_cf1_summed_pulse_length, cf1_pulse_length, median);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
*/
|
||||
unsigned long median = hlw_debug[(hlw_cf1_pulse_counter +1) / 2];
|
||||
snprintf_P(log_data, sizeof(log_data), PSTR("NRG: power %d, ui %d, cnt %d, smpl%s, sum %d, mean %d, median %d"),
|
||||
hlw_cf_power_pulse_length, hlw_select_ui_flag, hlw_cf1_pulse_counter, stemp, hlw_cf1_summed_pulse_length, cf1_pulse_length, median);
|
||||
AddLog(LOG_LEVEL_DEBUG);
|
||||
#endif
|
||||
|
||||
if (hlw_select_ui_flag == hlw_ui_flag) {
|
||||
hlw_cf1_voltage_pulse_length = cf1_pulse_length;
|
||||
hlw_cf1_voltage_max_pulse_counter = hlw_cf1_pulse_counter;
|
||||
|
||||
if (hlw_cf1_voltage_pulse_length && energy_power_on) { // If powered on always provide voltage
|
||||
hlw_u = (hlw_voltage_ratio * Settings.energy_voltage_calibration) / hlw_cf1_voltage_pulse_length;
|
||||
hlw_u = (hlw_voltage_ratio * Settings.energy_voltage_calibration) / hlw_cf1_voltage_pulse_length; // V *10
|
||||
energy_voltage = (float)hlw_u / 10;
|
||||
} else {
|
||||
energy_voltage = 0;
|
||||
@ -170,10 +169,9 @@ void HlwEvery200ms(void)
|
||||
|
||||
} else {
|
||||
hlw_cf1_current_pulse_length = cf1_pulse_length;
|
||||
hlw_cf1_current_max_pulse_counter = hlw_cf1_pulse_counter;
|
||||
|
||||
if (hlw_cf1_current_pulse_length && energy_active_power) { // No current if no power being consumed
|
||||
hlw_i = (hlw_current_ratio * Settings.energy_current_calibration) / hlw_cf1_current_pulse_length;
|
||||
hlw_i = (hlw_current_ratio * Settings.energy_current_calibration) / hlw_cf1_current_pulse_length; // mA
|
||||
energy_current = (float)hlw_i / 1000;
|
||||
} else {
|
||||
energy_current = 0;
|
||||
@ -217,29 +215,12 @@ void HlwSnsInit(void)
|
||||
hlw_current_ratio = HLW_IREF;
|
||||
}
|
||||
|
||||
hlw_cf_pulse_length = 0;
|
||||
hlw_cf_pulse_last_time = 0;
|
||||
hlw_cf_power_pulse_length = 0;
|
||||
hlw_cf1_pulse_length = 0;
|
||||
hlw_cf1_pulse_last_time = 0;
|
||||
hlw_cf1_voltage_pulse_length = 0;
|
||||
hlw_cf1_current_pulse_length = 0;
|
||||
hlw_cf1_voltage_max_pulse_counter = 0;
|
||||
hlw_cf1_current_max_pulse_counter = 0;
|
||||
|
||||
hlw_load_off = 1;
|
||||
hlw_energy_period_counter = 0;
|
||||
|
||||
hlw_select_ui_flag = 0; // Voltage;
|
||||
|
||||
pinMode(pin[GPIO_NRG_SEL], OUTPUT);
|
||||
digitalWrite(pin[GPIO_NRG_SEL], hlw_select_ui_flag);
|
||||
pinMode(pin[GPIO_NRG_CF1], INPUT_PULLUP);
|
||||
attachInterrupt(pin[GPIO_NRG_CF1], HlwCf1Interrupt, FALLING);
|
||||
pinMode(pin[GPIO_HLW_CF], INPUT_PULLUP);
|
||||
attachInterrupt(pin[GPIO_HLW_CF], HlwCfInterrupt, FALLING);
|
||||
|
||||
hlw_cf1_timer = 0;
|
||||
}
|
||||
|
||||
void HlwDrvInit(void)
|
||||
|
Loading…
x
Reference in New Issue
Block a user