Помогите разобраться с библиотекой iarduino_RTC

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ну точнее там в принципе все понятно. Вот только почему-то функция binktime() у меня не работает. Экран у меня стандартный 2х16 ардуиновский с I2C. Программа для обычных часов лежит на многих сайтах и там в момент установки времени должен мигать выбранный параметр (секунды, минуты, часы или там что другое). Так вот сами часы работают. Правда повозицца немного с кварцем пришлось. У меня была микросхемка ds1307, купил кварц в Чип и Дип, собрал на макетке - не работает. Повозился, в итоге нашел на старом медиацентре часовой кварт, впаял и все заработало. Так вот часы работают, но при установке не мигает устанавливаемы параметр. Тут вроде темка была, но там автор написал, что мол сам решил и проблема была в ошибке, но не написал в какой. Вот кусочек, каксающийся установки времени:

// Функция управления кнопками:
void Func_buttons_control(){
  uint8_t i=0;
//  watch.blinktime(VAR_mode_SET);                                  // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
//Если часы находятся в режиме установки даты/времени
  if(VAR_mode_SET){
//  Если нажата кнопка UP
    watch.blinktime(VAR_mode_SET);
    if(digitalRead(PIN_button_UP  )){
      while(digitalRead(PIN_button_UP)){delay(50);}              // ждём пока мы не отпустим кнопку UP
      switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==59?0:watch.minutes+1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==23?0:watch.Hours+1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break;
      }
    }
//  Если нажата кнопка DOWN
    if(digitalRead(PIN_button_DOWN)){
      while(digitalRead(PIN_button_DOWN)){delay(50);}            // ждём пока мы её не отпустим
      switch (VAR_mode_SET){                                     // декремент (уменьшение) устанавливаемого значения
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==0?59:watch.minutes-1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==0?23:watch.Hours-1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==1?31:watch.day-1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==1?12:watch.month-1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==0?99:watch.year-1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==0?6:watch.weekday-1) ); break;
      }
    }
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
        delay(10);
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        VAR_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
        if(VAR_mode_SHOW==1 && VAR_mode_SET>3){VAR_mode_SET=1;}  // возвращаемся к первому устанавливаемому параметру
        if(VAR_mode_SHOW==2 && VAR_mode_SET>7){VAR_mode_SET=4;}  // возвращаемся к первому устанавливаемому параметру
      }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
        VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
      }
    }
//Если часы находятся в режиме вывода даты/времени
  }else{
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){delay(10);              // ждём пока мы её не отпустим
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        lcd.clear();                                             // стираем экран
        VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;                      // меняем режим вывода: дата/время
      }else{                                                     // если 
        if(VAR_mode_SHOW==1){VAR_mode_SET=1;}                    // если установлен режим вывода времени, то устанавливаемый параметр - секунды
        if(VAR_mode_SHOW==2){VAR_mode_SET=4;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
      }
    }
  }
}

Я еще сейчас попробую в порт пигающее время вывести, может это с экраном что не такт.

Поможите кто знает!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А в порту мигает?

Xomyc
Offline
Зарегистрирован: 10.04.2020

Да, только что проверил. В порту мигает. Значит что-то с дисплеем. Может частоту какую надо задать. Не ту что по умолчанию?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Xomyc пишет:
Помогите разобраться с библиотекой iarduino_RTC

Брось каку и не подбирай с полу что попало - это лучший способ с нею разобраться.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ворота пишет:

Xomyc пишет:
Помогите разобраться с библиотекой iarduino_RTC

Брось каку и не подбирай с полу что попало - это лучший способ с нею разобраться.

А какой некакой надо пользоваться? Это мой первый опыт. Возьму любую некаку!

Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Xomyc пишет:

Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.

Так в сущности дело не в том мигает или нет, а в том, что гадость в проект тянуть не надо ни в каком случае, даже если и мигает.

Их много неплохих, возьми хоть вот эту. Ты же самую худшую выбрал.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ворота пишет:

Xomyc пишет:

Ну и потом ведь в сущности дело не в этой библиотеке, а в дисплее. На порту то все мигает как положено.

