Split from Millis() not delaying
I've noticed an almost religious hatred of delay() amongst the experts in this forum. But the discussions in recent threads are a great example of why millis() timing isn't always the right tool for the job. The truth is, it's more complicated than delay() and, as is perfectly evident, harder to understand and easier to make mistakes, especially for beginners.
So I will make this assertion: it is ALWAYS better to use delay() UNLESS you need to do something else during that delay period*. Only then should you go the millis()-based multi-tasking route.
From an engineering point of view, there is no merit in making something more complicated than it needs to be. Indeed, it is an engineering sin to do so.
Just to be clear: I use millis() and micros() -based multitasking in most of my projects, but where the application is simple enough to allow it, I will always use delay().
Good engineering requires you use the right tool for the job, not the same tool for every job.
*There is another special case for avoiding delay() where timing offsets must not be allowed to accumulate, as discussed in another thread, but that's rare and beyond the scope of this thread.