millis with random switching question

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

sketch_random_millis.ino (1.2 KB)

randomSeed(analogRead(0));

...is unreliable. Here's why...

These are much better choices...

http://arduino.cc/forum/index.php/topic,108380.0.html

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

digitalWrite(13, ! digitalRead( 13 ) );

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

millis() >= waitUntilb

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

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

long waitUntilb=0;

The wait* variables need to be unsigned long.

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...

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;
  }
}

thanks so much
but please dont tell me it took you less than than a day . it worked as expected and i dont think i will be looking for a new wife now!

earthmove22:
thanks so much

You are welcome. I hope you learned a few things.

but please dont tell me it took you less than than a day

Just so you know, the posts are timestamped (03:13:37 AM to 02:57:25 AM). Of course, that doesn't include the time I spent learning to program. :wink:

it worked as expected and i dont think i will be looking for a new wife now!

A man's blessing (and curse). May you spend too much time on things that are not on the wife's Approved Activities list.

Because there would be a glitch when the millis() value rolls over?

Exactly.

hi guys
would a hardware issue be causing led to hang on high after say 5 min or less,i am using uno smd with led in pins 13 and ground,and have only been fooling with random off and on times now longer on than off ?
cheers

earthmove22:
hi guys
would a hardware issue be causing led to hang on high after say 5 min or less,i am using uno smd with led in pins 13 and ground,and have only been fooling with random off and on times now longer on than off ?
cheers

Please post your code, hard to diagnose otherwise. Is the issue consistent, i.e. does it always occur after 5 minutes?

Do you have a current limiting resistor in series with that LED?

Or are you talking about the on-board LED?

ok
the code is as was the provided by me old mate coding badly, the led was another seprate to board but as i was lead to believe pin 13 has inbuilt resistor for this purpose ( maybe not ha).over night i left it running with only board led doing the work and it is still working this morning,looks like i either need to provide seperate power source via switching transistor to led or increse the resistance via a couple of resistors on bread board,lesson learnt !
and thanks for your reply.