#include "driver/timer.h"
#define COLOR_TEMP_START 4000;
int const COLOR_TEMP_LOW = 2500;
#define DAY_LIGHT 12*60*60; // 12 hours in seconds
#define COLOR_TEMP_DECREASE 100;
#define COLOR_TEMP_INTERVAL 2800; // 4000K-2500K = 1500K / 100 = 15 steps, 12h every 2800 sec
int colorTemp = COLOR_TEMP_START; // set start value
boolean isColorTempChange = false; // flaf to indicate change in interrupt function
// Interrupt function for timer
static bool IRAM_ATTR timer_isr_callback(void *args)
{
colorTemp = colorTemp - 100; // after interrupt received decrease color temp
if (colorTemp < COLOR_TEMP_LOW) {
colorTemp = COLOR_TEMP_LOW;
}
isColorTempChange = true; // mark as decreased
return false;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32-S3!");
// Setting timer parameters. Note! in expresive example order is incorrect
timer_config_t config = {
.alarm_en = TIMER_ALARM_EN, // Разрешить генерацию тревожного события (прерывания) по переполнению счетчика
.counter_en = TIMER_PAUSE, // При создании таймера он будет "поставлен на паузу", его нужно позже запустить вручную
//.intr_type = 0,
.counter_dir = TIMER_COUNT_UP, // Нормальное направление счета (вверх / на увеличение)
.auto_reload = TIMER_AUTORELOAD_EN, // Включить автоматическую перезагрузку: чип перезапустит счетчик после тревожного события
.divider = 80, // Задаем параметры предделителя (80 = минимальный интервал 1 микросекунда)
};
// init timer
timer_init(TIMER_GROUP_0, TIMER_0, &config);
// Настраиваем НАЧАЛЬНОЕ значение счетчика
// Счетчик таймера начнёт свой счет со значения, указанного ниже.
// Если установлено auto_reload, это значение будет также автоматически устанавливаться при тревоге
timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0);
// Настраиваем ПОРОГОВОЕ значение счетчика, при достижении которого будет сгенерировано событие тревоги
// Значение задается в TIMER_BASE_CLK / TIMER_DIVIDER, то есть в нашем случае это: 80 MHz / 80 = 1MHz или 1 микросекунда
// last parameter in seconds -> currenlty is 5 but in prod need to set COLOR_TEMP_INTERVAL = 2800
//
timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, 5*1000*1000);
// Разрешаем прерывания для данного таймера
timer_isr_callback_add(TIMER_GROUP_0, TIMER_0, timer_isr_callback, NULL, 0);
timer_enable_intr(TIMER_GROUP_0, TIMER_0);
// Запускаем таймер
timer_start(TIMER_GROUP_0, TIMER_0);
Serial.println("Hardware timer started.");
}
void loop() {
// put your main code here, to run repeatedly:
if (isColorTempChange == 1) {
Serial.print("Decrease term by 100:");
Serial.println(colorTemp, DEC);
isColorTempChange = 0;
}
delay(1000); // this speeds up the simulation
}