Need guidance on programming technique

Excellent suggestions. Thanks a bunch.

I may be slow in responding as I look up and learn how all this new stuff works.

For instance, I was unaware of the F() macro and it's implications. I was thinking "I've got 32K of memory, why worry about conserving it". Oops, 1K. At the same time, by putting stuff in Flash memory, if there is a power failure, when it comes back up, it should all still be there.
Question: Is there any restriction on saving all the various situational states (timeHeaterCOn, prevLowerFwTub, stateSolenoidRoDi, etc.) in Flash memory? If so, a power flicker would not result in a complete reset. The process could just pick up where it left off.

I just received a DS1307 via the "slow boat from China". I haven't yet gone through the learning process for using it. Not necessary for this process, but fun. Actually, the whole thing is not necessary. I could just check the aquarium every day to make sure everything is working. But I'm 'way too lazy for that.

// Turn on first heater in the list

Oops. Fixed. That's what comes of careless copy and paste procedures.

Heater list should use C,D,E (initialized as "xCDEx").

Rats! I have looked at that 100 times and noticed nothing wrong! That's why I can't get those routines to work! I originally had Sensors A,B,C,D,E and Heaters A,B,C with Heaters A,B,C connected to Sensors C,D,E. This got so confusing that I took the time to change it so that C,D,E were connected to C,D,E. I missed the rotater. Thanks eversomuch. I would probably be gazing past it next winter.

massive case statements

I was playing around trying to see if I could use case statements to simplify things. It didn't in this case. But code once written tends to live on to haunt the unsuspecting traveler.

Using a func_ prefix on your functions seems unnecessary.

This was just to remind myself what these things were. When I see "func_" I instantly know what it is. Been doing that for 40 years. Old dog; new tricks. You know the deal.

define a struct to hold the set of data being displayed

Excellent suggestion. Now I have to investigate what a Struct is and how it works. Thanks for causing trouble.

You can compare blocks of memory using memcmp() from string.h.
The memXXX() functions are nice and clean.

You guys are determined to make me hurt my head by having to learn a whole bunch of new stuff, aren't you? Thanks. Looks like a much cleaner way to do it. Used with the F() macro, it will solve a bunch of my mess.

Millis and micros values should be held as unsigned long values.

Fixed. But it messed up the nice, neat columns of comments by making the code line longer. :~

"const uint8_t"

What's "uint8_t"?

Bytes instead of int

I never thought about it. Good idea. Thanks. Fixed.

change all your calls to now() with millis()

The time.h stuff looked more interesting than millis(). I saw a discussion about millis() rolling over to start over after some length of time and I didn't want to deal with it. I'm going to use a DS1307 clock sometime soon. Not needed. Just because it looks interesting.