Наскільки точним є збереження часу arduino?

Я хочу використовувати мій arduino, щоб вимкнути світло на 16 годин і на 8 годин. Я знаю загальний код, просто використовуючи затримки і код релейного щита. Я хочу знати, наскільки точно це буде? (Я позначив uno та leonardo, оскільки маю доступ до обох)

1
Затримка Arduino() насправді не призначена для обліку часу. У одиночному використання в середній тривалості він може в кращому випадку підходити до точності годинника, але використовувати його повторно , щоб додати до більш тривалого періоду часу, є помилкою помилка початку/закінчення і гранулярність будуть накопичуватися. Замість цього ви повинні використовувати те, що дивиться на сумарну кількість кліків годинника, які пройшли протягом всього інтервалу інтересу.
додано Автор rossp, джерело

7 Відповіді

Є кілька версій і "клонів" Arduino, і кожен з них, ймовірно, буде використовувати різні компоненти. Час, коли ви звертаєтеся, в даному випадку "millis ()" я вважаю, підтримується від переривання таймера, який виводиться з головного годинника (зазвичай 16 МГц).

Головний годинник на платі може генеруватися керамічним резонатором, який не дуже точний: помилка 0,5% -1%. Це також може бути з гарного кварцового кристала, з точністю до 0,001%. Ці зміни на джерелі частоти призведуть до деякого дрейфу з часом ... Як ваші годинники потрібно час від часу перенастроюватися.

Another factor that affects accuracy, including for RTCs using a 32.768KHz crystal, is the temperature. Here an Application Note on this: http://www.st.com/content/ccc/resource/technical/document/application_note/55/e2/3d/2a/87/ab/4d/e1/CD00232494.pdf/files/CD00232494.pdf/jcr:content/translations/en.CD00232494.pdf

Ваша програма може не вимагати занадто великої точності, і ви можете просто написати ескіз, щоб роздрукувати час кожної секунди в серійному ... дозвольте йому працювати від однієї години, один день, і перевірте, скільки дрейфуєте ви. Після цього буде легко оцінити, скільки дрейфу ви отримаєте через місяць.

1
додано
Так, ви праві, трохи над головою, щоб збільшити millis, не буде кумулятивним.
додано Автор Paolo Bergantino, джерело
" Ви все ще маєте деякі втрати для невеликих накладних витрат вашого програмного забезпечення, щоб збільшити millis() ". Ні, ні. Апаратний таймер, який керує millis() , не припиняє підрахунок, а програмне забезпечення збільшує timer0_millis . Якщо ви не зробите щось дуже неправильно, як блокування переривань більше 1 мс, ви не втратите жодного кліща кристала/резонатора.
додано Автор Sprogz, джерело

За визначенням, Arduino є настільки точним, наскільки це кристалічний годинник/резонатор.

Цей годинник працює приблизно на 16 мГц для Uno.

Внутрішній час Arduino - це лише підрахунок того, скільки разів цей кристал вібрував.

READ THIS! - these next two paragraph are apparently incorrect. See Nick Gammon's comment below.

Цей кристал приблизно такий: https://www.sparkfun.com/products/536 - це від SparkFun точність до 50 ppm - це частки на мільйон. Отже, якщо ваш Arduino має такий кристал, він може втратити або отримати 50 частин на мільйон - за мільйон секунд, він буде обчислюватись десь між 999,950 і 1000,050 секунд. Це означає, що ви отримуєте/втрачаєте менше 4,3 секунди на день або 2 хвилини на місяць.   Якщо ви знайдете кристал на вашій платі, Google код (ймовірно, щось на зразок 16.000N, для Sparkfun один), який повинен сказати вам, що саме точність для цього чіпа. Зверніть увагу, що якщо ви знайдете таблицю, вона повинна сказати вам точність, при певних температурах - коли температура підвищується і зменшується, помилка також буде змінюватися.

Пам'ятайте також, що годинник Arduino знаходиться в енергонезалежній пам'яті - тобто, якщо ви вимикаєте пристрій Arduino, і вмикаєте його назад, він не знає, який час він - вам потрібно буде знову встановити годинник, або підключивши його до ПК, мережа або кнопки/відображення у вашому проекті.

Є багато альтернатив, залежно від вашої потреби, щоб обійти це: ви можете отримати дані з локальної мережі або WIFI, якщо ваш проект має це, або ви можете використовувати модуль RTC - вам потрібно встановити цей час на правильний час один раз, потім він запам'ятає після цього.

Крім того, ви можете використовувати залежний від світла резистор (він же фоторезистор) і запускати автоматично, коли він темніє. Це може спрацьовувати, коли затьмарюється з іншої причини, наприклад, буря, яка може бути або не бути перевагою.

