Merge pull request #35 from vas-dav/state-timer

State-timer
This commit is contained in:
Evgenii Meshcheriakov 2022-10-22 10:19:31 +03:00 committed by GitHub
commit 5dd5093d55
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 85 additions and 69 deletions

View File

@ -49,6 +49,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.cpp.misc.dialect.1047276372" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/> <option id="com.crt.advproject.cpp.misc.dialect.1047276372" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/>
<inputType id="com.crt.advproject.compiler.cpp.input.1472075573" superClass="com.crt.advproject.compiler.cpp.input"/> <inputType id="com.crt.advproject.compiler.cpp.input.1472075573" superClass="com.crt.advproject.compiler.cpp.input"/>
@ -73,6 +74,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.c.misc.dialect.1367957643" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/> <option id="com.crt.advproject.c.misc.dialect.1367957643" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.hdrlib.1476293714" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/> <option id="com.crt.advproject.gcc.hdrlib.1476293714" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/>
@ -90,6 +92,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.gas.hdrlib.925707249" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/> <option id="com.crt.advproject.gas.hdrlib.925707249" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gas.specs.1146689581" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/> <option id="com.crt.advproject.gas.specs.1146689581" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/>
@ -153,6 +156,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.cpp.misc.dialect.2103564035" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/> <option id="com.crt.advproject.cpp.misc.dialect.2103564035" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/>
<option id="com.crt.advproject.cpp.hdrlib.1905759872" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/> <option id="com.crt.advproject.cpp.hdrlib.1905759872" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/>
@ -178,6 +182,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.c.misc.dialect.1578394517" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/> <option id="com.crt.advproject.c.misc.dialect.1578394517" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.hdrlib.339012185" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/> <option id="com.crt.advproject.gcc.hdrlib.339012185" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/>
@ -195,6 +200,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DigitalIoPin/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/LiquidCrystal/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Timer/inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.gas.hdrlib.1849085416" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/> <option id="com.crt.advproject.gas.hdrlib.1849085416" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gas.specs.451573115" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/> <option id="com.crt.advproject.gas.specs.451573115" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/>

View File

@ -6,6 +6,7 @@
<project>lpc_chip_15xx</project> <project>lpc_chip_15xx</project>
<project>DigitalIoPin</project> <project>DigitalIoPin</project>
<project>LiquidCrystal</project> <project>LiquidCrystal</project>
<project>Timer</project>
</projects> </projects>
<buildSpec> <buildSpec>
<buildCommand> <buildCommand>

View File

@ -18,12 +18,13 @@
#include "Counter.h" #include "Counter.h"
#include "DigitalIoPin.h" #include "DigitalIoPin.h"
#include "Event.h" #include "Event.h"
#include "GMP252.h"
#include "HMP60.h"
#include "LiquidCrystal.h" #include "LiquidCrystal.h"
#include "ModbusMaster.h" #include "ModbusMaster.h"
#include "ModbusRegister.h" #include "ModbusRegister.h"
#include "GMP252.h"
#include "HMP60.h"
#include "PressureWrapper.h" #include "PressureWrapper.h"
#include "Timer.h"
/** Buttons enumeration /** Buttons enumeration
* *
@ -76,7 +77,8 @@ typedef void (StateHandler::*state_pointer) (const Event &);
class StateHandler class StateHandler
{ {
public: public:
StateHandler (LiquidCrystal *lcd, ModbusRegister *A01, PressureWrapper *pressure); StateHandler (LiquidCrystal *lcd, ModbusRegister *A01,
PressureWrapper *pressure, Timer *global);
virtual ~StateHandler (); virtual ~StateHandler ();
/** Get currently set pressure /** Get currently set pressure
@ -120,16 +122,17 @@ private:
* weigh of fan, so voltage within range of 0-89 is not * weigh of fan, so voltage within range of 0-89 is not
* sufficient to start motor. * sufficient to start motor.
* TODO: Value 89 should be scaled to 0 at some point */ * 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 /*integral controller for PID. should be global, since it
* accumulates error signals encountered since startup*/ * accumulates error signals encountered since startup*/
int integral = 0; int integral = 0;
int saved_set_value[2] = { 0, 0 }; int saved_set_value[2] = { 0, 0 };
int saved_curr_value[2] = { 0, 0 }; int saved_curr_value[2] = { 0, 0 };
int sensors_data[4] = {0}; int sensors_data[4] = { 0 };
LiquidCrystal *_lcd; LiquidCrystal *_lcd;
ModbusRegister *A01; ModbusRegister *A01;
PressureWrapper * pressure; PressureWrapper *pressure;
Timer *state_timer;
/* CO2 sensor object */ /* CO2 sensor object */
GMP252 co2; GMP252 co2;

