/// пины энкодера
#define CLK 2
#define DT 3
#define SW 4
#define PIN_BTN 5 // кнопка
#define PIN_OUT 9 // транс
#define PIN_TRANS 0
#define DELAY_DEB 40 // дребезг кнопки, мс
#define DELAY_AFTER 500 // пауза после сварки
#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[5] = {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 = 1;
if (enc1.isLeftH()) increment = -1;
// меняем параметры
vals[arrowPos] += increment;
printGUI();
}
// spotter();
//Impuls ();
//if (butt1.isClick()) {
//flagBTN = true;
// Serial.println(flagPULSE);
Impuls();
}
// if (flagBTN) {
//flagPULSE = true;
//static int32_t tmr1;
//if (millis() - tmr1 > vals[0]) {
// tmr1 = millis();
// }
//flagPULSE = !flagPULSE;
// }
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); // вывести стрелку
}
//void spotter() {
// if (digitalRead(PIN_BTN)) { // кнопка нажата
// delay(DELAY_DEB); // дебаунс
// digitalWrite(PIN_OUT, 1); // включаем транс
// if (!smartDelay(vals[0])) return; // ждём импульс
// digitalWrite(PIN_OUT, 0); // выключаем транс
// if (!smartDelay(vals[4])) return; // ждём паузу
// digitalWrite(PIN_OUT, 1); // включаем транс
// //int thisDelay = map(analogRead(ADC_POT), 0, 1023, POT_MIN, POT_MAX);
// if (!smartDelay(vals[2])) return; // ждём сварку
// digitalWrite(PIN_OUT, 0); // выключаем транс
// while (digitalRead(PIN_BTN)); // ждём отпускания кнопки
// delay(DELAY_AFTER);
// }
//}
// умная задержка, вернёт false если кнопка отпущена и отключит транс
//bool smartDelay(int time) {
//uint32_t tmr = millis();
//while (millis() - tmr < time) {
// if (!digitalRead(PIN_BTN)) {
// digitalWrite(PIN_OUT, 0);
// delay(DELAY_AFTER);
// return false;
// }
//}
//return true;
//}
bool Impuls() {
if (butt1.isClick()) {
flagBTN = 1;
while (analogRead(PIN_TRANS) > 10);
flagN = true;
if (flagBTN && flagN) {
digitalWrite(PIN_OUT, HIGH);
static int32_t tmr1 = micros();
if (micros() - tmr1 > 5000 * vals[2] / 100) {
digitalWrite(PIN_OUT, LOW);
tmr1 = micros();
flagN = false;
Serial.println(tmr1);
}
}
}
}