#include <JC_Button.h> // https://github.com/JChristensen/JC_Button
struct button_t
{
const Button jc_button;
const uint16_t period;
const uint8_t power;
};
const button_t buttons[] =
{
{ Button( 4 ), 1000, 10 },
{ Button( 5 ), 2000, 20 },
};
const uint8_t buttonsCount = sizeof( buttons ) / sizeof( button_t );
enum State : uint8_t
{
Initialize,
SelectPeriod,
SelectPower,
Invalid,
};
void setup()
{
pinMode( LED_BUILTIN, OUTPUT );
Serial.begin( 115200 );
for ( uint8_t i = 0; i < buttonsCount; i++ )
{
buttons[i].jc_button.begin();
}
}
void loop()
{
static uint8_t state = State::Initialize;
static uint8_t state_previous = State::Invalid;
static uint32_t timer_start = 0;
static uint32_t timer_duration = 0;
button_t * button;
for ( uint8_t i = 0; i < buttonsCount; i++ )
{
button = &buttons[i];
button->jc_button.read();
if ( button->jc_button.wasReleased() )
{
state++;
break;
}
}
if ( state_previous != state )
{
state_previous = state;
static uint32_t period;
static uint32_t power;
switch ( state )
{
case State::Initialize :
{
timer_duration = 0;
digitalWrite( LED_BUILTIN, LOW );
Serial.print( "Choose period : " );
break;
}
case State::SelectPeriod :
{
period = button->period;
Serial.println( period );
Serial.print( "Choose power : " );
break;
}
case State::SelectPower :
{
power = button->power;
Serial.println( power );
timer_start = millis();
timer_duration = period * power / 100UL;
digitalWrite( LED_BUILTIN, HIGH );
Serial.print( "LED on for " );
Serial.print( timer_duration );
Serial.println( " ms..." );
break;
}
default :
{
state = State::Initialize;
Serial.println( "Reset" );
break;
}
}
}
if ( timer_duration > 0 )
{
if ( millis() - timer_start >= timer_duration )
{
state = State::Initialize;
Serial.println( "Done" );
}
}
}