Ви не увійшли.
Тю, так предскажите. delay(1) и фсё. Конгэниально?
инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит.
А как же время? Длительность loop непредсказуема и ничем не определяется. Нет, ни фига - это не решение.
Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.
В принципе, да.
Но и эта потребность достаточно просто решается.
P.S. Но и такая потребность, как мне кажется, решается без учёта что там и как происходит с переполнением - инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит.
Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.
и тут великий страх перед переполнением...
Как-то объяснить нужно бы всем, в 1000001 раз снова и снова спрашивающих про переполнение, что:
- во всех случаях (95%), когда вас интересуют временные интервалы, нужно просто забыть про любые переполнения...
unsigned long prev, next;
...
if( ( next = millis() ) - prev ) > period ) {
prev = next;
...
}
(не забыть, что ключевое здесь слово unsigned)
- и только когда вас каким-то образом вас интересуют значения временных меток millis() нужно вспомнить вот про те 50 суток... например, когда нужно время/дату uptime от времени включения;
- удивляет почему так много и часто уделяется преувеличенного внимания в обсуждениях этому переполнению ... кто никогда до того и не слышал про переполнения вообще.
Ну это смотря от какого момента считать первый период. Если от включения, то cойдёт.
и тут великий страх перед переполнением...
на великах никто не ездит? только начали придумывать?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
первый пост ну или так: если "по-домашнему"
uint16_t period = 2000; // заданый интервал 2сек.
void loop()
if ((currentMillis = millis()) - startTime > period)
{
тута будет все делатса аш больше 50ти дней подряд! интервалом через 2 секунды
startTime = millis(); // сброс, чтоб отсчет пошел после выполнения последнего вкл лампы ато мало ли что, вдруг затяжное
//действие
}
А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
Сбросить-то его элементарно, другое дело, что в природе не существует реальной необходимости делать это. Если Вам кажется, что Вам это нужно, значит Вы где-то ошиблись или чего-то не понимаете.
А сбросить вот так:
1. На верхнем уровне описываете внешнюю переменную
extern volatile unsigned long timer0_millis;
Затем в любом месте, где Вам нужно, присваиваете ей любое значение. Вот с этого значения миллис и будет с этого момента считать (пока снова чего-то не присвоите). Например,
timer0_millis = 123ul;
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.
Работать может сколько хош. СОБЫТИЕ не должно превышать 50 суток.
А что здесь сложного?
if (millis() < save_millis) ...
NEW_NOOB пише:А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
При этом ещё держать в уме, что примерно через 50 дней millis превратится в ноль через переполнение.
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.
А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
правильно врубились)))
Аа всё, врубился. Вместо == лучше поставить <,> или >=, <=
NEW_NOOB пише:После неоднократного вскипания, мой мозг додумался до этого.
... if (val==1 && analogRead(Photorez)==500) { //Сработает вечером ... if (analogRead(Photorez)==200) { ... //Если темно, вкл режим "ночь" if (analogRead(Photorez)==800) { ... //Если светло, вкл режим "день" }
Для начала неплохо. Только не используйте равенство при определении порога освещенности, такого в природе не бывает.
А как же тогда ?
Так?
if (800>analogRead(Photorez)>810)