// #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 simvol[][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, simvol[i]);
Serial.println(simvol[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;
}
char lbuf[16];
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=11;};
scrupd=1;
curstr=0;
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);
sprintf(lbuf, "%02d:%02d:%02d%c+%dday", thh, tmm, tss, tdd==0?'\0':' ', tdd);
lcd.print(lbuf);
//Serial.println(thh==0?"0y0":"0n0");
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;
curstr=0;
lcd.clear();
scren=0;
break;
}
if(millis()-tmr>=100){
tmr=millis();
uint32_t sec=millis()/1; //
tss=(sec%3600ul)%60ul; //
tmm=(sec%3600ul)/60ul; //
thh=(sec/3600ul)%24ul; //
tdd=(sec/3600ul)/24ul; //
scrupd=!scrupd;
}
break;
}
case 11: //экран настройки=======================================================
{
if(scrupd){
scrupd=!scrupd;
lcd.clear();
lcd.setCursor(1,0);//столбец строка
lcd.print(" Set Time");
lcd.setCursor(1,1);
lcd.print(" Req. ds18b20");
}
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=20;}else{scren=21;};
scrupd=1;
curstr=!curstr;
break;
};
if (eb.hold()){
scrupd=!scrupd;
lcd.clear();
scren=0;
break;
}
break;
}
case 20: //
{
if(scrupd){
scrupd=!scrupd;
curstr=0;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("12:48");
lcd.setCursor(1,1);
lcd.print("10 min");
}
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.hold()){
scrupd=!scrupd;
curstr=0;
lcd.clear();
scren=11;
break;
}
break;
}
case 21: //
{
if(scrupd){
scrupd=!scrupd;
curstr=0;
lcd.clear();
lcd.setCursor(1,0);//столбец строка
lcd.print(" Read i2c");
lcd.setCursor(1,1);
lcd.print(" Set manual");
}
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=30;}else{scren=31;};
scrupd=1;
break;
};
if (eb.hold()){
scrupd=!scrupd;
lcd.clear();
scren=11;
break;
}
break;
}
case 30: //
{
if(scrupd){
scrupd=!scrupd;
curstr=0;
lcd.clear();
lcd.setCursor(0,0);//столбец строка
lcd.print("Set sensor 1");
lcd.setCursor(0,1);
lcd.print("...");
}
if (eb.click()){
for(byte i=0;i<34;i++){
delay(50);
if(i<=16){lcd.scrollDisplayRight();}else{
if(i==17){
lcd.setCursor(0,0);//столбец строка
lcd.print("Sensor adr 1");
lcd.setCursor(0,1);
lcd.print("28FFF17416208F2D");
}
lcd.scrollDisplayLeft();
};
}
break;
};
if (eb.hold()){
scrupd=!scrupd;
lcd.clear();
scren=21;
break;
}
break;
}
case 31: //
{
if(scrupd){
scrupd=!scrupd;
lcd.clear();
lcd.setCursor(0,0);//столбец строка
lcd.print("Sens 1 adr is:0x");
lcd.setCursor(0,1);
lcd.print("28FFF17416208F2D");
}
if (eb.hold()){
scrupd=!scrupd;
curstr=0;
lcd.clear();
scren=21;
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());
}
}