Go Down

Topic: millis with random switching question (Read 1 time) 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

Code: [Select]
randomSeed(analogRead(0));

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

http://arduino.cc/forum/index.php/topic,66206.msg630884.html#msg630884


These are much better choices...

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

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

earthmove22

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!

Coding Badly

thanks so much


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

Quote
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.   ;)

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

Jack Christensen


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

Code: [Select]
millis() >= waitUntilb

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


Because there would be a glitch when the millis() value rolls over?
MCP79411/12 RTC ... "One Million Ohms" ATtiny kit ... available at http://www.tindie.com/stores/JChristensen/


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

Jack Christensen


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?
MCP79411/12 RTC ... "One Million Ohms" ATtiny kit ... available at http://www.tindie.com/stores/JChristensen/

Coding Badly


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

Or are you talking about the on-board LED?

earthmove22

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.

Go Up