Подсчет наработки
- Войдите на сайт для отправки комментариев
Ср, 29/12/2021 - 14:32
Здравствуйте, никак не могу сообразить как сделать подсчет наработки включенного состояния реле.Задача такая, реле включилось-начался отсчет в секундах. Реле выключилось-осчет остановился. И так далее. А в 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; }
Понимаю что работать не будет.Направьте в нужное русло)
Стартовать отсчет не при == LOW, а при переходе из HIGH в LOW. Тормозить же при переходе из LOW в HIGH, а не при == HIGH.
это как при переходе?Через прерывания?
Делал человеку на мега88 как то. В 10000 обошелся. И это нормально, ибо много возни.
Раз в секунду проверяйте состояние реле. Если включено прибавляйте секунду. Если переключения не частые, то наверное точность будет достаточной.
это как при переходе?Через прерывания?
не надо никакого прерывания. "При переходе" это очень просто - это когда при этом отсчете на пине HIGH, а на прошломбыло LOW - значит произошел переход
и тут "
if
(tm.Hour == 0 && tm.Minute == 0 && tm.Second == 0 )"
желательно тоже какое то условие не просто == 0, а "в прошлый раз было вчера, а в этот уже наступило сегодня", вдруг код разрастется и по какой то причине 0:0:0 поймать не получится за секундуКак всё закручено... А типа, if_rising(x) можно? Или if_falling(x)? И ни о чём не думай.)
И будильник тогда завести в DS3231 чтобы дергал ногу ардуины с прерыванием и обнулял.