#define pin_e1 2 // 1 пин энкодера
#define pin_e2 3 // 2 пин энкодера
#define pin_by 4 // пин кнопки энкодера
#define logo "PRIBET" // приветствие
#define pin_d1 5 // Пин для красной линии диодов
#define pin_d2 6 // Пин для синей линии диодов
#define pin_d3 7 // Пин для оранжевой линии диодов
#define pin_d4 8 // Пин для желтой линии диодов
#define pin_d5 9 // Пин для зеленой линии диодов
#define pin_d6 10 // Пин для инфракрасной линии диодов
#define pin_d7 11 // Пин для ультрафиолетовой линии диодов
//========== таймер =================
#define TIK_0(x) \
static uint32_t tmr;\
bool flag = millis() - tmr >= (x);\
if (flag) tmr += (x);\
if (flag)
//==================================
#include <Arduino.h>
#include <EncButton.h>
EncButton eb(pin_e1, pin_e2, pin_by);
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // размер дисплея 16x2 (0х26, 0x27, 0x3F)
uint8_t menu, vid_diod;
uint32_t tik = 0, tmr;
String hh, mm, ss;
const char *menu_d[] = {"Red", "Blue", "Orange", "Yellow", "Green", "IR", "UV"};
const uint8_t *pin_d[] = {pin_d1, pin_d2, pin_d3, pin_d4, pin_d5, pin_d6, pin_d7};
void LCD();
void setup()
{
pinMode(pin_d1, OUTPUT);
pinMode(pin_d2, OUTPUT);
pinMode(pin_d3, OUTPUT);
pinMode(pin_d4, OUTPUT);
pinMode(pin_d5, OUTPUT);
pinMode(pin_d6, OUTPUT);
pinMode(pin_d7, OUTPUT);
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
lcd.setCursor(1, 0); // столбец 1 строка 0
lcd.print(logo);
delay(3000);
LCD();
}
void loop()
{
eb.tick();
if (eb.hasClicks(1))
{
menu < 3 ? menu++ : menu;
LCD();
}
if (eb.turn())
{
switch (menu)
{
case 0:
eb.dir() > 0 && vid_diod < 6 ? vid_diod += 1 * eb.dir() : vid_diod;
eb.dir() < 0 && vid_diod > 0 ? vid_diod += 1 * eb.dir() : vid_diod;
break;
case 1:
// изменение с шагом 1, при быстром вращении шаг 60
eb.dir() > 0 ? tik += (eb.fast() ? 60 : 1) * eb.dir() : tik;
eb.dir() < 0 && tik > 0 ? tik += (eb.fast() ? 60 : 1) * eb.dir() : tik;
break;
}
LCD();
}
if (menu == 3) {
digitalWrite(pin_d[vid_diod], HIGH);
while (1) {
eb.tick();
if (eb.hold()) {
menu = 0;
tik = 0;
time();
digitalWrite(pin_d[vid_diod], LOW);
LCD();
break;
}
if (millis() - tmr > 1000) {
tmr = millis();
if (tik > 0) {
tik--;
} else {
menu = 0;
digitalWrite(pin_d[vid_diod], LOW);
LCD();
break;
}
time();
LCD();
}
}
}
}
void LCD()
{
time();
switch (menu)
{
case 0:
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("vid dioda :");
//lcd.print(vid_diod);
lcd.setCursor(6, 1);
lcd.print(menu_d[vid_diod]);
break;
case 1:
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("Time :");
//lcd.print(tik);
lcd.setCursor(4, 1);
lcd.print(String(hh) + ":" + String(mm) + ":" + String(ss));
break;
case 2:
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("START ?");
//lcd.print(tik);
lcd.setCursor(0, 1);
lcd.print(String(hh) + ":" + String(mm) + ":" + String(ss) + " " + menu_d[vid_diod]);
break;
case 3:
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(String(menu_d[vid_diod]) + " On");
lcd.setCursor(3, 1);
lcd.print(hh + ":" + mm + ":" + ss);
break;
}
}
void time() {
hh = tik / 3600 > 9 ? String(tik / 3600) : "0" + String(tik / 3600) ;
mm = ((tik % 3600) / 60) > 9 ? String((tik % 3600) / 60) : "0" + String((tik % 3600) / 60) ;
ss = ((tik % 3600) % 60) > 9 ? String((tik % 3600) % 60) : "0" + String((tik % 3600) % 60) ;
}