/*
|
|
EmonLiteESP
|
|
|
|
Energy Monitor Library for ESP8266 based on EmonLib
|
|
Currently only support current sensing
|
|
*/
|
|
|
|
#include "Arduino.h"
|
|
#include "EmonLiteESP.h"
|
|
|
|
void EnergyMonitor::initCurrent(unsigned int pin, double ref, double ratio) {
|
|
_currentPin = pin;
|
|
_referenceVoltage = ref;
|
|
_currentRatio = ratio;
|
|
_currentMidPoint = (ADC_COUNTS>>1);
|
|
|
|
// Calculate default precision
|
|
_currentFactor = _currentRatio * _referenceVoltage / ADC_COUNTS;
|
|
_precision = 0;
|
|
_multiplier = 1;
|
|
while (_multiplier * _currentFactor < 1) {
|
|
_multiplier *= 10;
|
|
++_precision;
|
|
}
|
|
--_precision;
|
|
_multiplier /= 10;
|
|
|
|
};
|
|
|
|
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 = analogRead(_currentPin);
|
|
|
|
// Digital low pass filter extracts the VDC offset
|
|
_currentMidPoint = (_currentMidPoint + (sample - _currentMidPoint) / 1024.0);
|
|
filtered = sample - _currentMidPoint;
|
|
|
|
// Root-mean-square method
|
|
sum += (filtered * filtered);
|
|
|
|
}
|
|
|
|
double rms = int(sqrt(sum / samples) - 0.5);
|
|
double current = _currentFactor * rms;
|
|
current = round(current * _multiplier) / _multiplier;
|
|
return current;
|
|
|
|
};
|