EEPROM.read() returns a byte. EEPROM.write() stores a byte. It makes no sense at all to call EEPROM.write() and pass it a float. It makes no sense to store the value read from EEPROM in a float.
If the data fits in a byte, pissing away three more using a float makes no sense.
Your RGBW struct needs to be reworked.
You need to be using more arrays and more functions. Read and/or write related data in EEPROM using a function. getTimes() and saveTimes(). getColors() and setColors().
That way, we can look at getTimes() and see that it is, or is not, doing reasonable things, and then forget about it. We see a call to getTimes(), and we know that it works.
A reasonable amount of white space between blocks of code is one line. More than that is annoying.
Consistent indenting is good. Yours is not. Tools + Auto Format will deal with that.
Sometimes comments are good. Sometimes, you really need a users manual. Guess which case this is.
A big block of comments that says FEEDING MENU, followed by the menu4() function makes me want to come kick your ass. What's wrong with skipping the comments and simply calling the function feedingMenu()?
if (menu == 7)
You should do some research involving enums. if(menu == FEEDING) or if(menu == LOWSUN) makes so much more sense.
Having ONE function to turn power pins on or off that takes a pin number and a state makes more sense than 16 functions that do nearly identical things.
Having a way to look up the EEPROM address for write the state of the nth pin makes more sense than hardcoding the addresses.
if (ch3bar >= 5) { myGLCD.fillRect(180,171,200,176); }
if (ch3bar >= 10) { myGLCD.fillRect(180,166,200,176); }
if (ch3bar >= 15) { myGLCD.fillRect(180,161,200,176); }
if (ch3bar >= 20) { myGLCD.fillRect(180,156,200,176); }
if (ch3bar >= 25) { myGLCD.fillRect(180,151,200,176); }
if (ch3bar >= 30) { myGLCD.fillRect(180,146,200,176); }
if (ch3bar >= 35) { myGLCD.fillRect(180,141,200,176); }
if (ch3bar >= 40) { myGLCD.fillRect(180,136,200,176); }
if (ch3bar >= 45) { myGLCD.fillRect(180,131,200,176); }
if (ch3bar >= 50) { myGLCD.fillRect(180,126,200,176); }
if (ch3bar >= 55) { myGLCD.fillRect(180,121,200,176); }
if (ch3bar >= 60) { myGLCD.fillRect(180,116,200,176); }
if (ch3bar >= 65) { myGLCD.fillRect(180,111,200,176); }
if (ch3bar >= 70) { myGLCD.fillRect(180,106,200,176); }
if (ch3bar >= 75) { myGLCD.fillRect(180,101,200,176); }
if (ch3bar >= 80) { myGLCD.fillRect(180,96,200,176); }
if (ch3bar >= 85) { myGLCD.fillRect(180,91,200,176); }
if (ch3bar >= 90) { myGLCD.fillRect(180,86,200,176); }
if (ch3bar >= 95) { myGLCD.fillRect(180,81,200,176); }
if (ch3bar >= 99) { myGLCD.fillRect(180,76,200,176); }
A little modulo arithmetic, and this could be one line of code.
Anyway, that's way too much code to determine whether you have a software problem or a hardware problem.
void loop()
{
analogWrite(pin1, 250);
delay(1000);
analogWrite(pin2, 250);
delay(1000);
analogWrite(pin3, 250);
delay(1000);
analogWrite(pin4, 250);
delay(10000);
}
If the first light comes on bright, and the second one does, and the third one does, but the 4th one causes all the lights to dim, then switch the order around. If turning the 4th pin on, regardless of which one is 4th, then you have a hardware problem.