Помогите разобраться с таймером на ds 3231

Тема в разделе "Глядите, что я сделал", создана пользователем Imperious, 3 ноя 2017.

  1. Imperious

    Imperious Нуб

    Собственно многие наверно зададутся вопросом, зачем мне делать таймер на ds 3231 да ещё и посекундный, когда в самой ардуине есть кварц, который легко использовать с millis, только к несчастью он у меня сбивается спустя 30 секунд работы ардуины, так вот ближе к делу, использую библиотеку #include "RTClib.h" для управления часиками, впрочем она удобная и меня полностью устраивает, а вот мой говнокод, проблема только с таймером для управления кнопками на резистивной клаве key_time_sec и key_time_sec_previous, на остальные таймеры пока не жалуюсь, ну или просто мало тестировал

    key_value = analogRead (keyboard);
    key_time_sec = now.hour()*60*60+now.minute()*60+now.second();
    work_time_sec = now.hour()*60*60+now.minute()*60+now.second();
    day_time_sec = now.hour()*60*60+now.minute()*60+now.second();
    if (key_time_sec - key_time_sec_previous == 1)
    {
    key_time_sec_previous = key_time_sec;
    key_timer-=1;
    }
    if (menu == "Work")
    {
    if (work_time_sec - work_time_sec_previous == 59)
    {
    work_time_sec_previous = work_time_sec;
    timer_light +=1;
    timer_maisure +=1;
    if (options_scroll_values[5] > 0)
    {
    daylight_timer +=1;
    }
    }
    if (day_time_sec - day_time_sec_previous == 5)
    {
    if (days_display == 0 && timers_display == 0)
    {
    days_display = 1;
    d = 0;
    }else{if (days_display == 1 && timers_display == 0)
    {
    timers_display = 1;
    f = 0;
    }else{if (days_display == 1 && timers_display == 1)
    {
    days_display = 0;
    timers_display = 0;
    m = 0;
    }}}
    day_time_sec_previous = day_time_sec;
    }
    }
    Он вроде пашет, но почему то спустя где то 10 часов управление кнопками пропадает, если перезагрузить ардуину, ничего больше не трогая, то кнопки снова работают.Далее я попытался исправить эту проблему заменив (key_time_sec - key_time_sec_previous == 1) на (key_time_sec - key_time_sec_previous >= 1), думал что это поможет, но на деле клава сразу же отказывалась работать, а при попытке вывести на комп key_time_sec_previous выдавало какое то левое число. "Хрен с ним"- подумал я и написал так

    key_time_sec = now.second();
    if (key_time_sec == 59)
    {

    key_time_sec_previous = 0;

    }
    Но на деле это ничего не изменило, также спустя 10 часов кнопки переставали работать.
    Может найдется чудак который тоже делал таймер из часов, и кто сталкивался с такой проблемой, или гуру-ардуинщик. За любой ответ больше спасибо
     
    Последнее редактирование: 3 ноя 2017
  2. xaser

    xaser Нерд

    Таймер через millis() переполняется спустя 30 сек. из-за того, что переменная объявленная на хранение значения millis() переполняется. Используйте unsigned long тогда переполнится примерно 50 дней.