Arduino и millis()

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Arduino и millis()

Сообщение sergejey » Чт мар 27, 2014 3:35 pm

Что называется, хозяйке на заметку.

Функция millis() в Arduino возвращает количество милли-секунд с момента запуска контроллера, так вот, как оказалось, она обнуляется через некоторое время (вроде бы 9-10 часов) и начинает отсчёт заново. "Фишка" известная и описанная, но я не знал и прокололся, когда на основе аптайма делал периодическую отправку температуры на сервер -- у меня через указанное количество часов время отправки значения было больше чем текущий аптайм контроллера и температура переставал отправляться. Не зная об этом сложно отловить, т.к. проблема проявляется только через полсуток. Надеюсь, кому-нибудь, кто прочитает этот пост, сэкономит время :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Arduino и millis()

Сообщение dmw » Пт мар 28, 2014 5:41 am

Тут есть тонкость - тип переменной с которой сравнивать millis(), она должна быть unsigned long.
Ее предельное значение 4,294,967,295 (примерно 50 дней, а точнее 49 дней 17 часов 2 минуты 47 секунд 295 мсек).
http://arduino.ru/Reference/Millis
http://arduino.ru/Reference/UnsignedLong
MaksMS82
Сообщения: 422
Зарегистрирован: Ср сен 05, 2012 7:30 am
Откуда: Киров
Благодарил (а): 0
Поблагодарили: 70 раз
Контактная информация:

Re: Arduino и millis()

Сообщение MaksMS82 » Пт мар 28, 2014 11:24 am

Интересно , не должно быть порог полсуток ,даже если указать тип long ,то будет предел 25 дней..
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Arduino и millis()

Сообщение sergejey » Пт мар 28, 2014 11:40 am

У меня была переменная
unsigned int uptime;
uptime=(millis()/1000);
видимо как раз из-за того, что доходило до предела unisgned int была такая проблема (как раз 65500 секунд это около 18 часов)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить