Here’s a stripped down example of Khoi Hoang’s ESP32TimerInterrupt library. The library claims to run up to 16 compares (or alarms) on one, single timer. It seems to work well although I’ve only tested 3 timers thus far. I plan to use it on my Idiot Christmas Light Controller controlling triacs.
include <Arduino.h>
/
TimerInterruptTest.ino
For ESP32 boards
Written by Khoi Hoang
Built by Khoi Hoang https://github.com/khoih-prog/ESP32TimerInterrupt
Licensed under MIT license
This is the most basic example using Khoi Hoang's ESP32TimerInterrupt library.
The library works well, but I found myself wanting an ultra basic version to understand the functionality
*/
define TIMER_INTERRUPT_DEBUG 0
define TIMERINTERRUPT_LOGLEVEL 0
include "ESP32TimerInterrupt.h"
// Change these to whatever GPIO you'd like to toggle
define LED0 25 // GPIO 25
define LED1 27 // GPIO 27
define LED2 33 // GPIO 33
// The lenght of each timer in milliseconds
define TIMER0_INTERVAL_MS 100
define TIMER1_INTERVAL_MS 3000
define TIMER2_INTERVAL_MS 400
void IRAM_ATTR TimerHandler0(void)
{
static bool toggle0 = false;
//timer interrupt toggles pin LED0
digitalWrite(LED0, toggle0);
toggle0 = !toggle0;
}
void IRAM_ATTR TimerHandler1(void)
{
static bool toggle1 = false;
//timer interrupt toggles LED1
digitalWrite(LED1, toggle1);
toggle1 = !toggle1;
}
void IRAM_ATTR TimerHandler2(void)
{
static bool toggle2 = false;
//timer interrupt toggles LED2
digitalWrite(LED2, toggle2);
toggle2 = !toggle2;
}
// Init ESP32 timer 0,1, and 2
ESP32Timer ITimer0(0);
ESP32Timer ITimer1(1);
ESP32Timer ITimer2(2);
void setup()
{
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
Serial.begin(115200);
while (!Serial)
;
delay(100);
Serial.print(F("\nStarting TimerInterruptTest on "));
Serial.println(ARDUINO_BOARD);
Serial.println(ESP32_TIMER_INTERRUPT_VERSION);
Serial.print(F("CPU Frequency = "));
Serial.print(F_CPU / 1000000);
Serial.println(F(" MHz"));
// Using ESP32 => 80 / 160 / 240MHz CPU clock ,
// For 64-bit timer counter
// For 16-bit timer prescaler up to 1024
// Setup Timer0
// Interval in microsecs
if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 1000, TimerHandler0))
{
Serial.print(F("Starting ITimer0 OK, millis() = "));
Serial.println(millis());
}
else
Serial.println(F("Can't set ITimer0. Select another freq. or timer"));
// Setup Timer1
// Interval in microsecs
if (ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS * 1000, TimerHandler1))
{
Serial.print(F("Starting ITimer1 OK, millis() = "));
Serial.println(millis());
}
else
Serial.println(F("Can't set ITimer1. Select another freq. or timer"));
// Setup Timer2
// Interval in microsecs
if (ITimer2.attachInterruptInterval(TIMER2_INTERVAL_MS * 1000, TimerHandler2))
{
Serial.print(F("Starting ITimer2 OK, millis() = "));
Serial.println(millis());
}
else
Serial.println(F("Can't set ITimer1. Select another freq. or timer"));
Serial.flush();
}
void loop()
{
}