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.

65 lines
1.5 KiB

  1. /*
  2. EmonLiteESP
  3. Energy Monitor Library for ESP8266 based on EmonLib
  4. Currently only support current sensing
  5. */
  6. #include "Arduino.h"
  7. #include "EmonLiteESP.h"
  8. void EnergyMonitor::initCurrent(unsigned int pin, double ref, double ratio) {
  9. _currentPin = pin;
  10. _referenceVoltage = ref;
  11. _currentRatio = ratio;
  12. _currentMidPoint = (ADC_COUNTS>>1);
  13. // Calculate default precision
  14. _currentFactor = _currentRatio * _referenceVoltage / ADC_COUNTS;
  15. _precision = 0;
  16. _multiplier = 1;
  17. while (_multiplier * _currentFactor < 1) {
  18. _multiplier *= 10;
  19. ++_precision;
  20. }
  21. --_precision;
  22. _multiplier /= 10;
  23. };
  24. byte EnergyMonitor::getPrecision() {
  25. return _precision;
  26. }
  27. void EnergyMonitor::setPrecision(byte precision) {
  28. _precision = precision;
  29. _multiplier = 1;
  30. for (byte i=0; i<_precision; i++) _multiplier *= 10;
  31. }
  32. double EnergyMonitor::getCurrent(unsigned int samples) {
  33. int sample;
  34. double filtered;
  35. double sum;
  36. for (unsigned int n = 0; n < samples; n++) {
  37. // Read analog value
  38. sample = analogRead(_currentPin);
  39. // Digital low pass filter extracts the VDC offset
  40. _currentMidPoint = (_currentMidPoint + (sample - _currentMidPoint) / 1024.0);
  41. filtered = sample - _currentMidPoint;
  42. // Root-mean-square method
  43. sum += (filtered * filtered);
  44. }
  45. double rms = int(sqrt(sum / samples) - 0.5);
  46. double current = _currentFactor * rms;
  47. current = round(current * _multiplier) / _multiplier;
  48. return current;
  49. };