Суточный таймер. Защита от сбоев и отключения.

senatorow
Offline
Зарегистрирован: 21.02.2015

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

void setup(){
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
}

void loop()
{
  // сравниваем время и управляем выходом// 
  if (setMinClockOff == minute && setHorClockOff == hour
      && second == 0) digitalWrite(outPin, HIGH);
  if (setMinClockOn == minute && setHorClockOn == hour
      && second == 0) digitalWrite(outPin, LOW);    
 }
Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Не понял, надо чтобы после моргушки состояние выхода устанавливалось в такое же как и до моргушки?

senatorow
Offline
Зарегистрирован: 21.02.2015

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

Нужно чтобы востанавливалось значение заданное в определённый промежуток времени.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

ТОгда надо в 12 и 14 строчке не просто включать и выключать, а еще в тот же EEPROM писать состояние выхода. А в сетапе при пуске платы надо считывать это значение и устанавливать выход в нужное состояние.

senatorow
Offline
Зарегистрирован: 21.02.2015

Спасибо большое, если не затруднительно кусочек кода как это делается. 

А если в место знака равно, использовать знак больше или равно? Поможет делу?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
void setup()
{
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
  // считываем предыдущие состояние и выставляем его на пин.
  digitalWrite(outPin, EEPROM.read(5));
}

void loop()
{
  // сравниваем время и управляем выходом// 
  if (setMinClockOff == minute && setHorClockOff == hour && second == 0)
  {
    digitalWrite(outPin, HIGH);
    EEPROM.write(5, HIGH);
  }
  if (setMinClockOn == minute && setHorClockOn == hour && second == 0)
  {
    digitalWrite(outPin, LOW);
    EEPROM.write(5, LOW);
  }
}

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

senatorow
Offline
Зарегистрирован: 21.02.2015

Спасибо огромное! Попробую на железе отпишусь.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Да поможет, но надо внимательно с логическими операциями, а то часы будут больше минуты меньше и можно получить не то что ожидаете. А так можно конечно грубо говоря пока час меньше часа отключения и минута меньше минуты отключения поддерживаем один уровень на выходе, как только больше меняем уровень на выходе.

senatorow
Offline
Зарегистрирован: 21.02.2015

Penni, я где то читал что EEPROM рассчитан на 100000 циклов а что произойдёт после этого?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ошибки чтения и записи начнутся. Но 100000 это сильно с запасом цифра взята, для страховки. На самом деле практика показывает, что до 5000000 можно смело расчитывать.

senatorow
Offline
Зарегистрирован: 21.02.2015

[quote=Penni]

Ошибки чтения и записи начнутся. Но 100000 это сильно с запасом цифра взята, для страховки. На самом деле практика показывает, что до 5000000 можно смело расчитывать.

[/qуuote]

А после этого, можно как то программно сбросить эти настройки и обнулить память или это физический процесс?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

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

senatorow
Offline
Зарегистрирован: 21.02.2015

Penni пишет:

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

А сколько в eeprom ячеек ?

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

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Смотря какая плата, в меге 2560 4 КБ а в уно например 1 КБ

Да надо будет в скетче прописать другой номер ячейки и всё. И я бы на секунды не смотрел особенно когда там строго =. Можно их вообще убрать а вместо них смотреть на состояние выхода. Если час равен нужному и минута равна нужной и выход LOW тогда делаем выход HIGH и пишем в еепром. И так же при срабатывании таймера на отключение.

senatorow
Offline
Зарегистрирован: 21.02.2015

Ну да, действительно, все равно настройки которые завожу через LCD шилд только часы и минуты.(без секунд)

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Можно что-нибудь типа такого, так сказать решение в лоб без еепром

if((hour > setHorClockOn) and (hour < setHorClockOff))
  digitalWrite(outPin, LOW);
else
  if((hour < setHorClockOn) and (hour > setHorClockOff))
    digitalWrite(outPin, HIGH);
  else
  if(hour == setHorClockOn)
  {
    if(minute >= setMinClockOn)
      digitalWrite(outPin, LOW);
    else
      digitalWrite(outPin, HIGH);
  }
  else
    if(minute >= setMinClockOff)
      digitalWrite(outPin, HIGH);
    else
      digitalWrite(outPin, LOW);

Но тут главное все возможные варианты охватить.

senatorow
Offline
Зарегистрирован: 21.02.2015

Буду пробовать, спасибо большое!