Не выставляется время/дата в часах

Тема в разделе "Arduino & Shields", создана пользователем Lastik, 7 дек 2017.

  1. Lastik

    Lastik Нерд

    Доброго времени суток.

    Решил попробовать свои силы в ардуино, для начала попробовал сделать часы с возможностью корректировать время/дату кнопками. Сами то часы работают, но вот заставить работать коррекцию не могу.
    Подскажите пожалуйста, в чем косяк?

    Исходные данные:

    Ардуино - Arduino UNO R3;

    Дисплей - OLED 128*64, подключен к пинам +5, GND, A4(SDA), A5(SCL);

    Модуль времени - Tiny RTC I2C Modules, подключен к пинам +3,3, GND, SDA, SCL;

    кнопки - микрики на пинах 2, 3 и 4 к GND подтянуты резисторами 10к, замыкаются на +5.

    Код:
    Код (C++):
    // Подключаем библиотеки:
    #include <Wire.h>              // Подключаем библиотеку для работы с шиной I2C
    #include <OLED_I2C.h>          // Подключение библиотеки для дисплея
    OLED  myOLED(SDA, SCL);        // Cоздаем экземпляр класса
    extern uint8_t MegaNumbers[];  // Подключение больших шрифтов
    extern uint8_t SmallFont[];    // Подключение маленьких шрифтов
    #include <iarduino_RTC.h>      // Подключение библиотеки для часового модуля
    iarduino_RTC time(RTC_DS1307); // объявляем  переменную для работы с RTC модулем,  указывая название модуля

    // Объявляем переменные и константы:
    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_SET    = 0;  // Режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели

    void setup()
    {
    pinMode(PIN_button_SET,  INPUT);  // Устанавливаем режим работы вывода кнопки, как "вход"
    pinMode(PIN_button_UP,   INPUT);  // Устанавливаем режим работы вывода кнопки, как "вход"
    pinMode(PIN_button_DOWN, INPUT);  // Устанавливаем режим работы вывода кнопки, как "вход"
    delay(300);                       // Ждем 300 мс
    time.begin();                     // Инициируем RTC модуль
    myOLED.begin();                   // Инициируем OLED дисплей
    myOLED.setBrightness(127);        // Настраиваем яркость дисплея
    }

    void loop()
    {
    if(millis()%500==0)                           // Если прошла 0,5 секунды
    {
      myOLED.setFont(SmallFont);                   // Установка маленького шрифта
      myOLED.print(time.gettime("D"), CENTER, 0);  // Отображение дня недели
      myOLED.setFont(MegaNumbers);                 // Установка большого шрифта
      myOLED.print(time.gettime("H"), 4, 12);      // Отображение часов
      myOLED.print("/", 51, 12);                   // Отображение двоеточия
      myOLED.print(time.gettime("i"), 75, 12);     // Отображение минут
      myOLED.setFont(SmallFont);                   // Установка маленького шрифта
      myOLED.print(time.gettime("d-M-Y"), CENTER, 57);   // Отображение даты
      myOLED.update();                             // Обновление дисплея
      delay(500);                                  // Ждем 0,5 секунды
      myOLED.setFont(MegaNumbers);                 // Скрытие двоеточия
      myOLED.print("-", 51, 12);
      myOLED.update();                             // Обновление дисплея
      delay(500);                                  // Ждем 0,5 секунды
    }
    Func_buttons_control();                        // Передаём управление кнопкам
    }

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

    YeS Гик

    У него вроде питание от 5V.
    time по моему зарезервировано. Я бы написал time_t или currentTime или как то так.
     
    Последнее редактирование: 7 дек 2017
  3. Lastik

    Lastik Нерд

    Пробовал и 5V и 3.3V, "на скорость не влияет". Встречал записи на форумах, что на 3.3V работает стабильнее. Тем не менее сейчас переподключил на 5V, результат тот же - часы работают, время считают, время кнопками не корректируется.

    В описании библиотеки определение типа модуля часов идет именно этой командой.
     
  4. YeS

    YeS Гик

    В него встроена цепь подзарядки, которая 5 вольтами подзаряжает батарейку. Я думаю что если вы запитываете модуль от 3.3V то батарея подзаряжаться не будет.
     
  5. Lastik

    Lastik Нерд

    Батарейки подзаряжать нельзя. В чистом виде должен ставиться аккумулятор, но и с ним существующая цепь подзарядки убъет бедолагу очень быстро.
    У меня цепь подзарядки выпаяна и поставлена обычная батарейка. По словам специалистов, ее емкости должно хватить на 10 лет работы модуля.
     
  6. YeS

    YeS Гик

    Ну какбээээ... я думал это естественно. Извините за фривольность в описании.
     
  7. Lastik

    Lastik Нерд

    Все, всем спасибо, нашел где проблема. В код закралась ошибка и недоговоренность :)
    Тему можно закрывать.