Так в сущности дело не в том мигает или нет, а в том, что гадость в проект тянуть не надо ни в каком случае, даже если и мигает.

Их много неплохих, возьми хоть вот эту. Ты же самую худшую выбрал.


Это вы к тому, что сама микросхема барахло? Ну может. Но сейчас другой нет. А купить другую в режиме само изоляции если через алиэкспресс, то долго, если в магазине в городе, то далеко ехать и штрафануть могут. Те дорого. Или все таки библиотеку другую посмотреть. Просто я вот не пойму. Тут то в данном конкретном случае как ситуацию исправить? Другой дисплей попробовать? У меня 4х срочный есть. Или таки другой частотой помигать попробовать?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Xomyc пишет:
Это вы к тому, что сама микросхема барахло?
Нет, я к тому, что библиотека - барахло. Если у тебя друшая микросхема (прости, упустил) найди нормальную библиотеку для неё.

А про эту библиотеку - ну, почитай же, наконец, сколько и каких предупреждений выдаёт тебе компилятор при её компиляции. Неужели не пропало желание её использовать?

Xomyc
Offline
Зарегистрирован: 10.04.2020

Да вот с утра пытаюсь найти и все в эту библиотеку упирается. Да и никаких сообщений при компиляции вроде нет.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Вот поковырял я с библиотекой DS1307. Вроде все просто. Но там вообще нет функции мигания времени.

Xomyc
Offline
Зарегистрирован: 10.04.2020

В общем что-то получилось. Правда пришлось залезть в библиотеку и увидеть, что частота задается не 1Гц, а 1000. Соответственно когда ставлю 200-500 мигает. Но все равно странно. Скажем на 200 2 раза мигнет (опять таки по ощущениям раз в секунду) т следующие 2 секунды горит не мигая. А если скажем ставлю 500, то наоборот мигнет 2 раза, а потом 2 секунды не горит вообще сегмент. Т.е. такое ощущение, что этот параметр не частоту мигания задает. Но вот что - так и не понял. Поковыряю еще, но в принципе я уже при редактировании времени сделал надпись в правом верхнем углу что меняется.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Xomyc пишет:
никаких сообщений при компиляции вроде нет.
Есть и до хрена, просто ты голову в песок спрятал как страус, лишь бы их не видеть. Почитай вот здесь, что нужно сделать, чтобы видеть сообщения.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Наверное ты очень страусов любишь!
Почитаю.
Но все таки ни одного примера библиотеки ты не привёл где бы было мигание. Но выступаешь уверенно! Есть у меня друг такой. Всегда в полицию/милицию попадает.

b707
Offline
Зарегистрирован: 26.05.2017

Xomyc - судя по проблемам с миганием - у вас наверняка в программе куча задержек, из-за которых код в loop() проходит цикл секунду или две. Кнопки в программе хорошо работают, не подтормаживают? - или чтобы сработали, приходится нажимать и удерживать?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Xomyc пишет:
Наверное ты очень страусов любишь! Почитаю. Но все таки ни одного примера библиотеки ты не привёл где бы было мигание. Но выступаешь уверенно! Есть у меня друг такой. Всегда в полицию/милицию попадает.

Я чёт не понял, ты решил похамить немного? Я подсказал тебе, что у тебя дерьмовая библиотека на которую компилятор ругается матом, подсказал как увидеть сообщения компилятора, которых ты не видишь (и теряешь много полезной информации) - и это твоё "спасибо"?

Ну, ладно, разбирайся тогда сам в своих проблемах. Если чего не поймёшь, то вот на этом сайте всё написано - почитай.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ворота пишет:

Xomyc пишет:
Наверное ты очень страусов любишь! Почитаю. Но все таки ни одного примера библиотеки ты не привёл где бы было мигание. Но выступаешь уверенно! Есть у меня друг такой. Всегда в полицию/милицию попадает.

Я чёт не понял, ты решил похамить немного? Я подсказал тебе, что у тебя дерьмовая библиотека на которую компилятор ругается матом, подсказал как увидеть сообщения компилятора, которых ты не видишь (и теряешь много полезной информации) - и это твоё "спасибо"?

