From f57db0f1b2ad855ee632cd84e281a6899f136995 Mon Sep 17 00:00:00 2001 From: Axel C Date: Wed, 25 Nov 2015 22:27:43 +0100 Subject: [PATCH] First version of the new code, not fully tested on my Leonardo Need to see the level for he kids --- .../AqueponicsProject/AqueponicsProject.ino | 185 ++++++++++++++++++ arduino/AqueponicsProject/README.txt | 6 + arduino/AqueponicsProject/TimerOne.zip | Bin 0 -> 8334 bytes 3 files changed, 191 insertions(+) create mode 100644 arduino/AqueponicsProject/AqueponicsProject.ino create mode 100644 arduino/AqueponicsProject/README.txt create mode 100644 arduino/AqueponicsProject/TimerOne.zip diff --git a/arduino/AqueponicsProject/AqueponicsProject.ino b/arduino/AqueponicsProject/AqueponicsProject.ino new file mode 100644 index 0000000..d2dd8ad --- /dev/null +++ b/arduino/AqueponicsProject/AqueponicsProject.ino @@ -0,0 +1,185 @@ +/* + * + * + * + * Clock mechanism to execut an action every houres + * + * TODO Switch action reset houre to 9 + * TODO Safety extra sensor + */ + +#include +#include +#include + +// Pin definitions +#define LAMP 8 // Pin of the lamp relay +#define LED 13 // For Leonardo built in led +#define PUMP_IN 9 // Pin of the pump 1 +#define PUMP_OUT 10 // Pin of the pump 2 +#define WATER_UP 4 // Pin of the water sensor 1 +#define WATER_DOWN 5 // Pin of the water sensor 2 + +// Time definition +#define DAY_TIME 14 // Number of hours the day lasts (LAMP ON) +#define DAY_START 9 // Hour of the day that the day start +#define PUMP_CYCLE 15 // Time between 2 pump cycles +#define WATER_UP_TIME 5 // Time to keep water up + +#define SIMULATION true //Boolean to activate the simulation (reduce time 1mn = 1s) + +// Time counter variables +volatile int hoursCounter; // 0 to 23 +volatile int secondsCounter; // 0 to 59 +volatile int minutesCounter; // 0 to 59 + +bool ledState = 0; // led status memory +bool waterLevelState = 0; // water level status memory +#define DOWN 0 +#define FILLING 1 +#define UP 3 +#define CLEARING 4 + + +/* void setup(void) + * Setup software run only once + * Allows to setup all the software and hardware +*/ +void setup(void) +{ + // Setup the pin function TODO select good pin + pinMode(LAMP, OUTPUT); + pinMode(LED, OUTPUT); + pinMode(PUMP_IN, OUTPUT); + pinMode(PUMP_OUT, OUTPUT); + pinMode(WATER_UP, INPUT); + digitalWrite(WATER_UP, HIGH); //Setup pull up + pinMode(WATER_DOWN, INPUT); + digitalWrite(WATER_DOWN, HIGH); //Setup pull up + + // initialize Timer1 for 1 second interval + Timer1.initialize(1000000); // Set 1 second to timer 1 + Timer1.attachInterrupt(seconds_timer); + + hoursCounter = DAY_START; // Init the time to DAY_START at startup + minutesCounter = 1; + secondsCounter = 1; + digitalWrite(LAMP, HIGH); +} + + +/* void loop(void) + * Main program automatically loaded + * +*/ +void loop(void) +{ + switch (waterLevelState) { + + case DOWN: + //Wait for pump cycle time to activate pump + if(0 == (minutesCounter % PUMP_CYCLE)) + { + digitalWrite(PUMP_IN, 1); // Turn ON the filling pump + waterLevelState = FILLING; + } + break; + + case FILLING: + // wait for water up sensor to be activated + if(0 == digitalRead(WATER_UP)) + { + digitalWrite(PUMP_IN, 0); // Turn OFF the filling pump + waterLevelState = UP; + } + break; + + case UP: + //Wait for level up time passed to clear + if(0 == ((minutesCounter % PUMP_CYCLE) % WATER_UP_TIME)) + { + digitalWrite(PUMP_OUT, 1); // Turn ON the clearing pump + waterLevelState = CLEARING; + } + break; + break; + + case CLEARING: + // wait for water down sensor to be activated + if(0 == digitalRead(WATER_DOWN)) + { + digitalWrite(PUMP_OUT, 0); // Turn OFF the clearing pump + waterLevelState = DOWN; + } + break; + + default: + // default is optional + break; + } +} + + +/* seconds_timer(void) + * Timer executed every seconds for time count + * This function allows to make a basic clock which count hours, minutes and seconds +*/ +void seconds_timer(void) +{ + + toggle_led(); //Toggle the card LED every seconds + + // In case of SIMULATION increment minutes to go quicker + if (SIMULATION) + { + minutesCounter ++; // Increment the minutes counter + } + else + {// In case of normal use, increment seconds + secondsCounter++; // Increment the seconds counter + } + + // Every 60s we increment the minutes counters (not used in SIMULATION) + if (0 == secondsCounter % 60) + { + minutesCounter ++; //Increment the minutes counter + secondsCounter = 0; // Clear the seconds counter + } + + // Every 60min increment the hours counter + if (0 == minutesCounter % 60) + { + hoursCounter ++; // Increment the hours counter + minutesCounter = 0; // Clear the minutes counter + + // At the end of the day reset the hours counter + if (23 < hoursCounter) + { + hoursCounter = 0; // Clear the hours counter + } + + // Execute following code one time every hours + hours_action(); + } +} + +/* void hour_action(void) + * Program executed one time every hours + * +*/ +void hours_action(void) +{ + //Check if something has to be done + if (DAY_START == hoursCounter) + digitalWrite(LAMP, 1); + + if ((DAY_START + DAY_TIME) == hoursCounter) + digitalWrite(LAMP, 0); +} + +void toggle_led(void) +{ + ledState = ledState ^ 1; + digitalWrite(LED, ledState); +} + diff --git a/arduino/AqueponicsProject/README.txt b/arduino/AqueponicsProject/README.txt new file mode 100644 index 0000000..866a724 --- /dev/null +++ b/arduino/AqueponicsProject/README.txt @@ -0,0 +1,6 @@ + + +Librairies: +TimerOne +https://github.com/PaulStoffregen/TimerOne +Copy after unzip inside Arduino/hardware/libraries/ \ No newline at end of file diff --git a/arduino/AqueponicsProject/TimerOne.zip b/arduino/AqueponicsProject/TimerOne.zip new file mode 100644 index 0000000000000000000000000000000000000000..4af85d7af1791ff302adc502961b12ffa82ac059 GIT binary patch literal 8334 zcmai(1z1$w*2jk&y1Pq|4n-OX>6GpsdT42+JETLpJCqPnx}_1NJEd!+1U`Jdc){zv z-3&Rs?_*8~j!_@V&-G=FJrWn=4NqtE`t$ihkA=_k;U#k?_5 z*LI2xCur{sH<3ZL6v=9vn^tm~rs;_oT-d4k_^bv!`xpa3=qq{2%L7NHSU?o%#*`if zMx}A)(MLhL^@vwuEnN#z{ntoHy)gPCxS4M{V+A>$8X#+N$MNF#*W}r~fZILw3zsTp z^~PVRSb!8SAm@LXCM!oXwO+!G_zb9D5q>BwDgeOwI6=QPcC+~zw)`Dn#B6o9)# zWm;Mz;iEejmK4rsANDshfa5P=IY!EII!}m}{OdQl8fi%%r>0*uQgVktMp`3!w$5Ux z;}0~pctAr;i&zDBt%7<)VRDU7FE~SV4rz&c7I3NDiHgd)eIbuS$lz6K zN%d9AGfpkCG}LOw2s}=jCMQqIy&}uHY^9QvV4hvbosjNjqC?iHgFSoBv{)UxBS7nf>qX%J$p9N&6D-bME zBlvr^!LDGl+?YX3u4y?$nINi#<&_Ka|DG*acjF)AY6!No208xD7XaYT>>~badvQY> zWjheaS5eiBE9Yjmk|?@jCM(PQPyw+zRsfAL7~q=C9<86-i8C|YtMrhwWhn>1;k&wRq}Kw$9-31Mm#@nWRYS?bWE@mQ-qKi?w3WpX0|)1q zrOZl=D#rPCZs`%B7$ys8vuP+z=TvZ?Y7F=?3?mE}g+*#554B+S&%+NtXRy4ssz?}^ z5>{A?v8el^J%|M|_LuESgyyWLt`z7>%gxs9NQR*$F=0U`fF40T**m*=DPeap`u~Dh) z73_j=qqndIjN#B9S0}-<5shN)$<~39W8XSc{d{|mdP+mkYV2nYvA(oCX|po3SGU>k z@K{a8>>^)8DyXGe%sRBGCz1|i@=!DBJgkh9Nyfbh}phyKp}= zrfS)PU6af(LH@-0V9$$EcfR0_Kmm^d1v)M5epvIG+48eMX_Rj~nZfI36)WifJyl5l z8o^RFP9O(|7j{m6#D2qBh)Us2?7x5m0OzAa@$6gYPT*QBb??qY^J_k5hemSj1O{EBi|R`+XFYo54RNZE(?v+L z>8)aClzoFkhRO`+r`jsD;^zGB2oFRISQTlr9OXzUG$t%TXcQ2S!7K$13x0FPEz;V!$xG5sEXf)r2j#|jmjGO{c>Ek)@X12Tt67meP0%%duT`iA(8 zjI@=tu3nwi`+|1qsafa+JN8(}S458Q;`K*8gHUfwZH?-=eP+d?7!9MIKR{;?qW27Y z_P&RAa2E!#tz%Z8B7}h1&nPfb-9t3O(&{_?+NUS9(aUfr9n^rvlfed>{OyF}(AB0B z%n?iASv0q41{AS@&Jg5$3lhdkH`yILUL}k5d6*YRMNvD)SJG)Y0%-N{icm3*eyMpo zY2Y}?veIw(m3$zL_a4{iLg%&^;f4^?Ta3Bfz& zKdy#cy<|xf)npVtYY(GJ@tJ%KL!{?lr6F3Wl9vr(`1FkyGl&M}WOIGkD6E`F!OK8Z zTjI^RWSXlu!BS7kJK|QZsEW@d1qQ~5wK%5a*bZ7#77k06@sq6Pa!e{ULbzasYnzUV znnY17OB=4>Or3#Baa>?Y9u{z0D>E|#3agG-L{LmSNy{9pE&b^vE|`87So4*%o+gaT zdA4xCEd@AA=h%hEc|cOfxtWUw}5XBH;8`dTc3~^#kcO@HS6=t@P(Dm)&kR zQ4RwI0N~z@b}NvZi>-r+Ba4%((~F2cq&7ATvGMP=o2(l6OF3e&_B>!9iR>ubd*S0P z=0J{bIem`1%PbkSf;vM(5*}7jU)sP6U&az(eWT;ZwHbYJ9>|YKx<$&F=$9>b6Gy}r zxy&R)0f_XH0BQr6Vks_u9UB@TA}&ioFh|oG&9~6BEeqGwA29dFDwsHY)^RgNnm@;C zZDHhK=-|d;>1b=i`KmRljSc15-X#*_x-J8Y#|F6BK;4gcDOxE>i^hJ1I}7PxkEWR0 zy=&R+r89t5=GQ{;;PiBxuVYB>iP%)A}&r8x>9hx61lB&r2VUm4Gbdw&dP# zTyPWDEs{t(8!!8i#O3ptN(n#d^o5sLSwqxE-+s+ws$dAWlog%FH|t&AZEL!IH%S`5 zuDKtUeNC}vS#P3WZkBlX+_#z2l~K8%g;>N%%?vM-sMVshdUIs*gXbnLdtU7vpG)N~ z>V3CaI1CZCZrm2Var@rC_^sP^4z_k62PX@VqwXtqn|3x7F_&~dAe*%-a~6FHG%V*Z zPC8;r9b8YI&~ti+yxm4&7B#|I4m%3LtLwc-yDPT#bY5l-E~8k1mlLnhO2Ii-BKa6I z(Z&9KM-rLMe61w=+@_6MiNq#sW48RB3dWWKpfSdx}&aI+FH zkxHGJB;;6qh#5PqlothCuAJGFMbozf>M=ma^4UWl-U)R_Q9xUaDamSgDjlnq$BWud zr8NlORSuXVwnRYHDM9v8mcSe&pmGC>?wfHCERwm)p)oj3V01Ssxp=q|CA*(fU#>7A zs>SIHjN&goIxgPL8i`>ST86O;_QNN%oIl~<6`Rdzm~UrC^+!(&&!eDF(F0;9Y$gYL zX+|w;pfronj>G zQ5Z>)G!qDADrGeIfj|9I3`G=%3z`fFrYB6W&+BgycFA(#`;keAJZY7k_^$RH<}|7U z1guU-FAnW!Nrb~23_rzjcUvZ%@VOC&a*aU3lvpVO(ZTN%yWYN*hGI}=ng=UJZNJMp zddf(>>4i>(|Dx(MeDisAgX?Ao6{j-|BgZB(Yl_oR%tER)vD0YWNz7`nX07QE!s9u09<>84qM< z4B3|Uha$aZwFbspNRp+^Fv)zG|9&Wneig!HfB^uSZuSrNR@B=^U>0LLJ1>>#pF3r*6ZHro5yUVf zzE!0VR|LugXw>4@I301dny;3h@90{wBH}LjyRM_3vYYPYVF*2Qt1=r(<8gHEI#@;^ zgXvEYHTGNA}=`SmS$4Xx-EL+VU~IIb7U}NbMLwzE?xy>&%^_!-?@l zLYpLpjzHTHt$(F7Eh`9zU>^xkR~W0!hi=_~KifH(d?S zR&4s}Qwhv6mKi+)k~X>>;kPgSc{I(;mr0>(bFr#F@v1Z+LsdFF_APdVmjjC$EBkwz z@dXrDSPj6->U4|nOPaOA+Tif?Yew7g+a}RWKB${d+)W;hkp6nmw zt5<`=t-Ie|j3gnTIiq@GPi?)*t=xX3M)$03OcwSP*=%<~-gQd$(l*ydjgr-0oce)GaiI&dKQ65W^mQEq`XB@lgxH~Vsq2tH^)wC4Jim?gUV$@OxT@{Ak-0AQyE0I=_FSAHj#`Kso(*ij*jE4hpu znbI-?N{nI1SHBRv1_TG!AJTzrE%B7CDWM_b7pL=F`<>e^X)bW#T&q+;Oraj&zLX?NelP*lHi-BGpn#$?nWy z`Ult>6a6WD2dPM#)A-+aw)|RP+LG$BbV}ZfVH5{!0?-p>GDGD$x}iRG`jBq+gO@~x zTyz^yX+4uiT@2c}lc69!*dx>t=h%%1r92g|-Dun*VLV7OaXk-oPW$A#x?-Q>(?`C} z+n)4AhFMf7jOY&mstawJztR=kpvJRVbR$pW(LKbXfO7btV#BgeBJB0bwr%=Rs(Zex ze%F^qnm5b_k|EvWimc84GD34pGi_!xhA3|ilFs?kazhWub1)XJRLZQyKka`)x7#9P zK@qxj4INUCfNF=*wAlp=x zz)d9@(WV8Dz_oBpI6a1ItT*^weAzH_RI`o@H)XApXf~F-gGp3Qe`s=AbkTOT=7ZRk zgo6e@lLQ}i5fhbkY+Jt`7EBR0M~N?31mma#6j^i-(GMY5D9|eSn_n0Nb2P~~rX3%; z{J=`ClVPV7uuNK5Q_XcRhs_nvC7F7cV}bt-NA58ycF7i|m5l|yJzzGSRM`(BO5s@i zy0z%CMmsySk>I zY1dlXEMYvO`H*QD_VcXLn}K}S5}gm9H;L7nIX5z*f_8S5x!*gNzvSSBD^giH7jjc! zdo0&Jl3~R+mg*~Ey;jlctV@Vzn4YD#(RE1TIQYO}RNtN_GpO;nJDEZ$9s@h#7{TyO zhgcaCax#&d%mk50p>duOQh8B}lNg4f2lU*OjSx2#m`Q?C#X^d}-I|iKCBFi@zRm<) z2DLE!K}nO*#y%_y>>=*g8B^>O8Xvdd_r9hux_A!`2fGsT;_+gP2+No1pR9)#)}l`p z6fz?pjlK;dYT+O-UYKj6vsmnVdK&r+AiLV@Lw|Y1;<@!1aSC5XFlg5!2S`@<$iiw| zVw}0C-LoPmbDpzgvk)N>B!MW)Br^_n0ad=o_ z_u?@;h@>ioZ%A)p8!6XKU}k7Zv%(5S$Bpla|rme`OBoFe}i!JjiIMO&|wTb3q_N?HbS5`5f}Atfn7he2Iqb+Q7!1t zEuWC@W}R0RAvQi4(`97nE<&1-b0{=~Olbsv81aoS6E@`kdZ6+OE>%g9u_%5v(4v5C zfH`@;sSefb3S&@qvA@wy`wbP?UQd*~W&nsd)mp7L6qS_4NAz7>^ds)G?z8S9%NKm& z?JbK6PeE;@b!#csa-GgBGJ938&ECG&E=!3{l1JEiX+1fxHH?+Er$>z%qYHBasAL7& zsvnN^Zd*!dTQh+8X8InctA~40;%i@w>Yk<{7H9VLGN}=ALwUH05toXT+QWIobb_4Mf$fgkiohk(LimpK`NYBQBuU$Y7m_njOJ?NSs%NGw z)qO3v#bsT^}3+-CQt6XD>E#GIPI6zPrehhcnU_H z_NVJy@oE*7>EyoxN5NxxsGmDYXnlXy`1!MRIYD#b={oUZbNQ-@^A)O`8RW-+=?+HS z8**Y+Qv(uFyDF$sQraTYn-kp%a@rztQ3DcdjY=|8?h?8R^5eGJc9iibL++WaOcGP> zit!3krw&Lv&Nz11M=S4PA)xD*l5r-e8R6F8_9#PC*|e|>leUgb-dUjbjwC~X!l^+@ zp#pq^CtNIwff?sSBXB7sDj>;--E9-kyTJb9QowD3wL7&lLnmcL{qaOGWT{Xl%M9f$ zsPov^HcOxN>cEs=RsTBXs<`cg;TysyPjLa)GV4*#p2MnT+SY!`Tt~i`H$)uQqA9Dm_Y@he1eNbS1s>6B%8dkmcEJi%@KZ%y)97keU&Gu;$LyBhqW_ zhX>8hl`-jK(_sQZ?!#o;TAQ{zj;!#9eJAzPV@tG0*zz$h<~XcprcXTCZ0IPgDO_sp~FbEnWSe9{;reCj6}+b~|{V8-nW1`}g4gMfh8J>@F36y)8Il zHVpOOssCA4z`Ey`>dkY{Z|d) hWiUX6b|yS3jtetG(D&;FA^e2)?MSH^7_;@*uS z!2SihwZQE^VSg)k+?~dz{|&pP{*-_3dU-pOx8Pg*zq};5=cNz)-)8c+-h9tZsgPf8 z-rC!_{WtBGoA;INyKXl8KeXT6|K{i|`quu5zArQ0qA6~IwCJWf{5xdsijIGqPp!&d zp5EF&G4~b1yBHOuJD6MH?5AG%H;m=iUzl6_C+5B)cNZgr{1?o>^|`;n(quIM$%tF~ zC+xnobr)ufatHQX==vKYZtB+xb!-1*+}AAbGR|*G?Z0o&?a5CC<8PQes9*VYYyZUD ue|o!%QNI!GZhL3FJz+8b8{~`gFUYM`l!3d6UH|~?<~4GoxfBxp{Pur=rQaR^ literal 0 HcmV?d00001