Go Down

Topic: millis with random switching question (Read 997 times) previous topic - next topic

earthmove22

hi guy's
have been stumped for days on this one,trying to create chopper for water stream,and light show, have done code with delays and works and now wanted to change out to millis type program the theory is turn on led (will be stepper motor in future) then wait random time ,then turn off after seperate random time the code included is only one i would like help with
thanks in advance



Coding Badly


Reading from an OUTPUT works so toggling pin 13 can be reduced to this single line of code...

Code: [Select]
digitalWrite(13, ! digitalRead( 13 ) );

Coding Badly


For your application I doubt it will matter but this...

Code: [Select]
millis() >= waitUntilb

...is not a reliable way to mark time.


Comparing unsigned values (return from millis) with signed values is not good...

Code: [Select]
long waitUntilb=0;

The wait* variables need to be unsigned long.

Coding Badly


From the code, I gather the strategy is to wait a random amount of time (either 100 to 180 milliseconds or 4000 to 5000 milliseconds) and then toggle pin 13.  The HIGH time is 100 to 180 milliseconds and the LOW time is 4000 to 5000 milliseconds.  Sound about right?

All the "problems" listed above are minor.  In other words, there is nothing wrong with how you were approaching the problem.  However, I believe there is a simpler approach.  Maybe something like this...


Code: [Select]
void setup()
{
  pinMode(13, OUTPUT);
}

unsigned long delta;
unsigned long previous;

void loop()
{
  unsigned long now;

  now = millis();

  if ( now - previous >= delta )
  {
    digitalWrite(13, ! digitalRead( 13 ) );

    if ( digitalRead( 13 ) )
    {
      // Determine the HIGH time
      delta = random( 100, 180 );
    }
    else
    {
      // Determine the LOW time
      delta = random( 4000, 5000 );
    }
    previous = now;
  }
}

Go Up