#include #include #include #define AQUAGRA //#define AQUAZOA #ifdef AQUAGRA char auth[] = "hneeH3NrG9r-e1jrrECsZiB_-TUkU6z7"; //220L #elif AQUAZOA char auth[] = "JDoe08avtg2zR73kwk4OiSKk9C7tffjM"; //70L #endif char ssid[] = "Livebox-7C2C"; char pass[] = "566C61F61F9C925C9F3D7D79E6"; WidgetRTC rtc; BlynkTimer timer; WidgetTerminal terminal(V60); //************************************************************************ // Variable Global perso //************************************************************************ #ifdef AQUAGRA #define RESERVE 1200 #define LITRE 220 #define FACTEURML 635 //Temps d'allumage de la pompe en ms pour distribuer 1ml #define RESERVEMIN 100 #define STARTCa 16 #define STARTKh 30 #define STARTMg 7 #define STARTEasy 1.8 #elif AQUAZOA #define RESERVE 450 #define LITRE 70 #define FACTEURML 200//todo //Temps d'allumage de la pompe en ms pour distribuer 1ml #define RESERVEMIN 50 #define STARTCa 16 #define STARTKh 30 #define STARTMg 7 #define STARTEasy 0.6 #endif #define POMPE0 0 #define POMPE1 1 #define POMPE2 2 #define POMPE3 3 #define POMPE4 4 #define POMPE5 5 //#define POMPE6 6 pin 6 cree une erreur //#define POMPE7 7 //nombre de ml a distribuer pour remonter de +1 (mg ou kh) par litre d'eau #define FACTEUR0 0.0057 //FACTEUR CA #define FACTEUR1 0.36 //0.36ml/L = +1KH #define FACTEUR3 0.02 //FACTEUR MG const int PINPOMPE0 = 5; const int PINPOMPE1 = 4; const int PINPOMPE2 = 16; const int PINPOMPE3 = 14; const int PINPOMPE4 = 12; const int PINPOMPE5 = 13; //6 et 7 cree une erreur const int PINPOMPE6 = 9; const int PINPOMPE7 = 10; float Mesure0, Mesure1, Mesure2, Mesure3, Mesure4, Mesure5, Mesure6, Mesure7; float ML0, ML1, ML2, ML3, ML4, ML5, ML6, ML7 ; float Cible0, Cible1, Cible2, Cible3, Cible4, Cible5, Cible6, Cible7 ; bool Auto0, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7 ; float Reserve0, Reserve1, Reserve2, Reserve3, Reserve4, Reserve5, Reserve6, Reserve7 ; float MLForce0, MLForce1, MLForce2, MLForce3, MLForce4, MLForce5, MLForce6, MLForce7 ; int dist; //************************************************************************ // Fonction Seul //************************************************************************ void Ft_Timer() { int Hmin = hour() * 60 + minute(); switch(Hmin){ case 0: //Calcium dist=0; AutoDistribue0(ML0); break; case 360: //Calcium dist=1; AutoDistribue0(ML0); break; case 720: //Calcium dist=2; AutoDistribue0(ML0); break; case 1080: //Calcium dist=3; AutoDistribue0(ML0); break; case 90: //KH dist=0; AutoDistribue1(ML1); break; case 450: //KH dist=1; AutoDistribue1(ML1); break; case 810: //KH dist=2; AutoDistribue1(ML1); break; case 1170: //KH dist=3; AutoDistribue1(ML1); break; case 180: //mineral dist=0; AutoDistribue2(ML2); break; case 540: //mineral dist=1; AutoDistribue2(ML2); break; case 900: //mineral dist=2; AutoDistribue2(ML2); break; case 1260: //mineral dist=3; AutoDistribue2(ML2); break; case 270://mg dist=0; AutoDistribue3(ML3); break; case 630://mg dist=1; AutoDistribue3(ML3); break; case 990://mg dist=2; AutoDistribue3(ML3); break; case 1350://mg dist=3; AutoDistribue3(ML3); break; case 1020://EasyReef AutoDistribue4(ML4); break; } } BLYNK_CONNECTED() { char message[30]; sprintf(message, "\nnew Connection\n"); terminal.print(message); terminal.flush(); rtc.begin(); Blynk.syncAll(); } BLYNK_WRITE(V60){ if (String("Ca") == param.asStr()){ Blynk.virtualWrite(V3, STARTCa); ML0=STARTCa; } if (String("Kh") == param.asStr()){ Blynk.virtualWrite(V13, STARTKh); ML1=STARTKh; } if (String("Mi") == param.asStr()){ Blynk.virtualWrite(V23, (ML0+ML1)/2); ML2=(ML0+ML1)/2; } if (String("Mg") == param.asStr()){ Blynk.virtualWrite(V33, STARTMg); ML3=STARTMg; } } void setup(){ //Pin Setup pinMode(PINPOMPE0, OUTPUT); pinMode(PINPOMPE1, OUTPUT); pinMode(PINPOMPE2, OUTPUT); pinMode(PINPOMPE3, OUTPUT); pinMode(PINPOMPE4, OUTPUT); pinMode(PINPOMPE5, OUTPUT); digitalWrite(PINPOMPE0, LOW); digitalWrite(PINPOMPE1, LOW); digitalWrite(PINPOMPE2, LOW); digitalWrite(PINPOMPE3, LOW); digitalWrite(PINPOMPE4, LOW); digitalWrite(PINPOMPE5, LOW); Blynk.begin(auth, ssid, pass, IPAddress(192, 168, 1, 18), 8081); setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes) timer.setInterval(1000L*60, Ft_Timer); } void loop(){ Blynk.run(); timer.run(); } //************************************************************************ // Fonction Calcium //************************************************************************ void AutoDistribue0(float ml){ if (Auto0) { if(((ML0/4)*FACTEURML)>(1000*4)){ Active0(ML0/4); } else if((((ML0/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){ Active0(ML0/2); } else if (dist==0){ Active0(ML0); } } else{ Blynk.notify("Calcium est Arreter"); } } void Active0(float ml) { digitalWrite(PINPOMPE0, HIGH); delay(FACTEURML * ml); digitalWrite(PINPOMPE0, LOW); Reserve0=Reserve0-ml; Blynk.virtualWrite(V4, Reserve0); char message[30]; sprintf(message, "Distribution %.1fml de Calcium a %d:%d\n", ml,hour(),minute()); terminal.print(message); terminal.flush(); if(Reserve0(1000*4)){ Active1(ML1/4); } else if((((ML1/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){ Active1(ML1/2); } else if (dist==0){ Active1(ML1); } } else{ Blynk.notify("KH est Arreter"); } } void Active1(float ml) { digitalWrite(PINPOMPE1, HIGH); delay(FACTEURML * ml); digitalWrite(PINPOMPE1, LOW); Reserve1=Reserve1-ml; Blynk.virtualWrite(V14, Reserve1); char message[30]; sprintf(message, "Distribution %.1fml de KH a %d:%d\n", ml,hour(),minute()); terminal.print(message); terminal.flush(); if(Reserve1(1000*4)){ Active2(ML2/4); } else if((((ML2/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){ Active2(ML2/2); } else if (dist==0){ Active2(ML2); } } else{ Blynk.notify("Mineral est Arreter"); } } void Active2(float ml) { digitalWrite(PINPOMPE2, HIGH); delay(FACTEURML * ml); digitalWrite(PINPOMPE2, LOW); Reserve2=Reserve2-ml; Blynk.virtualWrite(V24, Reserve2); char message[30]; sprintf(message, "Distribution %.1fml de Mineral a %d:%d\n", ml,hour(),minute()); terminal.print(message); terminal.flush(); if(Reserve2(1000*4)){ Active3(ML3/4); } else if((((ML3/2)*FACTEURML)>(1000*2))&(dist==0|dist==2)){ Active3(ML3/2); } else if (dist==0){ Active3(ML3); } } else{ Blynk.notify("Magnesium est Arreter"); } } void Active3(float ml) { digitalWrite(PINPOMPE3, HIGH); delay(FACTEURML * ml); digitalWrite(PINPOMPE3, LOW); Reserve3=Reserve3-ml; Blynk.virtualWrite(V34, Reserve3); char message[30]; sprintf(message, "Distribution %.1fml de Magnesium a %d:%d\n", ml,hour(),minute()); terminal.print(message); terminal.flush(); if(Reserve3