// #define EB_NO_FOR // отключить поддержку pressFor/holdFor/stepFor и счётчик степов (экономит 2 байта оперативки)
// #define EB_NO_CALLBACK // отключить обработчик событий attach (экономит 2 байта оперативки)
// #define EB_NO_COUNTER // отключить счётчик энкодера (экономит 4 байта оперативки)
// #define EB_NO_BUFFER // отключить буферизацию энкодера (экономит 1 байт оперативки)
// #define EB_DEB_TIME 50 // таймаут гашения дребезга кнопки (кнопка)
// #define EB_CLICK_TIME 500 // таймаут ожидания кликов (кнопка)
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
#include <EncButton.h>
//EncButton eb(3, 2, 4);
//EncButton eb(2, 3, 4, INPUT); // + режим пинов энкодера
//EncButton eb(2, 3, 4, INPUT, INPUT_PULLUP); // + режим пинов кнопки
EncButton eb(2, 3, 4, INPUT, INPUT_PULLUP, LOW); // + уровень кнопки
#include "Wire.h" // библиотека для протокола I2C
#include "LiquidCrystal_I2C.h" // библиотека для LCD 16x02
LiquidCrystal_I2C lcd(0x27, 20, 2); // присваиваем имя дисплею
// переменные для отсчета времени и будильника
static uint32_t tmr;
uint32_t sec=millis()/1000; //
int tss=(sec%3600ul)%60ul; //
int tmm=(sec%3600ul)/60ul; //
int thh=(sec/3600ul)%24ul; //
int tdd=(sec/3600ul)/24ul; //
// значкi
byte znakt[][8] = { {B00000,B00000,B00000,B01110,B00000,B00000,B00000,B00000},//номер термометра 0
{B00000,B00000,B01110,B00000,B01110,B00000,B00000,B00000},// 1
{B00000,B01110,B00000,B01110,B00000,B01110,B00000,B00000},// 2
{B01110,B00000,B01110,B00000,B01110,B00000,B01110,B00000},// 3
{B11111,B10001,B11111,B10101,B10101,B10001,B10001,B11111},//сВЕТ вкл выкл 4
{B11111,B10001,B10001,B10101,B10101,B11111,B10001,B11111},// 5
{B11111,B10001,B11111,B10101,B10101,B10001,B10001,B11111},//запись да нет 6
{B11111,B10001,B10001,B10101,B10101,B11111,B10001,B11111},// 7
{B00000,B00100,B01010,B10101,B00100,B00100,B00100,B00000},//СТРЕЛКА ВВЕРХ 8
};
//переменная для подсветки
bool lig=1;
//переменная для выбранной строки
bool curstr=0;
bool strch=0;
//переменная для экранов
byte scren=0;
bool scrupd=1;
const byte posar[]={1,4,8,13};// массив положений курсора
byte pos;//текущее положение курсора при установке времени
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
for(byte i=0;i<8;i++){
lcd.createChar(i, znakt[i]);
Serial.println(znakt[i][8],BIN);
}
// показаны значения по умолчанию
eb.setBtnLevel(LOW);
eb.setClickTimeout(500);
eb.setDebTimeout(50);
eb.setHoldTimeout(600);
eb.setStepTimeout(200);
eb.setEncReverse(0);
eb.setEncType(EB_STEP4_LOW);
eb.setFastTimeout(30);
// сбросить счётчик энкодера
eb.counter = 0;
}
void loop() {
eb.tick();//энкодер
switch(scren){
case 0: // начальный экран=======================================================
{
if(scrupd){
scrupd=!scrupd;
lcd.clear();
lcd.setCursor(1,0);//столбец строка
lcd.print(" REC");
lcd.setCursor(1,1);
lcd.print(" SET");
}
lcd.setCursor(0,curstr);
lcd.write(126);
if(eb.turn()){
lcd.setCursor(0,curstr);
lcd.write(16);
curstr=!curstr;
lcd.setCursor(0,curstr);
lcd.write(126);
Serial.println("curstr " + int(curstr));
};
if (eb.click()){
if(curstr==0){scren=10;}else{scren=20;};
scrupd=1;
break;
};
break;
}
case 10: // экран записи==========================================================
{
if(scrupd){
scrupd=!scrupd;
//lcd.clear();
lcd.setCursor(0,0);
//lcd.print("ti:me");
if(thh<10){lcd.print('0');lcd.print(thh);}else{lcd.print(thh);};lcd.print(":");
if(tmm<10){lcd.print('0');lcd.print(tmm);}else{lcd.print(tmm);};lcd.print(":");
if(tss<10){lcd.print('0');lcd.print(tss);}else{lcd.print(tss);};lcd.print(char(39));lcd.print(tdd);
lcd.setCursor(15,0);
lcd.write(lig+5);
lcd.setCursor(0,1);
for(byte i=0;i<4;i++){
lcd.write(i);lcd.print("12 ");
}
}
if (eb.hasClicks(2)){
lig=!lig;
if (lig)lcd.backlight(); else lcd.noBacklight();
lcd.setCursor(15,0);
lcd.write(lig+5);
};
if (eb.hold()){
scrupd=!scrupd;
lcd.clear();
scren=0;
break;
}
if(millis()-tmr>=1000){
tmr=millis();
uint32_t sec=millis()/1000; //
tss=(sec%3600ul)%60ul; //
tmm=(sec%3600ul)/60ul; //
thh=(sec/3600ul)%24ul; //
tdd=(sec/3600ul)/24ul; //
scrupd=!scrupd;
}
break;
}
case 20: //экран настройки=======================================================
{
lcd.blink();
if(scrupd){
pos=0; //выбираем положение курсора в массиве
scrupd=!scrupd;
//lcd.clear();
lcd.setCursor(posar[pos],0);//столбец строка
lcd.print("__:__'__ - __");
lcd.setCursor(posar[pos],1);
lcd.print(" Hh:Mm:Dd - int");
lcd.setCursor(posar[pos],0);
}
if (eb.click()) {
if (pos<sizeof(posar)-1)pos++; else pos=0;
lcd.setCursor(posar[pos],0);
eb.counter=0;
//Serial.println("<<<<<<<<<<<>>>>>>>>>>>");Serial.print("posar[pos]\t");Serial.print("pos\t");Serial.println("posar[pos]");for(byte i=0;i<7;i++){Serial.print(posar[pos]);Serial.print("\t\t");Serial.print(pos);Serial.print("\t");Serial.println(posar[i]);};Serial.println("<<<<<<<<<<<>>>>>>>>>>>");
break;
}
if (eb.right()&&(eb.counter<=9)) {lcd.print(eb.counter);lcd.setCursor(posar[pos],0);}
if (eb.left()&&(eb.counter>=0)) {lcd.print(eb.counter);lcd.setCursor(posar[pos],0);}
if (eb.hold()){
lcd.noBlink();
scrupd=!scrupd;
lcd.clear();
scren=0;
break;
}
break;
}
}
// обработка поворота общая
if (eb.turn()) {
Serial.print("turn: dir ");
Serial.print(eb.dir());
Serial.print(", fast ");
Serial.print(eb.fast());
Serial.print(", hold ");
Serial.print(eb.pressing());
Serial.print(", counter ");
Serial.print(eb.counter);
Serial.print(", clicks ");
Serial.println(eb.getClicks());
}
// обработка поворота раздельная
if (eb.left()) {Serial.println("left");!strch;!curstr;}
if (eb.right()) {Serial.println("right");!strch;!curstr;}
if (eb.leftH()) Serial.println("leftH");
if (eb.rightH()) Serial.println("rightH");
// кнопка
if (eb.press()) Serial.println("press");
if (eb.click()) Serial.println("click");
if (eb.release()) {
Serial.println("release");
Serial.print("clicks: ");
Serial.print(eb.getClicks());
Serial.print(", steps: ");
Serial.print(eb.getSteps());
Serial.print(", press for: ");
Serial.print(eb.pressFor());
Serial.print(", hold for: ");
Serial.print(eb.holdFor());
Serial.print(", step for: ");
Serial.println(eb.stepFor());
}
// состояния
// Serial.println(eb.pressing());
// Serial.println(eb.holding());
// Serial.println(eb.busy());
// Serial.println(eb.waiting());
// таймаут
if (eb.timeout(2000)) Serial.println("timeout!");
// удержание
if (eb.hold()) Serial.println("hold");
if (eb.hold(3)) Serial.println("hold 3");
// импульсное удержание
if (eb.step()) Serial.println("step");
if (eb.step(3)) Serial.println("step 3");
// отпущена после импульсного удержания
if (eb.releaseStep()) Serial.println("release step");
if (eb.releaseStep(3)) Serial.println("release step 3");
// отпущена после удержания
if (eb.releaseHold()) Serial.println("release hold");
if (eb.releaseHold(2)) Serial.println("release hold 2");
// проверка на количество кликов
if (eb.hasClicks(3)) Serial.println("has 3 clicks");
// вывести количество кликов
if (eb.hasClicks()) {
Serial.print("has clicks: ");
Serial.println(eb.getClicks());
}
}