Вопрос по таймеру TTimerList.h

itehno
Offline
Зарегистрирован: 18.04.2015

Доброго дня. Подскажите. Возможно ли отследить состояние времени переключения таймера <TTimerList.h>?

Допустим, мне необходимо включать поочередно два светодиода с временем свечения в 2000 мс, но при этом, что бы между их включением/выключением была некая пауза, допустим в 1000 мс.

Алгоритм:

  1. Включаем светодиод №1
  2. Светодиод №1 включен в течении 2000 мс
  3. Выключаем светодиод №1
  4. Пауза перед включением светодиода №2 1000 мс
  5. Включаем светодиод №2
  6. Светодиод №2 включен в течении 2000 мс
  7. Выключаем светодиод №2
  8. Пауза перед включением светодиода №1 1000 мс
  9. Возвращаемся к первому пункту

Была идея отслеживать по состоянию порта – высокий/низкий уровень, но так не работает. Вот и интересует вопрос, можно ли как-то отследить период работы таймеров светодиодов и паузы, что бы была возможность включать их поочередно.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Можно. Тока я седня уже плюшевый, теперь только завтра

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А зачем использовать энту подпрограмму для события "раз в секунду"? В начале лупа по миллис отслеживаете секунду и ставите флаг. в конце лупа флаг снимаете. А по ходу лупа считаете флаги и выполняете действия.

Че-т я разболтался - пойду приму живой воды.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

На, проверяй, точно ли по ТЗ горят. Сделано всего на одном таймере, остальные не пострадали. 

/*
    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)  отдает значение внутреннего счетчика, до которого он досчитал на момент её вызова