Таймер на часах реального времени

SVD
Offline
Зарегистрирован: 05.04.2018

Уважаемые ГУРУ, доброго времени суток. С ног сбился ни как не могу найти… помогите пожалуйста. Нужно реализовать следующую задачу: С помощью часов DS3231 создать таймер, который продолжит мотать даже при отключенном устройстве и при каждом запуске ардуинки будет показывать намотанное время с момента запуска таймера. В секундах (9455343 сек) или минутах(454675 мин) или часах как угодно. Может кто-нибудь встречался с такой задачей, подскажите пожалуйста, где посмотреть?

 

negavoid
Offline
Зарегистрирован: 09.07.2016

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

DS3231 может Вам выдать в любом формате, но должна быть "ГЛАВНАЯ КНОПКА" по которой Вы инициируете прибор. А по Вашим запросам нажать на нее можно только один раз. Предполагаю - записать в EEPROM и поставить там же флаг - "больше не читать".

SVD
Offline
Зарегистрирован: 05.04.2018

С EEPROM знаком плохо. Помнится туда проблематично большие числа записать? Или я ошибаюсь? Как-то воевал, помню, хотел сохранить значение, больше 255 не смог…

 

negavoid
Offline
Зарегистрирован: 09.07.2016

В arduino uno 1024 байта EEPROM. Стало быть, туда может влезть число до 255^1024, атомов во Вселенной гораздо меньше.

SVD
Offline
Зарегистрирован: 05.04.2018

Все извиняюсь за вопрос,  погуглил, нашел…

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

negavoid пишет:

В arduino uno 1024 байта EEPROM. Стало быть, туда может влезть число до 255^1024, атомов во Вселенной гораздо меньше.

256^1024-1 ~ 1.09e2466

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

сохранять возможно и на microsd карточку, каждое включение девайс глянул сколько времени и сохранил его вместо сериал в sd карту, выйдет лог целый включений девайса, если вам нужен не одноразовый момент. Там важно когда произошло включение, а не сколько времени прошло. Зная когда было включение обработаете сами. Либо если единожды, то зашить это число дату месяц время изначально, и сделать тупо таймер, для которого достаточно получить текущую дату время, синхронизировав откуда угодно эти данные, да хоть по сериал. вот вам мой код, по которому включается инвертер от солнечной батареи по расписанию, в отличие от китайских таймеров на 24 программы в неделю, неограниченное количество. Реле только поставить. Таймер включается по времени. Часы невероятно глючные ds1302, лучше со встроенным кварцем кажется ds1307, заменил их на ds1307 

однократное включение если, здесь либо sd карточка если с eeprom совсем никак, но там сохраняют и легко кажется. Если никак то sd карту прикручиывайте сохранить 1 байт. 

//A6 и A7 в nano не могут быть исопльзованы как цифровые 
// Бибилиотека разработана для RTC модуля http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-rtc-tr...
// Пример считывания текущего времени с RTC модуля (DS1307) и вывод в "Последовательный порт" :
//внимание!!!!! после припайки прозвонить сначала прибором все провода
//ушло 2 часа на поиски причин из за не прозвоненных проводов 
#include <iarduino_RTC.h>
  iarduino_RTC time(RTC_DS1302, 5, 3, 4); //8, 9, 7 пины DS1302 RST, CLK, DAT
//  iarduino_RTC time(RTC_DS1307);          // подключаем RTC модуль на базе чипа DS1307, используется аппаратная шина I2C
//      iarduino_RTC time(RTC_DS3231);          // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C
void setup() {
// pinMode(Relay, OUTPUT); //A7 пин реле on off тест вкл выкл по событию  
    delay(300);
    Serial.begin(115200);
    time.begin();
    pinMode(7, OUTPUT); //реле 7    
    pinMode(2, OUTPUT);//реле 2   
//!!!!!!!!!!!!!!!!!! ВАЖНО НИЖЕ СТРОКУ ЗАШИТЬ 1 РАЗ, СРАЗУ ЖЕ В ТЕЧЕНИИ МИНУТЫ ЗАШИТЬ ПОВТОРНО БЕЗ НИЖНЕЙ 
//СТРОКИ ЕСЛИ НЕ ЗАШИТЬ ПОВТОРНО БЕЗ НИЖНЕЙ СТРОКИ ВРЕМЯ БУДЕТ С ОДНОГО СТАРТОВАТЬ СТАРТА ПРИ 
//ПОДКЛЮЧЕНИИ К SERIAL 1Й РАЗ ВРЕМЯ ЗАШИВАЕТСЯ ПРЯМО В ЧИП, 2Й РАЗ ЧИП НЕ ЗАТРАГИВАЕТ, БАТАРЕЙКА
//СОХРАНИТ В ЧИПЕ ДАННЫЕ В РЕАЛЬНОМ ВРЕМЕНИ ПОКА НЕ ВЫНЯТЬ БАТАРЕЙКУ, ЧИП БАТАРЕЙКОЗАВИСИМ     
 //   time.settime(0,13,21,27,10,18,6);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
    Serial.print(time.Hours);   Serial.print("Chasov:");  // Вывод часов
            Serial.print(time.minutes); Serial.print("Minut:");  // Вывод минут
              Serial.print(time.seconds); Serial.println("Secund GLUK"); // Вывод секунд
//****************************БЛОК ПАРСИНГА МИНУТ ЧАСОВ START**************************************
//цикл парсинга совпадения минут часов (дни не нужны) возможно добавить парсинг по дням)   ********            
//   if(time.weekday==6){    
//  Serial.print("SUBBOTAWEEKDAY");   
  }   
   if(time.minutes==53){     // если совпали минуты 
        if(time.Hours==20){    // если совпали часы
              digitalWrite(7, HIGH); //реле пин7 работает (светодиод гаснет реле)
               digitalWrite(2, HIGH);//реле пин2  работает (светодиод гаснет реле)      
          Serial.print("15ON"); 
          }   
         //   if(time.day==9)
                  }  
