#include <esp32-hal-timer.h>
#define SW 23
hw_timer_t *timer = NULL;
int c = 0;
void IRAM_ATTR onTimer(){
digitalWrite(2, !digitalRead(2));
}
void setup() {
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(18, OUTPUT);
pinMode(19, OUTPUT);
pinMode(SW, INPUT);
//Internal Interrupt
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true);
timerAlarmEnable(timer);
timerAlarmDisable(timer);
//External Interrupt
//Interrupt pin, ISR function to execute, mode
attachInterrupt(digitalPinToInterrupt(SW), onTimer, CHANGE);
detachInterrupt(digitalPinToInterrupt(SW));
}
void loop() {
Millis();
}
//it's seem impossible to do multiple task with loop
void Polling(){
digitalWrite(4, !digitalRead(4));
delay(100);
digitalWrite(5, !digitalRead(5));
delay(500);
digitalWrite(2, !digitalRead(2));
delay(1000);
digitalWrite(18, !digitalRead(18));
delay(1500);
digitalWrite(19, !digitalRead(19));
delay(2000);
}
//Internal Interrupt
void InternalInterrupt(){
digitalWrite(4, !digitalRead(4));
c++;
if((c%5)==0)
digitalWrite(5, !digitalRead(5));
if((c%10)==0)
digitalWrite(2, !digitalRead(2));
if((c%15)==0)
digitalWrite(18, !digitalRead(18));
if((c%30)==0)
digitalWrite(19, !digitalRead(19));
if(c>30)
c=0;
}
//External Interrupt
void ExternalInterrupt(){
attachInterrupt(digitalPinToInterrupt(SW), onTimer, CHANGE);
}
//millis() function
unsigned long last100 = 0;
unsigned long last500 = 0;
unsigned long last1000 = 0;
unsigned long last1500 = 0;
unsigned long last3000 = 0;
void Millis(){
if(millis() - last100 >= 100){
last100 = millis();
digitalWrite(4, !digitalRead(4));
}
if(millis() - last500 >= 500){
last500 = millis();
digitalWrite(2, !digitalRead(2));
}
if(millis() - last1000 >= 1000){
last1000 = millis();
digitalWrite(5, !digitalRead(5));
}
if(millis() - last1500 >= 1500){
last1500 = millis();
digitalWrite(18, !digitalRead(18));
}
if(millis() - last3000 >= 2000){
last3000 = millis();
digitalWrite(19, !digitalRead(19));
}
}