/*
|
|
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;
|
|
|
|
};
|