//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;
}
}