"How to interrupt the loop function and restart it?"
You don't. That's not how you write Arduino code. You need to have your loop function call a series of non-blocking functions that check to see if it's time to do something, do a very small bit of work if it is time, or just return if it's not time yet.
What I've done is to create a class ArduinoObject that has a setup function, a start function, a stop function, a loop function, and a boolean property running
. My main program has a global variable that holds an array of ArduinoObject
s.
Every time through the loop, I check all the ArduinoObject
s in the array, and call their loop functions.
The first thing each object does is check its running
flag. If running==false
, it exits immediately.
Each object uses unsigned long values to track the next millis()
time count when it should do something.
Let's say the object does an animation, so it has an unsigned long nextAnimationStepTime
. In the loop()
function, if nextAnimationStepTime<millis()
, it doesn't do anything. If instead nextAnimationStepTime>=millis()
, the object advances the animation to the next step, and sets nextAnimationStepTime = millis() + animationStepDuration
. That way, next time the object is called, it will wait until it's time to advance the animation yet another step.
Each object is written to only do a tiny bit of work on each pass through the loop, and return as quickly as possible.
With this design, I can add an arbitrary number of objects/tasks to my loop, and all of them get attention on every pass through the loop. Most objects simply decide they're not running, or it's not time to do anything, and return.
You can then add control logic that starts and stops individual objects based on things like button presses.
With this approach you'd have your button 1 press stop animation 2 if it was running and run animation 1. Conversely, pressing button 2 would stop animation 1 if