/*
https://forum.arduino.cc/t/button-timer-with-pwm-output/1419547/
*/
#define BTN_PIN 2
#define LED_PIN 11
#define POT_PIN A0
#define POT2_PIN A1
unsigned long lastBtn;
unsigned long btnDebounce = 50;
byte btnState = HIGH;
unsigned long ledStart;
unsigned long ledRunTime = 500;
enum StatesSystem {
state_Idle,
state_Wait,
state_Run
};
StatesSystem sysState = state_Idle;
unsigned long waitStart;
unsigned long waitTime = 1000;
void setup() {
Serial.begin(115200);
pinMode(BTN_PIN, INPUT_PULLUP);
}
void loop() {
unsigned long now = millis();
int v;
v = analogRead(POT2_PIN);
waitTime = map(v, 0, 1023, 10, 2000);
if (now - lastBtn >= btnDebounce) {
byte b = digitalRead(BTN_PIN);
if (b != btnState) {
lastBtn = now;
btnState = b;
if (b == HIGH) {
//press and release
if (sysState == state_Idle) {
sysState = state_Wait;
waitStart = now;
}
}
}
}
switch (sysState) {
case state_Wait:
if (now - waitStart >= waitTime) {
sysState = state_Run;
ledStart = now;
}
break;
case state_Run:
if (now - ledStart >= ledRunTime) {
//stop
stateSys = state_Idle;
analogWrite(LED_PIN, 0);
} else {
//led is active..
v = analogRead(POT_PIN);
v = map(v, 0, 1023, 0, 255);
analogWrite(LED_PIN, v);
}
break;
}
}