Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

81 lines
1.8 KiB

/*
EmonLiteESP
Energy Monitor Library for ESP8266 based on EmonLib
Currently only support current sensing
*/
#include "Arduino.h"
#include "EmonLiteESP.h"
void EnergyMonitor::initCurrent(current_c callback, double ref, double ratio) {
_currentCallback = callback;
_referenceVoltage = ref;
_currentRatio = ratio;
_currentMidPoint = (ADC_COUNTS>>1);
calculatePrecision();
};
void EnergyMonitor::calculatePrecision() {
_currentFactor = _currentRatio * _referenceVoltage / ADC_COUNTS;
_precision = 0;
_multiplier = 1;
while (_multiplier * _currentFactor < 1) {
_multiplier *= 10;
++_precision;
}
--_precision;
_multiplier /= 10;
}
void EnergyMonitor::setReference(double ref) {
_referenceVoltage = ref;
}
void EnergyMonitor::setCurrentRatio(double ratio) {
_currentRatio = ratio;
}
byte EnergyMonitor::getPrecision() {
return _precision;
}
void EnergyMonitor::setPrecision(byte precision) {
_precision = precision;
_multiplier = 1;
for (byte i=0; i<_precision; i++) _multiplier *= 10;
}
double EnergyMonitor::getCurrent(unsigned int samples) {
int sample;
double filtered;
double sum;
for (unsigned int n = 0; n < samples; n++) {
// Read analog value
sample = _currentCallback();
// Digital low pass filter extracts the VDC offset
_currentMidPoint = (_currentMidPoint + (sample - _currentMidPoint) / 10.0);
filtered = sample - _currentMidPoint;
// Root-mean-square method
sum += (filtered * filtered);
}
double rms = int(sqrt(sum / samples) - 0.5);
double current = _currentFactor * rms;
Serial.println(sum);
Serial.println(rms);
Serial.println(current);
current = round(current * _multiplier) / _multiplier;
Serial.println(current);
return current;
};