Сегодня смок! Поздравляю сэр! (С)
У вас одно время со смещением на 3 часа, а второе нет
Кроме того, в процедуре sunset() с логикой совсем туго. Вы сначала безальтернативно выводите цвет на ленту, а только потом начинаете проверять - а надо ли было это делать…
У вас логики в коде вообще не просматривается.
Вот, смотрите:
Что тут происходит - Вы понимаете?
Если текущее время меньше времени рассвета - выполняется ваша процедура sunset(); .
Возьмем для примера, что текущее время 3 часа ночи, а рассвет - в 7 утра.
Ваша процедура начинает выполнятся сразу, потому что 3 часа меньше, чем семь. И будет выполнятся все 4 часа, пока не наступит рассвет.
А вам надо, чтобы она начала выполнятся только за пять минут до рассвета.
И как я уже писал, сама процедура sunset() тоже написана нелогично.
void sunset() {
static const uint8_t sunriseLength = 5; // общая продолжительность восхода солнца, в минутах
static const float interval = ((float)(sunriseLength * 60) / 256)*1000;
// текущий цветовой индекс палитры градиентов
static uint8_t heatIndex = 240; // start out at 0
CRGB color = ColorFromPalette(HeatColors_p, heatIndex);
// залейте всю полосу текущим цветом
fill_solid(leds, NUM_LEDS, color);
// медленно увеличивайте огонь
EVERY_N_MILLISECONDS(interval ) { if(heatIndex > 0) { heatIndex--; } }
}
смотрите - после настройки переменных interval и heatIndex вы в строке 14 заливаете полосу светом. И только потом, в строке 17, меняете цветовой индекс и проверяете, не кончился ли цикл.
А когда цикл дойдет до нуля, вы все равно снова и снова будете заливать полосу цветом, хотя это может давным давно никому не нужно.
Правильно было бы СНАЧАЛА поставить условие цикла - и только если оно выполняется, менять цвет и заливать полосу.
Кроме того, в макросе EVERY_N_MILLISECONDS(interval ) параметр interval должен быть целым, а у вас он float. В данном случае, скорее всего, ничего страшного - но вообще эта такая “мелочь”, которая запросто может сломать всю программу.