Подсчет наработки

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, никак не могу сообразить как сделать подсчет наработки включенного состояния реле.Задача такая, реле включилось-начался отсчет в секундах. Реле выключилось-осчет остановился. И так далее. А в 0часов о минут по сигналу с DS3231 отсчет должен обнулиться и начать заново считать. Пробую такой код, но он не останавливается когда реле выключается.


unsigned long start_timer=0;
unsigned long narabotka=0;

if (digitalRead(7)==LOW )  //реле включилось
  {
    start_timer=millis();
   }
  if (digitalRead(7)==HIGH)  //реле выключилось
  {
     narabotka=(millis()-start_timer)/1000;
   }
  lcd.setCursor(11, 1);
    lcd.print(narabotka);
if (tm.Hour == 0 && tm.Minute == 0 && tm.Second == 0 )
{
narabotka=0;
}

Понимаю что работать не будет.Направьте в нужное русло)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Стартовать отсчет не при == LOW, а при переходе из HIGH в LOW. Тормозить же при переходе из LOW в HIGH, а не при == HIGH.

gzp13
Offline
Зарегистрирован: 06.04.2015

sadman41 пишет:
Стартовать отсчет не при == LOW, а при переходе из HIGH в LOW. Тормозить же при переходе из LOW в HIGH, а не при == HIGH.

это как при переходе?Через прерывания?

Green
Offline
Зарегистрирован: 01.10.2015

Делал человеку на мега88 как то. В 10000 обошелся. И это нормально, ибо много возни.

Upper
Offline
Зарегистрирован: 23.06.2020

Раз в секунду проверяйте состояние реле. Если включено прибавляйте секунду. Если переключения не частые, то наверное точность будет достаточной. 

b707
Offline
Зарегистрирован: 26.05.2017

gzp13 пишет:

это как при переходе?Через прерывания?


не надо никакого прерывания. "При переходе" это очень просто - это когда при этом отсчете на пине HIGH, а на прошломбыло LOW - значит произошел переход

Morroc
Offline
Зарегистрирован: 24.10.2016

и тут "if (tm.Hour == 0 && tm.Minute == 0 && tm.Second == 0 )" желательно тоже какое то условие не просто == 0, а "в прошлый раз было вчера, а в этот уже наступило сегодня", вдруг код разрастется и по какой то причине 0:0:0 поймать не получится за секунду

Green
Offline
Зарегистрирован: 01.10.2015

Как всё закручено... А типа, if_rising(x) можно? Или if_falling(x)? И ни о чём не думай.)

Morroc
Offline
Зарегистрирован: 24.10.2016

И будильник тогда завести в DS3231 чтобы дергал ногу ардуины с прерыванием и обнулял.