No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[ | |||
---- | |||
Source code Arduino: | |||
Arduino.ino: | |||
<pre> | |||
#include "Unit.h" | |||
#include "RunningAverage.h" | |||
#include "StopWatch.h" | |||
bool doprint=true; | |||
const int threshold=20; | |||
const int neg_threshold=-10; | |||
const int array_size=15; | |||
const int fill_array=200; | |||
unsigned int grow_time=36000; | |||
unsigned int break_time=7200; | |||
unsigned int wait_time=1200; | |||
const int unit_one_sensor=A0; | |||
const int unit_two_sensor=A1; | |||
const int unit_thr_sensor=A2; | |||
int unit_one_plus=4; | |||
int unit_one_minus=5; | |||
int unit_two_plus=6; | |||
int unit_two_minus=7; | |||
int unit_thr_plus=8; | |||
int unit_thr_minus=9; | |||
Unit one(unit_one_sensor, unit_one_minus, unit_one_plus, 1, threshold, array_size, fill_array); | |||
Unit two(unit_two_sensor, unit_two_minus, unit_two_plus, 2, threshold, array_size, fill_array); | |||
Unit thr(unit_thr_sensor, unit_thr_minus, unit_thr_plus, 3, threshold, array_size, fill_array); | |||
void setup(){ | |||
pinMode(unit_one_minus,OUTPUT); | |||
pinMode(unit_one_plus,OUTPUT); | |||
pinMode(unit_two_minus,OUTPUT); | |||
pinMode(unit_two_plus,OUTPUT); | |||
pinMode(unit_thr_minus,OUTPUT); | |||
pinMode(unit_thr_plus,OUTPUT); | |||
Serial.begin(19200); | |||
Serial.println("burnout_011"); | |||
one.wachse(); | |||
two.wachse(); | |||
thr.wachse(); | |||
} | |||
void loop(){ | |||
/* | |||
one.run(); | |||
two.run(); | |||
thr.run(); | |||
*/ | |||
one.run_timed(grow_time, break_time, wait_time); | |||
two.run_timed(grow_time, break_time, wait_time); | |||
thr.run_timed(grow_time, break_time, wait_time); | |||
if(doprint) | |||
{ | |||
one.do_print(); | |||
two.do_print(); | |||
thr.do_print(); | |||
Serial.println(); | |||
} | |||
delay(1); | |||
} | |||
</pre> | |||
Unit.h | |||
<pre> | |||
#ifndef Unit_h | |||
#define Unit_h | |||
#include "RunningAverage.h" | |||
#include "StopWatch.h" | |||
class Unit | |||
{ | |||
public: | |||
Unit(void); | |||
Unit(int const& sensor, int const& minus, int const& plus, int const& unitid, int const& threshold, int const& size, int const& fillarray); | |||
~Unit(); | |||
void wachse(); | |||
void breche(); | |||
void warte(); | |||
int state(); | |||
void run(); | |||
void run_timed(unsigned int const& grow_time, unsigned int const& break_time, unsigned int const& wait_time); | |||
void emergency_break(); | |||
void do_print(); | |||
void fill_spaces(int const& value); | |||
private: | |||
int m_sensor; | |||
int m_relais_minus; | |||
int m_relais_plus; | |||
int m_state; | |||
int m_unitid; | |||
int m_threshold; | |||
int m_fillarray; | |||
RunningAverage m_RA; | |||
RunningAverage m_delta_RA; | |||
StopWatch m_sw; | |||
int m_readings; | |||
}; | |||
#endif | |||
</pre> | |||
Unit.cpp | |||
<pre> | |||
#include "Unit.h" | |||
#include "RunningAverage.h" | |||
#include "StopWatch.h" | |||
#include <Arduino.h> | |||
Unit::Unit(int const& sensor, int const& r_minus, int const& r_plus, int const& unitid, int const& threshold, int const& size, int const& fillarray) | |||
{ | |||
m_sensor=sensor; | |||
m_relais_minus = r_minus; | |||
m_relais_plus = r_plus; | |||
m_unitid=unitid; | |||
m_threshold=threshold; | |||
m_state=0; | |||
m_fillarray=fillarray; | |||
m_sw.start(); | |||
m_RA.init(size); | |||
m_delta_RA.init(size); | |||
digitalWrite(m_relais_minus, HIGH); | |||
digitalWrite(m_relais_plus, HIGH); | |||
} | |||
Unit::~Unit() | |||
{ | |||
} | |||
void Unit::wachse() | |||
{ | |||
digitalWrite(m_relais_minus, LOW); | |||
digitalWrite(m_relais_plus, HIGH); | |||
m_state=1; | |||
} | |||
void Unit::breche() | |||
{ | |||
digitalWrite(m_relais_minus, HIGH); | |||
delay(10); | |||
digitalWrite(m_relais_plus, LOW); | |||
m_state=2; | |||
} | |||
void Unit::warte() | |||
{ | |||
digitalWrite(m_relais_minus, HIGH); | |||
digitalWrite(m_relais_plus, HIGH); | |||
m_state=3; | |||
} | |||
int Unit::state() | |||
{ | |||
return m_state; | |||
} | |||
void Unit::run() | |||
{ | |||
m_readings=analogRead(m_sensor); | |||
emergency_break(); | |||
m_RA.addValue(m_readings); | |||
m_delta_RA.addValue(m_readings-m_RA.getAverage()); | |||
if(m_fillarray>0) | |||
{ | |||
m_fillarray--; | |||
} | |||
else if(m_readings<=1000) | |||
{ | |||
if(m_delta_RA.getAverage()>m_threshold) | |||
{ | |||
breche(); | |||
} | |||
if(m_delta_RA.getAverage()<(-m_threshold)) | |||
{ | |||
wachse(); | |||
} | |||
} | |||
} | |||
void Unit::run_timed(unsigned int const& grow_time, unsigned int const& break_time, unsigned int const& wait_time) | |||
{ | |||
m_readings=analogRead(m_sensor); | |||
emergency_break(); | |||
m_RA.addValue(m_readings); | |||
m_delta_RA.addValue(m_readings-m_RA.getAverage()); | |||
if(m_fillarray>0) | |||
{ | |||
m_fillarray--; | |||
} | |||
else if(m_readings<=1000) | |||
{ | |||
if(m_delta_RA.getAverage()>m_threshold) | |||
{ | |||
breche(); | |||
m_sw.reset(); | |||
m_sw.start(); | |||
} | |||
if(m_delta_RA.getAverage()<(-m_threshold)) | |||
{ | |||
wachse(); | |||
m_sw.reset(); | |||
m_sw.start(); | |||
} | |||
if(m_state==1 && m_sw.elapsed()>grow_time) | |||
{ | |||
breche(); | |||
} | |||
if(m_state==2 && m_sw.elapsed()>break_time) | |||
{ | |||
wachse(); | |||
} | |||
if(m_state==3 && m_sw.elapsed()>wait_time) | |||
{ | |||
wachse(); | |||
} | |||
} | |||
} | |||
void Unit::do_print() | |||
{ | |||
Serial.print(" unit"); | |||
Serial.print(m_unitid); | |||
Serial.print(": "); | |||
Serial.print(m_state); | |||
fill_spaces(m_readings); | |||
Serial.print(m_readings); | |||
Serial.print(" "); | |||
fill_spaces(m_delta_RA.getAverage()); | |||
Serial.print(m_delta_RA.getAverage()); | |||
Serial.print("#"); | |||
fill_spaces(m_fillarray); | |||
Serial.print(m_fillarray); | |||
Serial.print("->"); | |||
fill_spaces(m_sw.elapsed()); | |||
Serial.print(m_sw.elapsed()); | |||
} | |||
void Unit::emergency_break() | |||
{ | |||
if(m_readings>1000 && m_readings < 1010) | |||
{ | |||
Serial.print(" | "); | |||
Serial.print(m_readings); | |||
Serial.print(" "); | |||
Serial.print("HIGH"); | |||
Serial.print(" E_1 UNIT"); | |||
Serial.print(m_unitid); | |||
Serial.print(": "); | |||
Serial.print(m_state); | |||
Serial.print(" | "); | |||
breche(); | |||
m_sw.reset(); | |||
m_sw.start(); | |||
} | |||
if(m_readings>=1010) | |||
{ | |||
Serial.print(" # "); | |||
Serial.print(m_readings); | |||
Serial.print(" # "); | |||
Serial.print("HIGH"); | |||
Serial.print(" E_2 UNIT"); | |||
Serial.print(m_unitid); | |||
Serial.print(": "); | |||
Serial.print(m_state); | |||
Serial.print(" # "); | |||
wachse(); | |||
delay(10); | |||
breche(); | |||
m_sw.reset(); | |||
m_sw.start(); | |||
} | |||
if(m_readings>1022) | |||
{ | |||
Serial.print(" | "); | |||
Serial.print(m_readings); | |||
Serial.print(" "); | |||
Serial.print("HIGH"); | |||
Serial.print(" E_3 UNIT"); | |||
Serial.print(m_unitid); | |||
Serial.print(": "); | |||
Serial.print(m_state); | |||
Serial.print(" | "); | |||
warte(); | |||
m_sw.reset(); | |||
m_sw.start(); | |||
} | |||
} | |||
void Unit::fill_spaces(int const& value) | |||
{ | |||
if(value<1000 && value>=0) | |||
{ | |||
Serial.print(" "); | |||
if(value<100) | |||
{ | |||
Serial.print(" "); | |||
if(value<10) | |||
{ | |||
Serial.print(" "); | |||
} | |||
} | |||
} | |||
if(value>-1000 && value<0) | |||
{ | |||
if(value>-100) | |||
{ | |||
Serial.print(" "); | |||
if(value>-10) | |||
{ | |||
Serial.print(" "); | |||
} | |||
} | |||
} | |||
} | |||
</pre> | |||
RunningAverage.h | |||
<pre> | |||
#ifndef RunningAverage_h | |||
#define RunningAverage_h | |||
// | |||
// FILE: RunningAverage.h | |||
// AUTHOR: Rob dot Tillaart at gmail dot com | |||
// PURPOSE: RunningAverage library for Arduino | |||
// URL: http://playground.arduino.cc/Main/RunningAverage | |||
// HISTORY: See RunningAverage.cpp | |||
// | |||
// Released to the public domain | |||
// | |||
// backwards compatibility | |||
// clr() clear() | |||
// add(x) addValue(x) | |||
// avg() getAverage() | |||
#define RUNNINGAVERAGE_LIB_VERSION "0.2.02" | |||
class RunningAverage | |||
{ | |||
public: | |||
RunningAverage(); | |||
RunningAverage(int); | |||
~RunningAverage(); | |||
void clear(); | |||
void init(int n); | |||
void addValue(int); | |||
int getAverage(); | |||
void fillValue(int, int); | |||
protected: | |||
int _size; | |||
int _cnt; | |||
int _idx; | |||
int _sum; | |||
int * _ar; | |||
}; | |||
#endif | |||
// END OF FILE | |||
</pre> | |||
RunningAverage.cpp | |||
<pre> | |||
// | |||
// FILE: RunningAverage.cpp | |||
// AUTHOR: Rob Tillaart | |||
// VERSION: 0.2.02 | |||
// PURPOSE: RunningAverage library for Arduino | |||
// | |||
// The library stores the last N individual values in a circular buffer, | |||
// to calculate the running average. | |||
// | |||
// 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 | |||
// | |||
// Released to the public domain | |||
// | |||
#include "RunningAverage.h" | |||
#include <stdlib.h> | |||
RunningAverage::RunningAverage() | |||
{ | |||
} | |||
RunningAverage::RunningAverage(int n) | |||
{ | |||
_size = n; | |||
_ar = (int*) malloc(_size * sizeof(int)); | |||
clear(); | |||
} | |||
RunningAverage::~RunningAverage() | |||
{ | |||
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::init(int n) | |||
{ | |||
_size = n; | |||
_ar = (int*) malloc(_size * sizeof(int)); | |||
clear(); | |||
} | |||
// adds a new value to the data-set | |||
void RunningAverage::addValue(int f) | |||
{ | |||
_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 | |||
int RunningAverage::getAverage() | |||
{ | |||
if (_cnt == 0) return 0; // NaN ? math.h | |||
return _sum / _cnt; | |||
} | |||
// fill the average with a value | |||
// the param number determines how often value is added (weight) | |||
// number should preferably be between 1 and size | |||
void RunningAverage::fillValue(int value, int number) | |||
{ | |||
clear(); | |||
for (int i = 0; i < number; i++) | |||
{ | |||
addValue(value); | |||
} | |||
} | |||
// END OF FILE | |||
</pre> | |||
Stopwatch.h | |||
<pre> | |||
#ifndef StopWatch_h | |||
#define StopWatch_h | |||
// | |||
// FILE: StopWatch.h | |||
// AUTHOR: Rob Tillaart | |||
// PURPOSE: Simple StopWatch library for Arduino | |||
// HISTORY: See StopWatch.cpp | |||
// URL: http://playground.arduino.cc/Code/StopWatchClass | |||
// | |||
// Released to the public domain | |||
// | |||
#define STOPWATCH_LIB_VERSION "0.1.03" | |||
#if ARDUINO >= 100 | |||
#include "Arduino.h" | |||
#else | |||
#include "WProgram.h" | |||
#endif | |||
class StopWatch | |||
{ | |||
public: | |||
enum State { | |||
RESET, RUNNING, STOPPED }; | |||
enum Resolution { | |||
MILLIS, MICROS, SECONDS }; | |||
StopWatch(enum Resolution res = SECONDS); | |||
void start(); | |||
void stop(); | |||
void reset(); | |||
unsigned long value(); | |||
unsigned long elapsed() { | |||
return value(); | |||
}; | |||
bool isRunning(); | |||
enum State state(); | |||
enum Resolution resolution() { | |||
return _res; | |||
}; | |||
private: | |||
enum State _state; | |||
enum Resolution _res; | |||
unsigned long _starttime; | |||
unsigned long _stoptime; | |||
unsigned long (*_gettime)(void); | |||
static unsigned long seconds() { | |||
return millis()/1000; | |||
}; | |||
}; | |||
#endif | |||
// END OF FILE | |||
</pre> | |||
StopWatch.cpp | |||
<pre> | |||
// | |||
// FILE: StopWatch.cpp | |||
// AUTHOR: Rob Tillaart | |||
// VERSION: 0.1.03 | |||
// PURPOSE: Simple StopWatch library for Arduino | |||
// | |||
// The library is based upon millis() and therefore | |||
// has the same restrictions as millis() has wrt overflow. | |||
// | |||
// HISTORY: | |||
// 0.1.00 - 2011-01-04 initial version | |||
// 0.1.01 - 2011-01-04 Added better state | |||
// 0.1.02 - 2011-06-15 Added state() + #defines + lib version | |||
// 0.1.03 - 2012-01-22 Added several improvements | |||
// By mromani & Rob Tillaart | |||
// | |||
// Released to the public domain | |||
// | |||
#include "StopWatch.h" | |||
StopWatch::StopWatch(enum Resolution res) | |||
{ | |||
_res = res; | |||
switch(_res) { | |||
case MICROS: | |||
_gettime = micros; | |||
break; | |||
case MILLIS: | |||
_gettime = millis; | |||
break; | |||
case SECONDS: | |||
_gettime = seconds; | |||
break; | |||
default: | |||
_gettime = millis; | |||
break; | |||
} | |||
reset(); | |||
} | |||
void StopWatch::reset() | |||
{ | |||
_state = StopWatch::RESET; | |||
_starttime = _stoptime = 0; | |||
} | |||
void StopWatch::start() | |||
{ | |||
if (_state == StopWatch::RESET || _state == StopWatch::STOPPED) | |||
{ | |||
_state = StopWatch::RUNNING; | |||
unsigned long t = _gettime(); | |||
_starttime += t - _stoptime; | |||
_stoptime = t; | |||
} | |||
} | |||
unsigned long StopWatch::value() | |||
{ | |||
if (_state == StopWatch::RUNNING) _stoptime = _gettime(); | |||
return _stoptime - _starttime; | |||
} | |||
void StopWatch::stop() | |||
{ | |||
if (_state == StopWatch::RUNNING) | |||
{ | |||
_state = StopWatch::STOPPED; | |||
_stoptime = _gettime(); | |||
} | |||
} | |||
bool StopWatch::isRunning() | |||
{ | |||
return (_state == StopWatch::RUNNING); | |||
} | |||
enum StopWatch::State StopWatch::state() | |||
{ | |||
return _state; | |||
} | |||
// END OF FILE | |||
</pre> |
Revision as of 19:19, 5 October 2013
Source code Arduino:
Arduino.ino:
#include "Unit.h" #include "RunningAverage.h" #include "StopWatch.h" bool doprint=true; const int threshold=20; const int neg_threshold=-10; const int array_size=15; const int fill_array=200; unsigned int grow_time=36000; unsigned int break_time=7200; unsigned int wait_time=1200; const int unit_one_sensor=A0; const int unit_two_sensor=A1; const int unit_thr_sensor=A2; int unit_one_plus=4; int unit_one_minus=5; int unit_two_plus=6; int unit_two_minus=7; int unit_thr_plus=8; int unit_thr_minus=9; Unit one(unit_one_sensor, unit_one_minus, unit_one_plus, 1, threshold, array_size, fill_array); Unit two(unit_two_sensor, unit_two_minus, unit_two_plus, 2, threshold, array_size, fill_array); Unit thr(unit_thr_sensor, unit_thr_minus, unit_thr_plus, 3, threshold, array_size, fill_array); void setup(){ pinMode(unit_one_minus,OUTPUT); pinMode(unit_one_plus,OUTPUT); pinMode(unit_two_minus,OUTPUT); pinMode(unit_two_plus,OUTPUT); pinMode(unit_thr_minus,OUTPUT); pinMode(unit_thr_plus,OUTPUT); Serial.begin(19200); Serial.println("burnout_011"); one.wachse(); two.wachse(); thr.wachse(); } void loop(){ /* one.run(); two.run(); thr.run(); */ one.run_timed(grow_time, break_time, wait_time); two.run_timed(grow_time, break_time, wait_time); thr.run_timed(grow_time, break_time, wait_time); if(doprint) { one.do_print(); two.do_print(); thr.do_print(); Serial.println(); } delay(1); }
Unit.h
#ifndef Unit_h #define Unit_h #include "RunningAverage.h" #include "StopWatch.h" class Unit { public: Unit(void); Unit(int const& sensor, int const& minus, int const& plus, int const& unitid, int const& threshold, int const& size, int const& fillarray); ~Unit(); void wachse(); void breche(); void warte(); int state(); void run(); void run_timed(unsigned int const& grow_time, unsigned int const& break_time, unsigned int const& wait_time); void emergency_break(); void do_print(); void fill_spaces(int const& value); private: int m_sensor; int m_relais_minus; int m_relais_plus; int m_state; int m_unitid; int m_threshold; int m_fillarray; RunningAverage m_RA; RunningAverage m_delta_RA; StopWatch m_sw; int m_readings; }; #endif
Unit.cpp
#include "Unit.h" #include "RunningAverage.h" #include "StopWatch.h" #include <Arduino.h> Unit::Unit(int const& sensor, int const& r_minus, int const& r_plus, int const& unitid, int const& threshold, int const& size, int const& fillarray) { m_sensor=sensor; m_relais_minus = r_minus; m_relais_plus = r_plus; m_unitid=unitid; m_threshold=threshold; m_state=0; m_fillarray=fillarray; m_sw.start(); m_RA.init(size); m_delta_RA.init(size); digitalWrite(m_relais_minus, HIGH); digitalWrite(m_relais_plus, HIGH); } Unit::~Unit() { } void Unit::wachse() { digitalWrite(m_relais_minus, LOW); digitalWrite(m_relais_plus, HIGH); m_state=1; } void Unit::breche() { digitalWrite(m_relais_minus, HIGH); delay(10); digitalWrite(m_relais_plus, LOW); m_state=2; } void Unit::warte() { digitalWrite(m_relais_minus, HIGH); digitalWrite(m_relais_plus, HIGH); m_state=3; } int Unit::state() { return m_state; } void Unit::run() { m_readings=analogRead(m_sensor); emergency_break(); m_RA.addValue(m_readings); m_delta_RA.addValue(m_readings-m_RA.getAverage()); if(m_fillarray>0) { m_fillarray--; } else if(m_readings<=1000) { if(m_delta_RA.getAverage()>m_threshold) { breche(); } if(m_delta_RA.getAverage()<(-m_threshold)) { wachse(); } } } void Unit::run_timed(unsigned int const& grow_time, unsigned int const& break_time, unsigned int const& wait_time) { m_readings=analogRead(m_sensor); emergency_break(); m_RA.addValue(m_readings); m_delta_RA.addValue(m_readings-m_RA.getAverage()); if(m_fillarray>0) { m_fillarray--; } else if(m_readings<=1000) { if(m_delta_RA.getAverage()>m_threshold) { breche(); m_sw.reset(); m_sw.start(); } if(m_delta_RA.getAverage()<(-m_threshold)) { wachse(); m_sw.reset(); m_sw.start(); } if(m_state==1 && m_sw.elapsed()>grow_time) { breche(); } if(m_state==2 && m_sw.elapsed()>break_time) { wachse(); } if(m_state==3 && m_sw.elapsed()>wait_time) { wachse(); } } } void Unit::do_print() { Serial.print(" unit"); Serial.print(m_unitid); Serial.print(": "); Serial.print(m_state); fill_spaces(m_readings); Serial.print(m_readings); Serial.print(" "); fill_spaces(m_delta_RA.getAverage()); Serial.print(m_delta_RA.getAverage()); Serial.print("#"); fill_spaces(m_fillarray); Serial.print(m_fillarray); Serial.print("->"); fill_spaces(m_sw.elapsed()); Serial.print(m_sw.elapsed()); } void Unit::emergency_break() { if(m_readings>1000 && m_readings < 1010) { Serial.print(" | "); Serial.print(m_readings); Serial.print(" "); Serial.print("HIGH"); Serial.print(" E_1 UNIT"); Serial.print(m_unitid); Serial.print(": "); Serial.print(m_state); Serial.print(" | "); breche(); m_sw.reset(); m_sw.start(); } if(m_readings>=1010) { Serial.print(" # "); Serial.print(m_readings); Serial.print(" # "); Serial.print("HIGH"); Serial.print(" E_2 UNIT"); Serial.print(m_unitid); Serial.print(": "); Serial.print(m_state); Serial.print(" # "); wachse(); delay(10); breche(); m_sw.reset(); m_sw.start(); } if(m_readings>1022) { Serial.print(" | "); Serial.print(m_readings); Serial.print(" "); Serial.print("HIGH"); Serial.print(" E_3 UNIT"); Serial.print(m_unitid); Serial.print(": "); Serial.print(m_state); Serial.print(" | "); warte(); m_sw.reset(); m_sw.start(); } } void Unit::fill_spaces(int const& value) { if(value<1000 && value>=0) { Serial.print(" "); if(value<100) { Serial.print(" "); if(value<10) { Serial.print(" "); } } } if(value>-1000 && value<0) { if(value>-100) { Serial.print(" "); if(value>-10) { Serial.print(" "); } } } }
RunningAverage.h
#ifndef RunningAverage_h #define RunningAverage_h // // FILE: RunningAverage.h // AUTHOR: Rob dot Tillaart at gmail dot com // PURPOSE: RunningAverage library for Arduino // URL: http://playground.arduino.cc/Main/RunningAverage // HISTORY: See RunningAverage.cpp // // Released to the public domain // // backwards compatibility // clr() clear() // add(x) addValue(x) // avg() getAverage() #define RUNNINGAVERAGE_LIB_VERSION "0.2.02" class RunningAverage { public: RunningAverage(); RunningAverage(int); ~RunningAverage(); void clear(); void init(int n); void addValue(int); int getAverage(); void fillValue(int, int); protected: int _size; int _cnt; int _idx; int _sum; int * _ar; }; #endif // END OF FILE
RunningAverage.cpp
// // FILE: RunningAverage.cpp // AUTHOR: Rob Tillaart // VERSION: 0.2.02 // PURPOSE: RunningAverage library for Arduino // // The library stores the last N individual values in a circular buffer, // to calculate the running average. // // 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 // // Released to the public domain // #include "RunningAverage.h" #include <stdlib.h> RunningAverage::RunningAverage() { } RunningAverage::RunningAverage(int n) { _size = n; _ar = (int*) malloc(_size * sizeof(int)); clear(); } RunningAverage::~RunningAverage() { 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::init(int n) { _size = n; _ar = (int*) malloc(_size * sizeof(int)); clear(); } // adds a new value to the data-set void RunningAverage::addValue(int f) { _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 int RunningAverage::getAverage() { if (_cnt == 0) return 0; // NaN ? math.h return _sum / _cnt; } // fill the average with a value // the param number determines how often value is added (weight) // number should preferably be between 1 and size void RunningAverage::fillValue(int value, int number) { clear(); for (int i = 0; i < number; i++) { addValue(value); } } // END OF FILE
Stopwatch.h
#ifndef StopWatch_h #define StopWatch_h // // FILE: StopWatch.h // AUTHOR: Rob Tillaart // PURPOSE: Simple StopWatch library for Arduino // HISTORY: See StopWatch.cpp // URL: http://playground.arduino.cc/Code/StopWatchClass // // Released to the public domain // #define STOPWATCH_LIB_VERSION "0.1.03" #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif class StopWatch { public: enum State { RESET, RUNNING, STOPPED }; enum Resolution { MILLIS, MICROS, SECONDS }; StopWatch(enum Resolution res = SECONDS); void start(); void stop(); void reset(); unsigned long value(); unsigned long elapsed() { return value(); }; bool isRunning(); enum State state(); enum Resolution resolution() { return _res; }; private: enum State _state; enum Resolution _res; unsigned long _starttime; unsigned long _stoptime; unsigned long (*_gettime)(void); static unsigned long seconds() { return millis()/1000; }; }; #endif // END OF FILE
StopWatch.cpp
// // FILE: StopWatch.cpp // AUTHOR: Rob Tillaart // VERSION: 0.1.03 // PURPOSE: Simple StopWatch library for Arduino // // The library is based upon millis() and therefore // has the same restrictions as millis() has wrt overflow. // // HISTORY: // 0.1.00 - 2011-01-04 initial version // 0.1.01 - 2011-01-04 Added better state // 0.1.02 - 2011-06-15 Added state() + #defines + lib version // 0.1.03 - 2012-01-22 Added several improvements // By mromani & Rob Tillaart // // Released to the public domain // #include "StopWatch.h" StopWatch::StopWatch(enum Resolution res) { _res = res; switch(_res) { case MICROS: _gettime = micros; break; case MILLIS: _gettime = millis; break; case SECONDS: _gettime = seconds; break; default: _gettime = millis; break; } reset(); } void StopWatch::reset() { _state = StopWatch::RESET; _starttime = _stoptime = 0; } void StopWatch::start() { if (_state == StopWatch::RESET || _state == StopWatch::STOPPED) { _state = StopWatch::RUNNING; unsigned long t = _gettime(); _starttime += t - _stoptime; _stoptime = t; } } unsigned long StopWatch::value() { if (_state == StopWatch::RUNNING) _stoptime = _gettime(); return _stoptime - _starttime; } void StopWatch::stop() { if (_state == StopWatch::RUNNING) { _state = StopWatch::STOPPED; _stoptime = _gettime(); } } bool StopWatch::isRunning() { return (_state == StopWatch::RUNNING); } enum StopWatch::State StopWatch::state() { return _state; } // END OF FILE