//Reference ("INTERRUPT Serial Routine - ISR" part): https://www.youtube.com/watch?v=SXZkX3cJqDs&t=740s
//NOTE(via chatGPT): For ISR in Arduino nano, Interrupt pins in nano are as below :
//Digital Pin 2: Interrupt 0
//Digital Pin 3: Interrupt 1 

int relay = 7;
int builtInLed = 13; //using inbuilt LED for observing/indicating our operations
int pushButton = 2;
int countThroughPushButton = 0;

volatile int buttonState;
double a = 0;

void btnInterrupt () {
  buttonState = digitalRead(pushButton);

  // //counter program-(not performs as req. :: ⚠btn debounce issue)---------------------
  // if (buttonState == LOW) {
  //   countThroughPushButton ++;
  //   Serial.println(countThroughPushButton);
  //   delay(500); //Note: delay must be avoid in ISR
  // }

  //counter program2 (my modified :: ✅to eliminate btn debounce effect)----------------------------
  if (buttonState == LOW) {
    a += 0.075;
    countThroughPushButton =+ floor(a);
    Serial.print(a);
    Serial.print(", ");
    Serial.println(countThroughPushButton);
  }
  if(a>=5){
    a = 0; //reset
    countThroughPushButton = 0; //reset
  }
}

void setup() {
  // put your setup code here, to run once:
  pinMode(pushButton, INPUT_PULLUP);
  pinMode(relay, OUTPUT);
  pinMode(builtInLed, OUTPUT);
  Serial.begin(9600);

  attachInterrupt(digitalPinToInterrupt(pushButton), btnInterrupt, CHANGE);
  // attachInterrupt(digitalPinToInterrupt(pushButton), btnInterrupt, RISING);
}

void loop() {
  // put your main code here, to run repeatedly:

  //control program----------------------------
  //always ON i.e duty cycle = 100%
  if (countThroughPushButton == 0) {
    digitalWrite(relay, HIGH);
    digitalWrite(builtInLed, HIGH);
  }
  // ON: 7.5 min, OFF: 2.5 min, duty cycle = 75%
  else if (countThroughPushButton == 1) {
    digitalWrite(relay, HIGH);
    digitalWrite(builtInLed, HIGH);
    delay(4500);
    digitalWrite(relay, LOW);
    digitalWrite(builtInLed, LOW);
    delay(1500);
  }
  // ON: 5 min, OFF: 5 min, duty cycle = 50%
  else if (countThroughPushButton == 2) {
    digitalWrite(relay, HIGH);
    digitalWrite(builtInLed, HIGH);
    delay(3000);
    digitalWrite(relay, LOW);
    digitalWrite(builtInLed, LOW);
    delay(3000);
  }
  // ON: 2.5 min, OFF: 7.5 min, duty cycle = 25%
  else if (countThroughPushButton == 3) {
    digitalWrite(relay, HIGH);
    digitalWrite(builtInLed, HIGH);
    delay(1500);
    digitalWrite(relay, LOW);
    digitalWrite(builtInLed, LOW);
    delay(4500);
  }
  // ON: 1 min, OFF: 9 min, duty cycle = 10%
  else if (countThroughPushButton == 4) {
    digitalWrite(relay, HIGH);
    digitalWrite(builtInLed, HIGH);
    delay(600);
    digitalWrite(relay, LOW);
    digitalWrite(builtInLed, LOW);
    delay(5400);
  }
  // reset count
  else {
    a = 0;
    countThroughPushButton = 0;
  }
}