Как запомнить время и сравнить с текущим ?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Добрейшего времени. Есть модуль часов, и он нормально работает:) http://www.ebay.com/itm/261043197718?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

Вопрос в следующем. Пишим время в EEPROM(раз в 5 минут или по какому то действию) в каждую отдельную ячейку -часы и минуты.

Считываем(раз в 5 минут или по какому то действию) -всё вроде тип топ.

Задача состоит в следующем:

Как правильно сравнить разницу(вывести) в минутах между реальным временим и которое хрониться в памяти. Не могу найти функционал.

Помогите плиз кто чем может (только по существу)

Выкладывать весь код, дело не благородное -очень много лишнего (тяжело ковыряться в чужом).Мне бы только реальный пример. Как перевести два значения 18 (часы) 30 (минуты)в 1830 и то же самое сделать с реальным временем 19 часов 39 минут в 1939 . Разница между двумя значениями как раз и нужна.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Что за изврат ?

 А не проще использовать функцию millis()  ? 

А так,проще переводить часы-минуты-секунды сразу в одно число и запоминать во флеш ..вот только количество раз записи/чтения ограничено все же..

Gagarin74
Offline
Зарегистрирован: 24.08.2013

MaksMS пишет:

Что за изврат ?

 А не проще использовать функцию millis()  ? 

А так,проще переводить часы-минуты-секунды сразу в одно число и запоминать во флеш ..вот только количество раз записи/чтения ограничено все же..

Я не спорю, но с millis() -что то не очень получается. И не совсем понял ".вот только количество раз записи/чтения ограничено все же.."

Вы наверное не совсем поняли -почему через гимор. Ардуина будет выключатся переодически. И нужно будет считать интервал прошедшего времени с последнего выключения.

Dimsan
Offline
Зарегистрирован: 25.10.2013

Gagarin74, переведите часы в минуты и сравнивайте. 18 ч 30 мин = 18*60 + 30 мин = 1110 мин.

MaksMS
Offline
Зарегистрирован: 11.03.2013

У  EEPROM все же есть ограничение на количество записи.

Для ардуины можно использовать резервный источник питания

Если использовать часы  ,то просто переводим в секунды и пишем в  EEPROM ,потом  разницу вычесть  легче в секундах,которые,поделив на 60 можно получить уже в минутах :)

Если часы не будут использоватся по прямому назначению,то можно их просто обнулять при событии и получим уже сразу что хотим

Gagarin74
Offline
Зарегистрирован: 24.08.2013

MaksMS пишет:

У  EEPROM все же есть ограничение на количество записи.

Для ардуины можно использовать резервный источник питания

Если использовать часы  ,то просто переводим в секунды и пишем в  EEPROM ,потом  разницу вычесть  легче в секундах,которые,поделив на 60 можно получить уже в минутах :)

Если часы не будут использоватся по прямому назначению,то можно их просто обнулять при событии и получим уже сразу что хотим

Про EEPROM -можно по подробней -сколько конкретно циклов????!!!!!!

Ардуино подключается к автомобильному прикуривателю. По этому про бесперебойник речи не идет.Машина может быть выключена на день на неделю итд итп

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Dimsan пишет:

Gagarin74, переведите часы в минуты и сравнивайте. 18 ч 30 мин = 18*60 + 30 мин = 1110 мин.

БЛИН а вот за это 5 БАЛЛОВ!!!!!! Вот я мудильник!!!!!!!!!!

MaksMS
Offline
Зарегистрирован: 11.03.2013

Судя по даташитам 100 000 - по идее должно хватить :)

Gagarin74
Offline
Зарегистрирован: 24.08.2013

MaksMS пишет:

Судя по даташитам 100 000 - по идее должно хватить :)

Не так много :(  А на SD карту -долго ?

MaksMS
Offline
Зарегистрирован: 11.03.2013

На год должно хватить,если будет включено круглосуточно и запись будет каждые 5 минут.

 

Кстати ,на том часовом модуле,что на ебей имеется микросхема памяти  -можно и её использовать,но надо смотреть сколько у её циклов записи/чтения

 

Dimsan
Offline
Зарегистрирован: 25.10.2013

Можно и на СД карту. Ведь данные пишутся со значительным интервалом времени, поэтому скорость записи не важна.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

MaksMS пишет:

На год должно хватить,если будет включено круглосуточно и запись будет каждые 5 минут.

 

Кстати ,на том часовом модуле,что на ебей имеется микросхема памяти  -можно и её использовать,но надо смотреть сколько у её циклов записи/чтения

 

СПАСИБО за помощь!!!!!!!!!!

MaksMS
Offline
Зарегистрирован: 11.03.2013

Хы , в даташите написано 1 млн циклов :) - на 10 лет должно хватить...

maksim
Offline
Зарегистрирован: 12.02.2012

http://arduino.ru/forum/programmirovanie/kak-sokhranit-znachenie-pered-sbrosom

maksim пишет:

Из даташита:

7.4 EEPROM Data Memory
The ATmega48PA/88PA/168PA/328P contains 256/512/512/1K bytes of data EEPROM memory. It is organized as a separate data space, in which single bytes can be read and written. The EEPROM has an endurance of at least 100,000 write/erase cycles. The access between theEEPROM and the CPU is described in the following, specifying the EEPROM Address Registers, the EEPROM Data Register, and the EEPROM Control Register. ”Memory Programming” on page 294 contains a detailed description on EEPROM Programming in SPI or Parallel Programming mode.
 
Все-таки думаю не зря производитель пишит эту цифру. И в расчетах нужно использовать именно ее, а тот подход, который предлагаете вы называется "русский авось".
Сейчас запустил этот тест по уничтожению ячейки ради интереса, как встанет отпишусь, но уже перевалило за 200000 перезаписей.
#include <EEPROM.h>

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  
  unsigned long Fucks = 0;
  byte FuckIn = 0, FuckOut = 0;
   Serial.println("START");
  while (FuckIn == FuckOut) {
    if (FuckIn == 0) FuckIn = 255; 
    else FuckIn = 0; 
    EEPROM.write(301, FuckIn);
    FuckOut = EEPROM.read(301);
    ++Fucks;
    if ((Fucks % 1000) == 0) {
      Serial.println(Fucks);
      digitalWrite(13,(!digitalRead(13)));
    }
  }
  Serial.println("ERROR");
  Serial.println("ERROR");
  Serial.println("ERROR");
  Serial.println(Fucks);
}

void loop() {}

maksim пишет:

Итак результат. Первый сбой произошел на 6321455 цикле перезаписи! Очень не плохо! Последующие после 12477, 1129, 2891, 6257. Можно считать, что ячейка сносилась.

В принципе если данные не так важны, то можно смело писать/стирать и не париться.
Еще можно организовать дублирование данных и проверку, то есть копировать каждый байт например 3 раза и записывать в 3 ячейки ЕЕПРОМ, а при чтении сравнивать эти копии и если 1 из 3 байт не равен оставшимся двум, то за верное значение принять то что в этих двух байтах. Вероятность того, что две ячейки дадут сбой одновременно и (или), при котором байты одинакого покоцаются стремится к нулю. 

Тогда для задачи поставленной выше ЕЕПРОМ хватит на ~10 лет.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

maksim пишет:

http://arduino.ru/forum/programmirovanie/kak-sokhranit-znachenie-pered-sbrosom

maksim пишет:

Из даташита:

7.4 EEPROM Data Memory
The ATmega48PA/88PA/168PA/328P contains 256/512/512/1K bytes of data EEPROM memory. It is organized as a separate data space, in which single bytes can be read and written. The EEPROM has an endurance of at least 100,000 write/erase cycles. The access between theEEPROM and the CPU is described in the following, specifying the EEPROM Address Registers, the EEPROM Data Register, and the EEPROM Control Register. ”Memory Programming” on page 294 contains a detailed description on EEPROM Programming in SPI or Parallel Programming mode.
 
Все-таки думаю не зря производитель пишит эту цифру. И в расчетах нужно использовать именно ее, а тот подход, который предлагаете вы называется "русский авось".
Сейчас запустил этот тест по уничтожению ячейки ради интереса, как встанет отпишусь, но уже перевалило за 200000 перезаписей.
#include <EEPROM.h>

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  
  unsigned long Fucks = 0;
  byte FuckIn = 0, FuckOut = 0;
   Serial.println("START");
  while (FuckIn == FuckOut) {
    if (FuckIn == 0) FuckIn = 255; 
    else FuckIn = 0; 
    EEPROM.write(301, FuckIn);
    FuckOut = EEPROM.read(301);
    ++Fucks;
    if ((Fucks % 1000) == 0) {
      Serial.println(Fucks);
      digitalWrite(13,(!digitalRead(13)));
    }
  }
  Serial.println("ERROR");
  Serial.println("ERROR");
  Serial.println("ERROR");
  Serial.println(Fucks);
}

void loop() {}

maksim пишет:

Итак результат. Первый сбой произошел на 6321455 цикле перезаписи! Очень не плохо! Последующие после 12477, 1129, 2891, 6257. Можно считать, что ячейка сносилась.

В принципе если данные не так важны, то можно смело писать/стирать и не париться.
Еще можно организовать дублирование данных и проверку, то есть копировать каждый байт например 3 раза и записывать в 3 ячейки ЕЕПРОМ, а при чтении сравнивать эти копии и если 1 из 3 байт не равен оставшимся двум, то за верное значение принять то что в этих двух байтах. Вероятность того, что две ячейки дадут сбой одновременно и (или), при котором байты одинакого покоцаются стремится к нулю. 

Тогда для задачи поставленной выше ЕЕПРОМ хватит на ~10 лет.

 

СПАСИБО!!!!!!!!! ТО что ДОКТОР ПРОПИСАЛ!!!!!!!