Thanks-- some good things to think about and clarify.
How long [does it work]?
It appears to depend how much the displayed tube is changing. Sometimes this is only a few seconds, other times it's a few minutes.
Is your code toggling that pin? If your code isn't directly changing the state of the pin, you won't really have much debug information to go on.
The code is multiplexing, so the pin should be rapidly changing state. Result is that the LED is mostly on all of the time. (When I'm describing "on" here, I'm really talking about a quick pulsing, consistent with the multiplexing I'm doing here -- not a constant on.)
(And you do have a current limiting resistor in series with that LED, right?)
Pressing just the RESET button and getting back to normal operation, might suggest a code problem. 1) Running out of RAM. 2) not declaring variables for millis() and micros() correctly. 3) Not handling rollover of millis() and micros(). etc.
I'm happy to look into any or all of these, but it doesn't explain why the LED shows normal operation until I've got the tube in place.
How would I go about figuring out if I've run out of RAM?
Not using micros() anywhere.
All vars recording millis() are LONG. I know I'm not handling the overflows on those yet, but I thought I didn't need to worry about that for the first 9 hours or so? I was going to add my overflow handling in later.
There is a poly-fuse on the USB supply line. However, a simple press of the Reset-button generally wouldn't reset it. A power cycle (and sometimes a few seconds of power-down) is needed to let the polymer cool down.
Hmm. That does suggest a code problem. Not sure how attaching the tube would alter how the code was running, though? I'm not attempting to use any input here.
Nobody ever complained about someone posting their code and schematic along with their question.
My code is getting pretty complicated; perhaps I can create a reduced sketch that reproduces the problem and post that.