// Часы на WS2812
// Версия 1.9
// Дата написания 26.09.2021
// Сборка проршивки [email protected]
/* Последоватеольность соединения сигментов индикатора
{G B A F E D C} {G B A F E D C} {верхняя точка} {нижняя точка} {G B A F E D C} {G B A F E D C}
Количество светодиодов светодиодов выберается относительно количества светотдиодов на сегмент
При первом запуске выбрать режим "----" для обнуления памяти
ВОЗМОЖНОСТИ
Отображают время, температуру, давление, дату, 255 цетов (смена каждую минуту)
В режиме часов нажатие на "+" отображает температуру, а на "-" дату
Цвет отображении температуры изменяется от температуры
НАСТРОЙКИ в часах (листаются кнопкой "настройки" по кругу) менять кнопками "+" и "-":
1. (H) установка часов 0...23
2. (A) установка минут 0...59
3. (S) сброс секунд на 0 кнопками ("+" - сбрасывает сек. на 0 добавляет 1 мин.) или ("-" - сбрасывает сек. на 0)
4. (d) установка дня 1...31
5. (b) установка месяца 1...12
6. (отображается полностью) установка года
7. (C) настройка цвета (если 00 то автоматическая) 0...25
8. (L) настройка яркости (если 00 то автоматическая) 0...25
9. (t) включение датчиков температуры (0 - отк. 1 - 1 датчик, 2 - 2 датчик, 3 - оба)
10. (P) включение датчиков температуры (0 - отк. 1 - температура, 2 - давление, 3 - оба)
11. (tt) установка времени отображения температуры, давления 0...8 сек.
12. (td) установка времени отображения даты 0...5 сек.
13. (SH) установка отображениея анимации при смене минут (0 - отк. 1 - вкл. 2 - вкл. ночной режим)
14. (tH) установка количества отображения температуры и даты в минуту 1...5 раз (период 60,30,20,15,12 сек. соответственно)
15. (----) сброс настроек кнопками "+" или "-"
*/
#include <DS3232RTC.h>
#include <FastLED.h>
#include <EEPROMex.h>
#include <microDS18B20.h>
// Настройки пинов подключения к Ардуино +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define DATA_PIN 6 // pin вывод данных на светодиоды
#define LIGHT_PIN A0 // pin датчика освещенности
#define TEMP_1_PIN 10 // pin 1 датчика температуры только плюсовая до десятых
#define TEMP_2_PIN 11 // pin 2 датчика температуры плюсовая и минусовая до целых
#define PIN_UP 3 // pin кнопки прибавить
#define PIN_ST 4 // pin кнопки выбор
#define PIN_DW 5 // pin кнопки убавить
// Настройки +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LED_TYPE WS2811 // Тип светодиодов (WS2812, WS2811 и т.д.)
#define COLOR_ORDER GRB // Порядок цветов (если при включении часы не красные менять буквы местами)
#define SEGMENT_LEDS 1 // Количество светодиодов на сегмент (точки по 1 светодиоду)
#define LIGHT_MIN 4 // Минимальный уровень яркости (0...255) должно быть меньше максимального
#define LIGHT_MAX 250 // Максимальный уровень яркости (0...255) должно быть больше минимального
#define TIME_EXIT 4 // Время выхода из меню после последнего нажатия кнопок (секунд)
#define ANIME_DELAY 20 // Замедление анимации при смемене цвета в миллисекундах (не более 30)
//#define BMP_280 // Закоментировать строку если датчик BMP280 неиспользуется
#define ADDRESS_BMP280 0x76 // Адрес датчика BMP280 (0x77 или 0x76 или сканировать шину I2C)
#define ZERO_WATCH // Закомеентировать строку для отображения первого нуля в часах
// Настройки ночного режима +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LIGHT_NIGHT 100 // Яркость ниже которой включается ночной режим (0...255, 255 - не учитывать яркость)
#define TIME_NIGHT_BEGIN 22 // Время включения ночного режима (в часах)
#define TIME_NIGHT_END 7 // Время выключения ночного режима (в часах)
#define COLOR_NIGHT 0xFF0000 // Цвет часов в ночном режиме
// Настройка отображения давления +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define COLOR_PRES // Закоментировать для отключения цветов отображения давления (будет как часы)
#define COLOR_PRES_ST 0x00FF00 // Цвет давления неизменном относительно предыдушего замера
#define COLOR_PRES_UP 0xFF0000 // Цвет при повышении давления относительно предыдушего замера
#define COLOR_PRES_DW 0x0000FF // Цвет при понижении давления относительно предыдушего замера
// Настройки отображения температуры ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define TEMP_1_SYMBOL 10 // Символ градусов 1 датчика температуры (10 - "0", 11 - "С")
#define TEMP_2_SYMBOL 10 // Символ градусов 2 датчика температуры (10 - "0", 11 - "С")
#define TEMP_BMP_SYMBOL 10 // Символ градусов датчика температуры с BMP (10 - "0", 11 - "С")
#define TEMP_1_COLOR 1 // Вариант цвета 1 датчика (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_2_COLOR 1 // Вариант цвета 2 датчика (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_BMP_COLOR 1 // Вариант цвета датчика с BMP (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_1_CORRECT 0 // Корректировка показания 1 датчика температуры (в гр. С, десятые через точку)
#define TEMP_2_CORRECT 0 // Корректировка показания 2 датчика температуры (в гр. С, десятые через точку)
#define TEMP_BMP_CORRECT 0 // Корректировка показания датчика температуры с BMP280 (в гр. С, десятые через точку)
#define TEMP_1_MIN 20 // Минимальная температура 1 датчика (отображается синим)
#define TEMP_1_MAX 30 // Максимальная температура 1 датчика (отображается красным)
#define TEMP_2_MIN -20 // Минимальная температура 2 датчика (отображается синим)
#define TEMP_2_MAX 35 // Максимальная температура 2 датчика (отображается красным)
#define TEMP_BMP_MIN 20 // Минимальная температура датчика с BMP (отображается синим)
#define TEMP_BMP_MAX 30 // Максимальная температура датчика с BMP (отображается красным)
// Defauil настройки в часах устанавливаются режимом "----" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define TIME_TEMP 4 // Установка времени отображения температуры и давления 0...8 секунд (0 - отк.)
#define TIME_DATE 0 // Установка времени отображения даты 0...3 секунд (0 - отк.)
#define SET_COLOR 0 // Настройка цвета (если 0 то автоматическая) 0...20
#define SET_LIGHT 0 // Настройка яркости (если 0 то автоматическая) 0...25
#define SET_TEMPS 2 // Включение отображения температуры (0 - отк. 1 - 1 датчик, 2 - 2 датчик, 3 - оба)
#define SET_PRESS 0 // Включение отображения температуры и давления с BMP280 (0 - отк. 1 - темп., 2 - давл., 3 - оба)
#define SET_SHOWS 1 // Включение отображения анимации при смене минут (0 - отк. 1 - вкл. 2 - вкл. ночной режим)
#define TIME_TIME 4 // Установка количества отображения температуры и даты в минуту 1...5 раз
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#ifdef BMP_280
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
#endif
MicroDS18B20 <TEMP_1_PIN> sensor1;
MicroDS18B20 <TEMP_2_PIN> sensor2;
#define NUM_LEDS ((SEGMENT_LEDS * 28) + 2)
#define POINT_UP (14 * SEGMENT_LEDS)
#define POINT_DW ((14 * SEGMENT_LEDS) + 1)
CRGB leds[NUM_LEDS];
CRGB temp_color;
CRGB led_color;
CRGB pres_color;
byte digits[22] = {0b01111110, // 0
0b01000010, // 1
0b00110111, // 2
0b01100111, // 3
0b01001011, // 4
0b01101101, // 5
0b01111101, // 6
0b01000110, // 7
0b01111111, // 8
0b01101111, // 9
0b00001111, // º 10
0b00111100, // C 11
0b01011011, // H 12
0b01011111, // A 13
0b01101101, // S 14
0b00000001, // - 15
0b01110011, // d 16
0b01111001, // b 17
0b00000000, // 18
0b00111001, // t 19
0b00111000, // L 20
0b00011111}; // P 21
boolean eeprom_flag;
boolean temp_flag = false;
boolean read_eeprom = true;
boolean mode_flag = true;
boolean night_flag = false;
unsigned long key_pressed;
unsigned long t;
unsigned long opdating_time;
byte color;
byte old_color = 0;
byte mode = 55; // Режим работы
byte brightness; // Яркость
byte znak; // Для вывода знака минуса
byte points = 0; // Состотяние точек
byte figure[4]; // Цыфры часов
byte setups[9]; // 0, TIME_TEMP, TIME_DATE, SET_COLOR, SET_LIGHT, SET_TEMPS, SET_SHOWS, TIME_TIME, SET_PRESS
int temp1; // Температура
int temp2; // Температура
int time_tp = 2000; // Промежуточное время вывода температуры
byte tp = 0;
int old_pres = 0;
#ifdef BMP_280
int pres; // Давление
int temp; // Температура с BMP280
#endif
class button { // Работа с кнопками
public:
button (byte pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);}
static byte key;
boolean click() {
boolean btnState = digitalRead(_pin);
if (!btnState && !_flag && millis() - _tmr >= 100) {
_flag = true;
key = true;
_tmr = millis();
return true;}
if (!btnState && _flag && millis() - _tmr >= 400) {
_tmr = millis ();
key = true;
return true;}
if (btnState && _flag) {
_flag = false;
key = false;
_tmr = millis();}
return false;}
private:
byte _pin;
uint32_t _tmr;
boolean _flag;};
button up(PIN_UP);
button st(PIN_ST);
button dw(PIN_DW);
byte button::key;
void setup(){
LEDS.addLeds <LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Установить тип светодиодной ленты
figure[0] = 0;
figure[1] = 7 * SEGMENT_LEDS;
figure[2] = (14 * SEGMENT_LEDS) + 2;
figure[3] = (21 * SEGMENT_LEDS) + 2;
t = millis();
opdating_time = millis();
#ifdef BMP_280
bmp.begin(ADDRESS_BMP280);
#endif
}
// END setup
void BrightnessCheck(){ // Установка яркости по датчику освещенности
if (setups[4] == 0) brightness = map(analogRead(LIGHT_PIN), 0, 1023, LIGHT_MIN, LIGHT_MAX);
else brightness = setups[4] * 10;
LEDS.setBrightness(brightness);}
void TempColor(byte set_sh, int temp_x, int temp_min, int temp_max){ // Функция изменения цвета от температуры
byte sum_color;
if (set_sh == 0) temp_color = led_color;
if (temp_x < temp_min * 10) temp_x = temp_min * 10;
if (temp_x > temp_max * 10) temp_x = temp_max * 10;
if (set_sh == 1) sum_color = map(temp_x, temp_min * 10, temp_max * 10, 170, 0);
if (set_sh == 2) sum_color = map(temp_x, temp_min * 10, temp_max * 10, 170, 255);
temp_color = CHSV(sum_color, 255, 255);}
#ifdef BMP_280
void PresColor(){ // Функция изменения цвета давления
int p;
p = bmp.readPressure();
#ifdef COLOR_PRES
if (p == 0 || p == old_pres) pres_color = COLOR_PRES_ST;
if (p < old_pres) pres_color = COLOR_PRES_DW;
if (p > old_pres) pres_color = COLOR_PRES_UP;
old_pres = p;
#else
pres_color = led_color;
#endif
}
#endif
void DigitOut(byte digit_1, byte digit_2, byte digit_3, byte digit_4, byte point, CRGB d_color){ // Функция вывода на диоды
byte digit[4] = {digit_1, digit_2, digit_3, digit_4};
for (byte s = 0; s <= 3; s++){
byte cursor = figure[s];
for(byte k = 0; k <= 6; k++){
for(byte i = 1; i <= SEGMENT_LEDS; i++){
if ((digits[digit[s]] & 1 << k) == 1 << k)
leds[cursor] = d_color;
else leds[cursor] = 0x000000;
cursor++;}}}
if (point == 0){leds[POINT_DW] = 0x000000; leds[POINT_UP] = 0x000000;}
else if (point == 1){leds[POINT_DW] = d_color; leds[POINT_UP] = 0x000000;}
else if (point == 2){leds[POINT_DW] = d_color; leds[POINT_UP] = d_color;}}
int PressingButton(byte variable, byte var_min, byte var_max){ // Функция работы кнопок + и -
if (up.click()) { //увеличиваем
if (variable == var_max) variable = var_min; else variable += 1;}
if (dw.click()) { //уменьшаем
if (variable == var_min) variable = var_max; else variable -= 1;}
return variable;}
void Animate(int v) { // Функция анимации
static uint8_t hue = 0;
leds[v] = CHSV(hue++, 255, 255);
FastLED.show();
for(byte m = 0; m < NUM_LEDS; m++) {
leds[m].nscale8(250);}
delay(ANIME_DELAY / SEGMENT_LEDS);}
void Animation() { // Фунция анимации при смене минуты
for(int i = 0; i < NUM_LEDS; i++) Animate(i);
for(int i = NUM_LEDS - 1; i >= 0; i--) Animate(i);}
void ColorSelect(){ // Функция выбора цвета часов
if (night_flag) led_color = COLOR_NIGHT;
else if (setups[3] == 0){
while (abs(color - old_color) < 25) color = random8();
led_color = CHSV(color, 255, 255);}
else if (setups[3] != 0)led_color = CHSV(setups[3] * 10, 255, 255);}
// Работа с памятью ===============================================================================================
void ReadEEPROM() { // Чтение
for (byte i = 1; i <= 8; i++) setups[i] = EEPROM.readByte(i);
read_eeprom = false;}
void UpdateEEPROM() { // Запись
for (byte i = 1; i <= 8; i++) EEPROM.updateByte(i, setups[i]);}
void EepromTick() { // Проверка
if (eeprom_flag && mode_flag){
for (byte i = 1; i <= 8; i++){
if (setups[i] != EEPROM.readByte(i)){
UpdateEEPROM();
break;}}
eeprom_flag = false;}}
void(* resetFunc) (void) = 0; // Функция перезагрузкки МК.
void ResetClock(){ // Сброс на настройки по умолчанию
byte def_setup[9] = {0, TIME_TEMP, TIME_DATE, SET_COLOR, SET_LIGHT, SET_TEMPS, SET_SHOWS, TIME_TIME, SET_PRESS};
// setups[i] i = _ 1 2 3 4 5 6 7 8
for (byte i = 1; i <= 8; i++) EEPROM.updateByte(i, def_setup[i]);
delay(100);
resetFunc();}
// ==================================================================================================================
void loop() { // Основной цикл -------------------------------------------------------------------------------
if (read_eeprom) ReadEEPROM();
BrightnessCheck(); // Проверка яркости
time_t tm;
if (millis() - opdating_time > 100){
tm = RTC.get(); // Получение времени
opdating_time = millis();}
tmElements_t Now;
if (mode == 0){
Now.Hour = hour(tm);
Now.Minute = minute(tm);
Now.Second = second(tm);
Now.Day = day(tm);
Now.Month = month(tm);
Now.Year = year(tm) - 1970;
if (setups[6] == 2 && brightness < LIGHT_NIGHT && (Now.Hour <= TIME_NIGHT_END || Now.Hour >= TIME_NIGHT_BEGIN)) night_flag = true;
else night_flag = false;}
if (mode < 20 && mode != 0 && (millis() - key_pressed) > (TIME_EXIT * 1000)) mode = 0; // Переход в режим часов
if (!night_flag && (setups[5] != 0 || setups[8] != 0)) {
if ((mode == 0 && up.click()) || (mode == 0 && (second(tm) % (60 / setups[7]) == 1))) { // Переход в режим запроса температуры
t = millis();
if (setups[5] != 0) {
sensor1.requestTemp();
sensor2.requestTemp();
temp_flag = true;}
#ifdef BMP_280
else if (setups[8] == 2) mode = 23;
else if (setups[8] == 1 || setups[8] == 3) mode = 22;
temp = 10 * (bmp.readTemperature() + TEMP_BMP_CORRECT);
pres = bmp.readPressure() * 0.00750063;
if (setups[8] == 3) tp += 2;
if (setups[8] < 3 && setups[8] > 0) tp += 1;
PresColor();
#else
setups[8] = 0;
#endif
if (setups[5] == 3) tp += 2;
if (setups[5] != 0 && setups[5] < 3) tp += 1;
if (setups[2] != 0) tp += 1;
time_tp = (setups[1] * 1000) / tp;}}
if (temp_flag && mode == 0 && millis() - t > 1900) { // Запрос температуры
temp_flag = false;
t = millis();
temp1 = 10 * (sensor1.getTemp() + TEMP_1_CORRECT);
temp2 = 10 * (sensor2.getTemp() + TEMP_2_CORRECT);
if (setups[5] == 1 || setups[5] == 3) mode = 20;
else if (setups[5] == 2) mode = 21;}
if ((mode == 0 && dw.click()) || (!night_flag && setups[5] == 0 && setups[8] == 0 && setups[2] != 0 && mode == 0 && (second(tm) % (60 / setups[7]) == 1))) { // Переход в режим даты
t = millis();
mode = 25;}
if (mode < 20 && st.click()){ // если нажата кнопка 2, то гоняем меню по кругу
if (mode == 15) mode = 1; else mode++;}
if (mode < 20 && button::key) { // Отслеживание нажатия любой кнопки
key_pressed = millis();
if (mode >= 7 && mode <= 14) {
eeprom_flag = true;
mode_flag = false;}}
if (second(tm) == 2) old_color = color;
if (setups[7] == 5 && (setups[1] + setups[2]) > 8 && (setups[5] + setups[8]) > 5) setups[7] = 4;
// ------------------------------------------ switch -----------------------------------
switch (mode) {
case 0: { // Нормальный режим отображение времени
if (second(tm) == 0) {ColorSelect();
if (setups[6] != 0 && !night_flag) Animation();}
if (second(tm) % 2 == 0) points = 2; else points = 0;
#ifdef ZERO_WATCH
if (hour(tm) < 10) DigitOut(18, hour(tm) % 10, minute(tm) / 10, minute(tm) % 10, points, led_color);
else
#endif
DigitOut(hour(tm) / 10, hour(tm) % 10, minute(tm) / 10, minute(tm) % 10, points, led_color);
mode_flag = true;
tp = 0;
break;}
case 1: { // Режим установки часов
Now.Hour = PressingButton(Now.Hour, 0, 23);
if (Now.Hour != hour(tm)) RTC.write(Now);
DigitOut(12, 15, Now.Hour / 10, Now.Hour % 10, 0, led_color);
break;}
case 2: { // Режим установки минут
Now.Minute = PressingButton(Now.Minute, 0, 59);
if (Now.Minute != minute(tm)) RTC.write(Now);
DigitOut(13, 15, Now.Minute / 10, Now.Minute % 10, 0, led_color);
break;}
case 3: { // Режим установки секунд
if (up.click()) { //обнуляем секунды + 1 минута
Now.Second = 0;
Now.Minute = Now.Minute + 1;
RTC.write(Now);}
if (dw.click()) { //обнуляем секунды
Now.Second = 0;
RTC.write(Now);}
key_pressed = millis();
DigitOut(14, 15, second(tm) / 10, second(tm) % 10, 0, led_color);
break;}
case 4: { // Режим установки дня
Now.Day = PressingButton(Now.Day, 1, 31);
if (Now.Day != day(tm)) RTC.write(Now);
DigitOut(16, 15, Now.Day / 10, Now.Day % 10, 0, led_color);
break;}
case 5: { // Режим установки месяца
Now.Month = PressingButton(Now.Month, 1, 12);
if (Now.Month != month(tm)) RTC.write(Now);
DigitOut(17, 15, Now.Month / 10, Now.Month % 10, 0, led_color);
break;}
case 6: { // Режим установки года
Now.Year = PressingButton(Now.Year, 50, 99);
if (Now.Year != year(tm)) RTC.write(Now);
DigitOut(2, 0, ((Now.Year - 30) / 10) % 100, ((Now.Year - 30) % 10), 0, led_color);
break;}
case 7: { // Режим установки цвета
setups[3] = PressingButton(setups[3], 0, 25);
if (setups[3] > 0) led_color = CHSV(setups[3] * 10, 255, 255);
DigitOut(11, 15, setups[3] / 10, setups[3] % 10, 0, led_color);
break;}
case 8: { // Режим установки яркости
setups[4] = PressingButton(setups[4], 0, 25);
DigitOut(20, 15, setups[4] / 10, setups[4] % 10, 0, led_color);
break;}
case 9: { // Режим установки датчиков температуры
setups[5] = PressingButton(setups[5], 0, 3);
DigitOut(18, 19, 15, setups[5], 0, led_color);
break;}
#ifdef BMP_280
case 10: { // Режим установки датчиков BMP280
setups[8] = PressingButton(setups[8], 0, 3);
DigitOut(18, 21, 15, setups[8], 0, led_color);
break;}
#else
case 10: {mode = 11;
break;}
#endif
case 11: { // Режим установки времени отображения температуры, давления
setups[1] = PressingButton(setups[1], 0, 8);
DigitOut(19, 19, 15, setups[1], 0, led_color);
break;}
case 12: { // Режим установки времени отображения даты
setups[2] = PressingButton(setups[2], 0, 3);
DigitOut(19, 16, 15, setups[2], 0, led_color);
break;}
case 13: { // Режим установки отображения анимации при смене минут
setups[6] = PressingButton(setups[6], 0, 2);
DigitOut(14, 12, 15, setups[6], 0, led_color);
break;}
case 14: { // Режим установки количества отображения часов
setups[7] = PressingButton(setups[7], 1, 5);
DigitOut(19, 12, 15, setups[7], 0, led_color);
break;}
case 15: { // Режим сброса
if (up.click() || dw.click()) {
ResetClock();}
DigitOut(15, 15, 15, 15, 0, led_color);
break;}
case 20: { // Режим вывода температуры 1 датчик
TempColor(TEMP_1_COLOR, temp1, TEMP_1_MIN, TEMP_1_MAX);
if (temp1 < 100) DigitOut(18, (temp1 % 100) / 10, temp1 % 10, TEMP_1_SYMBOL, 1, temp_color);
else DigitOut(temp1 / 100, (temp1 % 100) / 10, temp1 % 10, TEMP_1_SYMBOL, 1, temp_color);
if (millis() - t > time_tp) {
if (setups[5] >= 2) {
mode = 21;
t = millis();}
#ifdef BMP_280
else if (setups[8] == 2) {
mode = 23;
t = millis();}
else if (setups[8] != 0) {
mode = 22;
t = millis();}
#endif
else if (setups[2] != 0) {
mode = 25;
t = millis();}
else mode = 0;}
break;}
case 21: { // Режим вывода температуры без десятых 2 датчик
if (temp2 < 0) znak = 15;
else znak = 18;
TempColor(TEMP_2_COLOR, temp2, TEMP_2_MIN, TEMP_2_MAX);
if (abs(temp2) < 100) DigitOut(18, znak, (abs(temp2) % 100) / 10, TEMP_2_SYMBOL, 0, temp_color);
else DigitOut(znak, abs(temp2) / 100, (abs(temp2) % 100) / 10, TEMP_2_SYMBOL, 0, temp_color);
if (millis() - t > time_tp) {
#ifdef BMP_280
if (setups[8] == 2) {
mode = 23;
t = millis();}
else if (setups[8] != 0) {
mode = 22;
t = millis();}
else if (setups[2] != 0) {
mode = 25;
t = millis();}
#else
if (setups[2] != 0) {
mode = 25;
t = millis();}
#endif
else mode = 0;}
break;}
#ifdef BMP_280
case 22: { // Режим вывода температуры BMP280
TempColor(TEMP_BMP_COLOR, temp, TEMP_BMP_MIN, TEMP_BMP_MAX);
if (temp < 100) DigitOut(18, (temp % 100) / 10, temp % 10, TEMP_BMP_SYMBOL, 1, temp_color);
else DigitOut(temp / 100, (temp % 100) / 10, temp % 10, TEMP_BMP_SYMBOL, 1, temp_color);
if (millis() - t > time_tp) {
if (setups[8] >= 2) {
mode = 23;
t = millis();}
else if (setups[2] != 0) {
mode = 25;
t = millis();}
else mode = 0;}
break;}
case 23: { // Режим вывода давления
DigitOut(21, pres / 100, (pres % 100) / 10, pres % 10, 0, pres_color);
if (millis() - t > time_tp) {
if (setups[2] != 0) {
mode = 25;
t = millis();}
else mode = 0;}
break;}
#endif
case 25: { // Режим вывода даты
DigitOut(day(tm) / 10, day(tm) % 10, month(tm) / 10, month(tm) % 10, 1, led_color);
if (setups[2] == 0 && millis() - t > 2000) mode = 0;
else if (setups[2] != 0 && millis() - t > (setups[2] * 1000)) mode = 0;
break;}
case 55: { // Режим вывода версии проошивки
led_color = 0xFF0000;
DigitOut(15, 1, 9, 15, 1, led_color);
if (millis() - t > 3000) mode = 0;
break;}
} // Конец switch
EepromTick(); // Проверка на сохранение в пямать
FastLED.show(); // Вывод на диоды
}
// END. -----------------------------------------------------------------------------------------------------------