Usage of timer inside loop

Why can’t we use timer function such as .timer.setTimeout(5000L, { digitalWrite(pin, LOW) } ); inside the loop.

Why would you want to do it? It’s a bit like trying to load a barrow just by repeatedly sticking the showell into the ground. Perhaps you don’t understand the idea lying behind timers??

1 Like

I want to use timer function instead of delay as it is causing disconnection from server due to delay function inside loop. So what must be the alternative instead of placing the timer inside a void . This method is causing too much void function

You are not allowed :wink: to use timers the same way as you are using delay()!!
The timers are what the name suggest: A timingly recalled routine (part of code)
Please look at the examples and at the timer manual :

Just note,that inside the loop you will find only the - It is by no means comparable to delay: Its purpose is to manage timer tasks.

1 Like

My suggestion:

  1. create a flag variable say timerDone.
  2. Initialise it to 0.
  3. Instead of the delay In the loop() routine insert the code:
    if (timerDone) DoSomething;
  4. In code before loop, declare the routine delayTimer.
    void delayTimer()
    digitalWrite(pin, LOW);
    timerDone =1;

Edit: The loop will like:

void loop()
if (Condition_met) delayTimer();
if (timerDone) DoSomething();

1 Like

Since I was responding to some one’s problem, I thought about the issue and made/wrote this up. If senior members in this group think this is elegant way of replacing delay statements with timers and avoid heartbeat miss etc., maybe this can be published in the knowledge base as a recommended alternative to using delays.

@marvin7 @Gunner @Costas @wanek @PeteKnight

1 Like

Well this old fart :older_man: (but young at heart :stuck_out_tongue_winking_eye: ) is still wondering why this OP needs a delay in the loop?? If you only want something to run for say once every 10 seconds, then put it in a timed function that runs once every 10 seconds… no need for a delay, fake or otherwise, in the loop.

1 Like

I don’t know @mohan_sundaram. If someone REALLY needs to hold the program flow, but not causing the Blynk to timeout, I’d try the following:

#define DELAY5000 5000L

	void loop(){
		//some code
		for (unsigned long start = millis(); millis() - start < DELAY5000; ) { //start delay, but do not block Blynk "stuff";
		//some code;

This will definitely hold the loop() without interrupting the Blynk… I’m not using it anyway :stuck_out_tongue:

1 Like