View File

@ -8,11 +8,13 @@
#include <StateHandler.h> #include <StateHandler.h>
#define PID 0 #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->_lcd = lcd;
this->A01 = A01; this->A01 = A01;
this->pressure = pressure; this->pressure = pressure;
this->state_timer = global;
current = &StateHandler::stateInit; current = &StateHandler::stateInit;
(this->*current) (Event (Event::eEnter)); (this->*current) (Event (Event::eEnter));
current_mode = MANUAL; current_mode = MANUAL;
@ -79,7 +81,7 @@ StateHandler::stateInit (const Event &event)
switch (event.type) switch (event.type)
{ {
case Event::eEnter: case Event::eEnter:
SetState(&StateHandler::stateSensors); SetState (&StateHandler::stateSensors);
break; break;
case Event::eExit: case Event::eExit:
_lcd->clear (); _lcd->clear ();
@ -107,14 +109,14 @@ StateHandler::stateManual (const Event &event)
{ {
case Event::eEnter: case Event::eEnter:
displaySet (saved_set_value[MANUAL], saved_curr_value[MANUAL]); 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; break;
case Event::eExit: case Event::eExit:
_lcd->clear (); _lcd->clear ();
break; break;
case Event::eKey: case Event::eKey:
handleControlButtons (event.value); handleControlButtons (event.value);
this->A01->write(value[MANUAL].getCurrent() * 10); this->A01->write (value[MANUAL].getCurrent () * 10);
break; break;
case Event::eTick: case Event::eTick:
save (event.value, MANUAL); save (event.value, MANUAL);
@ -139,17 +141,20 @@ StateHandler::stateAuto (const Event &event)
case Event::eTick: case Event::eTick:
save (event.value, AUTO); save (event.value, AUTO);
#if PID #if PID
pid(); pid ();
this->A01->write(fan_speed.getCurrent()); this->A01->write (fan_speed.getCurrent ());
#endif #endif
#if !PID #if !PID
if(saved_curr_value[AUTO] < saved_set_value[AUTO]) { if (saved_curr_value[AUTO] < saved_set_value[AUTO])
fan_speed.inc(); {
this->A01->write(fan_speed.getCurrent()); fan_speed.inc ();
} else if(saved_curr_value[AUTO] > saved_set_value[AUTO]){ this->A01->write (fan_speed.getCurrent ());
fan_speed.dec(); }
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 #endif
break; break;
} }
@ -159,33 +164,36 @@ void
StateHandler::stateSensors (const Event &event) StateHandler::stateSensors (const Event &event)
{ {
switch (event.type) switch (event.type)
{ {
case Event::eEnter: case Event::eEnter:
break; break;
case Event::eExit: case Event::eExit:
break; break;
case Event::eKey: case Event::eKey:
break; break;
case Event::eTick: case Event::eTick:
sensors_data[PRESSUREDAT] = pressure->getPressure(); sensors_data[PRESSUREDAT] = pressure->getPressure ();
sensors_data[TEMPERATURE] = humidity.readT(); sensors_data[TEMPERATURE] = humidity.readT ();
sensors_data[HUMIDITY] = humidity.readRH(); sensors_data[HUMIDITY] = humidity.readRH ();
sensors_data[CO2] = co2.read(); sensors_data[CO2] = co2.read ();
#if 1 #if 1
char line_up[16] = { 0 }; char line_up[16] = { 0 };
char line_down[16] = { 0 }; char line_down[16] = { 0 };
snprintf (line_up, 16, "PRE:%02d TEM:%02d", sensors_data[PRESSUREDAT],sensors_data[TEMPERATURE]); snprintf (line_up, 16, "PRE:%02d TEM:%02d", sensors_data[PRESSUREDAT],
snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY], sensors_data[CO2]); sensors_data[TEMPERATURE]);
snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY],
sensors_data[CO2]);
_lcd->clear (); _lcd->clear ();
_lcd->setCursor (0, 0); _lcd->setCursor (0, 0);
_lcd->print (line_up); _lcd->print (line_up);
_lcd->setCursor (0, 1); _lcd->setCursor (0, 1);
_lcd->print (line_down); _lcd->print (line_down);
#endif #endif
SetState (current_mode? &StateHandler::stateAuto : &StateHandler::stateManual); SetState (current_mode ? &StateHandler::stateAuto
break; : &StateHandler::stateManual);
} break;
}
} }
void void
@ -212,13 +220,12 @@ void
StateHandler::save (int eventValue, size_t mode) StateHandler::save (int eventValue, size_t mode)
{ {
/* if pressure is not provided from main it checks it in following if{}*/ /* if pressure is not provided from main it checks it in following if{}*/
if(!eventValue) { if (!eventValue)
/* Small delay for modbus communications with pressure sensor */ {
int i = 0; /* Small delay for modbus communications with pressure sensor */
while(i<720) i++; state_timer->tickCounter (1);
i = 0; eventValue = pressure->getPressure ();
eventValue = pressure->getPressure(); }
}
int counterValue = value[mode].getCurrent (); int counterValue = value[mode].getCurrent ();
if (saved_curr_value[mode] != eventValue if (saved_curr_value[mode] != eventValue
|| saved_set_value[mode] != counterValue) || saved_set_value[mode] != counterValue)
@ -229,13 +236,14 @@ StateHandler::save (int eventValue, size_t mode)
} }
} }
void StateHandler::pid () { void
float kP = 0.1, kI = 0.01, kD = 0.01; StateHandler::pid ()
int error = 0, last_error = 0, derivative = 0; {
error = saved_set_value[AUTO] - saved_curr_value[AUTO]; float kP = 0.1, kI = 0.01, kD = 0.01;
last_error = error; int error = 0, last_error = 0, derivative = 0;
integral += error; error = saved_set_value[AUTO] - saved_curr_value[AUTO];
derivative = error - last_error; last_error = error;
fan_speed.setInit((kP*error) + (kI*integral) + (kD * derivative)); integral += error;
derivative = error - last_error;
fan_speed.setInit ((kP * error) + (kI * integral) + (kD * derivative));
} }

