This version takes number input from serial to change the blink rate.
It uses my UNO's on-board led on pin 13 and works.
Don't feed it garbage and it will behave as expected, bigger numbers make longer ON time.
unsigned long waitUntil = 0UL; // because millis() returns UL
enum whatFlag { led13state, endOfLine, dataBegun };
byte Flags = 0;
void setup()
{
pinMode( 13, OUTPUT );
digitalWrite( 13, bitRead( Flags, led13state ));
Serial.begin( 9600 );
Serial.println( "Blink w/user input. Enter up to 1000 for led-on interval" );
Serial.println();
}
void loop()
{
static byte c; // c for character buffer
// static byte endOfLineState = 0;
static unsigned long timeSinceLastSerialRead = 0UL;
static int enter = 0; // to get serial-entered number value.
static int ledMillisOn = 100; // must be 0-999
// flash led and state changer
if ( waitUntil - millis() >= 10000UL ) // when millis() passes waitUntil the _unsigned_ subtract
{ // leaves very large positive result
Flags ^= ( 1 << led13state ); // led13state T/F bit toggle
if (bitRead( Flags, led13state )) waitUntil = millis() + (unsigned long)(ledMillisOn);
else waitUntil = millis() + (unsigned long)(999 - ledMillisOn);
digitalWrite(13, bitRead( Flags, led13state ));
}
// serial input
if (Serial.available())
{
c = Serial.read();
// Serial.print(".");
// Serial.print( c );
timeSinceLastSerialRead = millis();
if ( c >= '0' && c <= '9' )
{
enter *= 10; // decimal shifting whatever is in enter 1 place up
enter += ( c - '0' ); // ascii 48 is '0'
bitSet(Flags, dataBegun ); // entry is treated as finished
if ( enter >= 100 ) // next digit being able to take the total > 999
{
bitSet(Flags, endOfLine ); // entry is treated as finished
}
}
else if (( c == 13 || c == 10 ) && bitRead( Flags, dataBegun ))
{
bitSet( Flags, endOfLine ); // entry is treated as finished
}
else if (( millis() - timeSinceLastSerialRead >= 500 ) && ! bitRead( Flags, endOfLine ))
{
bitSet( Flags, endOfLine ); // entry is treated as finished
}
}
// serial output
if ( bitRead( Flags, endOfLine ) && bitRead( Flags, dataBegun )) // should be done and have data
{
Serial.print( ">> " );
Serial.print( enter );
Serial.println( " <<" );
ledMillisOn = enter;
enter = 0;
bitClear( Flags, endOfLine );
bitClear( Flags, dataBegun ); // clears bits, endOfLine and dataBegun
}
}