Приветствую друзья. Помогите с логикой пожалуйста

Сегодня смок! Поздравляю сэр! (С)

У вас одно время со смещением на 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. В данном случае, скорее всего, ничего страшного - но вообще эта такая “мелочь”, которая запросто может сломать всю программу.

1 лайк