/// пины энкодера
#define CLK 2
#define DT 3
#define SW 4
#define PIN_BTN 5   // кнопка
#define PIN_OUT 9   // транс
#define PIN_TRANS 0

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес 0x27 или 0x3f

#include "GyverButton.h"
GButton butt1(PIN_BTN);


int vals[6] = {50, 90, 50, 80, 30}; // T, T2, A, A2, P
int8_t arrowPos = 0;  // позиция стрелки
bool flagBTN, flagN, flagPULSE;

void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE2);
  butt1.setType(LOW_PULL);

  lcd.init();
  lcd.backlight();
  printGUI();   // выводим интерфейс

  pinMode(PIN_BTN, INPUT);
  pinMode(PIN_OUT, OUTPUT);
}

void loop() {
  enc1.tick();
  butt1.tick();

  if (enc1.isTurn()) {  // при любом повороте
    lcd.clear();
    int increment = 0;  // локальная переменная направления

    // получаем направление
    if (enc1.isRight()) increment = 1;
    if (enc1.isLeft()) increment = -1;

    arrowPos += increment;  // двигаем курсор
    arrowPos = constrain(arrowPos, 0, 4); // ограничиваем

    increment = 0;  // обнуляем инкремент
    if (enc1.isRightH()) increment = 10;
    if (enc1.isLeftH()) increment = -10;
    // меняем параметры
    vals[arrowPos] += increment;

    printGUI();
  }

  Impuls();
}

void printGUI() {
  lcd.setCursor(0, 0); lcd.print("T:"); lcd.print(vals[0]);
  lcd.setCursor(6, 0); lcd.print("T2:"); lcd.print(vals[1]);
  lcd.setCursor(0, 1); lcd.print("A:"); lcd.print(vals[2]);
  lcd.setCursor(5, 1); lcd.print("A2:"); lcd.print(vals[3]);
  lcd.setCursor(11, 1); lcd.print("P:"); lcd.print(vals[4]);
  // выводим стрелку
  switch (arrowPos) {
    case 0: lcd.setCursor(1, 0);
      break;
    case 1: lcd.setCursor(8, 0);
      break;
    case 2: lcd.setCursor(1, 1);
      break;
    case 3: lcd.setCursor(7, 1);
      break;
    case 4: lcd.setCursor(12, 1);
      break;
  }
  lcd.write(126);   // вывести стрелку
}

bool Impuls() {
  if (butt1.isClick()) {
    flagBTN = 1;
    for (int i = 0; i < vals[0] / 10; i++) {
      while (analogRead(PIN_TRANS) > 10);
      flagN = true;
      if (flagBTN && flagN) {
        digitalWrite(PIN_OUT, HIGH);
        delayMicroseconds(5000 * vals[2] / 100);
        digitalWrite(PIN_OUT, LOW);
        flagN = false;

        //  Serial.println(tmr1);
      }
    }
    if ( vals[1] > 0) {
      delay(vals[4]);
      for (int i = 0; i < vals[1] / 10; i++) {
        while (analogRead(PIN_TRANS) > 10);
        flagN = true;
        if (flagBTN && flagN) {
          digitalWrite(PIN_OUT, HIGH);
          delayMicroseconds(5000 * vals[3] / 100);
          digitalWrite(PIN_OUT, LOW);
          flagN = false;

          //  Serial.println(tmr1);
        }
      }
    }
    flagBTN = 0;
  }

}