diff --git a/StateHandler/.cproject b/StateHandler/.cproject
index 289e85d..90bc713 100644
--- a/StateHandler/.cproject
+++ b/StateHandler/.cproject
@@ -49,6 +49,7 @@
+
@@ -73,6 +74,7 @@
+
@@ -90,6 +92,7 @@
+
@@ -153,6 +156,7 @@
+
@@ -178,6 +182,7 @@
+
@@ -195,6 +200,7 @@
+
diff --git a/StateHandler/.project b/StateHandler/.project
index 428ff80..e3443fd 100644
--- a/StateHandler/.project
+++ b/StateHandler/.project
@@ -6,6 +6,7 @@
lpc_chip_15xx
DigitalIoPin
LiquidCrystal
+ Timer
diff --git a/StateHandler/inc/StateHandler.h b/StateHandler/inc/StateHandler.h
index 20ca0e6..6f43451 100644
--- a/StateHandler/inc/StateHandler.h
+++ b/StateHandler/inc/StateHandler.h
@@ -18,12 +18,13 @@
#include "Counter.h"
#include "DigitalIoPin.h"
#include "Event.h"
+#include "GMP252.h"
+#include "HMP60.h"
#include "LiquidCrystal.h"
#include "ModbusMaster.h"
#include "ModbusRegister.h"
-#include "GMP252.h"
-#include "HMP60.h"
#include "PressureWrapper.h"
+#include "Timer.h"
/** Buttons enumeration
*
@@ -76,7 +77,8 @@ typedef void (StateHandler::*state_pointer) (const Event &);
class StateHandler
{
public:
- StateHandler (LiquidCrystal *lcd, ModbusRegister *A01, PressureWrapper *pressure);
+ StateHandler (LiquidCrystal *lcd, ModbusRegister *A01,
+ PressureWrapper *pressure, Timer *global);
virtual ~StateHandler ();
/** Get currently set pressure
@@ -120,16 +122,17 @@ private:
* weigh of fan, so voltage within range of 0-89 is not
* sufficient to start motor.
* TODO: Value 89 should be scaled to 0 at some point */
- Counter fan_speed = {20, 1000};
+ Counter fan_speed = { 20, 1000 };
/*integral controller for PID. should be global, since it
* accumulates error signals encountered since startup*/
int integral = 0;
int saved_set_value[2] = { 0, 0 };
int saved_curr_value[2] = { 0, 0 };
- int sensors_data[4] = {0};
+ int sensors_data[4] = { 0 };
LiquidCrystal *_lcd;
ModbusRegister *A01;
- PressureWrapper * pressure;
+ PressureWrapper *pressure;
+ Timer *state_timer;
/* CO2 sensor object */
GMP252 co2;
diff --git a/StateHandler/src/StateHandler.cpp b/StateHandler/src/StateHandler.cpp
index 40cd323..a0f0d98 100644
--- a/StateHandler/src/StateHandler.cpp
+++ b/StateHandler/src/StateHandler.cpp
@@ -8,11 +8,13 @@
#include
#define PID 0
-StateHandler::StateHandler (LiquidCrystal *lcd, ModbusRegister *A01, PressureWrapper *pressure)
+StateHandler::StateHandler (LiquidCrystal *lcd, ModbusRegister *A01,
+ PressureWrapper *pressure, Timer *global)
{
this->_lcd = lcd;
this->A01 = A01;
this->pressure = pressure;
+ this->state_timer = global;
current = &StateHandler::stateInit;
(this->*current) (Event (Event::eEnter));
current_mode = MANUAL;
@@ -79,7 +81,7 @@ StateHandler::stateInit (const Event &event)
switch (event.type)
{
case Event::eEnter:
- SetState(&StateHandler::stateSensors);
+ SetState (&StateHandler::stateSensors);
break;
case Event::eExit:
_lcd->clear ();
@@ -107,14 +109,14 @@ StateHandler::stateManual (const Event &event)
{
case Event::eEnter:
displaySet (saved_set_value[MANUAL], saved_curr_value[MANUAL]);
- this->A01->write(this->value[FAN_SPEED].getCurrent ());
+ this->A01->write (this->value[FAN_SPEED].getCurrent ());
break;
case Event::eExit:
_lcd->clear ();
break;
case Event::eKey:
handleControlButtons (event.value);
- this->A01->write(value[MANUAL].getCurrent() * 10);
+ this->A01->write (value[MANUAL].getCurrent () * 10);
break;
case Event::eTick:
save (event.value, MANUAL);
@@ -139,17 +141,20 @@ StateHandler::stateAuto (const Event &event)
case Event::eTick:
save (event.value, AUTO);
#if PID
- pid();
- this->A01->write(fan_speed.getCurrent());
+ pid ();
+ this->A01->write (fan_speed.getCurrent ());
#endif
#if !PID
- if(saved_curr_value[AUTO] < saved_set_value[AUTO]) {
- fan_speed.inc();
- this->A01->write(fan_speed.getCurrent());
- } else if(saved_curr_value[AUTO] > saved_set_value[AUTO]){
- fan_speed.dec();
- this->A01->write(fan_speed.getCurrent());
- }
+ if (saved_curr_value[AUTO] < saved_set_value[AUTO])
+ {
+ fan_speed.inc ();
+ this->A01->write (fan_speed.getCurrent ());
+ }
+ else if (saved_curr_value[AUTO] > saved_set_value[AUTO])
+ {
+ fan_speed.dec ();
+ this->A01->write (fan_speed.getCurrent ());
+ }
#endif
break;
}
@@ -159,33 +164,36 @@ void
StateHandler::stateSensors (const Event &event)
{
switch (event.type)
- {
- case Event::eEnter:
- break;
- case Event::eExit:
- break;
- case Event::eKey:
- break;
- case Event::eTick:
- sensors_data[PRESSUREDAT] = pressure->getPressure();
- sensors_data[TEMPERATURE] = humidity.readT();
- sensors_data[HUMIDITY] = humidity.readRH();
- sensors_data[CO2] = co2.read();
+ {
+ case Event::eEnter:
+ break;
+ case Event::eExit:
+ break;
+ case Event::eKey:
+ break;
+ case Event::eTick:
+ sensors_data[PRESSUREDAT] = pressure->getPressure ();
+ sensors_data[TEMPERATURE] = humidity.readT ();
+ sensors_data[HUMIDITY] = humidity.readRH ();
+ sensors_data[CO2] = co2.read ();
#if 1
- char line_up[16] = { 0 };
- char line_down[16] = { 0 };
- snprintf (line_up, 16, "PRE:%02d TEM:%02d", sensors_data[PRESSUREDAT],sensors_data[TEMPERATURE]);
- snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY], sensors_data[CO2]);
+ char line_up[16] = { 0 };
+ char line_down[16] = { 0 };
+ snprintf (line_up, 16, "PRE:%02d TEM:%02d", sensors_data[PRESSUREDAT],
+ sensors_data[TEMPERATURE]);
+ snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY],
+ sensors_data[CO2]);
- _lcd->clear ();
- _lcd->setCursor (0, 0);
- _lcd->print (line_up);
- _lcd->setCursor (0, 1);
- _lcd->print (line_down);
+ _lcd->clear ();
+ _lcd->setCursor (0, 0);
+ _lcd->print (line_up);
+ _lcd->setCursor (0, 1);
+ _lcd->print (line_down);
#endif
- SetState (current_mode? &StateHandler::stateAuto : &StateHandler::stateManual);
- break;
- }
+ SetState (current_mode ? &StateHandler::stateAuto
+ : &StateHandler::stateManual);
+ break;
+ }
}
void
@@ -212,13 +220,12 @@ void
StateHandler::save (int eventValue, size_t mode)
{
/* if pressure is not provided from main it checks it in following if{}*/
- if(!eventValue) {
- /* Small delay for modbus communications with pressure sensor */
- int i = 0;
- while(i<720) i++;
- i = 0;
- eventValue = pressure->getPressure();
- }
+ if (!eventValue)
+ {
+ /* Small delay for modbus communications with pressure sensor */
+ state_timer->tickCounter (1);
+ eventValue = pressure->getPressure ();
+ }
int counterValue = value[mode].getCurrent ();
if (saved_curr_value[mode] != eventValue
|| saved_set_value[mode] != counterValue)
@@ -229,13 +236,14 @@ StateHandler::save (int eventValue, size_t mode)
}
}
-void StateHandler::pid () {
- float kP = 0.1, kI = 0.01, kD = 0.01;
- int error = 0, last_error = 0, derivative = 0;
- error = saved_set_value[AUTO] - saved_curr_value[AUTO];
- last_error = error;
- integral += error;
- derivative = error - last_error;
- fan_speed.setInit((kP*error) + (kI*integral) + (kD * derivative));
+void
+StateHandler::pid ()
+{
+ float kP = 0.1, kI = 0.01, kD = 0.01;
+ int error = 0, last_error = 0, derivative = 0;
+ error = saved_set_value[AUTO] - saved_curr_value[AUTO];
+ last_error = error;
+ integral += error;
+ derivative = error - last_error;
+ fan_speed.setInit ((kP * error) + (kI * integral) + (kD * derivative));
}
-
diff --git a/esp-vent-main/src/esp-vent-main.cpp b/esp-vent-main/src/esp-vent-main.cpp
index c8fda08..47771f5 100644
--- a/esp-vent-main/src/esp-vent-main.cpp
+++ b/esp-vent-main/src/esp-vent-main.cpp
@@ -17,12 +17,12 @@
#endif
#include "DigitalIoPin.h"
+#include "I2C.h"
#include "LiquidCrystal.h"
+#include "PressureWrapper.h"
#include "StateHandler.h"
#include "SwitchController.h"
#include "Timer.h"
-#include "PressureWrapper.h"
-#include "I2C.h"
#include
@@ -60,15 +60,14 @@ main (void)
lcd.print ("Test");
/* FAN object */
- ModbusMaster fan(1);
- fan.begin(9600);
- ModbusRegister A01(&fan, 0);
-// ModbusRegister DI1(&fan, 4, false);
+ ModbusMaster fan (1);
+ fan.begin (9600);
+ ModbusRegister A01 (&fan, 0);
+ // ModbusRegister DI1(&fan, 4, false);
PressureWrapper sens;
-
- StateHandler ventMachine (&lcd, &A01, &sens);
+ StateHandler ventMachine (&lcd, &A01, &sens, &glob_time);
/** Common pins */
DigitalIoPin b_up (0, 7, true, true, true); // A5
SwitchController sw_up (&b_up, &glob_time, &ventMachine, BUTTON_CONTROL_UP);
@@ -81,7 +80,6 @@ main (void)
SwitchController sw_toggle (&b_toggle, &glob_time, &ventMachine,
BUTTON_CONTROL_TOG_MODE);
-
int pressure = 0, pressure_time = 0;
while (1)
{
@@ -100,7 +98,7 @@ main (void)
}
++pressure_time;
#endif
- ventMachine.HandleState (Event (Event::eTick, pressure));
+ ventMachine.HandleState (Event (Event::eTick, pressure));
glob_time.tickCounter (1);
}