Вопрос про rtclib

Тема в разделе "Arduino & Shields", создана пользователем Batman, 2 июл 2020.

  1. Batman

    Batman Нуб

    Задача : часы на базе DS3231. Хочу установить часы не через скетч
    Код (C++):
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    А в ручную, кнопкой.

    Для этого изменяю переменную "час". Как мне ее записать в DS3231 не трогая при этом минуты, секунды, дату? Или RTClib можно записывать только всё сразу?
     
  2. подставь текущую и измени только что требуется.
     
  3. Batman

    Batman Нуб

    как будет правильно выглядеть запись ?
     
  4. DtS2

    DtS2 Гик

    Как только ссылку на библиотеку дашь, можешь рассчитывать на толковые ответы.
     
  5. Batman

    Batman Нуб

    https://github.com/adafruit/RTClib
     
  6. DtS2

    DtS2 Гик

    Нет, в этой библиотеке ты отдельно часы не установишь, только adjust(полное время)
     
  7. Un_ka

    Un_ka Гик

    Для данных часов, есть другая библиотека, где это можно сделать не тревожа остальные парметры.
    Её описание.
     
  8. Kakmyc

    Kakmyc Нерд

    Ну и что мешает в структуре поменять значение часов/минут и тд и послать на запись всю структуру ?
     
    b707 нравится это.
  9. b707

    b707 Гуру

    а что, для этого обязательно иметь специальную функцию установки именно часа? Зверь же верно написал - сначала читаем из часов текущее время, меняем в нем что нужно, потом записываем обратно
     
  10. Kakmyc

    Kakmyc Нерд

    ТС, сам по себе вопрос задан некорректно.
    У тебя значение времени в модуле в секундах хранится и обрабатывается.
    Соответственно ты и записываешь /всегосчитываешь одну переменную типа uint32_t.
    Т.е. для смены часа тебе нужно из этой переменной вычесть/прибавить 3600сек. А потом послать новое значение на запись
     
  11. Batman

    Batman Нуб

    не могли бы мне нубу растолковать , как это будет выглядеть в скетче.

    я сейчас получаю отдельно час , отдельно минуты, следующим образом:
    Код (C++):
    {
    DateTime now = rtc.now();
    hh=now.hour();
    mm=now.minute(); //получение времени
    }
     
  12. KindMan

    KindMan Гик

    Так уже вроде растолковали...
     
  13. Batman

    Batman Нуб

    я имел ввиду именно как это на практике должно выглядеть.

    DateTime RTC_DS3231::now() {
    Wire.beginTransmission(DS3231_ADDRESS);
    Wire._I2C_WRITE((byte)0);
    Wire.endTransmission();

    Wire.requestFrom(DS3231_ADDRESS, 7);
    uint8_t ss = bcd2bin(Wire._I2C_READ() & 0x7F);
    uint8_t mm = bcd2bin(Wire._I2C_READ());
    uint8_t hh = bcd2bin(Wire._I2C_READ());
    Wire._I2C_READ();
    uint8_t d = bcd2bin(Wire._I2C_READ());
    uint8_t m = bcd2bin(Wire._I2C_READ());
    uint16_t y = bcd2bin(Wire._I2C_READ()) + 2000;

    return DateTime(y, m, d, hh, mm, ss);