| 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
