#include "LiquidCrystal_I2C.h"
#include "GyverButton.h"
#include "Wire.h"
#include "EEPROM.h"
//#include <LCD_1602_RUS.h>
//LCD_1602_RUS lcd(0x27,16,2);
//Описание русских букв для вывода на дисплей
uint8_t tochki[8] = {B0, B00000, B0, B0, B0, B0, B10101};
uint8_t bukva_P[8] = {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
uint8_t bukva_Ya[8] = {B01111, B10001, B10001, B01111, B00101, B01001, B10001};
uint8_t bukva_L[8] = {0x3, 0x7, 0x5, 0x5, 0xD, 0x9, 0x19};
uint8_t bukva_Lm[8] = {0, 0, B01111, B00101, B00101, B10101, B01001};
uint8_t bukva_Mz[8] = {0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E};
uint8_t bukva_I[8] = {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11};
uint8_t bukva_D[8] = {B01111, B00101, B00101, B01001, B10001, B11111, 0x11};
uint8_t bukva_G[8] = {B11111, B10001, B10000, B10000, B10000, B10000, B10000};
uint8_t bukva_IY[8] = {B01110, B00000, B10001, B10011, B10101, B11001, B10001};
uint8_t bukva_Z[8] = {B01110, B10001, B00001, B00010, B00001, B10001, B01110};
uint8_t bukva_SHYA[8] = {B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001};
uint8_t bukva_ZH[8] = {B10101, B10101, B10101, B11111, B10101, B10101, B10101};
uint8_t bukva_Y[8] = {B10001, B10001, B10001, B01010, B00100, B01000, B10000};
uint8_t bukva_B[8] = {B11110, B10000, B10000, B11110, B10001, B10001, B11110};
uint8_t bukva_CH[8] = {B10001, B10001, B10001, B01111, B00001, B00001, B00001};
uint8_t bukva_IYI[8] = {B10001, B10001, B10001, B11001, B10101, B10101, B11001};
uint8_t bukva_TS[8] = {B10010, B10010, B10010, B10010, B10010, B10010, B11111, B00001};
uint8_t bukva_Tz[8] = {B11000, B01000, B01000, B01110, B01001, B01001, B01110};
uint8_t bukva_YO[8] = {B01010, B00000, B11111, B10000, B11111, B10000, B11111};
GButton down(3);
GButton up(4);
GButton start(5);
GButton enc_rh(6);
GButton enc_lh(7);
GButton enc_btn(8);
LiquidCrystal_I2C lcd(0x27,16,2);
uint32_t eepromTimer = 0;
boolean eepromFlag = false;
byte Propil = 0;
byte Podjem = 0;
byte propil_data = 0;
byte podjem_data = 0;
int Opusk;
int Start = 0;
int Sensor = 0;
int Tolwina = 0;
unsigned long TimerUp, TimerDown, TimerStart;
boolean EncPress = 0;
boolean MoveUp = 0;
boolean MoveDown = 0;
boolean Menu = false;
//int btnUp = 0;
//int btnDown = 0;
int Str = 0;
int rec_data = 0;
char text_1[] = " TOLWINA:";
char text_2[] = " OPUSK:";
char text_3[] = " PODJEM:";
char text_4[] = "PROPIL:";
char pointer[] = ">";
//char text_1[] = " ТОЛЩИНА:";
//char text_2[] = " ОПУСК:";
//char text_3[] = " ПОДЪЁМ:";
//char text_4[] = "ПРОПИЛ:";
void interrupt_2(){
Sensor = 1;
if (Sensor == 1 && digitalRead(2) == 1){
Opusk = Opusk + 1;
Sensor = 0;
}
}
void setup(){
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
pinMode(10, OUTPUT);
pinMode(4, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), interrupt_2, HIGH);
enc_btn.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс)
enc_btn.setTimeout(2000); // настройка таймаута на удержание (по умолчанию 500 мс)
enc_btn.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс)
down.setDebounce(50);
down.setTimeout(2000);
down.setClickTimeout(600);
up.setDebounce(50);
up.setTimeout(2000);
up.setClickTimeout(600);
start.setDebounce(50);
start.setTimeout(2000);
start.setClickTimeout(600);
byte propil_data = 0;
byte podjem_data = 0;
EEPROM.get(0, podjem_data);
EEPROM.get(4, propil_data);
//Serial.println(podjem_data);
//Serial.println(propil_data);
}
void Worked () {
//lcd.clear();
lcd.createChar(0, bukva_L); // создаем символы и записываем их в память LCD
lcd.createChar(1, bukva_SHYA); lcd.createChar(2, bukva_I);
lcd.createChar(3, bukva_P); lcd.createChar(4, bukva_Y);
lcd.setCursor (0, 0);
lcd.print(" TO"); lcd.write(0); lcd.write(1); lcd.write(2); lcd.print("HA:");
lcd.setCursor (0, 1);
lcd.print(" O"); lcd.write(3); lcd.write(4); lcd.print("CK:");
lcd.setCursor(10,0);
lcd.print(Tolwina);
lcd.setCursor(10,1);
lcd.print(Opusk);
}
void Nastroyka() {
//lcd.clear();
lcd.createChar(0, bukva_P); lcd.createChar(1, bukva_D);
lcd.createChar(2, bukva_Tz); lcd.createChar(3, bukva_YO);
lcd.createChar(4, bukva_I); lcd.createChar(5, bukva_L);
lcd.setCursor(1,0);
lcd.print(" ");
lcd.setCursor(3,0);
lcd.write(0); lcd.print("O"); lcd.write(1); lcd.write(2); lcd.print("E");
lcd.print("M:");
lcd.setCursor(3,1);
lcd.write(0); lcd.print("PO"); lcd.write(0); lcd.write(4); lcd.write(5);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print(Podjem);
lcd.setCursor(10,1);
lcd.print(Propil);
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(" ");
}
void loop() {
up.tick();
down.tick();
start.tick();
enc_btn.tick();
enc_rh.tick();
enc_lh.tick();
if (up.isClick()) Serial.println("Click up");
if (down.isClick()) Serial.println("Click down");
if (start.isClick()) Serial.println("Click start");
if (enc_btn.isClick()) Serial.println("Click enc");
switch (EncPress){
case 0: Worked();
break;
case 1: Nastroyka();
break;
}
if (enc_btn.isHolded()) EncPress = !EncPress;
if (start.isPress()){
Start = !Start;
lcd.setCursor(10,1);
lcd.print(Opusk);
}
if (Start == 1){
if (Opusk < Tolwina + Propil){
digitalWrite(9, HIGH);
Serial.println("Start");
}
else {
if (Opusk >= Tolwina + Propil) {
digitalWrite(9, LOW);
Start = 0;
lcd.setCursor(10,1);
lcd.print(Opusk);
delay(2000);
lcd.setCursor(10,1);
lcd.print(" ");
Opusk = 0;
}
}
}
if ((!digitalRead(6) == true && EncPress == 0)){
Tolwina = Tolwina + 5;
lcd.setCursor(10,0);
lcd.print(" ");
delay(100);
lcd.setCursor(10,0);
lcd.print(Tolwina);
}
if ((!digitalRead(7) == true && EncPress == 0)){
Tolwina = Tolwina - 5;
lcd.setCursor(10,0);
lcd.print(" ");
delay(300);
lcd.setCursor(10,0);
lcd.print(Tolwina);
}
if (up.isClick() && EncPress == 1){
Str = 1;
Serial.println(Str);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(">");
}
if (down.isClick() && EncPress == 1){
Str = 2;
Serial.println(Str);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(">");
}
if ((!digitalRead(6) == true && Str ==1)){
Podjem = Podjem + 1;
lcd.setCursor(10,0);
lcd.print(" ");
delay(300);
lcd.setCursor(10,0);
lcd.print(Podjem);
Serial.println(Podjem);
eepromFlag = true; // поднять флаг
eepromTimer = millis(); // сбросить таймер
}
if ((!digitalRead(7) == true && Str ==1)){
Podjem = Podjem - 1;
lcd.setCursor(10,0);
lcd.print(" ");
delay(300);
lcd.setCursor(10,0);
lcd.print(Podjem);
Serial.println(Podjem);
eepromFlag = true; // поднять флаг
eepromTimer = millis(); // сбросить таймер
}
if ((!digitalRead(6) == true && Str ==2)){
Propil = Propil + 1;
lcd.setCursor(10,1);
lcd.print(" ");
delay(300);
lcd.setCursor(10,1);
lcd.print(Propil);
Serial.println(Propil);
eepromFlag = true; // поднять флаг
eepromTimer = millis(); // сбросить таймер
}
if ((!digitalRead(7) == true && Str == 2)){
Propil = Propil - 1;
lcd.setCursor(10,1);
lcd.print(" ");
delay(300);
lcd.setCursor(10,1);
lcd.print(Propil);
Serial.println(Propil);
eepromFlag = true; // поднять флаг
eepromTimer = millis(); // сбросить таймер
}
if (up.isClick() && Opusk == 0 && MoveDown == false && EncPress == 0){
Serial.println("Pressed UP");
digitalWrite(10, HIGH);
MoveUp = !MoveUp;
TimerUp = millis();
}
if (millis() - TimerUp >= Podjem * 1000){
digitalWrite(10, LOW);
MoveUp = !MoveUp;
}
if (down.isClick() && Opusk == 0 && MoveUp == false && EncPress == 0){
Serial.println("Pressed DOWN");
digitalWrite(9, HIGH);
MoveDown = !MoveDown;
TimerDown = millis();
}
if (millis() - TimerDown >= Podjem * 1000){
digitalWrite(9, LOW);
MoveDown = !MoveDown;
}
// если флаг поднят и с последнего нажатия прошло 10 секунд (10 000 мс)
if (eepromFlag && (millis() - eepromTimer >= 10000) ) {
eepromFlag = false; // опустили флаг
EEPROM.put(0, Podjem); // записали в EEPROM
EEPROM.put(4, Propil); // записали в EEPROM
digitalWrite(12, HIGH);
}
}