PaulS:
but the timed hold is an example on how to use millis().
Well, I recognize that. But, clearly OP didn't. I think that the blink without delay example is a better choice, but only because it is focusing only on one task. Your code shows how to do a number of things, not all of which are on OPs requirements list.
Hence why I recommended Blink Without Delay first. I didn't just write that code at the OPs request, It just happened to include an example of signal edge detection and using millis(), which is why I posted it.