// DualActionDelayMillis v1.1 by GoForSmoke 11/18/24 -- made for Uno R3
// expect: ground pin 7 to run delay mode, not grounded runs millis mode
// expect: enter key in Serial Monitor to pause action, unpause action
// note that Arduino millis is +/-1 and that printing takes time as well!
const byte blinkPin = 13; // Uno board LED pin13
const byte jumperPin = 7; // a jumper from pin 7 to GND or pin 7 unterminated
byte jumperStateNow, jumperStatePrev; // to compare what is to what was
const word debounce = 20; // ms delay while the contacts settle, dirty signal
byte blinkState; // led13 0=OFF, not-0=ON
const unsigned long interval1 = 5000;
unsigned long start1;
byte started1 = 0;
const unsigned long interval2 = 1000;
unsigned long start2;
byte started2 = 0;
void usage()
{
Serial.println( F( "\n Dual Action Delay Millis \n" ));
Serial.println( F( " ground pin 7 to run delay mode, not grounded runs millis mode" ));
Serial.println( F( " Send enter key in Serial Monitor to pause action, unpause action \n\n" ));
}
void setup()
{
Serial.begin( 115200 ); // run serial fast to clear the output buffer fast
// set Serial Monitor to match
pinMode( blinkPin, OUTPUT ); // LOW by default
// blinkState is 0 by default
pinMode( jumperPin, INPUT_PULLUP );
jumperStateNow = jumperStatePrev = digitalRead( jumperPin );
}
void loop()
{
// ============================ change mode with jumper =======
jumperStateNow = digitalRead( jumperPin ); // check for mode change
if ( jumperStateNow != jumperStatePrev ) // if jumperPin changes state, stop and debounce then re-init
{
while ( jumperStateNow != jumperStatePrev )
{
jumperStatePrev = jumperStateNow;
delay( debounce );
jumperStateNow = digitalRead( jumperPin );
} // finished debounce
started1 = started2 = 0; // init for millis mode
}
// ============================ end change mode with jumper =======
// ============================ millis mode ===================
if ( jumperStateNow > 0 ) // run millis mode
{
if ( started1 == 0 )
{
started1 = 1;
Serial.print( F( "Millis Wait " ));
Serial.print( interval1 );
Serial.print( F( " time " ));
Serial.println( millis());
start1 = millis();
}
if ( started2 == 0 )
{
started2 = 1;
Serial.print( F( "Millis Wait " ));
Serial.print( interval2 );
Serial.print( F( " time " ));
Serial.println( millis());
start2 = millis();
}
if ( millis() - start1 >= interval1 )
{
started1 = 0;
Serial.print( F( "Finished Millis Wait " ));
Serial.print( interval1 );
Serial.print( F( " time " ));
Serial.println( millis());
}
if ( millis() - start2 >= interval2 )
{
started2 = 0;
Serial.print( F( "Finished Millis Wait " ));
Serial.print( interval2 );
Serial.print( F( " time " ));
Serial.println( millis());
}
}
// ============================ end millis mode ===================
// ============================ delay mode ===================
else // run delay mode
{
Serial.print( F( "Delay " ));
Serial.print( interval1 );
Serial.print( F( " time " ));
Serial.println( millis());
delay( interval1 );
Serial.print( F( "Finished Delay " ));
Serial.print( interval1 );
Serial.print( F( " time " ));
Serial.println( millis());
Serial.print( F( "Delay " ));
Serial.print( interval2 );
Serial.print( F( " time " ));
Serial.println( millis());
delay( interval2 );
Serial.print( F( "Finished Delay " ));
Serial.print( interval2 );
Serial.print( F( " time " ));
Serial.println( millis());
}
// ============================ end delay mode ===================
// ============================ pause from serial monitor=====
if ( Serial.available()) // enter serial to pause
{
usage();
while ( Serial.available())
{
Serial.read(); // empty the buffer
}
while ( !Serial.available()); // wait for unpause
while ( Serial.available())
{
Serial.read(); // empty the buffer
}
started1 = started2 = 0; // re-init millis mode
}
// ============================ end pause from serial monitor=====
}