//конец цикла парсинга минут часов                   
//*****************************БЛОК ПАРСИНГА МИНУТ ЧАСОВ END***************************************
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }
//}
//    ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ:
//
//  Подключение библиотеки:
//  #include <iarduino_RTC.h>
//  iarduino_RTC time(название модуля [, вывод SS/RST [, вывод CLK [, вывод DAT]]]);
//      если модуль работает на шине I2C или SPI, то достаточно указать 1 параметр, например: iarduino_RTC time(RTC_DS3231);
//      если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: iarduino_RTC time(RTC_DS1305,22);
//      если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT
//  Для работы с модулями, в библиотеке реализованы 5 функции:
//      инициировать модуль  begin();
//      указать время        settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]);
//      получить время       gettime("строка с параметрами");
//      мигать времем        blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень)
//      разгрузить шину      period (минуты);
//  Функция begin():
//      функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д.
//  Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]):
//      записывает время в модуль
//      год указывается без учёта века, в формате 0-99
//      часы указываются в 24-часовом формате, от 0 до 23
//      день недели указывается в виде числа: 0-воскресенье, 1-понедельник, 2-вторник ..., 6-суббота
//      если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение
//      пример: time.settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений
//      пример: time.settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений
//      пример: time.settime(-1, -1, -1, 9, 2, 17); установит дату 09.02.2017 , а время и день недели оставит без изменений
//  Функция gettime("строка с параметрами"):
//      функция получает и выводит строку заменяя описанные ниже символы на текущее время
//      пример: time.gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu"
//      пример: time.gettime("s");               ответит строкой "05"
//      указанные символы идентичны символам для функции date() в PHP
//  s   секунды                       от      00    до       59  (два знака)
//  i   минуты                        от      00    до       59  (два знака)
//  h   часы в 12-часовом формате     от      01    до       12  (два знака)
//  H   часы в 24-часовом формате     от      00    до       23  (два знака)
//  d   день месяца                   от      01    до       31  (два знака)
//  w   день недели                   от       0    до        6  (один знак: 0-воскресенье, 6-суббота)
//  D   день недели наименование      от     Mon    до      Sun  (три знака: Mon Tue Wed Thu Fri Sat Sun)
//  m   месяц                         от      01    до       12  (два знака)
//  M   месяц наименование            от     Jan    до      Dec  (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
//  Y   год                           от    2000    до     2099  (четыре знака)
//  y   год                           от      00    до       99  (два знака)
//  a   полдень                               am   или       pm  (два знака, в нижнем регистре)
//  A   полдень                               AM   или       PM  (два знака, в верхнем регистре)
//  если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных
//      пример:  time.gettime();
//               Serial.print(time.Hours);   Serial.print(":");  // Вывод часов
//               Serial.print(time.minutes); Serial.print(":");  // Вывод минут
//               Serial.print(time.seconds); Serial.println(""); // Вывод секунд
//      seconds  секунды     0-59
//      minutes  минуты      0-59
//      hours    часы        1-12
//      Hours    часы        0-23
//      midday   полдень     0-1 (0-am, 1-pm)
//      day      день месяца 1-31
//      weekday  день недели 0-6 (0-воскресенье, 6-суббота)
//      month    месяц       1-12
//      year     год         0-99
//  Функция blinktime(параметр [, частота ]):
//      указывает функции gettime мигать одним из параметров времени (заменять параметр пробелами)
//      функция может быть полезна, для отображения на дисплее, устанавливаемого параметра времени
//      например при установке минут, они начинают мигать, и Вам понятно, что именно Вы устанавливаете
//      первым аргументом функции указывается параметр в виде числа от 0 до 8
//  0   не мигать
//  1   мигают сек
//  2   мигают мин
//  3   мигают час
//  4   мигают дни
//  5   мигают мес
//  6   мигает год
//  7   мигают дни недели
//  8   мигает полдень
//      второй аргумент функции является необязательным, он указвает частоту миганий в Гц, по умолчанию 1Гц
//      пример: time.blinktime(6);    // при выводе на дисплеё будет мигать год с частотой по умолчанию 1Гц
//      пример: time.blinktime(6, 2); // при выводе на дисплеё будет мигать год с частотой 2Гц
//  Функция period(минуты):
//      устанавливает минимальный период обращения к модулю в минутах (от 0 до 255)
//      функция может быть полезна, если шина сильно нагружена, на ней имеются несколько устройств
//      пример: time.period(10); // теперь каждые 10 минут к модулю может быть отправлен только 1 запрос на получение времени
//      ответом на все остальные запросы будет результат последнего полученного от модуля времени + время прошедшее с этого запроса
// СОВПАДЕНИЕ ЧИСЛА готовый код start 
//   if(time.day==27){    
//    digitalWrite(2, HIGH);
//  Serial.print("SUBBOTA");   
//    } 
//СОВПАДЕНИЕ ЧИСЛА готовый код end 
//СОВПАДЕНИЕ ДНЯ НЕДЕЛИ готовый код START
//   if(time.weekday==6){    
//    digitalWrite(
//      2, HIGH);
//  Serial.print("SUBBOTAWEEKDAY");   
//        }   
//СОВПАДЕНИЕ ДНЯ НЕДЕЛИ готовый код end
 

 

