void firstRunSetup() { // we need to track if this has EVER run, because we only want it to run once ever // iAqua was started 6/5/2014. That's when I created the project. // I'm going to save 65 into EEPROM bank 2014 as a check if (EEPROM.read(2014)!=65) { EEPROM.write(2014,65); // write to EEPROM so this never runs again // default screen settings EEPROM.write(28,0); //screenRetHome EEPROM.write(29,0); //screenDimLevel EEPROM.write(30,0); //screenDimSec EEPROM.write(31,0); //screenBrightMem EEPROM.write(47,0); EEPROM.write(40,0); EEPROM.write(42,0); EEPROM.write(41,0); EEPROM.write(45,0); EEPROM.write(46,0); // set default feeding values on first launch EEPROM.write(1,minute()); // last feeding data EEPROM.write(2,hour()); // last feeding data EEPROM.write(3,day()); // last feeding data EEPROM.write(4,month()); // last feeding data EEPROM.write(5,(year()-2000)); // last feeding data // feeding settings EEPROM.write(6,0); EEPROM.write(7,0); // feedingMins EEPROM.write(8,1); // feedPower.pwrLight1 EEPROM.write(9,1); // feedPower.pwrLight2 EEPROM.write(10,0); // feedPower.pwrFilter EEPROM.write(11,0); // feedPower.pwrWater EEPROM.write(12,0); // feedPower.pwrHeat EEPROM.write(13,0); // feedPower.pwrCO2 EEPROM.write(14,0); // feedPower.pwrAux1 EEPROM.write(15,0); // feedPower.pwrAux2 EEPROM.write(441,0); // feedPower.pwrCable // set default heater values on first launch EEPROM.write(16,0); // 16 // heater settings saved (0 for no, 1 for yes) EEPROM.write(17,0); // heatOffTemp EEPROM.write(18,0); // heatOnTemp EEPROM.write(19,0); // coldWarnTemp // set default dosing values on first launch EEPROM.write(20,0); // 20 // dosing settings saved EEPROM.write(21,0); // 21 // dose in 2mL EEPROM.write(22,0); // 22 // dosing reseviors capacity in mL^10 EEPROM.write(23,0); // 23 // pump 1 ms^10/ml EEPROM.write(24,0); // 24 // pump 2 ms^10/ml EEPROM.write(25,0); // 25 // dosing volume saved (0 for no, 1 for yes) EEPROM.write(26,0); // 26 // pump 1 remaining doses EEPROM.write(27,0); // 27 // pump 2 remaining doses // default screen settings EEPROM.write(28,0); //screenRetHome EEPROM.write(29,0); //screenDimLevel EEPROM.write(30,0); //screenDimSec EEPROM.write(31,0); //screenBrightMem // set default dosing values on first launch EEPROM.write(32,0); // remaining volume for pump 1 (high byte ^10) EEPROM.write(33,0); // remaining volume for pump 1 (low byte) EEPROM.write(34,0); // remaining volume for pump 2 (high byte ^10) EEPROM.write(35,0); // remaining volume for pump 2 (low byte) // kalibrace Ph sondy EEPROM.write(36,0); // kalibrace Ph sondy roztokem Ph4 EEPROM.write(37,0); // kalibrace Ph sondy roztokem Ph7 // nastaveni spinani topneho kabelu EEPROM.write(442,0); // teplota zapnuti topneho kabelu EEPROM.write(443,0); // teplota vypnuti topneho kabelu // nastaveni spinani topneho kabelu EEPROM.write(444,0); // teplota zapnuti chlazeni EEPROM.write(445,0); // teplota vypnuti chlazeni EEPROM.write(448,0); // vlhkost zapnuti chlazeni // Water settings EEPROM.write(446,0); // waterMins EEPROM.write(447,0); // waterSec // pro nastaveni offset cidel na 0, zadat 128 EEPROM.write(58,128); // offset teplota vody EEPROM.write(59,128); // offset teplota vzduchu EEPROM.write(60,128); // offset teplota vody EEPROM.write(61,128); // offset teplota vzduchu // pro nastaveni offset cidel na 0, zadat 128 EEPROM.write(90,0); // CalibrationPH4 EEPROM.write(91,0); // CalibrationPH7 EEPROM.write(92,20); // ProbleLife1=100; EEPROM.write(93,20); // ProbleLife2=150; EEPROM.write(94,20); // ProbleLife3=200; EEPROM.write(95,100); // CalibrationDay=250; EEPROM.write(96,128); // CO2OffVal; EEPROM.write(97,128); // CO2OnVal; // Nastaveni rele na vypnuto EEPROM.write(100,0); // EEPROM.write(100,0); // EEPROM.write(101,0); // EEPROM.write(102,0); // EEPROM.write(103,0); // EEPROM.write(104,0); // EEPROM.write(105,0); // EEPROM.write(106,0); // EEPROM.write(107,0); // EEPROM.write(108,0); // EEPROM.write(109,0); // EEPROM.write(110,0); // EEPROM.write(111,0); // EEPROM.write(112,0); // EEPROM.write(113,0); // EEPROM.write(114,0); // EEPROM.write(115,0); // EEPROM.write(116,0); // EEPROM.write(117,0); // EEPROM.write(118,0); // EEPROM.write(119,0); // EEPROM.write(120,0); // EEPROM.write(121,0); // EEPROM.write(122,0); // EEPROM.write(123,0); // EEPROM.write(124,0); // EEPROM.write(125,0); // EEPROM.write(126,0); // EEPROM.write(127,0); // EEPROM.write(128,0); // EEPROM.write(129,0); // //light ramp schedules EEPROM.write(220,0); // EEPROM.write(221,0); // EEPROM.write(222,0); // EEPROM.write(223,0); // EEPROM.write(224,0); // EEPROM.write(225,0); // EEPROM.write(226,0); // EEPROM.write(227,0); // EEPROM.write(228,0); // EEPROM.write(229,0); // EEPROM.write(230,0); // EEPROM.write(231,0); // EEPROM.write(232,0); // EEPROM.write(233,0); // EEPROM.write(234,0); // EEPROM.write(235,0); // EEPROM.write(236,0); // EEPROM.write(237,0); // EEPROM.write(238,0); // EEPROM.write(239,0); // EEPROM.write(240,0); // EEPROM.write(241,0); // EEPROM.write(242,0); // EEPROM.write(243,0); // // dosing schedules EEPROM.write(300,0); // EEPROM.write(301,0); // EEPROM.write(302,0); // EEPROM.write(303,0); // EEPROM.write(304,0); // EEPROM.write(305,0); // EEPROM.write(306,0); // EEPROM.write(307,0); // EEPROM.write(308,0); // EEPROM.write(309,0); // EEPROM.write(310,0); // EEPROM.write(311,0); // EEPROM.write(312,0); // EEPROM.write(313,0); // EEPROM.write(314,0); // EEPROM.write(315,0); // EEPROM.write(316,0); // EEPROM.write(317,0); // // RGBW values EEPROM.write(200,0); EEPROM.write(201,0); EEPROM.write(202,0); EEPROM.write(203,0); EEPROM.write(204,0); EEPROM.write(205,0); EEPROM.write(206,0); EEPROM.write(207,0); EEPROM.write(208,0); EEPROM.write(209,0); EEPROM.write(210,0); EEPROM.write(211,0); EEPROM.write(212,0); EEPROM.write(213,0); EEPROM.write(214,0); EEPROM.write(215,0); EEPROM.write(216,0); // EEPROM.write(217,0); // EEPROM.write(218,0); // EEPROM.write(219,0); // // RGBW values // 0=high sun, 1=mid sun, 2=low sun, 3=moon EEPROM.write(400,0); // HS red EEPROM.write(401,0); // HS green EEPROM.write(402,0); // HS blue EEPROM.write(403,0); // HS cool white EEPROM.write(404,0); // HS warm white EEPROM.write(405,0); // HS UV EEPROM.write(406,0); // chan7 EEPROM.write(407,0); // chan8 EEPROM.write(408,0); // chan9 EEPROM.write(409,0); // chan10 EEPROM.write(410,0); // MS EEPROM.write(411,0); // EEPROM.write(412,0); // EEPROM.write(413,0); // EEPROM.write(414,0); // EEPROM.write(415,0); // EEPROM.write(416,0); // EEPROM.write(417,0); // EEPROM.write(418,0); // EEPROM.write(419,0); // EEPROM.write(420,0); // LS EEPROM.write(421,0); // EEPROM.write(422,0); // EEPROM.write(423,0); // EEPROM.write(424,0); // EEPROM.write(425,0); // EEPROM.write(426,0); // EEPROM.write(427,0); // EEPROM.write(428,0); // EEPROM.write(429,0); // EEPROM.write(430,0); // Moon EEPROM.write(431,0); // EEPROM.write(432,0); // EEPROM.write(433,0); // EEPROM.write(434,0); // EEPROM.write(435,0); // EEPROM.write(436,0); // EEPROM.write(437,0); // EEPROM.write(438,0); // EEPROM.write(439,0); // } } void readSensorSettings() { // get heat warning temps heatOffTemp=EEPROM.read(17); heatOnTemp=EEPROM.read(18); coldWarnTemp=EEPROM.read(19); cableOffTemp=EEPROM.read(442); cableOnTemp=EEPROM.read(443); circOffTemp=EEPROM.read(444); circOnTemp=EEPROM.read(445); humiOn=EEPROM.read(448); schedcable.active=EEPROM.read(42); schedcirc.active=EEPROM.read(47); // nacti offset data cidel byte storedVal1 = EEPROM.read(58); byte storedVal2 = EEPROM.read(59); byte storedVal3 = EEPROM.read(60); byte storedVal4 = EEPROM.read(61); sensor1Calibration = ((float)storedVal1 - 128) / 10; sensor2Calibration = ((float)storedVal2 - 128) / 10; sensor3Calibration = ((float)storedVal3 - 128) / 10; sensor4Calibration = ((float)storedVal4 - 128) / 10; } void readPowerSchedule() { // load power schedule from eeprom schedLights1.active = EEPROM.read(100); schedLights1.onHour = EEPROM.read(101); schedLights1.onMinute = EEPROM.read(102); schedLights1.offHour = EEPROM.read(103); schedLights1.offMinute = EEPROM.read(104); schedLights2.active = EEPROM.read(105); schedLights2.onHour = EEPROM.read(106); schedLights2.onMinute = EEPROM.read(107); schedLights2.offHour = EEPROM.read(108); schedLights2.offMinute = EEPROM.read(109); schedCo2.active = EEPROM.read(115); schedCo2.onHour = EEPROM.read(116); schedCo2.onMinute = EEPROM.read(117); schedCo2.offHour = EEPROM.read(118); schedCo2.offMinute = EEPROM.read(119); schedAux1.active = EEPROM.read(120); schedAux1.onHour = EEPROM.read(121); schedAux1.onMinute = EEPROM.read(122); schedAux1.offHour = EEPROM.read(123); schedAux1.offMinute = EEPROM.read(124); schedAux2.active = EEPROM.read(125); schedAux2.onHour = EEPROM.read(126); schedAux2.onMinute = EEPROM.read(127); schedAux2.offHour = EEPROM.read(128); schedAux2.offMinute = EEPROM.read(129); } void readRampSchedule() { // load lighting ramp schedule from eeprom ramp1.onHour = EEPROM.read(220); ramp1.onMinute = EEPROM.read(221); ramp1.offHour = EEPROM.read(222); ramp1.offMinute = EEPROM.read(223); ramp2.onHour = EEPROM.read(224); ramp2.onMinute = EEPROM.read(225); ramp2.offHour = EEPROM.read(226); ramp2.offMinute = EEPROM.read(227); ramp3.onHour = EEPROM.read(228); ramp3.onMinute = EEPROM.read(229); ramp3.offHour = EEPROM.read(230); ramp3.offMinute = EEPROM.read(231); ramp4.onHour = EEPROM.read(232); ramp4.onMinute = EEPROM.read(233); ramp4.offHour = EEPROM.read(234); ramp4.offMinute = EEPROM.read(235); ramp5.onHour = EEPROM.read(236); ramp5.onMinute = EEPROM.read(237); ramp5.offHour = EEPROM.read(238); ramp5.offMinute = EEPROM.read(239); ramp6.onHour = EEPROM.read(240); ramp6.onMinute = EEPROM.read(241); ramp6.offHour = EEPROM.read(242); ramp6.offMinute = EEPROM.read(243); } void readDosingSchedule() { // load dosing schedule from eeprom pump1.onHour = EEPROM.read(300); pump1.onMinute = EEPROM.read(301); pump1.Sunday = EEPROM.read(302); pump1.Monday = EEPROM.read(303); pump1.Tuesday = EEPROM.read(304); pump1.Wednesday = EEPROM.read(305); pump1.Thursday = EEPROM.read(306); pump1.Friday = EEPROM.read(307); pump1.Saturday = EEPROM.read(308); pump2.onHour = EEPROM.read(309); pump2.onMinute = EEPROM.read(310); pump2.Sunday = EEPROM.read(311); pump2.Monday = EEPROM.read(312); pump2.Tuesday = EEPROM.read(313); pump2.Wednesday = EEPROM.read(314); pump2.Thursday = EEPROM.read(315); pump2.Friday = EEPROM.read(316); pump2.Saturday = EEPROM.read(317); } void readFeedSettings() { feedingMins=EEPROM.read(7); feedPower.pwrLight1=EEPROM.read(8); feedPower.pwrLight2=EEPROM.read(9); feedPower.pwrFilter=EEPROM.read(10); feedPower.pwrWater=EEPROM.read(11); feedPower.pwrHeat=EEPROM.read(12); feedPower.pwrCO2=EEPROM.read(13); feedPower.pwrAux1=EEPROM.read(14); feedPower.pwrAux2=EEPROM.read(15); feedPower.pwrCable=EEPROM.read(441); } void readWaterSettings() { waterMins=EEPROM.read(446); waterSec=EEPROM.read(447); } void readScreenSettings() { screenRetHome = EEPROM.read(28); screenDimLevel = EEPROM.read(29); screenDimSec = EEPROM.read(30); } void readBargraphColors() { for(int i = 0; i < 6 ; i++) { barColors[i] = EEPROM.read(80+i); } } // Giving some big credit here, my original version of the smart startup had several bugs with schedules wrapping past midnight. // This new smart startup routine was reworked and fixed by robsworld78 at The Planted Tank forums void smartStartup() { // get the current time in UNIX time, which is FAR easier for time calculations and comparisons // also must set UTC offset for mktime to calcuate stuff correct time_t currentStamp = now(); time_t midnight = tmConvert_t(year(),month(),day(),23,59,59); // current day 11:59:59pm //Might work: time_t midnight = nextMidnight(now()); time_t powerOn; time_t powerOff; time_t powerOffNextDay; //// POWER STARTUP: LIGHTS 1 // read in the power schedule and see if we are at a time when it should be on if (schedLights1.active == 1) { time_t powerOn = tmConvert_t(year(),month(),day(),schedLights1.onHour,schedLights1.onMinute,0); // get a unix time stamp for the power on time_t powerOff = tmConvert_t(year(),month(),day(),schedLights1.offHour,schedLights1.offMinute,0); // get a unix time stamp for the power off time_t powerOffNextDay = tmConvert_t(year(),month(),day(),schedLights1.offHour,schedLights1.offMinute,0); powerOffNextDay = powerOffNextDay+86400; if (powerOn==powerOff) AlarmPwrLight1_On(); else if (powerOn>powerOff) { if ((currentStamp>=powerOn) && (powerOffNextDay>=midnight)) AlarmPwrLight1_On(); else if (((currentStamp<=powerOn) && (currentStamp<=powerOff) && (powerOffNextDay>=midnight))) AlarmPwrLight1_On(); else AlarmPwrLight1_Off(); } else if ((currentStamp>=powerOn) && (currentStamp<=powerOff)) AlarmPwrLight1_On(); else AlarmPwrLight1_Off(); } //// POWER STARTUP: LIGHTS 2 // read in the power schedule and see if we are at a time when it should be on if (schedLights2.active == 1) { powerOn = tmConvert_t(year(),month(),day(),schedLights2.onHour,schedLights2.onMinute,0); // get a unix time stamp for the power on powerOff = tmConvert_t(year(),month(),day(),schedLights2.offHour,schedLights2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay = tmConvert_t(year(),month(),day(),schedLights2.offHour,schedLights2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay = powerOffNextDay+86400; if (powerOn==powerOff) AlarmPwrLight2_On(); else if (powerOn>powerOff) { if ((currentStamp>=powerOn) && (powerOffNextDay>=midnight)) AlarmPwrLight2_On(); else if (((currentStamp<=powerOn) && (currentStamp<=powerOff) && (powerOffNextDay>=midnight))) AlarmPwrLight2_On(); else AlarmPwrLight2_Off(); } else if ((currentStamp>=powerOn) && (currentStamp<=powerOff)) AlarmPwrLight2_On(); else AlarmPwrLight2_Off(); } //// POWER STARTUP: FILTER AlarmPwrFilter_On(); // the filter is ALWAYS ON //// POWER STARTUP: Water AlarmPwrWater_Off(); // the water is ALWAYS OFF //// POWER STARTUP: HEATER AlarmPwrHeat_On(); // the heater is ALWAYS ON //// POWER STARTUP: CO2 // read in the power schedule and see if we are at a time when it should be on if (schedCo2.active == 1) { powerOn = tmConvert_t(year(),month(),day(),schedCo2.onHour,schedCo2.onMinute,0); // get a unix time stamp for the power on powerOff = tmConvert_t(year(),month(),day(),schedCo2.offHour,schedCo2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay = tmConvert_t(year(),month(),day(),schedCo2.offHour,schedCo2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay=powerOffNextDay+86400; if (powerOn==powerOff) AlarmPwrCO2_On(); else if (powerOn>powerOff) { if ((currentStamp>=powerOn) && (powerOffNextDay>=midnight)) AlarmPwrCO2_On(); else if (((currentStamp<=powerOn) && (currentStamp<=powerOff) && (powerOffNextDay>=midnight))) AlarmPwrCO2_On(); else AlarmPwrCO2_Off(); } else if ((currentStamp>=powerOn) && (currentStamp<=powerOff)) AlarmPwrCO2_On(); else AlarmPwrCO2_Off(); } //// POWER STARTUP: AUX 1 // read in the power schedule and see if we are at a time when it should be on if (schedAux1.active == 1) { powerOn = tmConvert_t(year(),month(),day(),schedAux1.onHour,schedAux1.onMinute,0); // get a unix time stamp for the power on powerOff = tmConvert_t(year(),month(),day(),schedAux1.offHour,schedAux1.offMinute,0); // get a unix time stamp for the power off powerOffNextDay = tmConvert_t(year(),month(),day(),schedAux1.offHour,schedAux1.offMinute,0); // get a unix time stamp for the power off powerOffNextDay=powerOffNextDay+86400; if (powerOn==powerOff) AlarmPwrAux1_On(); else if (powerOn>powerOff) { if ((currentStamp>=powerOn) && (powerOffNextDay>=midnight)) AlarmPwrAux1_On(); else if (((currentStamp<=powerOn) && (currentStamp<=powerOff) && (powerOffNextDay>=midnight))) AlarmPwrAux1_On(); else AlarmPwrAux1_Off(); } else if ((currentStamp>=powerOn) && (currentStamp<=powerOff)) AlarmPwrAux1_On(); else AlarmPwrAux1_Off(); } //// POWER STARTUP: AUX 2 // read in the power schedule and see if we are at a time when it should be on if (schedAux2.active == 1) { powerOn = tmConvert_t(year(),month(),day(),schedAux2.onHour,schedAux2.onMinute,0); // get a unix time stamp for the power on powerOff = tmConvert_t(year(),month(),day(),schedAux2.offHour,schedAux2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay = tmConvert_t(year(),month(),day(),schedAux2.offHour,schedAux2.offMinute,0); // get a unix time stamp for the power off powerOffNextDay=powerOffNextDay+86400; if (powerOn==powerOff) AlarmPwrAux2_On(); else if (powerOn>powerOff) { if ((currentStamp>=powerOn) && (powerOffNextDay>=midnight)) AlarmPwrAux2_On(); else if (((currentStamp<=powerOn) && (currentStamp<=powerOff) && (powerOffNextDay>=midnight))) AlarmPwrAux2_On(); else AlarmPwrAux2_Off(); } else if ((currentStamp>=powerOn) && (currentStamp<=powerOff)) AlarmPwrAux2_On(); else AlarmPwrAux2_Off(); } // lighting mode is restored to value with closest start time after current time smartStartupRamp(); setStartupPWMLighting(); // if not using IR lighting, then startup lights with PWM } void smartStartupRamp() { time_t currentStamp = now(); time_t midnight = tmConvert_t(year(),month(),day(),23,59,59); // current day 11:59:59pm time_t rampStart1 = tmConvert_t(year(),month(),day(),ramp1.onHour,ramp1.onMinute,0); time_t rampStart2 = tmConvert_t(year(),month(),day(),ramp2.onHour,ramp2.onMinute,0); time_t rampStart3 = tmConvert_t(year(),month(),day(),ramp3.onHour,ramp3.onMinute,0); time_t rampStart4 = tmConvert_t(year(),month(),day(),ramp4.onHour,ramp4.onMinute,0); time_t rampStart5 = tmConvert_t(year(),month(),day(),ramp5.onHour,ramp5.onMinute,0); time_t rampStart6 = tmConvert_t(year(),month(),day(),ramp6.onHour,ramp6.onMinute,0); //// Ramp 2 after midnight if ((rampStart2rampStart1)) { currentLightMode=2; } else if ((rampStart2rampStart2) && (currentStamprampStart3) && (currentStamprampStart4) && (currentStamprampStart5) && (currentStamprampStart1) && (rampStart3rampStart2))) { currentLightMode=1; } else if (((rampStart2>rampStart1) && (rampStart3rampStart1) && (rampStart3rampStart3) && (currentStamprampStart1) && (rampStart3rampStart4) && (currentStamprampStart1) && (rampStart3rampStart5) && (currentStamprampStart1) && (rampStart3>rampStart1) && (rampStart4rampStart3)))) { currentLightMode=0; } else if ((((rampStart2>rampStart1) && (rampStart3>rampStart1) && (rampStart4rampStart1) && (rampStart3>rampStart1) && (rampStart4rampStart4) && (currentStamprampStart1) && (rampStart3>rampStart1) && (rampStart4rampStart5) && (currentStamprampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5rampStart4))))) ////winner { currentLightMode=1; } else if (((((rampStart2>rampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5rampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5rampStart5) && (currentStamprampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5>rampStart1) && (rampStart6rampStart5)))))) { currentLightMode=2; } else if ((((((rampStart2>rampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5>rampStart1) && (rampStart6rampStart1) && (rampStart3>rampStart1) && (rampStart4>rampStart1) && (rampStart5>rampStart1) && (rampStart6rampStart6) && (currentStamprampStart1) && (currentStamprampStart2) && (currentStamprampStart3) && (currentStamprampStart4) && (currentStamprampStart5) && (currentStamprampStart6) && (currentStamp