Страница 1 из 2
ARDUINO и собственный счетчик времени
Добавлено: Сб ноя 24, 2012 5:57 pm
ser009
Подскажите как грамотно на Arduino реализовать временные задержки для передачи данных?
Допустим для отправки собранных данных через промежутки времени через 5, 10, 30 мин и т.д или более длинные 2ч 4ч 24ч?
Re: ARDUINO и собственный счетчик времени
Добавлено: Вт ноя 27, 2012 3:44 pm
sergejey
ser009 писал(а):Подскажите как грамотно на Arduino реализовать временные задержки для передачи данных?
Допустим для отправки собранных данных через промежутки времени через 5, 10, 30 мин и т.д или более длинные 2ч 4ч 24ч?
Думаю, что через счётчик циклов. Считаем, что один цикл проходит за одну секунду (ставим задержку, если быстрее), с каждым проходом цикла увеличиваем значение счётчика, когда счётчик равен NNNN запускаем процедуру отправки данных и обнуляем счётчик.
Re: ARDUINO и собственный счетчик времени
Добавлено: Вт ноя 27, 2012 8:44 pm
emaster
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()) здесь обрабатываем срабатывание таймера.
В библиотеке есть пример мигающий светодиодом.
Для точного отсчёта длительных задержек нужна постоянная синхронизация с вышестоящим датчиком точного времени.
Re: ARDUINO и собственный счетчик времени
Добавлено: Ср ноя 28, 2012 1:34 pm
Frolov
Также можно использовать стандартную функцию millis() для среды ARDUINO. Эта функция возвращает количество миллисекунд, разрядность (unsigned long), с момента начала выполнения текущей программы на плате Arduino. Переполнение происходит приблизительно через 50 дней, что естественно необходимо учитывать при расчете заданного интервала времени
Re: ARDUINO и собственный счетчик времени
Добавлено: Ср ноя 28, 2012 2:07 pm
ser009
подскажите по Arduino 1.01
Хочу чтобы в основном цикле программы была подпрограмма по истечении скажем каждых 3 минут опрашивается датчики температуры и программа в основной цикл.
Использую скетч sochkasov. ArduinoControllerWebServer.
https://github.com/sochkasov/majordomo- ... rWebServer
Re: ARDUINO и собственный счетчик времени
Добавлено: Ср ноя 28, 2012 7:30 pm
emaster
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 миллисекунды
// Здесь опрашиваем датчики или вызываем соответствующую функцию
}
}
Re: ARDUINO и собственный счетчик времени
Добавлено: Ср дек 12, 2012 4:15 pm
Sicness
ИМХО, просто в цикле loop надо проверять сколько прошло времени после последнего запуска. Я делаю элементарно вот так:
if (lastTime - millis() < 10000)
lastTime = millis()
// делай то что хотел каждые 10 сек
Не понял зачем целый класс делать
Re: ARDUINO и собственный счетчик времени
Добавлено: Ср дек 12, 2012 7:24 pm
emaster
Sicness писал(а):ИМХО, просто в цикле loop надо проверять сколько прошло времени после последнего запуска. Я делаю элементарно вот так:
if (lastTime - millis() < 10000)
lastTime = millis()
// делай то что хотел каждые 10 сек
Не понял зачем целый класс делать
В элементарном случае - да. А бывают программы с двумя десятками таймеров.
Re: ARDUINO и собственный счетчик времени
Добавлено: Чт дек 13, 2012 2:02 pm
Sicness
Я и с двумя десятками таймеров скорее всего так буду делать. Тем более что столько таймеров в МК нет )
Я стороник программирования МК в стиле конечного детерменированного автомата.
Re: ARDUINO и собственный счетчик времени
Добавлено: Чт дек 13, 2012 6:54 pm
emaster
Sicness писал(а):Я и с двумя десятками таймеров скорее всего так буду делать. Тем более что столько таймеров в МК нет )
Я стороник программирования МК в стиле конечного детерменированного автомата.
Два десятка таймеров логических, не аппаратных. Отличаются от аппаратных тем, что у них обработчики расположены не в обработчиках прерываний, а в главном цикле. В случае arduino - в функции loop(). Что даёт бОльшую (но не накапливающуюся) погрешность времени срабатывания.
А таймеры и конечный автомат - понятия перпендикулярные, абсолютно не исключающие друг друга.
Простейший случай, когда нужны 5+ таймеров - устройство с LED индикатором и клавиатурой. Датчик переменного тока - ещё пара таймеров.
Можно конечно всё сделать без обёртывания в классы или структуры. Но этот код будет write-only, дорогой в разработке и поддержке, что при нынешней мощности МК почти совсем не актуально.