PeristatiqueV2.ino 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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. if (String("Kh") == param.asStr())
  139. Blynk.virtualWrite(V13, STARTKh);
  140. if (String("Mi") == param.asStr())
  141. Blynk.virtualWrite(V23, (ML0+ML1)/2);
  142. if (String("Mg") == param.asStr())
  143. Blynk.virtualWrite(V33, STARTMg);
  144. }
  145. void setup(){
  146. //Pin Setup
  147. pinMode(PINPOMPE0, OUTPUT);
  148. pinMode(PINPOMPE1, OUTPUT);
  149. pinMode(PINPOMPE2, OUTPUT);
  150. pinMode(PINPOMPE3, OUTPUT);
  151. digitalWrite(PINPOMPE0, HIGH);
  152. digitalWrite(PINPOMPE1, HIGH);
  153. digitalWrite(PINPOMPE2, HIGH);
  154. digitalWrite(PINPOMPE3, HIGH);
  155. Blynk.begin(auth, ssid, pass, IPAddress(192, 168, 1, 18), 8081);
  156. setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes)
  157. timer.setInterval(1000L*60, Ft_Timer);
  158. }
  159. void loop(){
  160. Blynk.run();
  161. timer.run();
  162. }
  163. //************************************************************************
  164. // Fonction Calcium
  165. //************************************************************************
  166. void AutoDistribue0(float ml){
  167. if (Auto0) {
  168. if(((ML0/4)*FACTEURML)>(1000*4)){
  169. }
  170. else if((((ML0/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  171. Active0(ML0/2);
  172. }
  173. else if (dist==0){
  174. Active0(ML0);
  175. }
  176. }
  177. else{
  178. Blynk.notify("Calcium est Arreter");
  179. }
  180. }
  181. void Active0(float ml) {
  182. digitalWrite(PINPOMPE0, LOW);
  183. delay(FACTEURML * ml);
  184. digitalWrite(PINPOMPE0, HIGH);
  185. Reserve0=Reserve0-ml;
  186. Blynk.virtualWrite(V4, Reserve0);
  187. char message[30];
  188. sprintf(message, "Distribution %.1fml de Calcium a %d:%d\n", ml,hour(),minute());
  189. terminal.print(message);
  190. terminal.flush();
  191. if(Reserve0<RESERVEMIN)
  192. Blynk.notify("Penser a remettre du Calcium");
  193. }
  194. //Mesure
  195. BLYNK_WRITE(V0) {
  196. if(Mesure0==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  197. Mesure0 = param.asFloat();
  198. return;
  199. }
  200. Mesure0 = param.asFloat();
  201. ML0 = ML0 + (((ML0/Mesure0)* Cible0 - ML0)/4.0);
  202. MLForce0 = (Cible0-Mesure0)*FACTEUR0*LITRE;
  203. if(MLForce0<0)
  204. MLForce0=0;
  205. ML2 = (ML1+ML0)/2.0;
  206. Blynk.virtualWrite(V23, ML2);
  207. Blynk.virtualWrite(V3, ML0);
  208. Blynk.virtualWrite(V7, MLForce0);
  209. }
  210. //Cible
  211. BLYNK_WRITE(V1) {
  212. if(Cible0==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  213. Cible0 = param.asFloat();
  214. return;
  215. }
  216. Cible0 = param.asFloat();
  217. ML0 = ML0 +(((ML0/Mesure0)* Cible0- ML0)/4.0);
  218. ML2 = (ML1+ML0)/2.0;
  219. Blynk.virtualWrite(V23, ML2);
  220. Blynk.virtualWrite(V3, ML0);
  221. }
  222. //En route
  223. BLYNK_WRITE(V2) {
  224. if ( param.asInt()){
  225. Auto0 = true;
  226. }
  227. else{
  228. Auto0 = false;
  229. }
  230. }
  231. BLYNK_WRITE(V3){
  232. ML0=param.asFloat();
  233. Blynk.virtualWrite(V3, ML0);
  234. }
  235. BLYNK_WRITE(V4){
  236. Reserve0=param.asFloat();
  237. Blynk.virtualWrite(V4, Reserve0);
  238. }
  239. //RAZ Reserve
  240. BLYNK_WRITE(V5){
  241. if(param.asInt()){
  242. Reserve0=RESERVE;
  243. Blynk.virtualWrite(V4, Reserve0);
  244. }
  245. }
  246. //Forcé4
  247. BLYNK_WRITE(V6){
  248. if(param.asInt()){
  249. Active0(4.0);
  250. }
  251. }
  252. //NB/Forcé
  253. BLYNK_WRITE(V7){
  254. MLForce0=param.asFloat();
  255. }
  256. //Forcé
  257. BLYNK_WRITE(V8){
  258. if ( param.asInt()){
  259. Active0(MLForce0);
  260. }
  261. }
  262. //************************************************************************
  263. // Fonction KH
  264. //************************************************************************
  265. void AutoDistribue1(float ml){
  266. if (Auto1) {
  267. if(((ML1/4)*FACTEURML)>(1000*4)){
  268. }
  269. else if((((ML1/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  270. Active1(ML1/2);
  271. }
  272. else if (dist==0){
  273. Active1(ML1);
  274. }
  275. }
  276. else{
  277. Blynk.notify("KH est Arreter");
  278. }
  279. }
  280. void Active1(float ml) {
  281. digitalWrite(PINPOMPE1, LOW);
  282. delay(FACTEURML * ml);
  283. digitalWrite(PINPOMPE1, HIGH);
  284. Reserve1=Reserve1-ml;
  285. Blynk.virtualWrite(V14, Reserve1);
  286. char message[30];
  287. sprintf(message, "Distribution %.1fml de KH a %d:%d\n", ml,hour(),minute());
  288. terminal.print(message);
  289. terminal.flush();
  290. if(Reserve1<RESERVEMIN)
  291. Blynk.notify("Penser a remettre du KH");
  292. }
  293. //Mesure
  294. BLYNK_WRITE(V10) {
  295. if(Mesure1==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  296. Mesure1 = param.asFloat();
  297. return;
  298. }
  299. Mesure1 = param.asFloat();
  300. ML1 = ML1 + (((ML1/Mesure1)* Cible1 - ML1)/4.0);
  301. MLForce1 = (Cible1-Mesure1)*FACTEUR1*LITRE;
  302. if(MLForce1<0)
  303. MLForce1=0;
  304. ML2 = (ML1+ML0)/2.0;
  305. Blynk.virtualWrite(V23, ML2);
  306. Blynk.virtualWrite(V13, ML1);
  307. Blynk.virtualWrite(V17, MLForce1);
  308. }
  309. //Cible
  310. BLYNK_WRITE(V11) {
  311. if(Cible1==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  312. Cible1 = param.asFloat();
  313. return;
  314. }
  315. Cible1 = param.asFloat();
  316. ML1 = ML1 +(((ML1/Mesure1) * Cible1- ML1)/4.0);
  317. ML2 = (ML0+ML1)/2.0;
  318. Blynk.virtualWrite(V23, ML2);
  319. Blynk.virtualWrite(V13, ML1);
  320. }
  321. //En route
  322. BLYNK_WRITE(V12) {
  323. if ( param.asInt()){
  324. Auto1 = true;
  325. }
  326. else{
  327. Auto1 = false;
  328. }
  329. }
  330. BLYNK_WRITE(V13){
  331. ML1=param.asFloat();
  332. Blynk.virtualWrite(V13, ML1);
  333. }
  334. BLYNK_WRITE(V14){
  335. Reserve1=param.asFloat();
  336. Blynk.virtualWrite(V14, Reserve1);
  337. }
  338. //RAZ Reserve
  339. BLYNK_WRITE(V15){
  340. if(param.asInt()){
  341. Reserve1=RESERVE;
  342. Blynk.virtualWrite(V14, Reserve1);
  343. }
  344. }
  345. //Forcé4
  346. BLYNK_WRITE(V16){
  347. if(param.asInt()){
  348. Active1(4.0);
  349. }
  350. }
  351. //NB/Forcé
  352. BLYNK_WRITE(V17){
  353. MLForce1=param.asFloat();
  354. }
  355. //Forcé
  356. BLYNK_WRITE(V18){
  357. if ( param.asInt()){
  358. Active1(MLForce1);
  359. }
  360. }
  361. //************************************************************************
  362. // Fonction Mineral
  363. //************************************************************************
  364. void AutoDistribue2(float ml){
  365. if (Auto2) {
  366. if(((ML2/4)*FACTEURML)>(1000*4)){
  367. }
  368. else if((((ML2/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  369. Active2(ML2/2);
  370. }
  371. else if (dist==0){
  372. Active2(ML2);
  373. }
  374. }
  375. else{
  376. Blynk.notify("Mineral est Arreter");
  377. }
  378. }
  379. void Active2(float ml) {
  380. digitalWrite(PINPOMPE2, LOW);
  381. delay(FACTEURML * ml);
  382. digitalWrite(PINPOMPE2, HIGH);
  383. Reserve2=Reserve2-ml;
  384. Blynk.virtualWrite(V24, Reserve2);
  385. char message[30];
  386. sprintf(message, "Distribution %.1fml de Mineral a %d:%d\n", ml,hour(),minute());
  387. terminal.print(message);
  388. terminal.flush();
  389. if(Reserve2<RESERVEMIN)
  390. Blynk.notify("Penser a remettre du Mineral");
  391. }
  392. //En route
  393. BLYNK_WRITE(V22) {
  394. if ( param.asInt()){
  395. Auto2 = true;
  396. }
  397. else{
  398. Auto2 = false;
  399. }
  400. }
  401. BLYNK_WRITE(V23){
  402. ML2=param.asFloat();
  403. Blynk.virtualWrite(V23, ML2);
  404. }
  405. BLYNK_WRITE(V24){
  406. Reserve2=param.asFloat();
  407. Blynk.virtualWrite(V24, Reserve2);
  408. }
  409. //RAZ Reserve
  410. BLYNK_WRITE(V25){
  411. if(param.asInt()){
  412. Reserve2=RESERVE;
  413. Blynk.virtualWrite(V24, Reserve2);
  414. }
  415. }
  416. //Forcé4
  417. BLYNK_WRITE(V26){
  418. if(param.asInt()){
  419. Active2(4.0);
  420. }
  421. }
  422. //NB/Forcé
  423. BLYNK_WRITE(V27){
  424. MLForce2=param.asFloat();
  425. }
  426. //Forcé
  427. BLYNK_WRITE(V28){
  428. if ( param.asInt()){
  429. Active2(MLForce2);
  430. }
  431. }
  432. //************************************************************************
  433. // Fonction Magnesium
  434. //************************************************************************
  435. void AutoDistribue3(float ml){
  436. if (Auto3) {
  437. if(((ML3/4)*FACTEURML)>(1000*4)){
  438. }
  439. else if((((ML3/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){
  440. Active3(ML3/2);
  441. }
  442. else if (dist==0){
  443. Active3(ML3);
  444. }
  445. }
  446. else{
  447. Blynk.notify("Magnesium est Arreter");
  448. }
  449. }
  450. void Active3(float ml) {
  451. digitalWrite(PINPOMPE3, LOW);
  452. delay(FACTEURML * ml);
  453. digitalWrite(PINPOMPE3, HIGH);
  454. Reserve3=Reserve3-ml;
  455. Blynk.virtualWrite(V34, Reserve3);
  456. char message[30];
  457. sprintf(message, "Distribution %.1fml de Magnesium a %d:%d\n", ml,hour(),minute());
  458. terminal.print(message);
  459. terminal.flush();
  460. if(Reserve3<RESERVEMIN)
  461. Blynk.notify("Penser a remettre du Magnesium");
  462. }
  463. //Mesure
  464. BLYNK_WRITE(V30) {
  465. if(Mesure3==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  466. Mesure3 = param.asFloat();
  467. return;
  468. }
  469. Mesure3 = param.asFloat();
  470. ML3 = ML3 + (((ML3/Mesure3)* Cible3 - ML3)/4.0);
  471. MLForce3 = (Cible3-Mesure3)*FACTEUR3*LITRE;
  472. if(MLForce3<0)
  473. MLForce3=0;
  474. Blynk.virtualWrite(V33, ML3);
  475. Blynk.virtualWrite(V37, MLForce3);
  476. }
  477. //Cible
  478. BLYNK_WRITE(V31) {
  479. if(Cible3==0){//Si nouvelle connection on recupere juste la valeur enregistrer sur le server
  480. Cible3 = param.asFloat();
  481. return;
  482. }
  483. Cible3 = param.asFloat();
  484. ML3 = ML3 +(((ML3/Mesure3)* Cible3- ML3)/4.0);
  485. Blynk.virtualWrite(V23, ML2);
  486. Blynk.virtualWrite(V33, ML3);
  487. }
  488. //En route
  489. BLYNK_WRITE(V32) {
  490. if ( param.asInt()){
  491. Auto3 = true;
  492. }
  493. else{
  494. Auto3 = false;
  495. }
  496. }
  497. BLYNK_WRITE(V33){
  498. ML3=param.asFloat();
  499. Blynk.virtualWrite(V33, ML3);
  500. }
  501. BLYNK_WRITE(V34){
  502. Reserve3=param.asFloat();
  503. Blynk.virtualWrite(V34, Reserve3);
  504. }
  505. //RAZ Reserve
  506. BLYNK_WRITE(V35){
  507. if(param.asInt()){
  508. Reserve3=RESERVE;
  509. Blynk.virtualWrite(V34, Reserve3);
  510. }
  511. }
  512. //Forcé4
  513. BLYNK_WRITE(V36){
  514. if(param.asInt()){
  515. Active3(4.0);
  516. }
  517. }
  518. //NB/Forcé
  519. BLYNK_WRITE(V37){
  520. MLForce3=param.asFloat();
  521. }
  522. //Forcé
  523. BLYNK_WRITE(V38){
  524. if ( param.asInt()){
  525. Active3(MLForce3);
  526. }
  527. }