// https://kit.alexgyver.ru/tutorials/max7219/
#include "MAX7219.h"
#include "ds1307.h"
//#include "AnalogKey.h"
// https://github.com/GyverLibs/GyverButton
#include "GyverButton.h"
#define pBtn1 34
#define pBtn2 33
#define pBtn3 32
#define pBtn4 33
#define pBtn5 25
GButton btn1(pBtn1), btn2(pBtn2), btn3(pBtn3), btn4(pBtn4), btn5(pBtn5);
#define CLK 18
#define DATA 23
#define CS 15
#define X_SEGMENTS 8
#define Y_SEGMENTS 2
#define AM_W X_SEGMENTS * 8 // 8 матрицы (64 точки)
#define AM_H Y_SEGMENTS * 8 // 2 матрицы (16 точек)
//MAX7219 < W, H, CS, DATA, CLK > mtrx; // подключение к любым пинам
// W и H - количество МАТРИЦ по горизонтали и вертикали
// CS, DATA, CLK - номера пинов
// MAX7219 < X_SEGMENTS, Y_SEGMENTS, CS, DATA, CLK > mtrx;
MAX7219 < X_SEGMENTS, Y_SEGMENTS, CS > mtrx;
// дисплей 8х2, пин CS 5, остальные на аппаратный SPI
// MAX7219 < 8, 2, 5 > mtrx;
// указываем пин и количество кнопок
//AnalogKey<btns, 5> keys;
String tape = "MAX7219";
int spacer = 1;
int width = 5 + spacer;
unsigned long ticker_next;
int value = 0;
void beginButton(){
// настройка антидребезга (по умолчанию 80 мс)
btn1.setDebounce(50);
btn2.setDebounce(50);
btn3.setDebounce(50);
btn4.setDebounce(50);
btn5.setDebounce(50);
// настройка таймаута на удержание (по умолчанию 500 мс)
btn1.setTimeout(300);
btn2.setTimeout(300);
btn3.setTimeout(300);
btn4.setTimeout(300);
btn5.setTimeout(300);
// настройка таймаута между кликами (по умолчанию 300 мс)
btn1.setClickTimeout(600);
btn2.setClickTimeout(600);
btn3.setClickTimeout(600);
btn4.setClickTimeout(600);
btn5.setClickTimeout(600);
// HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND)
// LOW_PULL - кнопка подключена к VCC, пин подтянут к GND
// по умолчанию стоит HIGH_PULL
btn1.setType(HIGH_PULL);
btn2.setType(HIGH_PULL);
btn3.setType(HIGH_PULL);
btn4.setType(HIGH_PULL);
btn5.setType(HIGH_PULL);
// NORM_OPEN - нормально-разомкнутая кнопка
// NORM_CLOSE - нормально-замкнутая кнопка
// по умолчанию стоит NORM_OPEN
btn1.setDirection(NORM_OPEN);
btn2.setDirection(NORM_OPEN);
btn3.setDirection(NORM_OPEN);
btn4.setDirection(NORM_OPEN);
btn5.setDirection(NORM_OPEN);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// init btns
beginButton();
Wire.begin();
delay(100); // Pause for 2 seconds
beginDS1307();
//beginEncoder();
mtrx.begin(); // запускаем
mtrx.setBright(2); // яркость 0..15
//mtrx.setRotation(1); // можно повернуть 0..3, по 90 град по часовой стрелке
// tape = "Clock !!!";
// handleTicker(1);
delay(100);
}
void loop() {
static uint32_t rebootTimerC = millis();
static uint32_t rebootTimer = millis();
static uint8_t btn = 0;
// обязательная функция отработки. Должна постоянно опрашиваться
btn1.tick();
btn2.tick();
btn3.tick();
btn4.tick();
btn5.tick();
testBtn();
if(millis() - rebootTimer >= 500){
rebootTimer = millis();
// --------
readDS1307();
}
if(millis() - rebootTimerC >= 500){
rebootTimerC = millis();
dashboardClock();
}
if(btn > 0){
Serial.println(btn);
btn = 0;
}
}
void dashboardClock(void){
// варіант 1
// mtrx.clear();
// mtrx.setScale(1); // масштаб текста
// mtrx.setCursor(7,1); // установить курсор
// mtrx.println(clockToStringFromDigit(tm.hours) + ":" + clockToStringFromDigit(tm.minutes) + ":" + clockToStringFromDigit(tm.seconds));
// mtrx.print(clockToStringFromDigit(tm.mday) + "." + clockToStringFromDigit(tm.month) + ".20" + clockToStringFromDigit(tm.year));
// mtrx.update();
// варіант 2
mtrx.clear();
mtrx.setScale(2); // масштаб текста
mtrx.setCursor(22,1); // установить курсор
mtrx.print(":");
mtrx.setCursor(1,1); // установить курсор
mtrx.print(clockToStringFromDigit(tm.hours));
mtrx.setCursor(30,1); // установить курсор
mtrx.print(clockToStringFromDigit(tm.minutes));
mtrx.setCursor(53,8); // установить курсор
mtrx.setScale(1); // масштаб текста
mtrx.print(clockToStringFromDigit(tm.seconds));
mtrx.update();
}
void handleTicker(uint8_t size) {
int letter, x, y;
tape = mtrx.utf8rus(tape);
for ( int i = 0 ; i < (width * size) * tape.length() + mtrx._width() - 1 - spacer; i++ ) {
mtrx.clear();
letter = i / (width * size);
x = (mtrx._width() - 1) - i % (width * size);
y = (mtrx._height() - (8 * size)) / 2;
while ( x + (width * size) - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
mtrx.drawChar(x, y, tape[letter], GFX_FILL, size);
}
letter--;
x -= (width * size);
}
mtrx.update();
delay(70);
}
}
void testBtn(){
if (btn1.isClick()) Serial.println("Click"); // проверка на один клик
if (btn1.isSingle()) Serial.println("Single"); // проверка на один клик
if (btn1.isDouble()) Serial.println("Double"); // проверка на двойной клик
if (btn1.isTriple()) Serial.println("Triple"); // проверка на тройной клик
if (btn1.hasClicks()) // проверка на наличие нажатий
Serial.println(btn1.getClicks()); // получить (и вывести) число нажатий
if (btn1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
if (btn1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс)
if (btn1.isHold()) { // если кнопка удерживается
Serial.print("Holding "); // выводим пока удерживается
Serial.println(btn1.getHoldClicks()); // можно вывести количество кликов перед удержанием!
}
if (btn1.isHold()) Serial.println("Holding"); // проверка на удержание
if (btn1.state()) Serial.println("Hold"); // возвращает состояние кнопки
if (btn1.isStep()) { // если кнопка была удержана (это для инкремента)
value++; // увеличивать/уменьшать переменную value с шагом и интервалом
Serial.println(value); // для примера выведем в порт
}
}