Ну, ладно, разбирайся тогда сам в своих проблемах. Если чего не поймёшь, то вот на этом сайте всё написано - почитай.

Ну я был предельно вежлив, а вот твои посты немного скажем так вольные. Все таки мы на брудершафт не пили. Но спасибо я сказал. И еще раз скажу спасибо.

Xomyc
Offline
Зарегистрирован: 10.04.2020

b707 пишет:

Xomyc - судя по проблемам с миганием - у вас наверняка в программе куча задержек, из-за которых код в loop() проходит цикл секунду или две. Кнопки в программе хорошо работают, не подтормаживают? - или чтобы сработали, приходится нажимать и удерживать?

Вот код, что у меня в итоге получилось. Но как я писал, основу писал не я. Она лежит на многих сайтах. Я переделал, чтобы часы с датой на одном экране лежали и установку 2 будильников и их отработку.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <iarduino_RTC.h>

iarduino_RTC watch(RTC_DS1307);          // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS1307
LiquidCrystal_I2C lcd(0x27,16,2);       // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2)

//  Определяем системное время:                           // Время загрузки скетча.
//const char* strM="JanFebMarAprMayJunJulAugSepOctNovDec";  // Определяем массив всех вариантов текстового представления текущего месяца.
//const char* sysT=__TIME__;                                // Получаем время компиляции скетча в формате "SS:MM:HH".
//const char* sysD=__DATE__;                                // Получаем дату  компиляции скетча в формате "MMM:DD:YYYY", где МММ - текстовое представление текущего месяца, например: Jul.
//  Парсим полученные значения sysT и sysD в массив i:    // Определяем массив «i» из 6 элементов типа int, содержащий следующие значения: секунды, минуты, часы, день, месяц и год компиляции скетча.
//const int i[6] {(sysT[6]-48)*10+(sysT[7]-48), (sysT[3]-48)*10+(sysT[4]-48), (sysT[0]-48)*10+(sysT[1]-48), (sysD[4]-48)*10+(sysD[5]-48), ((int)memmem(strM,36,sysD,3)+3-(int)&strM[0])/3, (sysD[9]-48)*10+(sysD[10]-48)};

const uint8_t PIN_button_SET  = 2;      // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   = 3;      // указываем номер вывода arduino, к которому подключена кнопка UP
const uint8_t PIN_button_DOWN = 4;      // указываем номер вывода arduino, к которому подключена кнопка DOWN
      uint8_t VAR_mode_SHOW   = 1;      // режим вывода: 1-часы 2-будильники
      uint8_t VAR_mode_SET    = 0;      // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели
      int8_t VAR_AL_MIN1     = 10;      // Задаем минуты 1-ого будильника
      int8_t VAR_AL_MIN2     = 0;      // Задаем минуты 2-ого будильника
      int8_t VAR_AL_HOUR1    = 9;      // Задаем часы 1-ого будильника
      int8_t VAR_AL_HOUR2    = 22;      // Задаем часы 2-ого будильника
      bool    VAR_alarm_FLAG1 = true;  // будильник1 разрешение работы
      bool    VAR_alarm_FLAG2 = true;  // будильник2 разрешение работы

int LED = 7;
unsigned long AW = 0;

void setup() {
  //Serial.begin(9600); 
  pinMode(PIN_button_SET,  INPUT);      // устанавливаем режим работы вывода кнопки, как "вход"
  pinMode(PIN_button_UP,   INPUT);      // устанавливаем режим работы вывода кнопки, как "вход"
  pinMode(PIN_button_DOWN, INPUT);      // устанавливаем режим работы вывода кнопки, как "вход"
  delay(300);                           // ждем 300мс
  watch.begin();                         // инициируем RTC модуль
  lcd.init();                           // инициируем LCD дисплей
  lcd.backlight();                      // включаем подсветку LCD дисплея
  //watch.settime(i[0],i[1],i[2],i[3],i[4],i[5]);
  pinMode(LED,OUTPUT);
}

