Напишите ответ

Введите сообщение и нажмите Отправить
Параметры

Назад

Обзор темы (новое вверху)

Green
2018-03-21 20:55:33

Тю, так предскажите. delay(1) и фсё. Конгэниально?

Kaka
2018-03-21 17:26:23
Olej пишет:

инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит. big_smile

А как же время? Длительность loop непредсказуема и ничем не определяется. Нет, ни фига - это не решение.

Olej
2018-03-21 15:15:02
Kaka пишет:

Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.

В принципе, да.
Но и эта потребность достаточно просто решается.

P.S. Но и такая потребность, как мне кажется, решается без учёта что там и как происходит с переполнением - инкрементруйте переменную uint64_t последовательно на значения интервалов получаемых в loop() ... надолго хватит. big_smile

Kaka
2018-03-21 15:03:56

Ну, почему же? Есть ещё один момент, когда про переполнение нужно помнить. Если например, нужно отсчитать временной интервал (один!) длиной в два месяца - жопа получится.

Olej
2018-03-21 14:54:56
maxmix пишет:

и тут великий страх перед переполнением... lol

Как-то объяснить нужно бы всем, в 1000001 раз снова и снова спрашивающих про переполнение, что:

- во всех случаях (95%), когда вас интересуют временные интервалы, нужно просто забыть про любые переполнения...

unsigned long prev, next;
...
if( ( next = millis() ) - prev ) > period ) {
   prev = next;
   ...
}

(не забыть, что ключевое здесь слово unsigned)

- и только когда вас каким-то образом вас интересуют значения временных меток millis() нужно вспомнить вот про те 50 суток... например, когда нужно время/дату uptime от времени включения;

- удивляет почему так много и часто уделяется преувеличенного внимания в обсуждениях этому переполнению ... кто никогда до того и не слышал про переполнения вообще.

Green
2018-03-21 14:31:58

Ну это смотря от какого момента считать первый период. Если от включения, то cойдёт.

maxmix
2018-03-21 13:40:46

и тут великий страх перед переполнением... lol
на великах никто не ездит? только начали придумывать?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
первый пост ну или так: если "по-домашнему"

uint16_t period = 2000; // заданый интервал 2сек.
void loop()
if ((currentMillis = millis()) - startTime > period)

{
  тута будет все делатса аш больше 50ти дней подряд! интервалом через 2 секунды
  startTime = millis(); //  сброс, чтоб отсчет пошел после выполнения последнего вкл лампы ато мало ли что, вдруг затяжное
   //действие
  }

Kaka
2018-03-21 11:58:17
NEW_NOOB пишет:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

Сбросить-то его элементарно, другое дело, что в природе не существует реальной необходимости делать это. Если Вам кажется, что Вам это нужно, значит Вы где-то ошиблись или чего-то не понимаете.

А сбросить вот так:

1. На верхнем уровне описываете внешнюю переменную

extern volatile unsigned long timer0_millis;

Затем в любом месте, где Вам нужно, присваиваете ей любое значение. Вот с этого значения миллис и будет с этого момента считать (пока снова чего-то не присвоите). Например,

timer0_millis = 123ul;
Green
2018-03-15 19:39:16
Olej пишет:

И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.

Работать может сколько хош. СОБЫТИЕ не должно превышать 50 суток.

alex_dol
2018-03-15 17:52:37

А что здесь сложного?
if (millis() < save_millis) ...

Olej
2018-03-15 16:53:46
alex_dol пишет:
NEW_NOOB пишет:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.

При этом ещё держать в уме, что примерно через 50 дней millis превратится в ноль через переполнение.
И это событие нужно как-то ловить и анализировать, если собираться работать дольше 50 дней.

alex_dol
2018-03-15 15:41:52
NEW_NOOB пишет:

А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.

А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.

vvr
2018-03-14 21:27:44

правильно врубились)))

NEW_NOOB
2018-03-14 16:57:15

Аа всё, врубился. Вместо == лучше поставить <,> или >=, <=

NEW_NOOB
2018-03-14 16:41:15
Вячеслав Азаров пишет:
NEW_NOOB пишет:

После неоднократного вскипания, мой мозг додумался до этого.

...
 if (val==1 && analogRead(Photorez)==500) {        //Сработает вечером
...
 if (analogRead(Photorez)==200) {
...                                                           //Если темно, вкл режим "ночь"
 if (analogRead(Photorez)==800) {
...                                                           //Если светло, вкл режим "день"
 }

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

А как же тогда ?
Так?
if (800>analogRead(Photorez)>810)

Подвал раздела