ARDUINO и собственный счетчик времени

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

ARDUINO и собственный счетчик времени

Сообщение ser009 » Сб ноя 24, 2012 5:57 pm

Подскажите как грамотно на Arduino реализовать временные задержки для передачи данных?
Допустим для отправки собранных данных через промежутки времени через 5, 10, 30 мин и т.д или более длинные 2ч 4ч 24ч?
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: ARDUINO и собственный счетчик времени

Сообщение sergejey » Вт ноя 27, 2012 3:44 pm

ser009 писал(а):Подскажите как грамотно на Arduino реализовать временные задержки для передачи данных?
Допустим для отправки собранных данных через промежутки времени через 5, 10, 30 мин и т.д или более длинные 2ч 4ч 24ч?
Думаю, что через счётчик циклов. Считаем, что один цикл проходит за одну секунду (ставим задержку, если быстрее), с каждым проходом цикла увеличиваем значение счётчика, когда счётчик равен NNNN запускаем процедуру отправки данных и обнуляем счётчик.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
emaster
Сообщения: 14
Зарегистрирован: Ср авг 15, 2012 3:15 pm
Благодарил (а): 0
Поблагодарили: 0

Re: ARDUINO и собственный счетчик времени

Сообщение emaster » Вт ноя 27, 2012 8:44 pm

ser009 писал(а):Подскажите как грамотно на Arduino реализовать временные задержки для передачи данных?
Допустим для отправки собранных данных через промежутки времени через 5, 10, 30 мин и т.д или более длинные 2ч 4ч 24ч?
Вы сподвигли меня портировать кусочек своей STM8 библиотечки под ардуино.
А именно, класс CLongTimer. Он позволяет отсчитывать задержки от одной миллисекунды до 500 млн. лет :)

Пользоваться элементарно:

1. Создаётся экземпляр класса: CLongTimer tmr(1000);
2. Устанавливается функция-обработчик срабатывания таймера: tmr.event(&elapsed);
3. В функцию loop добавляется вызов tmr.tick();

Или можно пропустить пункт 2, и после tmr.tick() делать:

if (tmr.elapsed()) здесь обрабатываем срабатывание таймера.

В библиотеке есть пример мигающий светодиодом.

Для точного отсчёта длительных задержек нужна постоянная синхронизация с вышестоящим датчиком точного времени.
Вложения
LongTimer.rar
LongTimer class
(2.25 КБ) 483 скачивания
Frolov
Сообщения: 1
Зарегистрирован: Ср ноя 28, 2012 1:25 pm
Благодарил (а): 0
Поблагодарили: 0

Re: ARDUINO и собственный счетчик времени

Сообщение Frolov » Ср ноя 28, 2012 1:34 pm

Также можно использовать стандартную функцию millis() для среды ARDUINO. Эта функция возвращает количество миллисекунд, разрядность (unsigned long), с момента начала выполнения текущей программы на плате Arduino. Переполнение происходит приблизительно через 50 дней, что естественно необходимо учитывать при расчете заданного интервала времени
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: ARDUINO и собственный счетчик времени

Сообщение ser009 » Ср ноя 28, 2012 2:07 pm

подскажите по Arduino 1.01
Хочу чтобы в основном цикле программы была подпрограмма по истечении скажем каждых 3 минут опрашивается датчики температуры и программа в основной цикл.
Использую скетч sochkasov. ArduinoControllerWebServer. https://github.com/sochkasov/majordomo- ... rWebServer
emaster
Сообщения: 14
Зарегистрирован: Ср авг 15, 2012 3:15 pm
Благодарил (а): 0
Поблагодарили: 0

Re: ARDUINO и собственный счетчик времени

Сообщение emaster » Ср ноя 28, 2012 7:30 pm

ser009 писал(а):подскажите по Arduino 1.01
Хочу чтобы в основном цикле программы была подпрограмма по истечении скажем каждых 3 минут опрашивается датчики температуры и программа в основной цикл.
Использую скетч sochkasov. ArduinoControllerWebServer. https://github.com/sochkasov/majordomo- ... rWebServer
В начале скетча добавить строчки:

Код: Выделить всё

#define SENSORS_CHECK_PERIOD    (3*60*1000)   // опрос каждые 3 минуты
CLongTimer sensors_timer(SENSORS_CHECK_PERIOD);
А loop изменить следующим образом:

Код: Выделить всё

void loop() {
  char buff[64];
  int len = 64;
  webserver.processConnection(buff, &len);  // process incoming connections one at a time forever

  sensors_timer.tick();
  if (sensors_timer.elapsed())
  {
      // Этот кусок кода будет выполняться каждые SENSORS_CHECK_PERIOD миллисекунды
      // Здесь опрашиваем датчики или вызываем соответствующую функцию
  }
}
Sicness
Сообщения: 57
Зарегистрирован: Сб май 12, 2012 1:42 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: ARDUINO и собственный счетчик времени

Сообщение Sicness » Ср дек 12, 2012 4:15 pm

ИМХО, просто в цикле loop надо проверять сколько прошло времени после последнего запуска. Я делаю элементарно вот так:
if (lastTime - millis() < 10000)
lastTime = millis()
// делай то что хотел каждые 10 сек

Не понял зачем целый класс делать
emaster
Сообщения: 14
Зарегистрирован: Ср авг 15, 2012 3:15 pm
Благодарил (а): 0
Поблагодарили: 0

Re: ARDUINO и собственный счетчик времени

Сообщение emaster » Ср дек 12, 2012 7:24 pm

Sicness писал(а):ИМХО, просто в цикле loop надо проверять сколько прошло времени после последнего запуска. Я делаю элементарно вот так:
if (lastTime - millis() < 10000)
lastTime = millis()
// делай то что хотел каждые 10 сек
Не понял зачем целый класс делать
В элементарном случае - да. А бывают программы с двумя десятками таймеров.
Sicness
Сообщения: 57
Зарегистрирован: Сб май 12, 2012 1:42 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: ARDUINO и собственный счетчик времени

Сообщение Sicness » Чт дек 13, 2012 2:02 pm

Я и с двумя десятками таймеров скорее всего так буду делать. Тем более что столько таймеров в МК нет )
Я стороник программирования МК в стиле конечного детерменированного автомата.
emaster
Сообщения: 14
Зарегистрирован: Ср авг 15, 2012 3:15 pm
Благодарил (а): 0
Поблагодарили: 0

Re: ARDUINO и собственный счетчик времени

Сообщение emaster » Чт дек 13, 2012 6:54 pm

Sicness писал(а):Я и с двумя десятками таймеров скорее всего так буду делать. Тем более что столько таймеров в МК нет )
Я стороник программирования МК в стиле конечного детерменированного автомата.
Два десятка таймеров логических, не аппаратных. Отличаются от аппаратных тем, что у них обработчики расположены не в обработчиках прерываний, а в главном цикле. В случае arduino - в функции loop(). Что даёт бОльшую (но не накапливающуюся) погрешность времени срабатывания.
А таймеры и конечный автомат - понятия перпендикулярные, абсолютно не исключающие друг друга.
Простейший случай, когда нужны 5+ таймеров - устройство с LED индикатором и клавиатурой. Датчик переменного тока - ещё пара таймеров.
Можно конечно всё сделать без обёртывания в классы или структуры. Но этот код будет write-only, дорогой в разработке и поддержке, что при нынешней мощности МК почти совсем не актуально.
Ответить