rims-arduino-library  v3.1.1
Recirculation infusion mash system library for Arduino
Rims.h
Go to the documentation of this file.
1 
56 #ifndef Rims_h
57 #define Rims_h
58 
59 // -------------------------- OPTIONAL EXTENSIONS ------------------------------
61 #define WITH_W25QFLASH
62 // -----------------------------------------------------------------------------
63 
65 #define SAMPLETIME 1000
66 #define SSRWINDOWSIZE 5000
68 
70 #define DEFAULTSP 68
71 #define DEFAULTTIME 5400
73 
75 #define PROBE_RTD 0
76 #define PROBE_THERM 1
78 #define PROBE_CUSTOM 2
80 
81 #define DEFAULTPROBETYPE PROBE_RTD
82 #define DEFAULTPROBE0 -247.1087
83 #define DEFAULTPROBE1 2.23511
84 #define DEFAULTPROBE2 0.001659
85 #define DEFAULTPROBE3 0.0
86 #define DEFAULTRES1 124.5
87 
89 #define RTDAMPGAIN 5.0
90 #define RTDAMPREF 2.5
92 #define TEMPSUPPLY 5.0
94 #define ADCFILTERTAU 30.0
96 
99 #define MAXTEMPVAR 1.0
100 #define SCREENSWITCHTIME 10000
102 
105 #define NOTIMELIMIT 4E9
106 
108 #define DEFAULTFLOWLOWBOUND 3.0
109 #define DEFAULTFLOWUPBOUND 5.0
111 
113 #define ADDRSESSIONTABLE 0x000000 // 1st sector
114 #define ADDRDATACOUNT 0x001000 // 2nd sector
116 #define ADDRBREWDATA 0x002000 // 3rd sector
118 #define BYTESPERDATA 20
120 #define MEMSIZEBYTES 1048576
122 
123 #include "Arduino.h"
124 #include "utility/UIRims.h"
125 #include "utility/PID_v1mod.h"
126 #include "utility/w25qflash.h"
127 
128 
130 void isrFlow();
132 extern volatile unsigned long g_flowLastTime;
134 extern volatile unsigned long g_flowCurTime;
135 
145 class Rims
146 {
147  friend class RimsIdent;
148  friend class RimsTuner;
149 
150 public:
151  Rims(UIRims* uiRims, byte analogPinPV, byte ssrPin,
152  double* currentTemp, double* ssrControl, double* settedTemp);
153 
154  void setTempProbe(byte probeType, float probeCoefs[],float res1);
155  void setPinLED(byte pinLED);
156  void setFlowSensor(byte pinFlow, float flowFactor,
157  float lowBound = DEFAULTFLOWLOWBOUND,
158  float upBound = DEFAULTFLOWUPBOUND,
159  float criticalFlow = DEFAULTFLOWLOWBOUND);
160  void setHeaterPowerDetect(char pinHeaterVolt);
161 
162  void setTuningPID(float Kp, float Ki, float Kd, float tauFilter,
163  int mashWaterQty = -1);
164 #ifdef WITH_W25QFLASH
165  void setMemCSPin(byte csPin);
166  void checkMemAccessMode();
167 #endif
168 
169  void run();
170 
171  float getTempPV();
172  float getFlow();
173  bool getHeaterVoltage();
174 
175  void stopHeating(bool state);
176 
177 protected:
178 
179  virtual void _initialize();
180  void _initSession();
181  void _endSession();
182 
183  virtual void _iterate();
184  void _refreshTimer();
185  void _refreshDisplay();
186  void _refreshSSR();
187  void _serialPrintBrewData();
188 
189 #ifdef WITH_W25QFLASH
190  unsigned int _memCountSessions();
191  unsigned long _memCountSessionData();
192  void _memInitSP();
193  void _memAddBrewData();
194  void _memDumpBrewData();
195  void _memFreeSpace();
196  void _memClearAll();
197 #endif
198 
199 private:
200 
201  // ===GENERAL===
202  UIRims* _ui;
203  PIDmod _myPID;
204  byte _analogPinPV;
205  byte _pinCV;
206  byte _pinLED;
207  char _pinHeaterVolt;
208 #ifdef WITH_W25QFLASH
209  W25QFlash _myMem;
210 #endif
211 
212  // ===STATE DATAS===
213  bool _rimsInitialized;
214  bool _noPower;
215  bool _buzzerState;
216  bool _memConnected;
217 
218  // ===MULTIPLE PIDs===
219  byte _pidQty;
220  byte _currentPID;
221  int _mashWaterValues[4];
222 
223  // ===TEMP PROBE===
224  byte _probeType;
225  float _probeCoefs[4];
226  float _res1;
227  float _filterCstADC;
228  float _lastTempADC;
229 
230  // ===PID I/O===
231  double* _setPointPtr;
232  double* _processValPtr;
233  double* _controlValPtr;
234 
235  // ===PID PARAMS===
236  float _kps[4];
237  float _kis[4];
238  float _kds[4];
239  float _tauFilter[4];
240 
241  // ===TIMER===
242  unsigned long _currentTime;
243  unsigned long _settedTime;
244  unsigned long _rimsStartTime;
245  unsigned long _windowStartTime;
246  unsigned long _runningTime;
247  unsigned long _timerRemaining;
248  unsigned long _totalStoppedTime;
249  unsigned long _timerStopTime;
250  unsigned long _timerStartTime;
251  unsigned long _lastScreenSwitchTime;
252  unsigned long _lastSampleTime;
253  bool _sumStoppedTime;
254  bool _sessionFinished;
255 
256  // ===FLOW SENSOR===
257  float _flowFactor;
258  float _flow;
259  float _criticalFlow;
260 
261 #ifdef WITH_W25QFLASH
262  // ===FLASH MEM===
263  unsigned long _memNextAddr;
264  unsigned long _memDataQty;
265 #endif
266 
267 };
272 #endif
W25QFlash class declaration and related macro.
bool getHeaterVoltage()
Check if heater is powered or not.
Definition: Rims.cpp:577
void setHeaterPowerDetect(char pinHeaterVolt)
Set pin to detect if there is voltage applied on heater.
Definition: Rims.cpp:220
void _refreshSSR()
Refresh solid state relay. SSR will be refreshed in function of _controlValPtr (duty-cycle in percent...
Definition: Rims.cpp:433
Toolkit to automatically tune PID without a process model.
Definition: RimsTuner.h:69
virtual void _iterate()
Main method called for temperature regulation and other actions at each iteration.
Definition: Rims.cpp:328
void setTempProbe(byte probeType, float probeCoefs[], float res1)
Set temperature probe (RTD, thermistor or custom) parameters.
Definition: Rims.cpp:104
void _initSession()
Init all attributes and I/O for starting a brew session.
Definition: Rims.cpp:291
#define DEFAULTFLOWUPBOUND
Default Upper bound for accepted flow rate [L/min].
Definition: Rims.h:110
void checkMemAccessMode()
Check if enterring in USB memory access mode.
Definition: RimsMem.cpp:56
void setTuningPID(float Kp, float Ki, float Kd, float tauFilter, int mashWaterQty=-1)
Set tuning for PID object.
Definition: Rims.cpp:143
volatile unsigned long g_flowCurTime
Current time interrupt is called [µSec].
Definition: Rims.cpp:13
void _refreshDisplay()
Refresh display used by UIRims instance.
Definition: Rims.cpp:412
#define DEFAULTFLOWLOWBOUND
Default lower bound for accepted flow rate [L/min].
Definition: Rims.h:108
Rims(UIRims *uiRims, byte analogPinPV, byte ssrPin, double *currentTemp, double *ssrControl, double *settedTemp)
Constructor.
Definition: Rims.cpp:45
void _memAddBrewData()
Add data point to the flash memory.
Definition: RimsMem.cpp:341
void stopHeating(bool state)
Stop heater no matter what PID output.
Definition: Rims.cpp:589
Library to handle Windbond W25Q SPI flash memory.
Definition: w25qflash.h:44
void _refreshTimer()
Refresh time related values.
Definition: Rims.cpp:377
unsigned long _memCountSessionData()
Count how many data point were taken.
Definition: RimsMem.cpp:269
void _serialPrintBrewData()
Print current data points values to the Serial logger. Serial port (UART) need to be initialized in t...
Definition: Rims.cpp:457
virtual void _initialize()
Initialize a Rims instance before starting temperature regulation.
Definition: Rims.cpp:249
void isrFlow()
ISR for flow sensor.
Definition: Rims.cpp:19
void _endSession()
Attributes treatments for ending a brew session.
Definition: Rims.cpp:313
void setMemCSPin(byte csPin)
Set pin for flash memory chip select.
Definition: RimsMem.cpp:28
Toolkit for process identification to manually calculate PID tuning.
Definition: RimsIdent.h:48
void _memInitSP()
Initialize flash memory.
Definition: RimsMem.cpp:298
float getFlow()
Get flow from hall-effect flow sensor.
Definition: Rims.cpp:557
PIDmod class declaration and related macro.
void _memDumpBrewData()
Dump brew session data on USB serial port.
Definition: RimsMem.cpp:103
Library to manage LCD and keypad for Rims library.
Definition: UIRims.h:68
void setFlowSensor(byte pinFlow, float flowFactor, float lowBound=DEFAULTFLOWLOWBOUND, float upBound=DEFAULTFLOWUPBOUND, float criticalFlow=DEFAULTFLOWLOWBOUND)
Set pin for flow sensor and parameters.
Definition: Rims.cpp:178
void _memFreeSpace()
Show free memory on flash mem via USB serial port.
Definition: RimsMem.cpp:161
volatile unsigned long g_flowLastTime
Last time interrupt was called [µSec].
Definition: Rims.cpp:12
void setPinLED(byte pinLED)
Set pin for heater LED indicator.
Definition: Rims.cpp:194
void _memClearAll()
Clear all memory via USB serial port.
Definition: RimsMem.cpp:185
UIRims class declaration and related macro.
Recirculation infusion mash system (RIMS) library for Arduino.
Definition: Rims.h:145
float getTempPV()
Get temperature from temperature probe (RTD, thermistor or custom).
Definition: Rims.cpp:493
void run()
Start and run Rims instance.
Definition: Rims.cpp:233
unsigned int _memCountSessions()
Count how many brew sessions were saved in flash mem.
Definition: RimsMem.cpp:222