PeristatiqueV3.ino 14 KB

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