#include <GyverOLED.h>                 // Библиотека дисплея
GyverOLED<SSD1306_128x64> oled(0x3c);  // Обьект дисплея

#include <Wire.h>  //Подключаем библиотеку для использования I2C интерфейса
#include <EncButton.h>

#define A 5
#define B 18
#define KEY 19

EncButton<EB_TICK, A, B, KEY> enc;  // энкодер с кнопкой <A, B, KEY>

int PWM_LW_MIN = 0;    //Если необходим ток покоя на LED - изменить эту константу
int PWM_LW_MAX = 250;  //Если необходимо ограничить максимальную яркость - уменьшить значение

int ComHOn = 0;
int ComMOn = 0;
int RD = 0;
int ComHOff = 0;
int ComMOff = 0;
int ZD = 0;
int PD = 0;
int PN = 0;
int SD = 0;
int SN = 0;
int ScD = 250;
int ScN = 50;
int pos = 1;

void setup() {
  attachInterrupt(A, isr, CHANGE);  // D2
  attachInterrupt(B, isr, CHANGE);  // D3
  //	attachInterrupt (KEY, isr, CHANGE);  // D3


  oled.init();            // Инциализация дисплея
  oled.setContrast(255);  // Макс. яркость
  oled.clear();           // очистить дисплей (или буфер)
  oled.update();          // обновить.
  Wire.begin();           //Инициируем I2C интерфейс
}
void loop() {
  enc.tick();
  // опрос происходит здесь
  if (enc.click()) {
    pos++;
  }
  if (pos > 4) {
    pos = 1;
  }
  switch (pos) {
    case 1:
      if (enc.left()) {
        PWM_LW_MAX = PWM_LW_MAX - 25;
        delay(150);
        //oled.clear();
      }
      if (PWM_LW_MAX < 0) {
        PWM_LW_MAX = 0;
      }
      if (enc.right()) {
        PWM_LW_MAX = PWM_LW_MAX + 25;
        delay(150);
        //oled.clear();
      }
      if (PWM_LW_MAX > 250) {
        PWM_LW_MAX = 250;
      }
      PD = PWM_LW_MAX / 2.5;
      break;

    case 2:
      if (enc.right()) {
        PWM_LW_MIN = PWM_LW_MIN + 25;
        delay(150);
        // oled.clear();
      }
      if (PWM_LW_MIN > 250) {
        PWM_LW_MIN = 250;
      }
      if (enc.left()) {
        PWM_LW_MIN = PWM_LW_MIN - 25;
        delay(150);
        // oled.clear();
      }
      if (PWM_LW_MIN < 0) {
        PWM_LW_MIN = 0;
      }
      PN = PWM_LW_MIN / 2.5;
      break;

    case 3:
      if (enc.right()) {
        ScD = ScD + 25;
        delay(150);
        //oled.clear();
      }
      if (ScD > 250) {
        ScD = 250;
      }
      if (enc.left()) {
        ScD = ScD - 25;
        delay(150);
        //oled.clear();
      }
      if (ScD < 0) {
        ScD = 0;
      }
      SD = ScD / 2.5;
      break;

    case 4:
      if (enc.right()) {
        ScN = ScN + 25;
        delay(150);
        //oled.clear();
      }
      if (ScN > 250) {
        ScN = 250;
      }
      if (enc.left()) {
        ScN = ScN - 25;
        delay(150);
        //oled.clear();
      }
      if (ScN < 0) {
        ScN = 0;
      }
      SN = ScN / 2.5;
      break;
  }
  uint8_t i = 1;
  oled.clear();
  oled.invertText(0);
  oled.setCursor(0, 0);
  oled.setScale(2);
  oled.invertText(1);
  oled.print("  ЯРКОСТЬ  ");
  oled.invertText(0);
  oled.setScale(1);
  oled.setCursor(1, 2);
  oled.print("Яркость светильника");
  oled.setCursor(1, 3);
  oled.print("День ");
  if (PD < 100) oled.print(" ");
  if (PD < 10) oled.print("0");
  oled.print(PD);
  oled.print("% ");
  oled.invertText(1);
  for (i = 1; i <= (PD / 10); i++) {
    oled.print(" ");
  }
  oled.invertText(0);
  oled.setCursor(1, 4);
  oled.print("Ночь ");
  if (PN < 100) oled.print(" ");
  if (PN < 10) oled.print("0");
  oled.print(PN);
  oled.print("% ");
  oled.invertText(1);
  for (i = 1; i <= (PN / 10); i++) {
    oled.print(" ");
  //  counter++;
  }
//  int counter = 0;


//Serial.println(counter);

//counter++;

//if (counter >= 10) counter = 0;

}


  oled.invertText(0);
  oled.setCursor(1, 5);
  oled.print("Яркость дисплея");
  oled.setCursor(1, 6);
  oled.print("День ");
  if (SD < 100) oled.print(" ");
  if (SD < 10) oled.print("0");
  oled.print(SD);
  oled.print("% ");
  oled.invertText(1);
  for (i = 1; i <= (SD / 10); i++) {
    oled.print(" ");
  }
  oled.invertText(0);
  oled.setCursor(1, 7);
  oled.print("Ночь ");
  if (SN < 100) oled.print(" ");
  if (SN < 10) oled.print("0");
  oled.print(SN);
  oled.print("% ");
  oled.invertText(1);
  for (i = 1; i <= (SN / 10); i++) {
    oled.print(" ");
  }
  oled.invertText(0);
  oled.update();  // обновить.
}
void isr() {
  enc.tickISR();  // в прерывании вызываем тик ISR
}