#define ALED_PIN 10 // пин ленты
#define ALED_NUM 37 // кол-во светодиодов
#define BTN1_PIN 14
#define BTN2_PIN 15
#define BTN3_PIN 16
#define BTN4_PIN 17
#define BTN5_PIN 8
#define BTN6_PIN 9
#define ENC1_PIN 2
#define ENC2_PIN 3
#define ENC_BTN_PIN 4
#define SERVO_PIN 5
#define PUMP_PIN 6
// #include <Arduino.h>
// #include <Wire.h>
#include <EEPROM.h>
#include <FastLED.h>
// #include <ServoSmooth.h>
#include <Servo.h>
#include <EncButton.h>
// #include <GyverOLED.h>
// bool flag_cv, flag_n, flag_afterinit, setup_while = false;
bool setup_while = false;
byte counter;
byte value = 0;
const byte btn_count = 6;
bool btns[btn_count] = {
false,
false,
false,
false,
false,
false,
};
CRGB leds[ALED_NUM];
uint32_t ledtmr, servotmr, n_time = 0;
// uint32_t tmr;
Servo servo;
Button btn[btn_count] = {
Button(BTN1_PIN),
Button(BTN2_PIN),
Button(BTN3_PIN),
Button(BTN4_PIN),
Button(BTN5_PIN),
Button(BTN6_PIN),
};
EncButton EncB(INPUT_PULLUP, ENC1_PIN, ENC2_PIN, ENC_BTN_PIN);
// GyverOLED<SSD1306_128x64> oled;
bool update_needed = false;
bool c1 = false, c2 = false, c3 = false;
bool c4 = false, c5 = false, c6 = false;
bool c1p = false, c2p = false, c3p = false;
bool c4p = false, c5p = false, c6p = false;
bool cal_start = true;
bool button_calibrate = true;
bool pump_calibrate = true;
bool servo_calibrate = true;
uint32_t stmr, n_start, n_stop = 0;
bool flag = false;
bool nst, nsp = false;
// byte scn = 0, vol = 0;
byte servopos = 0, setservopos = 0;
byte volume = 25;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(PUMP_PIN, OUTPUT);
EEPROM.get(0, value);
// EEPROM.get(1, n_time);
EncB.setHoldTimeout(600);
for (byte i = 0; i < btn_count; i++) {
btn[i].setHoldTimeout(600);
}
// показаны значения по умолчанию
EncB.setBtnLevel(LOW);
EncB.setClickTimeout(500);
EncB.setDebTimeout(50);
EncB.setHoldTimeout(600);
EncB.setStepTimeout(200);
EncB.setEncReverse(0);
EncB.setEncType(EB_STEP4_LOW);
EncB.setFastTimeout(30);
// сбросить счётчик энкодера
EncB.counter = 0;
servo.attach(SERVO_PIN);
servo.write(servopos);
// servo.setSpeed(180); // ограничить скорость
// servo.setAccel(0.8); // установить ускорение (разгон и торможение)
// servo.setAutoDetach(false); // отключить автоотключение (detach) при достижении целевого угла (по умолчанию включено)
FastLED.addLeds<WS2812B, ALED_PIN, GRB>(leds, ALED_NUM);
FastLED.setBrightness(255);
// oled.init();
// oled.clear(); // очистить дисплей (или буфер)
// oled.update(); // обновить. Только для режима с буфером! OLED_BUFFER
// oled.home(); // курсор в 0,0
// oled.autoPrintln(true);
// oled.setScale(2);
// oled.println("Наливатор"); // печатай что угодно: числа, строки, float, как Serial!
// oled.println("для PUZIKO");
// oled.setScale(1);
// oled.println("by Dominus Nox");
// // oled.println(n_time);
// // oled.print(cal_start);
// // oled.print(" ");
// // oled.print(button_calibrate);
// // oled.print(" ");
// // oled.print(pump_calibrate);
// // oled.print(" ");
// // oled.println(servo_calibrate);
// oled.update();
// Serial.println("init");
ledtmr = millis();
while (!setup_while) {
// servo.tick();
// Serial.println(setup_while);
if ((millis() - ledtmr) < 1500) {
for (int i = 0; i < ALED_NUM; i++) {
leds[i].setHue(counter + i * 255 / ALED_NUM);
}
// FastLED.show();
counter++;
} else {
setup_while = true;
for (int i = 0; i < ALED_NUM; i++) {
leds[i] = CRGB::Black;
}
}
FastLED.show();
}
Serial.println("Setup DONE");
}
void loop()
{
// put your main code here, to run repeatedly:
// servo.tick();
// Serial.println(millis());
EncB.tick();
for (byte i = 0; i < btn_count; i++)
{
btn[i].tick();
}
// if (EncB.left()) {
// volume += 5;
// update_needed = true;
// }
// if (EncB.right()) {
// volume -= 5;
// update_needed = true;
// }
// if (update_needed) {
// // digitalWrite(PUMP_PIN, 1);
// oled.clear(); // очистить дисплей (или буфер)
// oled.home(); // курсор в 0,0
// oled.autoPrintln(true);
// oled.setScale(3);
// oled.println("Объем");
// oled.println(volume);
// oled.update();
// update_needed = false;
// }
if (EncB.turn()) {
Serial.print("turn: dir ");
Serial.print(EncB.dir());
Serial.print(", fast ");
Serial.print(EncB.fast());
Serial.print(", hold ");
Serial.print(EncB.pressing());
Serial.print(", counter ");
Serial.print(EncB.counter);
Serial.print(", clicks ");
Serial.println(EncB.getClicks());
}
// обработка поворота раздельная
if (EncB.left()) Serial.println("left");
if (EncB.right()) Serial.println("right");
if (EncB.leftH()) Serial.println("leftH");
if (EncB.rightH()) Serial.println("rightH");
// кнопка
if (EncB.press()) Serial.println("press");
if (EncB.click()) Serial.println("click");
if (EncB.release()) {
Serial.println("release");
Serial.print("clicks: ");
Serial.print(EncB.getClicks());
Serial.print(", steps: ");
Serial.print(EncB.getSteps());
Serial.print(", press for: ");
Serial.print(EncB.pressFor());
Serial.print(", hold for: ");
Serial.print(EncB.holdFor());
Serial.print(", step for: ");
Serial.println(EncB.stepFor());
}
// состояния
// Serial.println(EncB.pressing());
// Serial.println(EncB.holding());
// Serial.println(EncB.busy());
// Serial.println(EncB.waiting());
// таймаут
if (EncB.timeout(1000)) Serial.println("timeout!");
// удержание
if (EncB.hold()) Serial.println("hold");
if (EncB.hold(3)) Serial.println("hold 3");
// импульсное удержание
if (EncB.step()) Serial.println("step");
if (EncB.step(3)) Serial.println("step 3");
// отпущена после импульсного удержания
if (EncB.releaseStep()) Serial.println("release step");
if (EncB.releaseStep(3)) Serial.println("release step 3");
// отпущена после удержания
if (EncB.releaseHold()) Serial.println("release hold");
if (EncB.releaseHold(2)) Serial.println("release hold 2");
// проверка на количество кликов
if (EncB.hasClicks(3)) Serial.println("has 3 clicks");
// вывести количество кликов
if (EncB.hasClicks()) {
Serial.print("has clicks: ");
Serial.println(EncB.getClicks());
}
// for (int i = 0; i < ALED_NUM; i++) {
// leds[i].setHue(counter + i * 255 / ALED_NUM);
// }
// FastLED.show();
// counter++;
// FastLED.show();
// if (!flag_n)
// {
// /* code */
// for (byte i = 0; i < btn_count; i++)
// {
// if (btn[i].holding())
// {
// btns[i] = true;
// }
// else
// {
// btns[i] = false;
// }
// }
// oled.clear();
// oled.home();
// oled.print("stop");
// oled.update();
// for (byte i = 0; i < ALED_NUM - 1; i++)
// {
// if (btns[byte(i / 6)])
// {
// leds[i].setHue(counter + i * 255 / (ALED_NUM - 1));
// }
// else
// {
// leds[i] = CRGB::Black;
// }
// }
// // |
// // // for (byte i = 0; i < 6; i++)
// // // {
// // // for (byte j = 1; j < 7; j++)
// // // {
// // // Serial.print(" ");
// // // Serial.print(6 * i + j);
// // // }
// // // }
// // |
// FastLED.show();
// counter++;
// if (EncB.hold())
// {
// flag_n != flag_n;
// Serial.println("hold");
// }
// if (EncB.left())
// Serial.println("left");
// if (EncB.right())
// Serial.println("right");
// if (EncB.leftH())
// Serial.println("leftH");
// if (EncB.rightH())
// Serial.println("rightH");
// if (EncB.press())
// Serial.println("press");
// if (EncB.click())
// Serial.println("click");
// // if (EncB.hold())
// // Serial.println("hold");
// }
// else
// {
// while (flag_n)
// {
// delay(1000);
// flag_n != flag_n;
// oled.clear();
// oled.home();
// oled.print("Fill");
// oled.update();
// }
// }
FastLED.show();
counter++;
}