Вопрос по таймеру TTimerList.h
- Войдите на сайт для отправки комментариев
Втр, 03/12/2019 - 17:53
Доброго дня. Подскажите. Возможно ли отследить состояние времени переключения таймера <TTimerList.h>?
Допустим, мне необходимо включать поочередно два светодиода с временем свечения в 2000 мс, но при этом, что бы между их включением/выключением была некая пауза, допустим в 1000 мс.
Алгоритм:
- Включаем светодиод №1
- Светодиод №1 включен в течении 2000 мс
- Выключаем светодиод №1
- Пауза перед включением светодиода №2 1000 мс
- Включаем светодиод №2
- Светодиод №2 включен в течении 2000 мс
- Выключаем светодиод №2
- Пауза перед включением светодиода №1 1000 мс
- Возвращаемся к первому пункту
Была идея отслеживать по состоянию порта – высокий/низкий уровень, но так не работает. Вот и интересует вопрос, можно ли как-то отследить период работы таймеров светодиодов и паузы, что бы была возможность включать их поочередно.
Можно. Тока я седня уже плюшевый, теперь только завтра
А зачем использовать энту подпрограмму для события "раз в секунду"? В начале лупа по миллис отслеживаете секунду и ставите флаг. в конце лупа флаг снимаете. А по ходу лупа считаете флаги и выполняете действия.
Че-т я разболтался - пойду приму живой воды.
На, проверяй, точно ли по ТЗ горят. Сделано всего на одном таймере, остальные не пострадали.
/* Name: TimersTest.ino Created: 04.12.2019 8:01:42 Author: DtS */ #include <Arduino.h> #include <TimerList.h> extern TTimerList TimerList; const uint8_t Led1Pin = 13; // светлодиот 1 const uint8_t Led2Pin = 10; // светлодиот 2 на этих пинах, от пина к земле uint8_t Leds[] = { Led1Pin, Led2Pin }; // 2 светодиода, можно добавить скока угодно const uint8_t LEDS_COUNT = sizeof(Leds) / sizeof(Leds[0]); uint8_t States[] = { 0,1,0,2 }; // состояния, 0 - пауза, 1,2 - горят светлодиоды 1 или 2 const uint8_t STATES_COUNT = sizeof(States) / sizeof(States[0]); uint8_t CurrState = 0; THandle hTimer = INVALID_HANDLE; uint8_t GetNextState(void) { // взять из массива States следущее состояние if (++CurrState >= STATES_COUNT) CurrState = 0; return States[CurrState]; } uint8_t LastStateIdx = 0; void tmrState(void) { // callback таймера, меняет интервал в зав-ти от состояния if (LastStateIdx != 0) LedOff(Leds[LastStateIdx - 1]); // если какой светлодиот был включен - выключим LastStateIdx = GetNextState(); // возьмем след. состояние switch (LastStateIdx) { case 0: // если пауза, то переустановим интервал на 1 секунду TimerList.setNewInterval(hTimer, 1000); // пауза 1 секунда break; case 1: case 2: // если светлодиоды, то на 2 секунды TimerList.setNewInterval(hTimer, 2000); // горит 2 секунды LedOn(Leds[LastStateIdx - 1]); // включим нужный светлодиот break; default: break; } } void LedOn(const uint8_t ALedPin) { // включить светлодиот на пине ALedPin digitalWrite(ALedPin, HIGH); } void LedOff(const uint8_t ALedPin) { // выключить светлодиот на пине ALedPin digitalWrite(ALedPin, LOW); } void setup() { Serial.begin(115200); delay(250); for (uint8_t i = 0; i < LEDS_COUNT; i++) { // настроим пины и выключим всё. pinMode(Leds[i], OUTPUT); LedOff(Leds[i]); } hTimer = TimerList.Add(1000, tmrState); // первым состоянием будет пауза 1 секунда } void loop() { }кстати, функция bool TimerList.isActive(THandle); отдает true если конкретный таймер запущен и false если остановлен.
а функция uint32_t TimerList.getCount(Upd: THandle) отдает значение внутреннего счетчика, до которого он досчитал на момент её вызова