// Подключаем библиотеку FastLED.
#include "FastLED.h"

// Указываем, какое количество пикселей у нашей ленты.
#define LED_COUNT 20

// Указываем, к какому порту подключен вход ленты DIN.

#define LED_PIN 12

#define TIME_FADE  30

#define SET_CANDLE 1

#define TIME_FLASH 2000

#define SWAP(G, R, B)    R,G,B

#define ON            1

#define OFF           0

// Создаем переменную strip для управления нашей лентой.
CRGB strip[LED_COUNT];

int mass_pin[5] = {A0,A1,A2,A3,A4};

uint8_t flag_flash = OFF;
unsigned long start_flash = 0;

void flash_center_candle()
{
  flag_flash = ON;

  digitalWrite(9, LOW);
  delay(5);
  digitalWrite(9, HIGH);

  start_flash = millis();
}

void flash_center_candel_timer()
{
  if((millis() - start_flash > TIME_FLASH) and (flag_flash == ON))
  {
    flag_flash = OFF;
  }
}

void fade()
{
  static unsigned long delay_time = 0;
  static int cnt_period = 0;
  if(millis() - delay_time > TIME_FADE)
  {
    if(cnt_period > 20)
    {
      cnt_period = 5;
    }

    uint8_t power = 100+random(155);
    for (int i = 0; i < LED_COUNT; i++)
    {
      if(flag_flash == OFF)
      {
        if((i == LED_COUNT/2-1) or (i == LED_COUNT/2)   or (i == LED_COUNT/2-2) or (i == LED_COUNT/2+1))
        {
          strip[i] = CRGB(SWAP(power,0, 0)); // Красный цвет.
        }
        else
        {
          strip[i] = CRGB(SWAP(30, 10, 0)); // Красный цвет.
        }
      }
      else{
        if((i == LED_COUNT/2-1) or (i == LED_COUNT/2)  or (i == LED_COUNT/2-2)  or (i == LED_COUNT/2-3) or (i == LED_COUNT/2+1) or (i == LED_COUNT/2+2))
        {
          strip[i] = CRGB(SWAP(power,0, 0)); // Красный цвет.
        }
        else
        {
          strip[i] = CRGB(SWAP(90, 30, 0)); // Красный цвет.
        }
      }
    }
    // Передаем цвета ленте.
    FastLED.show();
    delay_time = millis();
    cnt_period++;
  }
}

void reset_timer_candle()
{
  static unsigned long timer = 0;

  if(millis() - timer > 3000)
  {
    Serial.println("timer _on");
    digitalWrite(9, LOW);
    delay(15);
    digitalWrite(9, HIGH);
    timer = millis();
  }
}

void setup()
{
  // Добавляем ленту
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(strip, LED_COUNT);
  Serial.begin(115200);
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
}

int prev_cnt = 0;
int cnt_candle_set = 0;

void loop()
{
  int cnt = 0;
  for(int i = 0; i < 5; i++)
  {
    if(digitalRead(mass_pin[i]) == SET_CANDLE)
    {
      cnt++;
    }
  }
  if (prev_cnt < cnt)
  {
    cnt_candle_set++;
    if(cnt_candle_set > 20)
    {
      cnt_candle_set = 0;
      prev_cnt = cnt;
      flash_center_candle();
    }
  }
  else{
    cnt_candle_set = 0;
    prev_cnt = cnt;
  }
  reset_timer_candle();
  fade();
  flash_center_candel_timer();
}