void loop() {
  if(millis()%1000==0){                      // если прошла 1 секунда
    if(VAR_mode_SHOW==1){                    // если установлен режим вывода времени
      lcd.setCursor(0, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(watch.gettime("H:i:s"));     // выводим время
      lcd.setCursor(0, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 1
      lcd.print(watch.gettime("d-m-Y   D")); // выводим дату
      lcd.setCursor(12, 0);
      lcd.print(Func_TM_SET(VAR_mode_SET));
    }
    if(VAR_mode_SHOW==2){                    // если установлен режим вывода даты
      lcd.setCursor(0, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print("AL1:");
      lcd.setCursor(5, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_digits(8,VAR_AL_HOUR1,millis()));
      lcd.setCursor(7, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(":");
      lcd.setCursor(8, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_digits(9,VAR_AL_MIN1,millis()));
      lcd.setCursor(13, 0);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_en(10,VAR_alarm_FLAG1,millis()));
      lcd.setCursor(0, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print("AL2:");
      lcd.setCursor(5, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_digits(11,VAR_AL_HOUR2,millis()));
      lcd.setCursor(7, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(":");
      lcd.setCursor(8, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_digits(12,VAR_AL_MIN2,millis()));
      lcd.setCursor(13, 1);                   // устанавливаем курсор в позицию: столбец 0, строка 0
      lcd.print(Func_alarm_en(13,VAR_alarm_FLAG2,millis()));    }
    delay(10);                                // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс

    if(VAR_alarm_FLAG1){                     // если будильник1 включён
      if(watch.seconds==00){                  // если в текущем времени 0 секунд
        if(watch.minutes==VAR_AL_MIN1){     // если совпали минуты
          if(watch.Hours==VAR_AL_HOUR1){    // если совпали часы
            digitalWrite(LED, HIGH);
            AW = millis();
          }
        }
      }
    }
    if(VAR_alarm_FLAG2){                     // если будильник2 включён
      if(watch.seconds==00){                  // если в текущем времени 0 секунд
        if(watch.minutes==VAR_AL_MIN2){     // если совпали минуты
          if(watch.Hours==VAR_AL_HOUR2){    // если совпали часы
            digitalWrite(LED, HIGH);
            AW = millis();
          }
        }
      }
    }
//    if(VAR_alarm_FLAG2){Func_alarm_action();}// запускаем действия будильника

  }
  //Serial.println(VAR_mode_SET);
  if ((AW > 0) && (millis() - AW > 600000)) {digitalWrite(LED, LOW); AW = 0;}
  Func_buttons_control();                    // передаём управление кнопкам
}

// Функция вывода времени в будильниках
String Func_alarm_digits(uint8_t rz,uint8_t tm,unsigned long sc){
  String rs;
  if (tm < 10) rs = "0"+String(tm);
  else rs = String(tm);
  if (VAR_mode_SET == 0){return rs;}
  else 
  {
    if (rz == VAR_mode_SET)
    {
      if (sc%2 == 0){return rs;}
      else {return "  ";}
    }
    else {return rs;}
  }
}
// Функция вывода включен или нет будильник
String Func_alarm_en(uint8_t rz,bool en,unsigned long sc){
  String rs;
  if (en) rs = "ON ";
  else rs = "OFF";
  if (VAR_mode_SET == 0){return rs;}
  else 
  {
    if (rz == VAR_mode_SET)
    {
      if (sc%2 == 0){return rs;}
      else {return "   ";}
    }
    else {return rs;}
  }
}

String Func_TM_SET(uint8_t tm){
  switch (tm){
    case 0: return "";break;
    case 1: return "SEC ";break;
    case 2: return "MIN ";break;
    case 3: return "HOUR";break;
    case 4: return "DAY ";break;
    case 5: return "MON ";break;
    case 6: return "YEAR";break;
    case 7: return "DOW ";break;
  }
}

// Функция управления кнопками:
void Func_buttons_control(){
  uint8_t i=0;
  if(VAR_mode_SHOW==1) {watch.blinktime(VAR_mode_SET,200);}    // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
  if(VAR_mode_SHOW==2) {}                                  // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)
//Если часы находятся в режиме установки даты/времени
  if(VAR_mode_SET){
//  Если нажата кнопка UP
    if(digitalRead(PIN_button_UP  )){
      while(digitalRead(PIN_button_UP)){delay(50);}              // ждём пока мы не отпустим кнопку UP
      switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==59?0:watch.minutes+1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==23?0:watch.Hours+1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break;
      /* д.н.*/ case 8: VAR_AL_HOUR1++; if (VAR_AL_HOUR1 > 23) VAR_AL_HOUR1 = 0; break;
      /* д.н.*/ case 9: VAR_AL_MIN1++; if (VAR_AL_MIN1 > 59) VAR_AL_MIN1 = 0; break;
      /* д.н.*/ case 10: VAR_alarm_FLAG1 = !VAR_alarm_FLAG1; break;
      /* д.н.*/ case 11: VAR_AL_HOUR2++; if (VAR_AL_HOUR2 > 23) VAR_AL_HOUR2 = 0; break;
      /* д.н.*/ case 12: VAR_AL_MIN2++; if (VAR_AL_MIN2 > 59) VAR_AL_MIN2 = 0; break;
      /* д.н.*/ case 13: VAR_alarm_FLAG2 = !VAR_alarm_FLAG2; break;
      }
    }
//  Если нажата кнопка DOWN
    if(digitalRead(PIN_button_DOWN)){
      while(digitalRead(PIN_button_DOWN)){delay(50);}            // ждём пока мы её не отпустим
      switch (VAR_mode_SET){                                     // декремент (уменьшение) устанавливаемого значения
      /* сек */ case 1: watch.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: watch.settime(-1, (watch.minutes==0?59:watch.minutes-1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: watch.settime(-1, -1, (watch.Hours==0?23:watch.Hours-1),     -1, -1, -1, -1); break;
      /* дни */ case 4: watch.settime(-1, -1, -1, (watch.day==1?31:watch.day-1),         -1, -1, -1); break;
      /* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month==1?12:watch.month-1),     -1, -1); break;
      /* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==0?99:watch.year-1),       -1); break;
      /* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==0?6:watch.weekday-1) ); break;
      /* д.н.*/ case 8: VAR_AL_HOUR1--; if (VAR_AL_HOUR1 < 0) {VAR_AL_HOUR1 = 23;} break;
      /* д.н.*/ case 9: VAR_AL_MIN1--; if (VAR_AL_MIN1 < 0) {VAR_AL_MIN1 = 59;} break;
      /* д.н.*/ case 10: VAR_alarm_FLAG1 = !(VAR_alarm_FLAG1); break;
      /* д.н.*/ case 11: VAR_AL_HOUR2--; if (VAR_AL_HOUR2 < 0) {VAR_AL_HOUR2 = 23;} break;
      /* д.н.*/ case 12: VAR_AL_MIN2--; if (VAR_AL_MIN2 < 0) {VAR_AL_MIN2 = 59;} break;
      /* д.н.*/ case 13: VAR_alarm_FLAG2 = !(VAR_alarm_FLAG2); break;
      }
    }
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
        delay(10);
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        VAR_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
        if(VAR_mode_SHOW==1 && VAR_mode_SET>7){VAR_mode_SET=1;}  // возвращаемся к первому устанавливаемому параметру
        if(VAR_mode_SHOW==2 && VAR_mode_SET>13){VAR_mode_SET=8;}  // возвращаемся к первому устанавливаемому параметру
      }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
        VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
      }
    }
//Если часы находятся в режиме вывода даты/времени
  }else{
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){delay(10);              // ждём пока мы её не отпустим
        if(i<200){i++;}else{lcd.clear();}                        // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        lcd.clear();                                             // стираем экран
        VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;                      // меняем режим вывода: дата/время
      }else{                                                     // если 
        if(VAR_mode_SHOW==1){VAR_mode_SET=1;}                    // если установлен режим вывода времени, то устанавливаемый параметр - секунды
        if(VAR_mode_SHOW==2){VAR_mode_SET=8;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
      }
    }
  }
}