Hubert_M

Untitled

Jun 4th, 2019
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.51 KB | None | 0 0
  1. #include "MUX74HC4067.h"
  2. #include <Wire.h>
  3. //#include <CmdMessenger.h>
  4.  
  5.  
  6. #define WYP 0.63 // współczynnik wypływu
  7. #define G 9.81 // przyśpieszenie ziemskie
  8. #define TM 6 // time multipler
  9. #define QM 11 // maksymalna wartość potencjometrów 1-6
  10. #define X1 0.6 // poziom 1 czujnika wody
  11. #define X2 1.3 // poziom 2 czujnika wody
  12. #define X3 1.9 // poziom 3 czujnika wody
  13. #define XT 90 // poziom czujki temperatury
  14.  
  15. byte x[14] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
  16. byte y[24] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  17. byte doWizualizacji[23] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
  18. byte odWizualizacji[10] = { 10,10,10,10,10,10,5,5,5,5 };
  19.  
  20. double data[10];
  21.  
  22.  
  23. int checkIfOk = true;
  24.  
  25. //CmdMessenger cmdMessenger = CmdMessenger(Serial);
  26.  
  27. enum
  28. {
  29. kAcknowledge,
  30. kError,
  31. kReceive,
  32. kSend,
  33. };
  34.  
  35. class Tank {
  36. public:
  37. int x1 = 0, x2 = 0, x3 = 0, xT = 0; // czujki poziomu wody i temperatury
  38. double hT = 2; // wysokość zbiornika
  39. double r = 0.5; // promień podstawy
  40. double sT = PI * r * r; // pole podstawy
  41. double vT = sT * hT; // objętość maksymalna
  42. double hW = 0.0; // obecna wysokość wody
  43. double vW = 0; // obecna objętość wody
  44. double tWp = 20; // temperatura wody poprzednia
  45. double tWn = 20; // temperatura wody następna
  46. int m = 0; // mieszadło
  47. int overflowed = 0; // alarm przelania
  48. void check() {
  49. if (hW >= hT) {
  50. hW = 2; overflowed = 1;
  51. checkIfOk = 0;
  52. }
  53. if (hW >= X1) x1 = 1;
  54. else x1 = 0;
  55. if (hW >= X2) x2 = 1;
  56. else x2 = 0;
  57. if (hW >= X3) x3 = 1;
  58. else x3 = 0;
  59. if (tWp >= XT) xT = 1;
  60. else xT = 0;
  61. vW = sT * hW;
  62. }
  63. };
  64. class Valve {
  65. public:
  66. int status = 0; // zamknięty/otwarty
  67. double r = 0.03; // promień zaworu
  68. double sV = PI * r * r; // powierzch max otworu
  69. double rSV = sV; // obecna powierzchnia otowru
  70. void qV(double x) {
  71. if (x != QM) rSV = sV / x;
  72. else rSV = 0;
  73. }
  74. };
  75. class Heater {
  76. public:
  77. int status = 0; // grzeje/nie grzeje
  78. int overheat = 0; // alarm przegrzania
  79. int p = 100; // moc grzałki w kW
  80. int oh = 0; // zmienna pomocnicza, timer przegrzania
  81. double alfa1 = 2.8; // współczynnik pierwszy do obliczeń temp
  82. double alfa2 = -0.8; // współczynnik drugi do obliczeń temp
  83. double alfa3 = 0.04; // współczynnik trzeci do obliczeń temp
  84. double tHp = 20; // temperatura grzałki poprzednia
  85. double tHn = 20; // temperatura grzałki obecna
  86. void check() {
  87. oh++;
  88. if (oh > 50) {
  89. checkIfOk = 0;
  90. overheat = 1;
  91. oh = 0;
  92. }
  93. }
  94. void dH(double x) {
  95. alfa2 = -x;
  96. }
  97. };
  98. void heat(Tank& t, Heater& h) {
  99. h.tHn = h.tHp + 0.1 * (h.p - h.alfa1 * (h.tHp - t.tWp));
  100. if (t.vW > 0)
  101. t.tWn =
  102. t.tWp +
  103. 0.1 * (h.alfa2 * 1 / t.vW * (t.tWp - h.tHp) + h.alfa3 * (t.tWp - 20));
  104. else {
  105. h.check();
  106. t.tWn += 2 ;
  107. }
  108. if (t.tWn > 100) t.tWn = 100;
  109. t.tWp = t.tWn;
  110. h.tHp = h.tHn;
  111. }
  112. void cool(Tank& t, Heater& h) {
  113. h.oh = 0;
  114. t.tWn = 20 + (t.tWp - 20) * exp(-0.017 * 1 / t.vW);
  115. t.tWp = t.tWn;
  116. h.tHp = t.tWn;
  117. }
  118. void mixTemp(Tank& tP, Tank& tS, double d) {
  119. if (d > 0)
  120. tP.tWp = (tP.vW * 997 * tP.tWp + d * tS.sT * 997 * tS.tWp) /
  121. (tP.vW * 997 + d * tS.sT * 997);
  122. }
  123. double bind(Tank t, Valve v, int s, double h = 1000) {
  124. double d, q;
  125. if (v.rSV == 0) return 0;
  126. if (h == 1000) q = WYP * v.rSV * sqrt(2 * G * (h / 1000));
  127. else q = WYP * v.rSV * sqrt(2 * G * h);
  128. d = TM * q / t.sT;
  129. if (h < 1000)
  130. if (d >= h) d = h;
  131. if (d >= h) d = h;
  132. if (s == -1) return -d;
  133. return d;
  134. }
  135. unsigned long currentTime = 0, previousTime = 0, deltaTime = 0; // if co 100ms
  136. double d1 = 0, d2 = 0, d3 = 0, d4 = 0; // przepływ wody
  137. Heater h1, h2, h3, h4; // grzałki
  138. Tank t1, t2, t3, t4; // zbiorniki
  139. Valve v1, v2, v3, v4, v5, v6; // zawory
  140. void setup() {
  141. Wire.begin();
  142. Serial.begin(9600);
  143. //cmdMessenger.attach(OnUnknownCommand);
  144. //cmdMessenger.attach(kSend, OnReceive);
  145. //Serial.print("odbuta");
  146. }
  147. void loop() {
  148.  
  149. Wire.requestFrom(8, 14);
  150. //Serial.print("REGULATOR : ");
  151. while (Wire.available()) {
  152. for (int i = 0; i < sizeof(x); i++) {
  153. x[i] = Wire.read();
  154. //Serial.print(x[i]);
  155. }
  156. }
  157. //Serial.println();
  158. //Serial.print("POZIOM : ");
  159. //Serial.println(t1.hW);
  160. currentTime = millis();
  161. if (currentTime - previousTime >= 100UL) {
  162.  
  163. (x[0] == 1) ? v1.status = 1 : v1.status = 0;
  164. (x[1] == 1) ? v2.status = 1 : v2.status = 0;
  165. (x[2] == 1) ? v3.status = 1 : v3.status = 0;
  166. (x[3] == 1) ? v4.status = 1 : v4.status = 0;
  167. (x[4] == 1) ? v5.status = 1 : v5.status = 0;
  168. (x[5] == 1) ? v6.status = 1 : v6.status = 0;
  169. (x[6] == 1) ? h1.status = 1 : h1.status = 0;
  170. (x[7] == 1) ? h2.status = 1 : h2.status = 0;
  171. (x[8] == 1) ? h3.status = 1 : h3.status = 0;
  172. (x[9] == 1) ? h4.status = 1 : h4.status = 0;
  173. (x[10] == 1) ? t1.m = 1 : t1.m = 0;
  174. (x[11] == 1) ? t2.m = 1 : t2.m = 0;
  175. (x[12] == 1) ? t3.m = 1 : t3.m = 0;
  176. (x[13] == 1) ? t4.m = 1 : t4.m = 0;
  177.  
  178. /* v1.qV(1);
  179. v2.qV(11);
  180. v3.qV(11);
  181. v4.qV(11);
  182. v5.qV(11);
  183. v6.qV(11);
  184. h1.dH(0.8);
  185. h2.dH(0.8);
  186. h3.dH(0.8);
  187. h4.dH(0.8);*/
  188. v1.qV(odWizualizacji[0]);
  189. v2.qV(odWizualizacji[1]);
  190. v3.qV(odWizualizacji[2]);
  191. v4.qV(odWizualizacji[3]);
  192. v5.qV(odWizualizacji[4]);
  193. v6.qV(odWizualizacji[5]);
  194. h1.dH(odWizualizacji[6]/100);
  195. h2.dH(odWizualizacji[7]/100);
  196. h3.dH(odWizualizacji[8]/100);
  197. h4.dH(odWizualizacji[9]/100);
  198. if (v1.status == 1) d1 += bind(t1, v1, 1);
  199. if (v2.status == 1) d1 += bind(t1, v2, -1, t1.hW);
  200. if (v2.status == 1) d2 += bind(t2, v2, 1, t1.hW);
  201. if (h2.status == 1) mixTemp(t2, t1, d2);
  202. t1.hW += d1; d1 = 0;
  203. if (v3.status == 1) d1 += bind(t1, v3, -1, t1.hW);
  204. if (v4.status == 1) d2 += bind(t2, v4, -1, t2.hW);
  205. if (v3.status == 1) d3 += bind(t3, v3, 1, t1.hW);
  206. if (h3.status == 1) mixTemp(t3, t1, d3);
  207. if (v5.status == 1) d3 += bind(t3, v5, -1, t3.hW);
  208. if (v4.status == 1) d4 += bind(t4, v4, 1, t2.hW);
  209. if (h4.status == 1) mixTemp(t4, t2, d4);
  210. t4.hW += d4; d4 = 0;
  211. if (v5.status == 1) d4 += bind(t4, v5, 1, t3.hW);
  212. if (h4.status == 1) mixTemp(t4, t3, d4);
  213. if (v6.status == 1) d4 += bind(t4, v6, -1, t4.hW);
  214. t1.hW += d1; t2.hW += d2; t3.hW += d3; t4.hW += d4;
  215. t1.check(); t2.check(); t3.check(); t4.check();
  216. if (h1.status == 1) heat(t1, h1);
  217. else cool(t1, h1);
  218. if (h2.status == 1) heat(t2, h2);
  219. else cool(t2, h2);
  220. if (h3.status == 1) heat(t3, h3);
  221. else cool(t3, h3);
  222. if (h4.status == 1) heat(t4, h4);
  223. else cool(t4, h4);
  224. d1 = 0; d2 = 0; d3 = 0; d4 = 0;
  225. previousTime = currentTime;
  226. }
  227.  
  228.  
  229. Wire.requestFrom(9, 10);
  230. Serial.print("WIZUALIZACJA : ");
  231. while (Wire.available()) {
  232. for (int i = 0; i < sizeof(odWizualizacji); i++) {
  233. odWizualizacji[i] = Wire.read();
  234. if(odWizualizacji[i] == 0 && i < 6)
  235. odWizualizacji[i] = 11;
  236. if(odWizualizacji[i] == 0 && i > 6)
  237. odWizualizacji[i] = 5;
  238. Serial.print(odWizualizacji[i]);
  239. Serial.print(" | ");
  240. }
  241. }
  242. Serial.println();
  243.  
  244.  
  245.  
  246.  
  247.  
  248. Wire.beginTransmission(9);
  249. Wire.write(doWizualizacji,23);
  250. Wire.endTransmission();
  251.  
  252. Wire.beginTransmission(8);
  253.  
  254. y[0] = t1.x1;
  255. y[1] = t1.x2;
  256. y[2] = t1.x3;
  257.  
  258. y[3] = t2.x1;
  259. y[4] = t2.x2;
  260. y[5] = t2.x3;
  261.  
  262. y[6] = t3.x1;
  263. y[7] = t3.x2;
  264. y[8] = t3.x3;
  265.  
  266. y[9] = t4.x1;
  267. y[10] = t4.x2;
  268. y[11] = t4.x3;
  269.  
  270. y[12] = t1.xT;
  271. y[13] = t2.xT;
  272. y[14] = t3.xT;
  273. y[15] = t4.xT;
  274.  
  275. x[16] = checkIfOk;
  276.  
  277. Wire.write(y,17);
  278. Wire.endTransmission();
  279.  
  280. //Serial.print("XD");
  281. //cmdMessenger.feedinSerialData();
  282. //OnSend();
  283.  
  284. doWizualizacji[0] = v1.status;
  285. doWizualizacji[1] = v2.status;
  286. doWizualizacji[2] = v3.status;
  287. doWizualizacji[3] = v4.status;
  288. doWizualizacji[4] = v5.status;
  289. doWizualizacji[5] = v6.status;
  290.  
  291. doWizualizacji[6] = t1.m;
  292. doWizualizacji[7] = t2.m;
  293. doWizualizacji[8] = t3.m;
  294. doWizualizacji[9] = t4.m;
  295.  
  296. doWizualizacji[10] = h1.status;
  297. doWizualizacji[11] = h2.status;
  298. doWizualizacji[12] = h3.status;
  299. doWizualizacji[13] = h4.status;
  300.  
  301. doWizualizacji[14] = t1.hW * 100;
  302. doWizualizacji[15] = t1.tWp;
  303.  
  304. doWizualizacji[16] = t2.hW * 100;
  305. doWizualizacji[17] = t2.tWp;
  306.  
  307. doWizualizacji[18] = t3.hW * 100;
  308. doWizualizacji[19] = t3.tWp;
  309.  
  310. doWizualizacji[20] = t4.hW * 100;
  311. doWizualizacji[21] = t4.tWp;
  312.  
  313. doWizualizacji[22] = checkIfOk;
  314. }
Add Comment
Please, Sign In to add comment