PeristatiqueV2.ino 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. #include <BlynkSimpleEsp8266.h>
  2. #include <TimeLib.h>
  3. #include <WidgetRTC.h>
  4. #define AQUAGRA
  5. //#define AQUAZOA
  6. #ifdef AQUAGRA
  7. char auth[] = "_Fw7V6o4bPAovQ1idbetFcith6LmMnyh"; //220L
  8. #elif AQUAZOA
  9. char auth[] = "oObIhJsLplCUAhCBfwyvpBF_n_N8oqJv"; //70L
  10. #endif
  11. char ssid[] = "Livebox-7C2C";
  12. char pass[] = "566C61F61F9C925C9F3D7D79E6";
  13. WidgetRTC rtc;
  14. BlynkTimer timer;
  15. WidgetTerminal terminal(V60);
  16. //************************************************************************
  17. // Variable Global perso
  18. //************************************************************************
  19. #ifdef AQUAGRA
  20. #define RESERVE 1200
  21. #define LITRE 220
  22. #define FACTEURML 635 //Temps d'allumage de la pompe en ms pour distribuer 1ml
  23. #define RESERVEMIN 100
  24. #define STARTCa 16
  25. #define STARTKh 30
  26. #define STARTMg 7
  27. #elif AQUAZOA
  28. #define RESERVE 450
  29. #define LITRE 70
  30. #define FACTEURML 200//todo //Temps d'allumage de la pompe en ms pour distribuer 1ml
  31. #define RESERVEMIN 50
  32. #define STARTCa 16
  33. #define STARTKh 30
  34. #define STARTMg 7
  35. #endif
  36. #define POMPE0 0
  37. #define POMPE1 1
  38. #define POMPE2 2
  39. #define POMPE3 3
  40. //nombre de ml a distribuer pour remonter de +1 (mg ou kh) par litre d'eau
  41. #define FACTEUR0 0.0057 //FACTEUR CA
  42. #define FACTEUR1 0.36 //0.36ml/L = +1KH
  43. #define FACTEUR3 0.02 //FACTEUR MG
  44. const int PINPOMPE0 = 16;
  45. const int PINPOMPE1 = 5;
  46. const int PINPOMPE2 = 4;
  47. const int PINPOMPE3 = 0;
  48. float Mesure0, Mesure1, Mesure2, Mesure3;
  49. float ML0, ML1, ML2, ML3 ;
  50. float Cible0, Cible1, Cible2, Cible3 ;
  51. bool Auto0, Auto1, Auto2, Auto3 ;
  52. float Reserve0, Reserve1, Reserve2, Reserve3 ;
  53. float MLForce0, MLForce1, MLForce2, MLForce3 ;
  54. int dist;
  55. //************************************************************************
  56. // Fonction Seul
  57. //************************************************************************
  58. void Ft_Timer() {
  59. int Hmin = hour() * 60 + minute();
  60. switch(Hmin){
  61. case 0: //Calcium
  62. dist=0;
  63. AutoDistribue0(ML0);
  64. break;
  65. case 360: //Calcium
  66. dist=1;
  67. AutoDistribue0(ML0);
  68. break;
  69. case 720: //Calcium
  70. dist=2;
  71. AutoDistribue0(ML0);
  72. break;
  73. case 1080: //Calcium
  74. dist=3;
  75. AutoDistribue0(ML0);
  76. break;
  77. case 90: //KH
  78. dist=0;
  79. AutoDistribue1(ML1);
  80. break;
  81. case 450: //KH
  82. dist=1;
  83. AutoDistribue1(ML1);
  84. break;
  85. case 810: //KH
  86. dist=2;
  87. AutoDistribue1(ML1);
  88. break;
  89. case 1170: //KH
  90. dist=3;
  91. AutoDistribue1(ML1);
  92. break;
  93. case 180: //mineral
  94. dist=0;
  95. AutoDistribue2(ML2);
  96. break;
  97. case 540: //mineral
  98. dist=1;
  99. AutoDistribue2(ML2);
  100. break;
  101. case 900: //mineral
  102. dist=2;
  103. AutoDistribue2(ML2);
  104. break;
  105. case 1260: //mineral
  106. dist=3;
  107. AutoDistribue2(ML2);
  108. break;
  109. case 270://mg
  110. dist=0;
  111. AutoDistribue3(ML3);
  112. break;
  113. case 630://mg
  114. dist=1;
  115. AutoDistribue3(ML3);
  116. break;
  117. case 990://mg
  118. dist=2;
  119. AutoDistribue3(ML3);
  120. break;
  121. case 1350://mg
  122. dist=3;
  123. AutoDistribue3(ML3);
  124. break;
  125. }
  126. }
  127. BLYNK_CONNECTED() {
  128. char message[30];
  129. sprintf(message, "\nnew Connection\n");
  130. terminal.print(message);
  131. terminal.flush();
  132. rtc.begin();
  133. Blynk.syncAll();
  134. }
  135. BLYNK_WRITE(V60){
  136. if (String("Ca") == param.asStr()){
  137. Blynk.virtualWrite(V3, STARTCa);
  138. ML0=STARTCa;
  139. }
  140. if (String("Kh") == param.asStr()){
  141. Blynk.virtualWrite(V13, STARTKh);
  142. ML1=STARTKh;
  143. }
  144. if (String("Mi") == param.asStr()){
  145. Blynk.virtualWrite(V23, (ML0+ML1)/2);
  146. ML2=(ML0+ML1)/2;
  147. }
  148. if (String("Mg") == param.asStr()){
  149. Blynk.virtualWrite(V33, STARTMg);
  150. ML3=STARTMg;
  151. }
  152. }
  153. void setup(){
  154. //Pin Setup
  155. pinMode(PINPOMPE0, OUTPUT);
  156. pinMode(PINPOMPE1, OUTPUT);
  157. pinMode(PINPOMPE2, OUTPUT);
  158. pinMode(PINPOMPE3, OUTPUT);
  159. digitalWrite(PINPOMPE0, HIGH);
  160. digitalWrite(PINPOMPE1, HIGH);
  161. digitalWrite(PINPOMPE2, HIGH);
  162. digitalWrite(PINPOMPE3, HIGH);
  163. Blynk.begin(auth, ssid, pass, IPAddress(192, 168, 1, 18), 8081);
  164. setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes)
  165. timer.setInterval(1000L*60, Ft_Timer);
  166. }
  167. void loop(){
  168. Blynk.run();
  169. timer.run();
  170. }
  171. //************************************************************************
  172. // Fonction Calcium
  173. //************************************************************************
  174. void AutoDistribue0(float ml){
  175. if (Auto0) {
  176. if(((ML0/4)*FACTEURML)>(1000*4)){
  177. Active1(ML0/4);
  178. }
  179. else if((((ML0/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  180. Active0(ML0/2);
  181. }
  182. else if (dist==0){
  183. Active0(ML0);
  184. }
  185. }
  186. else{
  187. Blynk.notify("Calcium est Arreter");
  188. }
  189. }
  190. void Active0(float ml) {
  191. digitalWrite(PINPOMPE0, LOW);
  192. delay(FACTEURML * ml);
  193. digitalWrite(PINPOMPE0, HIGH);
  194. Reserve0=Reserve0-ml;
  195. Blynk.virtualWrite(V4, Reserve0);
  196. char message[30];
  197. sprintf(message, "Distribution %.1fml de Calcium a %d:%d\n", ml,hour(),minute());
  198. terminal.print(message);
  199. terminal.flush();
  200. if(Reserve0<RESERVEMIN)
  201. Blynk.notify("Penser a remettre du Calcium");
  202. }
  203. //Mesure
  204. BLYNK_WRITE(V0) {
  205. if(Mesure0==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  206. Mesure0 = param.asFloat();
  207. return;
  208. }
  209. Mesure0 = param.asFloat();
  210. ML0 = ML0 + (((ML0/Mesure0)* Cible0 - ML0)/4.0);
  211. MLForce0 = (Cible0-Mesure0)*FACTEUR0*LITRE;
  212. if(MLForce0<0)
  213. MLForce0=0;
  214. ML2 = (ML1+ML0)/2.0;
  215. Blynk.virtualWrite(V23, ML2);
  216. Blynk.virtualWrite(V3, ML0);
  217. Blynk.virtualWrite(V7, MLForce0);
  218. }
  219. //Cible
  220. BLYNK_WRITE(V1) {
  221. if(Cible0==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  222. Cible0 = param.asFloat();
  223. return;
  224. }
  225. Cible0 = param.asFloat();
  226. ML0 = ML0 +(((ML0/Mesure0)* Cible0- ML0)/4.0);
  227. ML2 = (ML1+ML0)/2.0;
  228. Blynk.virtualWrite(V23, ML2);
  229. Blynk.virtualWrite(V3, ML0);
  230. }
  231. //En route
  232. BLYNK_WRITE(V2) {
  233. if ( param.asInt()){
  234. Auto0 = true;
  235. }
  236. else{
  237. Auto0 = false;
  238. }
  239. }
  240. BLYNK_WRITE(V3){
  241. ML0=param.asFloat();
  242. Blynk.virtualWrite(V3, ML0);
  243. }
  244. BLYNK_WRITE(V4){
  245. Reserve0=param.asFloat();
  246. Blynk.virtualWrite(V4, Reserve0);
  247. }
  248. //RAZ Reserve
  249. BLYNK_WRITE(V5){
  250. if(param.asInt()){
  251. Reserve0=RESERVE;
  252. Blynk.virtualWrite(V4, Reserve0);
  253. }
  254. }
  255. //Forcé4
  256. BLYNK_WRITE(V6){
  257. if(param.asInt()){
  258. Active0(4.0);
  259. }
  260. }
  261. //NB/Forcé
  262. BLYNK_WRITE(V7){
  263. MLForce0=param.asFloat();
  264. }
  265. //Forcé
  266. BLYNK_WRITE(V8){
  267. if ( param.asInt()){
  268. Active0(MLForce0);
  269. }
  270. }
  271. //************************************************************************
  272. // Fonction KH
  273. //************************************************************************
  274. void AutoDistribue1(float ml){
  275. if (Auto1) {
  276. if(((ML1/4)*FACTEURML)>(1000*4)){
  277. Active1(ML1/4);
  278. }
  279. else if((((ML1/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  280. Active1(ML1/2);
  281. }
  282. else if (dist==0){
  283. Active1(ML1);
  284. }
  285. }
  286. else{
  287. Blynk.notify("KH est Arreter");
  288. }
  289. }
  290. void Active1(float ml) {
  291. digitalWrite(PINPOMPE1, LOW);
  292. delay(FACTEURML * ml);
  293. digitalWrite(PINPOMPE1, HIGH);
  294. Reserve1=Reserve1-ml;
  295. Blynk.virtualWrite(V14, Reserve1);
  296. char message[30];
  297. sprintf(message, "Distribution %.1fml de KH a %d:%d\n", ml,hour(),minute());
  298. terminal.print(message);
  299. terminal.flush();
  300. if(Reserve1<RESERVEMIN)
  301. Blynk.notify("Penser a remettre du KH");
  302. }
  303. //Mesure
  304. BLYNK_WRITE(V10) {
  305. if(Mesure1==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  306. Mesure1 = param.asFloat();
  307. return;
  308. }
  309. Mesure1 = param.asFloat();
  310. ML1 = ML1 + (((ML1/Mesure1)* Cible1 - ML1)/4.0);
  311. MLForce1 = (Cible1-Mesure1)*FACTEUR1*LITRE;
  312. if(MLForce1<0)
  313. MLForce1=0;
  314. ML2 = (ML1+ML0)/2.0;
  315. Blynk.virtualWrite(V23, ML2);
  316. Blynk.virtualWrite(V13, ML1);
  317. Blynk.virtualWrite(V17, MLForce1);
  318. }
  319. //Cible
  320. BLYNK_WRITE(V11) {
  321. if(Cible1==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  322. Cible1 = param.asFloat();
  323. return;
  324. }
  325. Cible1 = param.asFloat();
  326. ML1 = ML1 +(((ML1/Mesure1) * Cible1- ML1)/4.0);
  327. ML2 = (ML0+ML1)/2.0;
  328. Blynk.virtualWrite(V23, ML2);
  329. Blynk.virtualWrite(V13, ML1);
  330. }
  331. //En route
  332. BLYNK_WRITE(V12) {
  333. if ( param.asInt()){
  334. Auto1 = true;
  335. }
  336. else{
  337. Auto1 = false;
  338. }
  339. }
  340. BLYNK_WRITE(V13){
  341. ML1=param.asFloat();
  342. Blynk.virtualWrite(V13, ML1);
  343. }
  344. BLYNK_WRITE(V14){
  345. Reserve1=param.asFloat();
  346. Blynk.virtualWrite(V14, Reserve1);
  347. }
  348. //RAZ Reserve
  349. BLYNK_WRITE(V15){
  350. if(param.asInt()){
  351. Reserve1=RESERVE;
  352. Blynk.virtualWrite(V14, Reserve1);
  353. }
  354. }
  355. //Forcé4
  356. BLYNK_WRITE(V16){
  357. if(param.asInt()){
  358. Active1(4.0);
  359. }
  360. }
  361. //NB/Forcé
  362. BLYNK_WRITE(V17){
  363. MLForce1=param.asFloat();
  364. }
  365. //Forcé
  366. BLYNK_WRITE(V18){
  367. if ( param.asInt()){
  368. Active1(MLForce1);
  369. }
  370. }
  371. //************************************************************************
  372. // Fonction Mineral
  373. //************************************************************************
  374. void AutoDistribue2(float ml){
  375. if (Auto2) {
  376. if(((ML2/4)*FACTEURML)>(1000*4)){
  377. Active1(ML2/4);
  378. }
  379. else if((((ML2/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  380. Active2(ML2/2);
  381. }
  382. else if (dist==0){
  383. Active2(ML2);
  384. }
  385. }
  386. else{
  387. Blynk.notify("Mineral est Arreter");
  388. }
  389. }
  390. void Active2(float ml) {
  391. digitalWrite(PINPOMPE2, LOW);
  392. delay(FACTEURML * ml);
  393. digitalWrite(PINPOMPE2, HIGH);
  394. Reserve2=Reserve2-ml;
  395. Blynk.virtualWrite(V24, Reserve2);
  396. char message[30];
  397. sprintf(message, "Distribution %.1fml de Mineral a %d:%d\n", ml,hour(),minute());
  398. terminal.print(message);
  399. terminal.flush();
  400. if(Reserve2<RESERVEMIN)
  401. Blynk.notify("Penser a remettre du Mineral");
  402. }
  403. //En route
  404. BLYNK_WRITE(V22) {
  405. if ( param.asInt()){
  406. Auto2 = true;
  407. }
  408. else{
  409. Auto2 = false;
  410. }
  411. }
  412. BLYNK_WRITE(V23){
  413. ML2=param.asFloat();
  414. Blynk.virtualWrite(V23, ML2);
  415. }
  416. BLYNK_WRITE(V24){
  417. Reserve2=param.asFloat();
  418. Blynk.virtualWrite(V24, Reserve2);
  419. }
  420. //RAZ Reserve
  421. BLYNK_WRITE(V25){
  422. if(param.asInt()){
  423. Reserve2=RESERVE;
  424. Blynk.virtualWrite(V24, Reserve2);
  425. }
  426. }
  427. //Forcé4
  428. BLYNK_WRITE(V26){
  429. if(param.asInt()){
  430. Active2(4.0);
  431. }
  432. }
  433. //NB/Forcé
  434. BLYNK_WRITE(V27){
  435. MLForce2=param.asFloat();
  436. }
  437. //Forcé
  438. BLYNK_WRITE(V28){
  439. if ( param.asInt()){
  440. Active2(MLForce2);
  441. }
  442. }
  443. //************************************************************************
  444. // Fonction Magnesium
  445. //************************************************************************
  446. void AutoDistribue3(float ml){
  447. if (Auto3) {
  448. if(((ML3/4)*FACTEURML)>(1000*4)){
  449. Active1(ML3/4);
  450. }
  451. else if((((ML3/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  452. Active3(ML3/2);
  453. }
  454. else if (dist==0){
  455. Active3(ML3);
  456. }
  457. }
  458. else{
  459. Blynk.notify("Magnesium est Arreter");
  460. }
  461. }
  462. void Active3(float ml) {
  463. digitalWrite(PINPOMPE3, LOW);
  464. delay(FACTEURML * ml);
  465. digitalWrite(PINPOMPE3, HIGH);
  466. Reserve3=Reserve3-ml;
  467. Blynk.virtualWrite(V34, Reserve3);
  468. char message[30];
  469. sprintf(message, "Distribution %.1fml de Magnesium a %d:%d\n", ml,hour(),minute());
  470. terminal.print(message);
  471. terminal.flush();
  472. if(Reserve3<RESERVEMIN)
  473. Blynk.notify("Penser a remettre du Magnesium");
  474. }
  475. //Mesure
  476. BLYNK_WRITE(V30) {
  477. if(Mesure3==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  478. Mesure3 = param.asFloat();
  479. return;
  480. }
  481. Mesure3 = param.asFloat();
  482. ML3 = ML3 + (((ML3/Mesure3)* Cible3 - ML3)/4.0);
  483. MLForce3 = (Cible3-Mesure3)*FACTEUR3*LITRE;
  484. if(MLForce3<0)
  485. MLForce3=0;
  486. Blynk.virtualWrite(V33, ML3);
  487. Blynk.virtualWrite(V37, MLForce3);
  488. }
  489. //Cible
  490. BLYNK_WRITE(V31) {
  491. if(Cible3==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  492. Cible3 = param.asFloat();
  493. return;
  494. }
  495. Cible3 = param.asFloat();
  496. ML3 = ML3 +(((ML3/Mesure3)* Cible3- ML3)/4.0);
  497. Blynk.virtualWrite(V23, ML2);
  498. Blynk.virtualWrite(V33, ML3);
  499. }
  500. //En route
  501. BLYNK_WRITE(V32) {
  502. if ( param.asInt()){
  503. Auto3 = true;
  504. }
  505. else{
  506. Auto3 = false;
  507. }
  508. }
  509. BLYNK_WRITE(V33){
  510. ML3=param.asFloat();
  511. Blynk.virtualWrite(V33, ML3);
  512. }
  513. BLYNK_WRITE(V34){
  514. Reserve3=param.asFloat();
  515. Blynk.virtualWrite(V34, Reserve3);
  516. }
  517. //RAZ Reserve
  518. BLYNK_WRITE(V35){
  519. if(param.asInt()){
  520. Reserve3=RESERVE;
  521. Blynk.virtualWrite(V34, Reserve3);
  522. }
  523. }
  524. //Forcé4
  525. BLYNK_WRITE(V36){
  526. if(param.asInt()){
  527. Active3(4.0);
  528. }
  529. }
  530. //NB/Forcé
  531. BLYNK_WRITE(V37){
  532. MLForce3=param.asFloat();
  533. }
  534. //Forcé
  535. BLYNK_WRITE(V38){
  536. if ( param.asInt()){
  537. Active3(MLForce3);
  538. }
  539. }