1
додано
@dannyf - відредагований запис для позначення лише одного абзацу як "неточний", а не всього повідомлення. Я не зміг визначити номер деталі, тому не можу сказати, наскільки точним він є.
додано Автор Anarchofascist, джерело
H'm, якщо є точний кристал для USB, це не зробили сенс дизайну, щоб підштовхнути вихід, що в AtMega328P? Я знаю, що AtMega328P має тактову частоту, я припускаю, що 16U2 має тактову частоту? AtMega328P безумовно має годинник у ....
додано Автор Anarchofascist, джерело
Чи буде це проблемою? Затримка сигналу не буде - два чіпи не синхронізовані, і ніщо не припускає, що вони є (очевидно, інакше окремі годинники не працюватимуть). Годинник-вихід генерується перший чіп, так що я б очікував, що це буде сильний ясний сигнал - безумовно, 16MHz через кілька см не буде проблемою? Це також збереже шпильку (тому що кристал вимагає двох контактів).
додано Автор Anarchofascist, джерело
Uno має резонатор , підключений до Atmega328P, а не кристал. Кристал, який ви бачите на платі, підключений до Atmega16U2 (інтерфейс USB), тому що потребує більш точного часу. Резонатор не такий точний, як кристал, взагалі кажучи.
додано Автор Nick Gammon, джерело
Правда. І ці чіпи теж дуже близькі. Я не знаю чому. Можливо, до того часу, як їм здалося, стало надто пізно через те, як пробігли інші сліди на дошці.
додано Автор Nick Gammon, джерело
Цікаве питання. Вони могли б заощадити один або два цент, зробивши це. Повинна бути якась причина, якщо тільки бажання тримати високочастотні сигнали від переходу від однієї сторони до іншої.
додано Автор Nick Gammon, джерело
> наведена нижче інформація є неправильною ... я не впевнений, чому ви говорите, що це неправильно. Я стверджую, що ви в значній мірі точні в тому, що з хорошим кодуванням, довгострокова точність arduino, або будь-який інший MCU, є лише функцією осцилятора. той факт, що осцилятор являє собою кристал, або txco, або внутрішній осцилятор і т.д., принципово не змінює цього факту.
додано Автор dannyf, джерело

НЕ дуже.

Для такого періоду часу краще використовувати модуль Real Time Clock (RTC).

1
додано
Чим довше він працює, тим довше він буде дрейфувати. Осцилятор (керамічний) на Arduino Uno дуже поганий. Це краще на Леонардо, тому що він повинен керувати USB, але вся затримка ()/millis() річ неточна в кращому випадку.
додано Автор Majenko, джерело
Це звучить масово складніше і дорожче, ніж використання RTC ...
додано Автор Majenko, джерело
Ви можете подумати, але у мене є всі матеріали і старий ipod, який просто просить бути використаний для цього :)
додано Автор user23282, джерело
Добре, я можу просто використовувати телефон і інший щит для взаємодії з ним і отримати час. Велике спасибі :)
додано Автор user23282, джерело
Як довго я закінчу бути? Він не повинен бути надто точним
додано Автор user23282, джерело

У серпні 2013 року я зробив датчик температури та вологості . Він використовує чіп RTC (DS1307), які можна купити на eBay за $ 1, якщо не менше. Має резервну батарею (літієва комірка).

Я не пам'ятаю, коли-небудь скидав годинник на нього. Це зараз близько 3 років, і він працює близько 11 хвилин повільно. Це буде прийнятною помилкою для щось подібного до включення та виключення садового освітлення. Навіть для того, щоб приймати температуру, кілька хвилин, коли реєстрація читання, ймовірно, не має значення.

Використання внутрішнього годинника, ймовірно, не буде таким точним, але в цьому випадку може бути добре. Я пропоную вам слідувати пропозиції та коду Кріса Страттона, щоб помилки не були сукупними. Наприклад, якщо ви затримуєте на годину, а потім робите щось, переконайтеся, що "зробити щось" не додано до наступного часу затримки.

Якщо ви хочете, щоб супер точність (звучить як ви не), підключення модуля GPS дозволяє запитувати точний час від супутника, який може скоротити помилку до незначних сум. Ці GPS модулі, однак, не дешево.


Щось необхідно враховувати, якщо ви намагаєтеся зробити з внутрішніми годинниками: що відбудеться, якщо вимикається живлення? Потім він втрачає слід, коли потрібно вмикати і вимикати світло. Однак мікросхема годинника (як правило) має резервну батарею і "знає час" після того, як влада повернеться.

1
додано
Якщо ви йдете на eBay, щоб купити і RTC, просто витрачайте додатковий долар і отримайте DS3231 замість DS1307. Це один має температурно компенсований генератор, що призводить до ще більшої точності. 2 хвилини на рік, максимум. У мене працює 2 роки, і він залишається правильним до хвилини (тобто менше, ніж за 60 секунд).
додано Автор Al., джерело
Звучить як дуже хороша порада. :)
додано Автор Nick Gammon, джерело

Я думаю, що RTC модулі і чіпи реального часу годинник мають якийсь "помилка" сказав, що, це CAN макс. затримка для швидкого перемотування вперед для макс. 6 секунд на місяць. Щось, як це, я читав рік або тому назад, коли я мав справу з механізмом блокування дверей.

Але для програми. 8 годин, є модуль RTC Arduino більш ніж достатній, я б сказав. Я припускаю, що секунди не має значення.

1
додано

Просто тому, що це завжди опція ... Я зазвичай підключаю Arduinos до Інтернету так чи інакше, так що я отримую час від NTP-серверів один раз на день або з використанням UDP, щоб тримати годинник точним або достатньо точним.

Перевага полягає в тому, що, навіть якщо потужність втрачена, порівняно легко попросити Arduino отримати час під час завантаження. Тоді він завжди знає, і завжди вчасно.

З радістю поділилися кодом, але я знайшов у своїх прикладах бібліотеку UDP і пристосував його до власних потреб.

1
додано

Я хочу знати, наскільки точно це буде?

Точність є функцією кодування та апаратного забезпечення. з хорошим кодуванням, ви можете зробити його таким точним, на яке здатне ваше обладнання.

Я експериментував з осцилятором tco-919 з високою точністю (19,2 МГц), в необізнаній обстановці, без значного дрейфу часу після місяця.

Так що якщо ви дійсно хочете точності, йти з хорошим осцилятором.

якщо ви просто дбаєте про розумну точність (1%?), внутрішній генератор буде робити.

0
додано