bwn
Offline
Зарегистрирован: 25.08.2014

MYFRIEND пишет:

Часы невероятно глючные ds1302, лучше со встроенным кварцем кажется ds1307, заменил их на ds1307 

Поправлю по железу. 1307 та же хрень, что и 1302. С встроенным кварцем DS3231.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

bwn пишет:

Поправлю по железу. 1307 та же хрень, что и 1302. С встроенным кварцем DS3231.

большое спасибо! исправлю там в тексте, точно  DS3231 заказывал вместо полнейшего трэша этого 1302 и 1307 более кривых часов не возможно делать, их давно пора снять с производства, но китайцы любят шутить, да и не только китайцы. Эти часы 1302 и 1307 обходите стороной чем дальше тем лучше. Их место на свалке истории как неудачных разработок. Это как запорожец, только хуже. Все ваши проекты испортят. Так даже датчик воды был ужасен, заменил его на резистор за 0.01$ на основе омметра, из часов только DS3231, а 1302 сразу выкинул 5 штук, это издевательство разве подарить начинающим, как пример модели неудачной часов,  и 1307 такие же. А вот DS3231 говорят годами идут точно, а те даже не часы. 3 минуты в день и это не шутка все 5 штук шли криво!!!!!!! когда каждая секунда была важна. Сразу не мог поверить потом выкинул сразу 5 шт. 

PRC
Offline
Зарегистрирован: 03.02.2019

DS1307 очень чуствительна к конденсаторам на кварце. В принципе, если их подобрать, то можно получить неплохую точность. Ну и использовать в комнатных условиях ее конечно надо. Мне эти м/с нравились, что в них статическая память есть, можно настройки хранить.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

дополню, логировать часами можно любое событие, например усиление ветра на ветряке >3вольт например, глянуть на часы и сохранить на сд с точностью до секунды или появление солнца, для тех кто использует солнечные коллекторы, на логе может оказаться, что солнце за все лето появлялось лишь несколько раз  и не надолго) все это сделает использование DS3231  и microsd от той же солнечной батареи например в дневное время, разумеется батарея должна быть не ниже 21 вольт с понижением до 5 вольт например авто адаптером за 0.5$. Все что ниже 21в. не считаю за солнечные батареи как и ds1302 за часы. Такой же трэш. 

часы эти ds3231 полезная штука. Очень интересная, делал так инвертер для солнечных батарей включаемый по расписанию 220в. включается по ds3231. во всем доме. Реле ставится с ардуино на включение инвертора кнопку. Далее полный контроль инвертором самым дешевым для солнечной электростанции. часы эти ds3231 сами включат ночной режим дневной режим подсветок дома. Даже по часам играть сможет mp3 модуль ардуино за 3$. Скажет например "кто здесь)" по событию. Там все проще простого.

А умный инвертер и не купишь, даже таймер китайский не купишь умный 220в максимум 24 программы, с узкгоглазым дисплеем, а на ds3231 таймер хоть на 365 дней выйдет, кроме логов именно он включает все в умном доме у меня при цене 2-3$.  Подключение его - все ножки суются прямо в ардуино, назначаются GND и VCC на ножки, удобнее не бывает. Торчит приямо из ардуино. Как шилд.