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

Тема в разделе "Arduino & Shields", создана пользователем Delphin911, 10 апр 2020.

  1. Delphin911

    Delphin911 Нерд

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

    Я еще сейчас попробую в порт пигающее время вывести, может это с экраном что не такт.
    Код (C++):
    // Функция управления кнопками:
    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;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
          }
        }
      }
    }
     
    Поможите кто знает!
    Да, в порту проверил, там мигает. Что-то с дисплеем не то?
     
  2. jr.Bush

    jr.Bush Нерд

    Код (C++):
    time.blinktime(3);
    tft.print(time.gettime("H:i:s"));
    мигают ЧАСЫ при выводе на экран
     
  3. Delphin911

    Delphin911 Нерд

    Нет. Я пробовал так тоже. В порте мигает, а на дисплее нет.
     
  4. jr.Bush

    jr.Bush Нерд

    второй параметр задает частоту мигания, пробовали с ним играть
     
  5. Delphin911

    Delphin911 Нерд

    Нет. Я не знаю в каком диапазоне. Там вроде по умолчанию 1Гц.
     
  6. jr.Bush

    jr.Bush Нерд

    он может совпадать с частотой обновления экрана.
    Функция blinktime(параметр [, частота ]):
    // указывает функции gettime мигать одним из параметров времени (заменять параметр пробелами)
    // функция может быть полезна, для отображения на дисплее, устанавливаемого параметра времени
    // например при установке минут, они начинают мигать, и Вам понятно, что именно Вы устанавливаете
    // первым аргументом функции указывается параметр в виде числа от 0 до 8
    // 0 не мигать
    // 1 мигают сек
    // 2 мигают мин
    // 3 мигают час
    // 4 мигают дни
    // 5 мигают мес
    // 6 мигает год
    // 7 мигают дни недели
    // 8 мигает полдень
    // второй аргумент функции является необязательным, он указвает частоту миганий в Гц, по умолчанию 1Гц
    // пример: time.blinktime(6); // при выводе на дисплеё будет мигать год с частотой по умолчанию 1Гц
    // пример: time.blinktime(6, 2); // при выводе на дисплеё будет мигать год с частотой 2Гц
     
  7. Delphin911

    Delphin911 Нерд

    Попробовал поставить 2 и 20. Не моргает. Народ, неужели только у меня проблема? Щас дисплей другой попробую.
    Другой экран тоже не мигает. Ну я и не особо надеялся.
     
    Последнее редактирование: 11 апр 2020
  8. Delphin911

    Delphin911 Нерд

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

    jr.Bush Нерд

    Какой библиотекой позуешься?
     
  10. Delphin911

    Delphin911 Нерд

    Ну функция blinktime есть только в iarduino_RTC.h. Во всяком случае, в других библиотеках что я нашел, вообще мигания нет.
     
  11. Delphin911

    Delphin911 Нерд

    Подключил экран TFT от телефона старого кнопочного Alcatel. Все равно не мигает. Все Delay из программы убрал.