// LedTime - Часы на адресных светодиодных лентах
// Модуль часов SDA = А4, SCL = А5
// Фоторезистор OUT = A3
#include <RTClib.h> // Библиотека DS1307
#include <microDS18B20.h> // Библиотека термодатчика DS18B20
#include <FastLED.h> // Библиотека FastLED
#include <EEPROM.h> // Библиотека EEPROM
#include <GyverButton.h> // Библиотека кнопок
GButton UP(3, HIGH_PULL); // Кнопка " + " = 3
GButton OK(4, HIGH_PULL); // Кнопка " ОК " = 4
GButton DW(5, HIGH_PULL); // Кнопка " - " = 5
#define RESX 24 // 24 столбца
#define RESY 7 // 7 строк
#define DIGITX 4 // Ширина символа 4
#define DIGITY 7 // Высота символа 7
#define NUM_LEDS RESX * RESY // Размер матрицы = 168
#define LED_PIN 6 // Вход матрицы = 6
#define LED_TYPE WS2812B // Тип матрицы WS2812B
#define COLOR_ORDER GRB // Порядок цвета GRB
#define Zum 7 // Вывод Зуммера = 7
MicroDS18B20 <12> ds; // Термодатчик DS18B20
CRGB leds[NUM_LEDS];
RTC_DS1307 rtc;
int brg = 255; // Яркость светодиодов
int brg1 = 255; // Флаг яркости светодиодов
byte color1 = 160; // Цвет 1 (цвет цифр, надписей температуры, даты)
byte color2 = 0; // Цвет 2 (цвет двоеточия, значения температуры, точек)
int col1; // col1 = 0 (цвет 1 = 0), col1 = 5 (цвет 1 = 5) ... col1 = 250 (цвет 1 = 250), col1 = 255 (АВТО)
int col2; // col2 = 0 (цвет 2 = 0), col2 = 5 (цвет 2 = 5) ... col2 = 250 (цвет 2 = 250), col2 = 255 (АВТО)
byte flag1 = 0; // Флаг изменения цвета 1
byte flag2 = 0; // Флаг изменения цвета 2
byte k = 0; // Значение сдвига при выводе даты
byte flag = 0; // flag = 0 - Основной режим работы
// flag = 1 - Режим ввода часов
// flag = 2 - Режим ввода минут
// flag = 3 - Режим ввода дня
// flag = 4 - Режим ввода месяца
// flag = 5 - Режим ввода года
// flag = 6 - Режим отображения Времени, Температуры, Даты
// flag = 7 - Режим выбора 1 цвета
// flag = 8 - Режим выбора 2 цвета
// flag = 9 - Режим настройки яркости светодиодов
// flag = 10 - Режим выбора отображения 0 в часах (0 или 00)
// flag = 11 - Режим ввода часов будильника 1
// flag = 12 - Режим ввода минут будильника 1
// flag = 13 - Режим ввода часов будильника 2
// flag = 14 - Режим ввода минут будильника 2
// flag = 15 - Режим Вкл / Откл будильника 1
// flag = 16 - Режим ввода времени звука будильника 1
// flag = 17 - Режим Вкл / Откл будильника 2
// flag = 18 - Режим ввода времени звука будильника 2
byte reg; // reg = 1 (В), reg = 2 (В+Т), reg = 3 (В+Д), reg = 4 (В+Т+Д)
byte ch; // ch = 1 (один ноль в часах), ch = 2 (два ноля в часах)
byte b1; // b1 = 0 (будильник 1 отключен), b1 = 1 (будильник 1 включен)
byte b2; // b2 = 0 (будильник 2 отключен), b2 = 1 (будильник 2 включен)
byte fl1 = 0; // Флаг срабатывания будильника 1
byte fl2 = 0; // Флаг срабатывания будильника 2
byte fl3 = 0; // Флаг остановки изменения цвета при настройке
int bh1; // Часы будильника 1
int bm1; // Минуты будильника 1
int bh2; // Часы будильника 2
int bm2; // Минуты будильника 2
byte ok = 0; // Флаг долгого нажатия кнопки ОК
byte zv1 = 10; // Время звука будильника 1
byte zv2 = 10; // Время звука будильника 2
uint32_t tmr; // Значение таймера для прерывания зуммера
// Матрица символов (4 х 7)
byte digits[35][DIGITX * DIGITY] = {
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 0 (00)
{ 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 }, // 1 (01)
{ 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1 }, // 2 (02)
{ 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 3 (03)
{ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }, // 4 (04)
{ 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, // 5 (05)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 6 (06)
{ 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, // 7 (07)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 8 (08)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 9 (09)
{ 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // : (10)
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0 }, // . (11)
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // - (12)
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // + (13)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // о (14)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1 }, // А (15)
{ 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0 }, // Б (16)
{ 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0 }, // В (17)
{ 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // Г (18)
{ 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // Д (19)
{ 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1 }, // Е (20)
{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // И (21)
{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, // К (22)
{ 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // Л (23)
{ 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // М (24)
{ 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // Р (25)
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0 }, // С (26)
{ 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 }, // Т (27)
{ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, // У (28)
{ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // Ц (29)
{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0 }, // Ь (30)
{ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1 }, // Я (31)
{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // | (32)
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }, // , (33)
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // ` (34)
};
// НАСТРОЙКИ ПРИ СТАРТЕ
void setup() {
// Разбивка памяти EEPROM при чистом микроконтроллере
//EEPROM.write(0, 0xFF); // Принудительная разбивка памяти EEPROM
if (EEPROM.read(0) == 0xFF) {
EEPROM.update(0, 4); // Значение отображения Времени, Температуры, Даты
EEPROM.update(1, 255); // Значение выбора 1 цвета
EEPROM.update(2, 255); // Значение выбора 2 цвета
EEPROM.update(3, 2); // Значение отображения 0 в часах (0 или 00)
EEPROM.update(4, 0); // Значение часов будильника 1
EEPROM.update(5, 0); // Значение минут будильника 1
EEPROM.update(6, 0); // Значение часов будильника 2
EEPROM.update(7, 0); // Значение минут будильника 2
EEPROM.update(8, 0); // Значение режима Вкл / Откл будильника 1
EEPROM.update(9, 0); // Значение режима Вкл / Откл будильника 2
EEPROM.update(10, 10); // Значение времени звука будильника 1
EEPROM.update(11, 10); // Значение времени звука будильника 2
EEPROM.update(12, 255); // Значение яркости светодиодов
}
// Инициализация выводов
pinMode(Zum, OUTPUT); // Вывод зуммера
// Загрузка значений из EEPROM
reg = EEPROM.read(0); // Загрузка значения отображения Времени, Температуры, Даты
col1 = EEPROM.read(1); // Загрузка значения выбора 1 цвета
col2 = EEPROM.read(2); // Загрузка значения выбора 2 цвета
ch = EEPROM.read(3); // Загрузка значения отображения 0 в часах (0 или 00)
bh1 = EEPROM.read(4); // Загрузка значения часов будильника 1
bm1 = EEPROM.read(5); // Загрузка значения минут будильника 1
bh2 = EEPROM.read(6); // Загрузка значения часов будильника 2
bm2 = EEPROM.read(7); // Загрузка значения минут будильника 2
b1 = EEPROM.read(8); // Загрузка значения режима Вкл / Откл будильника 1
b2 = EEPROM.read(9); // Загрузка значения режима Вкл / Откл будильника 2
zv1 = EEPROM.read(10); // Загрузка значения времени звука будильника 1
zv2 = EEPROM.read(11); // Загрузка значения времени звука будильника 2
brg1 = EEPROM.read(12); // Загрузка значения яркости светодиодов
// Настройка модуля часов
rtc.begin(); // Инициализация модуля DS1307
rtc.adjust(DateTime(2024, 8, 8, 8, 24, 48)); // Запись данных в DS1307
ds.requestTemp(); // Обновление температуры
// Настройка LED матрицы
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brg); // Установка яркости светодиодов
clearDisplay(); // Очистка дисплея
FastLED.show();
}
// ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
void loop() { /*
// Опрос кнопок
UP.tick(); OK.tick(); DW.tick();
// Обработка кнопки " + " (Нажатие кнопки)
if (UP.isClick()) {
if (flag == 0) { flag = 14; ZM1(); return; } // Переход в режим настройки часов будильника 2
if (flag == 1) { sTime(1); return; } // Часы +
if (flag == 2) { sTime(3); return; } // Минуты +
if (flag == 3) { sTime(5); return; } // День +
if (flag == 4) { sTime(7); return; } // Месяц +
if (flag == 5) { sTime(9); return; } // Год +
if (flag == 6) { reg++; if (reg > 4) reg = 1; return; } // Изменение режима отображения
if (flag == 7) { fl3 = 1; col1+=5; if (col1 > 255) col1 = 0; return; } // Изменение 1 цвета
if (flag == 8) { fl3 = 1; col2+=5; if (col2 > 255) col2 = 0; return; } // Изменение 2 цвета
if (flag == 9) { brg1+=5; if (brg1 > 255) brg1 = 0; return; } // Яркость светодиодов +
if (flag == 10) { if (ch == 1) ch = 2; else ch = 1; return; } // Изменение отображения нуля
if (flag == 11) { bh1++; if (bh1 > 23) bh1 = 0; return; } // Часы будильника 1 +
if (flag == 12) { bm1++; if (bm1 > 59) bm1 = 0; return; } // Минуты будильника 1 +
if (flag == 13) { bh2++; if (bh2 > 23) bh2 = 0; return; } // Часы будильника 2 +
if (flag == 14) { bm2++; if (bm2 > 59) bm2 = 0; return; } // Минуты будильника 2 +
if (flag == 15) { if (b1 == 0) b1 = 1; else b1 = 0; return; } // Вкл / Откл будильника 1
if (flag == 16) { zv1+=10; if (zv1 > 60) zv1 = 10; return; } // Время звука будильника 1 +
if (flag == 17) { if (b2 == 0) b2 = 1; else b2 = 0; return; } // Вкл / Откл будильника 2
if (flag == 18) { zv2+=10; if (zv2 > 60) zv2 = 10; return; } // Время звука будильника 2 +
}
// Обработка кнопки " + " (Удержание кнопки)
if (UP.isHold()) {
if (flag == 0) { flag = 17; ZM1(); return; } // Переход в режим Вкл /Откл будильника 2
}
// Обработка кнопки " ОК " (Нажатие кнопки)
if (OK.isClick()) {
if (flag == 0) { flag = 1; ZM1(); return; } // Переход в режим настройки часов
if (flag == 1) { flag = 2; ZM1(); return; } // Переход в режим настройки минут
if (flag == 2) { flag = 3; ZM1(); return; } // Переход в режим настройки дня
if (flag == 3) { flag = 4; ZM1(); return; } // Переход в режим настройки месяца
if (flag == 4) { flag = 5; ZM1(); return; } // Переход в режим настройки года
if (flag == 5) { flag = 0; ZM1(); sTime(11); return; } // Переход в основной режим
if (flag == 6) { EEPROM.update(0, reg); flag = 7; ZM1(); return; } // Переход в режим выбора 1 цвета
if (flag == 7) { EEPROM.update(1, col1); flag = 8; ZM1(); return; } // Переход в режим выбора 2 цвета
if (flag == 8) { EEPROM.update(2, col2); flag = 9; ZM1(); return; } // Переход в режим настройки яркости светодиодов
if (flag == 9) { EEPROM.update(13, brg1); flag = 10; ZM1(); return; } // Переход в режим выбора отображения 0 в часах (0 или 00)
if (flag == 10) { if (col1 == 255) { fl3 = 0; color1 = 160; } EEPROM.update(3, ch); flag = 0;
if (col2 == 255) { fl3 = 0; color2 = 0; } fl3 = 0; ZM1(); return; } // Переход в основной режим
if (flag == 11) { EEPROM.update(4, bh1); flag = 12; ZM1(); return; } // Переход в режим настройки минут будильника 1
if (flag == 12) { EEPROM.update(5, bm1); flag = 0; ZM1(); return; } // Переход в основной режим
if (flag == 13) { EEPROM.update(6, bh2); flag = 14; ZM1(); return; } // Переход в режим настройки минут будильника 2
if (flag == 14) { EEPROM.update(7, bm2); flag = 0; ZM1(); return; } // Переход в основной режим
if (flag == 15) { EEPROM.update(8, b1); flag = 16; ZM1(); return; } // Переход в режим ввода времени звука будильника 1
if (flag == 16) { EEPROM.update(10, zv1); flag = 0; ZM1(); return; } // Переход в основной режим
if (flag == 17) { EEPROM.update(9, b2); flag = 18; ZM1(); return; } // Переход в режим ввода времени звука будильника 2
if (flag == 18) { EEPROM.update(14, zv2); flag = 0; ZM1(); return; } // Переход в основной режим
}
// Обработка кнопки " ОК " (Удержание кнопки)
if (OK.isHold()) {
if (ok == 0) { ok = 1;
if (flag == 0) { flag = 6; ZM1(); return; } // Переход в режим настройки отображения (Время, Температура, Дата)
if (flag == 2) { flag = 1; ZM2(); return; } // Возврат в режим настройки часов
if (flag == 3) { flag = 2; ZM2(); return; } // Возврат в режим настройки минут
if (flag == 4) { flag = 3; ZM2(); return; } // Возврат в режим настройки дня
if (flag == 5) { flag = 4; ZM2(); return; } // Возврат в режим настройки месяца
if (flag == 7) { flag = 6; ZM2(); return; } // Возврат в режим настройки отображения (Время, Температура, Дата)
if (flag == 8) { flag = 7; ZM2(); return; } // Возврат в режим выбора 1 цвета
if (flag == 9) { flag = 8; ZM2(); return; } // Возврат в режим выбора 2 цвета
if (flag == 10) { flag = 9; ZM2(); return; } // Возврат в режим настройки яркости светодиодов
if (flag == 12) { flag = 11; ZM2(); return; } // Возврат в режим настройки часов будильника 1
if (flag == 14) { flag = 13; ZM2(); return; } // Возврат в режим настройки часов будильника 2
if (flag == 16) { flag = 15; ZM2(); return; } // Возврат в режим Вкл / Откл будильника 1
if (flag == 18) { flag = 17; ZM2(); return; } // Возврат в режим Вкл / Откл будильника 2
}
} else { ok = 0; }
// Обработка кнопки " - " (Нажатие кнопки)
if (DW.isClick()) {
if (flag == 0) { flag = 12; ZM1(); return; } // Переход в режим настройки часов будильника 1
if (flag == 1) { sTime(2); return; } // Часы -
if (flag == 2) { sTime(4); return; } // Минуты -
if (flag == 3) { sTime(6); return; } // День -
if (flag == 4) { sTime(8); return; } // Месяц -
if (flag == 5) { sTime(10); return; } // Год -
if (flag == 6) { reg--; if (reg < 1) reg = 4; return; } // Изменение режима отображения
if (flag == 7) { fl3 = 1; col1-=5; if (col1 < 0) col1 = 255; return; } // Изменение 1 цвета
if (flag == 8) { fl3 = 1; col2-=5; if (col2 < 0) col2 = 255; return; } // Изменение 2 цвета
if (flag == 9) { brg1-=5; if (brg1 < 0) brg1 = 255; return; } // Яркость светодиодов -
if (flag == 10) { if (ch == 1) ch = 2; else ch = 1; return; } // Изменение отображения нуля
if (flag == 11) { bh1--; if (bh1 < 0) bh1 = 23; return; } // Часы будильника 1 -
if (flag == 12) { bm1--; if (bm1 < 0) bm1 = 59; return; } // Минуты будильника 1 -
if (flag == 13) { bh2--; if (bh2 < 0) bh2 = 23; return; } // Часы будильника 2 -
if (flag == 14) { bm2--; if (bm2 < 0) bm2 = 59; return; } // Минуты будильника 2 -
if (flag == 15) { if (b1 == 0) b1 = 1; else b1 = 0; return; } // Вкл / Откл будильника 1
if (flag == 16) { zv1-=10; if (zv1 < 10) zv1 = 60; return; } // Время звука будильника 1 -
if (flag == 17) { if (b2 == 0) b2 = 1; else b2 = 0; return; } // Вкл / Откл будильника 2
if (flag == 18) { zv2-=10; if (zv2 < 10) zv2 = 60; return; } // Время звука будильника 2 -
}
// Обработка кнопки " - " (Удержание кнопки)
if (DW.isHold()) {
if (flag == 0) { flag = 15; ZM1(); return; } // Переход в режим Вкл / Откл будильника 1
}
*/
// Вывод Времени, Температуры и Даты
displayTime();
FastLED.show();
delay(50);
clearDisplay();
}
//////////////////////////// П О Д П Р О Г Р А М М Ы ///////////////////////////////
// Функция настройки часов
void sTime(byte num) {
DateTime now = rtc.now();
int h = now.hour(); // Часы
int m = now.minute(); // Минуты
int dd = now.day(); // День
int mm = now.month(); // Месяц
int yy = now.year(); // Год
if (num == 1) { h++; if (h > 23) h = 0; } // Часы +
if (num == 2) { h--; if (h < 0) h = 23; } // Часы -
if (num == 3) { m++; if (m > 59) m = 0; } // Минуты +
if (num == 4) { m--; if (m < 0) m = 59; } // Минуты -
if (num == 5) { dd++; if (dd > 31) dd = 1; } // День +
if (num == 6) { dd--; if (dd < 1) dd = 31; } // День -
if (num == 7) { mm++; if (mm > 12) mm = 1; } // Месяц +
if (num == 8) { mm--; if (mm < 1) mm = 12; } // Месяц -
if (num == 9) { yy++; if (yy > 2099) yy = 2000; } // Год +
if (num == 10) { yy--; if (yy < 2000) yy = 2099; } // Год -
if (num == 11) {} // Сброс секунд при выходе из режима настройки
// Установка времени и даты в формате: (Часы, Минуты, Секунды, День, Месяц, Год)
rtc.adjust(DateTime(yy, mm, dd, h, m, 00)); // Запись данных в DS1307
}
// Функция вывода значений при настройке часов
void displayTime() {
DateTime now = rtc.now();
/*
// Проверка будильника 1
if (b1 == 1) {
if ((now.hour() == bh1) and (now.minute() == bm1)) {
fl1 = 1;
if (now.second() <= zv1) {
if (millis() - tmr >= 1000) {
tmr = millis();
digitalWrite(Zum, !digitalRead(Zum)); // Вкл / Откл зуммера с частотой 500мс
}
} else digitalWrite(Zum, 0);
} else { fl1 = 0; if (fl2 == 0) digitalWrite(Zum, 0); }
} else { if ((fl2 == 0) or (b1 == 0)) digitalWrite(Zum, 0); }
// Проверка будильника 2
if (b2 == 1) {
if ((now.hour() == bh2) and (now.minute() == bm2)) {
fl2 = 1;
if (now.second() <= zv2) {
if (millis() - tmr >= 1000) {
tmr = millis();
digitalWrite(Zum, !digitalRead(Zum)); // Вкл / Откл зуммера с частотой 500мс
}
} else digitalWrite(Zum, 0);
} else { fl2 = 0; if (fl1 == 0) digitalWrite(Zum, 0); }
} else { if ((fl1 == 0) or (b1 == 0)) digitalWrite(Zum, 0); }
// Изменение цвета 1
if ((fl3 == 0) and (col1 == 255)) {
if ((now.second() == 0) and (flag1 == 0)) if (color1 + 5 > 250) { color1 = 0; flag1 = 1; } else { color1 += 5; flag1 = 1; }
if (now.second() == 1) flag1 = 0;
}
// Постоянное значение цвета 1
if ((fl3 == 0) and (col1 != 255)) {
color1 = col1;
}
// Изменение цвета 2
if ((fl3 == 0) and (col2 == 255)) {
if ((now.second() == 0) and (flag2 == 0)) if (color2 + 5 > 250) { color2 = 0; flag2 = 1; } else { color2 += 5; flag2 = 1; }
if (now.second() == 1) flag2 = 0;
}
// Постоянное значение цвета 2
if ((fl3 == 0) and (col2 != 255)) {
color2 = col2;
}
// Изменение яркости светодиодов
if (brg1 == 0) { // Если значение яркости выбрано 0
if ((analogRead(3) / 4.0) >= 20) { // Если значение с фоторезистора >= 20
brg = analogRead(3) / 4.0; // Да, значение яркости с фоторезистора
} else { brg = 20; } // Нет, значение яркости = 20
} else { brg = brg1; } // Значение яркости по выбору
*/
// Основной режим работы
if (flag == 0) {
if (now.second() == 0) k = 0; // Обнуление регистра сдвига в 00 секунд
if ((reg == 1) or
((reg == 2) and (((now.second() >= 0) and (now.second() < 20)) or ((now.second() >= 30) and (now.second() <= 59)))) or
((reg == 3) and ((now.second() >= 0) and (now.second() < 51))) or
((reg == 4) and (((now.second() >= 0) and (now.second() < 20)) or ((now.second() >= 30) and (now.second() < 51))))) {
if ((now.hour() <= 9) and (ch == 2)) { // Проверка отображения нуля (0 или 00)
showDigit(0, 0, color1); // Вывод " 0 "
}
if (now.hour() > 9) {
showDigit((now.hour() / 10), 0, color1); // Вывод десятков часов
}
showDigit((now.hour() % 10), 5, color1); // Вывод единиц часов
if (now.second() % 2 == 0) { // Мигание " : "
showDigit(10, 10, color2); // Вывод " : "
}
showDigit((now.minute() / 10), 15, color1); // Вывод десятков минут
showDigit((now.minute() % 10), 20, color1); // Вывод единиц минут
}
// Вывод Температуры в период от 20 до 29 секунд
if (((reg == 2) or (reg == 4)) and ((now.second() >= 20) and (now.second() < 30))) {
ds.requestTemp(); // Запрос на измерение температуры
int celsius = abs(ds.getTemp()); // Переводим в целое число по модулю
showDigit(27, 0, color1); // Вывод " Т "
showDigit(34, 4, color1); // Вывод " Т+ "
showDigit((celsius / 10), 6, color2); // Вывод десятков температуры
showDigit((celsius % 10), 11, color2); // Вывод единиц температуры
showDigit(14, 16, color1); // Вывод " о "
showDigit(26, 20, color1); // Вывод " С "
}
// Вывод Даты в период от 51 до 59 секунд
if (((reg == 3) or (reg == 4)) and ((now.second() >= 51) and (now.second() < 59))) {
k++; // Изменение регистра сдвига
showDigit((now.day() / 10), (25 - k), color1); // Вывод десятков дня
showDigit((now.day() % 10), (30 - k), color1); // Вывод единиц дня
showDigit(11, (34 - k), color2); // Вывод " . "
showDigit((now.month() / 10), (38 - k), color1); // Вывод десятков месяца
showDigit((now.month() % 10), (43 - k), color1); // Вывод единиц месяца
showDigit(11, (47 - k), color2); // Вывод " . "
showDigit(2, (51 - k), color1); // Вывод " 2 "
showDigit(0, (56 - k), color1); // Вывод " 0 "
showDigit(((now.year() - 2000) / 10), (61 - k), color1); // Вывод десятков года
showDigit(((now.year() - 2000) % 10), (66 - k), color1); // Вывод единиц года
showDigit(11, (70 - k), color2); // Вывод " . "
if (now.dayOfTheWeek() == 0) {
showDigit(17, (75 - k), color1); // Вывод " B "
showDigit(26, (80 - k), color1); // Вывод " C "
showDigit(32, (85 - k), color1); // Вывод " | "
showDigit(22, (86 - k), color1); // Вывод " К "
}
if (now.dayOfTheWeek() == 1) {
showDigit(18, (75 - k), color1); // Вывод " Г "
showDigit(32, (78 - k), color1); // Вывод " | "
showDigit(32, (80 - k), color1); // Вывод " | "
showDigit(12, (81 - k), color1); // Вывод " - "
showDigit(32, (83 - k), color1); // Вывод " | "
showDigit(19, (85 - k), color1); // Вывод " Д "
showDigit(33, (89 - k), color1); // Вывод " , "
}
if (now.dayOfTheWeek() == 2) {
showDigit(17, (75 - k), color1); // Вывод " В "
showDigit(27, (80 - k), color1); // Вывод " Т "
showDigit(34, (84 - k), color1); // Вывод " ` "
showDigit(25, (86 - k), color1); // Вывод " Р "
}
if (now.dayOfTheWeek() == 3) {
showDigit(26, (75 - k), color1); // Вывод " С "
showDigit(25, (80 - k), color1); // Вывод " Р "
showDigit(19, (85 - k), color1); // Вывод " Д "
showDigit(33, (89 - k), color1); // Вывод " , "
}
if (now.dayOfTheWeek() == 4) {
showDigit(4, (75 - k), color1); // Вывод " Ч "
showDigit(27, (80 - k), color1); // Вывод " Т "
showDigit(34, (84 - k), color1); // Вывод " ` "
showDigit(17, (86 - k), color1); // Вывод " В "
}
if (now.dayOfTheWeek() == 5) {
showDigit(18, (75 - k), color1); // Вывод " Г "
showDigit(32, (78 - k), color1); // Вывод " | "
showDigit(27, (80 - k), color1); // Вывод " Т "
showDigit(34, (84 - k), color1); // Вывод " ` "
showDigit(32, (86 - k), color1); // Вывод " | "
showDigit(12, (87 - k), color1); // Вывод " - "
showDigit(32, (89 - k), color1); // Вывод " | "
}
if (now.dayOfTheWeek() == 6) {
showDigit(26, (75 - k), color1); // Вывод " С "
showDigit(16, (80 - k), color1); // Вывод " Б "
showDigit(27, (85 - k), color1); // Вывод " Т "
showDigit(34, (89 - k), color1); // Вывод " ` "
}
showDigit(now.dayOfTheWeek(), (92 - k), color1);
}
}
/*
// Режим ввода часов
if (flag == 1) {
showDigit((now.hour() / 10), 1, 160); // Вывод десятков часов (синий)
showDigit((now.hour() % 10), 6, 160); // Вывод единиц часов (синий)
showDigit(10, 11, 40); // Вывод " : " (желтый)
showDigit(4, 16, 0); // Вывод " Ч " (красный)
showDigit(11, 20, 0); // Вывод " . " (красный)
}
// Режим ввода минут
if (flag == 2) {
showDigit(24, 1, 0); // Вывод " М " (красный)
showDigit(32, 5, 0); // Вывод " М+ " (красный)
showDigit(11, 6, 0); // Вывод " . " (красный)
showDigit(10, 10, 40); // Вывод " : " (желтый)
showDigit((now.minute() / 10), 15, 160); // Вывод десятков минут (синий)
showDigit((now.minute() % 10), 20, 160); // Вывод единиц минут (синий)
}
// Режим ввода дня
if (flag == 3) {
showDigit((now.day() / 10), 0, 95); // Вывод десятков дня (зеленый)
showDigit((now.day() % 10), 5, 95); // Вывод единиц дня (зеленый)
showDigit(11, 10, 40); // Вывод " . " (желтый)
showDigit(19, 15, 0); // Вывод " Д " (красный)
showDigit(33, 19, 0); // Вывод " Д+ " (красный)
showDigit(11, 20, 0); // Вывод " . " (красный)
}
// Режим ввода месяца
if (flag == 4) {
showDigit(24, 1, 0); // Вывод " М " (красный)
showDigit(32, 5, 0); // Вывод " М+ " (красный)
showDigit(11, 6, 0); // Вывод " . " (красный)
showDigit(11, 10, 40); // Вывод " . " (желтый)
showDigit((now.month() / 10), 15, 95); // Вывод десятков месяца (зеленый)
showDigit((now.month() % 10), 20, 95); // Вывод единиц месяца (зеленый)
}
// Режим ввода года
if (flag == 5) {
showDigit(18, 0, 0); // Вывод " Г " (красный)
showDigit(11, 1, 0); // Вывод " . " (красный)
showDigit(2, 5, 95); // Вывод " 2 " (зеленый)
showDigit(0, 10, 95); // Вывод " 0 " (зеленый)
showDigit(((now.year() - 2000) / 10), 15, 95); // Вывод десятков года (зеленый)
showDigit(((now.year() - 2000) % 10), 20, 95); // Вывод единиц года (зеленый)
}
// Режим отображения Времени, Температуры, Даты
if (flag == 6) {
if (reg == 1) {
showDigit(17, 10, 160); // Вывод " В " (синий)
}
if (reg == 2) {
showDigit(17, 5, 160); // Вывод " В " (синий)
showDigit(13, 9, 40); // Вывод " + " (желтый)
showDigit(27, 14, 0); // Вывод " Т " (красный)
showDigit(34, 18, 0); // Вывод " Т+ " (красный)
}
if (reg == 3) {
showDigit(17, 5, 160); // Вывод " В " (синий)
showDigit(13, 9, 40); // Вывод " + " (желтый)
showDigit(19, 14, 95); // Вывод " Д " (зеленый)
showDigit(33, 18, 95); // Вывод " Д+ " (зеленый)
}
if (reg == 4) {
showDigit(17, 0, 160); // Вывод " В " (синий)
showDigit(13, 4, 40); // Вывод " + " (желтый)
showDigit(27, 9, 0); // Вывод " Т " (красный)
showDigit(34, 13, 0); // Вывод " Т+ " (красный)
showDigit(13, 14, 40); // Вывод " + " (желтый)
showDigit(19, 19, 95); // Вывод " Д " (зеленый)
showDigit(33, 23, 95); // Вывод " Д+ " (зеленый)
}
}
// Режим выбора 1 цвета
if (flag == 7) {
showDigit(26, 0, 160); // Вывод " C " (синий)
showDigit(1, 5, 160); // Вывод " 1 " (синий)
if (col1 == 255) {
showDigit(15, 10, 0); // Вывод " А " (красный)
showDigit(17, 15, 40); // Вывод " В " (желтый)
showDigit(27, 19, 95); // Вывод " Т " (зеленый)
showDigit(34, 23, 95); // Вывод " Т+ " (зеленый)
}
if ((col1 >= 0) and (col1 <= 250)) {
if (col1 < 10) {
showDigit(0, 10, col1); // Вывод " 0 "
showDigit(0, 15, col1); // Вывод " 0 "
showDigit(col1, 20, col1); // Вывод col1
}
if ((col1 >= 10) and (col1 < 100)) {
showDigit(0, 10, col1); // Вывод " 0 "
showDigit((col1 / 10), 15, col1); // Вывод col1
showDigit((col1 % 10), 20, col1); // Вывод col1
}
if ((col1 >= 100) and (col1 < 200)) {
showDigit(1, 10, col1); // Вывод " 1 "
showDigit(((col1 - 100) / 10), 15, col1); // Вывод col1
showDigit(((col1 - 100) % 10), 20, col1); // Вывод col1
}
if (col1 >= 200) {
showDigit(2, 10, col1); // Вывод " 2 "
showDigit(((col1 - 200) / 10), 15, col1); // Вывод col1
showDigit(((col1 - 200) % 10), 20, col1); // Вывод col1
}
}
}
// Режим выбора 2 цвета
if (flag == 8) {
showDigit(26, 0, 160); // Вывод " C " (синий)
showDigit(2, 5, 160); // Вывод " 2 " (синий)
if (col2 == 255) {
showDigit(15, 10, 0); // Вывод " А " (красный)
showDigit(17, 15, 40); // Вывод " В " (желтый)
showDigit(27, 19, 95); // Вывод " Т " (зеленый)
showDigit(34, 23, 95); // Вывод " Т+ " (зеленый)
}
if ((col2 >= 0) and (col2 <= 250)) {
if (col2 < 10) {
showDigit(0, 10, col2); // Вывод " 0 "
showDigit(0, 15, col2); // Вывод " 0 "
showDigit(col2, 20, col2); // Вывод col2
}
if ((col2 >= 10) and (col2 < 100)) {
showDigit(0, 10, col2); // Вывод " 0 "
showDigit((col2 / 10), 15, col2); // Вывод col2
showDigit((col2 % 10), 20, col2); // Вывод col2
}
if ((col2 >= 100) and (col2 < 200)) {
showDigit(1, 10, col2); // Вывод " 1 "
showDigit(((col2 - 100) / 10), 15, col2); // Вывод col2
showDigit(((col2 - 100) % 10), 20, col2); // Вывод col2
}
if (col2 >= 200) {
showDigit(2, 10, col2); // Вывод " 2 "
showDigit(((col2 - 200) / 10), 15, col2); // Вывод col2
showDigit(((col2 - 200) % 10), 20, col2); // Вывод col2
}
}
}
// Режим настройки яркости светодиодов
if (flag == 9) {
showDigit(31, 0, 160); // Вывод " Я " (синий)
showDigit(10, 5, 160); // Вывод " : " (синий)
if (brg1 == 0) {
showDigit(15, 10, 0); // Вывод " А " (красный)
showDigit(17, 15, 0); // Вывод " В " (красный)
showDigit(27, 19, 0); // Вывод " Т " (красный)
showDigit(34, 23, 0); // Вывод " Т+ " (красный)
}
if ((brg1 > 0) and (brg1 <= 255)) {
if (brg1 < 10) {
showDigit(0, 10, 0); // Вывод " 0 " (красный)
showDigit(0, 15, 0); // Вывод " 0 " (красный)
showDigit(brg1, 20, 0); // Вывод brg1 (красный)
}
if ((brg1 >= 10) and (brg1 < 100)) {
showDigit(0, 10, 0); // Вывод " 0 " (красный)
showDigit((brg1 / 10), 15, 0); // Вывод brg1 (красный)
showDigit((brg1 % 10), 20, 0); // Вывод brg1 (красный)
}
if ((brg1 >= 100) and (brg1 < 200)) {
showDigit(1, 10, 0); // Вывод " 1 " (красный)
showDigit(((brg1 - 100) / 10), 15, 0); // Вывод brg1 (красный)
showDigit(((brg1 - 100) % 10), 20, 0); // Вывод brg1 (красный)
}
if (brg1 >= 200) {
showDigit(2, 10, 0); // Вывод " 2 " (красный)
showDigit(((brg1 - 200) / 10), 15, 0); // Вывод brg1 (красный)
showDigit(((brg1 - 200) % 10), 20, 0); // Вывод brg1 (красный)
}
}
}
// Режим выбора отображения 0 в часах (0 или 00)
if (flag == 10) {
if (ch == 1) {
showDigit(0, 5, 160); // Вывод " 0 " (синий)
}
if (ch == 2) {
showDigit(0, 0, 160); // Вывод " 0 " (синий)
showDigit(0, 5, 160); // Вывод " 0 " (синий)
}
showDigit(4, 10, 0); // Вывод " Ч " (красный)
showDigit(15, 15, 0); // Вывод " А " (красный)
showDigit(26, 20, 0); // Вывод " С " (красный)
}
// Режим ввода часов будильника 1
if (flag == 11) {
showDigit((bh1 / 10), 0, 160); // Вывод десятков часов (синий)
showDigit((bh1 % 10), 5, 160); // Вывод единиц часов (синий)
showDigit(10, 10, 40); // Вывод " : " (желтый)
showDigit(16, 15, 0); // Вывод " Б " (красный)
showDigit(1, 20, 0); // Вывод " 1 " (красный)
}
// Режим ввода минут будильника 1
if (flag == 12) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(1, 5, 0); // Вывод " 1 " (красный)
showDigit(10, 10, 40); // Вывод " : " (желтый)
showDigit((bm1 / 10), 15, 160); // Вывод десятков минут (синий)
showDigit((bm1 % 10), 20, 160); // Вывод единиц минут (синий)
}
// Режим ввода часов будильника 2
if (flag == 13) {
showDigit((bh2 / 10), 0, 160); // Вывод десятков часов (синий)
showDigit((bh2 % 10), 5, 160); // Вывод единиц часов (синий)
showDigit(10, 10, 40); // Вывод " : " (желтый)
showDigit(16, 15, 0); // Вывод " Б " (красный)
showDigit(2, 20, 0); // Вывод " 2 " (красный)
}
// Режим ввода минут будильника 2
if (flag == 14) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(2, 5, 0); // Вывод " 2 " (красный)
showDigit(10, 10, 40); // Вывод " : " (желтый)
showDigit((bm2 / 10), 15, 160); // Вывод десятков минут (синий)
showDigit((bm2 % 10), 20, 160); // Вывод единиц минут (синий)
}
// Режим Вкл / Откл будильника 1
if (flag == 15) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(1, 5, 0); // Вывод " 1 " (красный)
showDigit(10, 10, 0); // Вывод " : " (желтый)
if (b1 == 0) {
showDigit(0, 14, 160); // Вывод " 0 " (синий)
showDigit(27, 19, 160); // Вывод " Т " (синий)
showDigit(34, 23, 160); // Вывод " Т+ " (синий)
}
if (b1 == 1) {
showDigit(17, 16, 160); // Вывод " В " (синий)
}
}
// Режим ввода времени звука будильника 1
if (flag == 16) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(1, 5, 0); // Вывод " 1 " (красный)
showDigit(10, 10, 0); // Вывод " : " (желтый)
showDigit((zv1 / 10), 15, 160); // Вывод zv1
showDigit((zv1 % 10), 20, 160); // Вывод zv1
}
// Режим Вкл / Откл будильника 2
if (flag == 17) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(2, 5, 0); // Вывод " 2 " (красный)
showDigit(10, 10, 0); // Вывод " : " (желтый)
if (b2 == 0) {
showDigit(0, 14, 160); // Вывод " 0 " (синий)
showDigit(27, 19, 160); // Вывод " Т " (синий)
showDigit(34, 23, 160); // Вывод " Т+ " (синий)
}
if (b2 == 1) {
showDigit(17, 16, 160); // Вывод " В " (синий)
}
}
// Режим ввода времени звука будильника 2
if (flag == 18) {
showDigit(16, 0, 0); // Вывод " Б " (красный)
showDigit(2, 5, 0); // Вывод " 2 " (красный)
showDigit(10, 10, 0); // Вывод " : " (желтый)
showDigit((zv2 / 10), 15, 160); // Вывод zv2
showDigit((zv2 % 10), 20, 160); // Вывод zv2
}*/
}
// Вывод символов на матрицу
void showDigit(byte digit, byte x, byte color) {
for (byte i = 0; i < (NUM_LEDS); i++) {
if (digits[digit][i] == 1) setPixel(x + (i - ((i / DIGITX) * DIGITX)), (i / DIGITX), color);
}
}
// Получить номер пикселя по координатам
void setPixel(byte x, byte y, byte color) {
if (x < RESX && y < RESY) {
leds[(y * RESX) + x] = CHSV(color, 255, brg);
}
}
// Очистка дисплея
void clearDisplay() {
for (byte i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black; // Заполнение матрицы черным цветом
}
}
// Подпрограмма кратковременного Зуммера
void ZM1() {
digitalWrite(Zum, 1); delay(100); digitalWrite(Zum, 0);
}
// Подпрограмма долговременного Зуммера
void ZM2() {
digitalWrite(Zum, 1); delay(500); digitalWrite(Zum, 0);
}