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