View File

@ -17,12 +17,12 @@
#endif #endif
#include "DigitalIoPin.h" #include "DigitalIoPin.h"
#include "I2C.h"
#include "LiquidCrystal.h" #include "LiquidCrystal.h"
#include "PressureWrapper.h"
#include "StateHandler.h" #include "StateHandler.h"
#include "SwitchController.h" #include "SwitchController.h"
#include "Timer.h" #include "Timer.h"
#include "PressureWrapper.h"
#include "I2C.h"
#include <cr_section_macros.h> #include <cr_section_macros.h>
@ -60,15 +60,14 @@ main (void)
lcd.print ("Test"); lcd.print ("Test");
/* FAN object */ /* FAN object */
ModbusMaster fan(1); ModbusMaster fan (1);
fan.begin(9600); fan.begin (9600);
ModbusRegister A01(&fan, 0); ModbusRegister A01 (&fan, 0);
// ModbusRegister DI1(&fan, 4, false); // ModbusRegister DI1(&fan, 4, false);
PressureWrapper sens; PressureWrapper sens;
StateHandler ventMachine (&lcd, &A01, &sens, &glob_time);
StateHandler ventMachine (&lcd, &A01, &sens);
/** Common pins */ /** Common pins */
DigitalIoPin b_up (0, 7, true, true, true); // A5 DigitalIoPin b_up (0, 7, true, true, true); // A5
SwitchController sw_up (&b_up, &glob_time, &ventMachine, BUTTON_CONTROL_UP); 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, SwitchController sw_toggle (&b_toggle, &glob_time, &ventMachine,
BUTTON_CONTROL_TOG_MODE); BUTTON_CONTROL_TOG_MODE);
int pressure = 0, pressure_time = 0; int pressure = 0, pressure_time = 0;
while (1) while (1)
{ {
@ -100,7 +98,7 @@ main (void)
} }
++pressure_time; ++pressure_time;
#endif #endif
ventMachine.HandleState (Event (Event::eTick, pressure)); ventMachine.HandleState (Event (Event::eTick, pressure));
glob_time.tickCounter (1); glob_time.tickCounter (1);
} }