PeristatiqueV2.ino 12 KB

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