diff --git a/src/espmega_iot_emon.cpp b/src/espmega_iot_emon.cpp new file mode 100644 index 0000000..863de9f --- /dev/null +++ b/src/espmega_iot_emon.cpp @@ -0,0 +1,53 @@ +#include "espmega_iot_emon.hpp" + +ESPMega_CT::ESPMega_CT(uint8_t analog_pin, float (*adc_to_watts)(uint16_t adc_value), uint32_t fram_address) +{ + this->analog_pin = analog_pin; + this->fram_address = fram_address; + this->adc_to_watts = adc_to_watts; +} + +void ESPMega_CT::begin() +{ + this->last_conversion_timestamp = millis(); + ESPMega_FRAM.read(fram_address, (uint8_t *)&this->energy, 16); + this->power = adc_to_watts(ESPMega_analogRead(this->analog_pin)); +} + +void ESPMega_CT::loop() +{ + this->energy += (millis() - this->last_conversion_timestamp) / 3600000 * this->power; + this->power = adc_to_watts(ESPMega_analogRead(this->analog_pin)); + this->last_conversion_timestamp = millis(); + ESPMega_FRAM.write(fram_address, (uint8_t *)&this->energy, 16); +} + +void ESPMega_CT::reset_energy() +{ + this->energy = 0; + ESPMega_FRAM.write16(fram_address, 0); +} + +long double ESPMega_CT::get_energy() +{ + return this->energy; +} + +float ESPMega_CT::get_power() +{ + return this->power; +} + +float ESPMega_CT::adc_to_watts_builtin(uint16_t adc_value) +{ + const float RATIO = 0.1; + const float BURDEN_RESISTANCE = 20; + const float VOLTAGE = 220; + const uint16_t ADC_RANGE_START = 500; + const uint16_t ADC_RANGE_END = 16000; + const float ADC_RANGE = 12; + float burden_voltage = (adc_value - ADC_RANGE_START) / (ADC_RANGE_END - ADC_RANGE_START) * ADC_RANGE; + float secondary_current = burden_voltage / BURDEN_RESISTANCE; + float primary_current = secondary_current / RATIO; + return primary_current * VOLTAGE; +} \ No newline at end of file diff --git a/src/espmega_iot_emon.hpp b/src/espmega_iot_emon.hpp new file mode 100644 index 0000000..818ce36 --- /dev/null +++ b/src/espmega_iot_emon.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +class ESPMega_CT { + public: + ESPMega_CT(uint8_t analog_pin,float(*adc_to_watts)(uint16_t adc_value), uint32_t fram_address); + void begin(); + void loop(); + float get_power(); + long double get_energy(); + void reset_energy(); + private: + uint8_t analog_pin; + uint32_t fram_address; + unsigned long last_conversion_timestamp; + float power; + long double energy; + float (*adc_to_watts)(uint16_t adc_value); + float adc_to_watts_builtin(uint16_t adc_value); +}; \ No newline at end of file