mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ update version 0.2.04
+ added getElement() (not released 0.2.03 version) + added getSize() (not released 0.2.03 version) + added getCount() (not released 0.2.03 version) + updated keywords.txt + added memory protection if there is not enough memory to allocate. + added return NAN instead of 0 for getAverage() + reduced _size, _cnt, _idx to uint8_t + changed extensions of example code to .ino
This commit is contained in:
parent
9c13789f2d
commit
9cbe3bf5f9
@ -1,19 +1,21 @@
|
||||
//
|
||||
//
|
||||
// FILE: RunningAverage.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.2.02
|
||||
// VERSION: 0.2.04
|
||||
// PURPOSE: RunningAverage library for Arduino
|
||||
//
|
||||
// The library stores the last N individual values in a circular buffer,
|
||||
// to calculate the running average.
|
||||
// The library stores the last N individual values in a circular buffer,
|
||||
// to calculate the running average.
|
||||
//
|
||||
// HISTORY:
|
||||
// HISTORY:
|
||||
// 0.1.00 - 2011-01-30 initial version
|
||||
// 0.1.01 - 2011-02-28 fixed missing destructor in .h
|
||||
// 0.2.00 - 2012-??-?? Yuval Naveh added trimValue (found on web)
|
||||
// http://stromputer.googlecode.com/svn-history/r74/trunk/Arduino/Libraries/RunningAverage/RunningAverage.cpp
|
||||
// 0.2.01 - 2012-11-21 refactored
|
||||
// 0.2.02 - 2012-12-30 refactored trimValue -> fillValue
|
||||
// 0.2.03 - 2013-11-31 getElement
|
||||
// 0.2.04 - 2014-07-03 added memory protection
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
@ -23,41 +25,50 @@
|
||||
|
||||
RunningAverage::RunningAverage(int n)
|
||||
{
|
||||
_size = n;
|
||||
_ar = (float*) malloc(_size * sizeof(float));
|
||||
clear();
|
||||
_size = n;
|
||||
_ar = (float*) malloc(_size * sizeof(float));
|
||||
if (_ar == NULL) _size = 0;
|
||||
clear();
|
||||
}
|
||||
|
||||
RunningAverage::~RunningAverage()
|
||||
{
|
||||
free(_ar);
|
||||
if (_ar != NULL) free(_ar);
|
||||
}
|
||||
|
||||
// resets all counters
|
||||
void RunningAverage::clear()
|
||||
{
|
||||
_cnt = 0;
|
||||
_idx = 0;
|
||||
_sum = 0.0;
|
||||
for (int i = 0; i< _size; i++) _ar[i] = 0.0; // needed to keep addValue simple
|
||||
void RunningAverage::clear()
|
||||
{
|
||||
_cnt = 0;
|
||||
_idx = 0;
|
||||
_sum = 0.0;
|
||||
for (int i = 0; i< _size; i++) _ar[i] = 0.0; // needed to keep addValue simple
|
||||
}
|
||||
|
||||
// adds a new value to the data-set
|
||||
void RunningAverage::addValue(float f)
|
||||
{
|
||||
_sum -= _ar[_idx];
|
||||
_ar[_idx] = f;
|
||||
_sum += _ar[_idx];
|
||||
_idx++;
|
||||
if (_idx == _size) _idx = 0; // faster than %
|
||||
if (_cnt < _size) _cnt++;
|
||||
if (_ar == NULL) return;
|
||||
_sum -= _ar[_idx];
|
||||
_ar[_idx] = f;
|
||||
_sum += _ar[_idx];
|
||||
_idx++;
|
||||
if (_idx == _size) _idx = 0; // faster than %
|
||||
if (_cnt < _size) _cnt++;
|
||||
}
|
||||
|
||||
// returns the average of the data-set added sofar
|
||||
float RunningAverage::getAverage()
|
||||
{
|
||||
if (_cnt == 0) return 0; // NaN ? math.h
|
||||
return _sum / _cnt;
|
||||
if (_cnt == 0) return NAN;
|
||||
return _sum / _cnt;
|
||||
}
|
||||
|
||||
// returns the value of an element if exist, 0 otherwise
|
||||
float RunningAverage::getElement(uint8_t idx)
|
||||
{
|
||||
if (idx >=_cnt ) return NAN;
|
||||
return _ar[idx];
|
||||
}
|
||||
|
||||
// fill the average with a value
|
||||
@ -65,10 +76,10 @@ float RunningAverage::getAverage()
|
||||
// number should preferably be between 1 and size
|
||||
void RunningAverage::fillValue(float value, int number)
|
||||
{
|
||||
clear();
|
||||
for (int i = 0; i < number; i++)
|
||||
{
|
||||
addValue(value);
|
||||
}
|
||||
clear();
|
||||
for (int i = 0; i < number; i++)
|
||||
{
|
||||
addValue(value);
|
||||
}
|
||||
}
|
||||
// END OF FILE
|
@ -1,6 +1,6 @@
|
||||
#ifndef RunningAverage_h
|
||||
#define RunningAverage_h
|
||||
//
|
||||
//
|
||||
// FILE: RunningAverage.h
|
||||
// AUTHOR: Rob dot Tillaart at gmail dot com
|
||||
// PURPOSE: RunningAverage library for Arduino
|
||||
@ -15,25 +15,33 @@
|
||||
// add(x) addValue(x)
|
||||
// avg() getAverage()
|
||||
|
||||
#define RUNNINGAVERAGE_LIB_VERSION "0.2.02"
|
||||
#define RUNNINGAVERAGE_LIB_VERSION "0.2.04"
|
||||
|
||||
class RunningAverage
|
||||
#include "Arduino.h"
|
||||
|
||||
class RunningAverage
|
||||
{
|
||||
public:
|
||||
RunningAverage(void);
|
||||
RunningAverage(int);
|
||||
~RunningAverage();
|
||||
void clear();
|
||||
void addValue(float);
|
||||
float getAverage();
|
||||
void fillValue(float, int);
|
||||
public:
|
||||
RunningAverage(void);
|
||||
RunningAverage(int);
|
||||
~RunningAverage();
|
||||
|
||||
void clear();
|
||||
void addValue(float);
|
||||
void fillValue(float, int);
|
||||
|
||||
float getAverage();
|
||||
|
||||
float getElement(uint8_t idx);
|
||||
uint8_t getSize() { return _size; }
|
||||
uint8_t getCount() { return _cnt; }
|
||||
|
||||
protected:
|
||||
int _size;
|
||||
int _cnt;
|
||||
int _idx;
|
||||
float _sum;
|
||||
float * _ar;
|
||||
uint8_t _size;
|
||||
uint8_t _cnt;
|
||||
uint8_t _idx;
|
||||
float _sum;
|
||||
float * _ar;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
40
libraries/RunningAverage/examples/ra_hour/ra_hour.ino
Normal file
40
libraries/RunningAverage/examples/ra_hour/ra_hour.ino
Normal file
@ -0,0 +1,40 @@
|
||||
//
|
||||
// FILE: runningAverageHour.pde
|
||||
// AUTHOR: Rob Tillaart
|
||||
// DATE: 2012-12-30
|
||||
//
|
||||
// PUPROSE: show working of runningAverage per hour
|
||||
// in 2 steps - last minute + last hour
|
||||
// 3 or more steps also possible
|
||||
//
|
||||
|
||||
#include "RunningAverage.h"
|
||||
|
||||
RunningAverage raMinute(60);
|
||||
RunningAverage raHour(60);
|
||||
|
||||
int samples = 0;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Demo RunningAverage lib - average per minute & hour");
|
||||
Serial.print("Version: ");
|
||||
Serial.println(RUNNINGAVERAGE_LIB_VERSION);
|
||||
raHour.clear();
|
||||
raMinute.clear();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
long rn = random(0, 100);
|
||||
raMinute.addValue(rn);
|
||||
samples++;
|
||||
|
||||
if (samples % 60 == 0) raHour.addValue(raMinute.getAverage());
|
||||
|
||||
Serial.print(" raMinute: ");
|
||||
Serial.print(raMinute.getAverage(), 4);
|
||||
Serial.print(" raHour: ");
|
||||
Serial.println(raHour.getAverage(), 4);
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
#include "RunningAverage.h"
|
||||
|
||||
RunningAverage raMinute(60);
|
||||
RunningAverage raHour(60);
|
||||
|
||||
int samples = 0;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Demo RunningAverage lib - average per minute & hour");
|
||||
raHour.clr();
|
||||
raMinute.clr();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
long rn = random(0, 100);
|
||||
raMinute.add(rn);
|
||||
samples++;
|
||||
|
||||
if (samples % 60 == 0) raHour.add(raMinute.avg());
|
||||
|
||||
Serial.print(" raMinute: ");
|
||||
Serial.print(raMinute.avg(), 4);
|
||||
Serial.print(" raHour: ");
|
||||
Serial.println(raHour.avg(), 4);
|
||||
}
|
37
libraries/RunningAverage/examples/ra_test/ra_test.ino
Normal file
37
libraries/RunningAverage/examples/ra_test/ra_test.ino
Normal file
@ -0,0 +1,37 @@
|
||||
//
|
||||
// FILE: runningAverageTest.pde
|
||||
// AUTHOR: Rob Tillaart
|
||||
// DATE: 2012-12-30
|
||||
//
|
||||
// PUPROSE: show working of runningAverage
|
||||
//
|
||||
|
||||
#include "RunningAverage.h"
|
||||
|
||||
RunningAverage myRA(10);
|
||||
int samples = 0;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Demo RunningAverage lib");
|
||||
Serial.print("Version: ");
|
||||
Serial.println(RUNNINGAVERAGE_LIB_VERSION);
|
||||
myRA.clear(); // explicitly start clean
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
long rn = random(0, 1000);
|
||||
myRA.addValue(rn * 0.001);
|
||||
samples++;
|
||||
Serial.print("Running Average: ");
|
||||
Serial.println(myRA.getAverage(), 3);
|
||||
|
||||
if (samples == 300)
|
||||
{
|
||||
samples = 0;
|
||||
myRA.clear();
|
||||
}
|
||||
delay(100);
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
#include "RunningAverage.h"
|
||||
|
||||
RunningAverage myRA(10); // use default size
|
||||
int samples = 0;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Demo RunningAverage lib");
|
||||
myRA.clr(); // explicitly start clean
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
long rn = random(0, 100);
|
||||
myRA.add(rn/100.0);
|
||||
samples++;
|
||||
Serial.print("Running Average: ");
|
||||
Serial.println(myRA.avg(), 4);
|
||||
|
||||
if (samples == 300)
|
||||
{
|
||||
samples = 0;
|
||||
myRA.clr();
|
||||
}
|
||||
delay(100);
|
||||
}
|
@ -16,6 +16,9 @@ clear KEYWORD2
|
||||
addValue KEYWORD2
|
||||
getAverage KEYWORD2
|
||||
fillValue KEYWORD2
|
||||
getElement KEYWORD2
|
||||
getSize KEYWORD2
|
||||
getCount KEYWORD2
|
||||
|
||||
#######################################
|
||||
# Instances (KEYWORD2)
|
||||
|
Loading…
Reference in New Issue
Block a user