Запуск по таймеру

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

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

void loop() {
   if(btn){
     test();
  }
}

void test(){
  Serial.println(test);
}

Если нажата кнопка btn ждем 2сек. и запускаем функцию test(). Как это сделать с использованием millis() или другими методами, чтобы неостанавливать выполнение всей програмы.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну есть масса способов. С помощью миллис, например здесь - http://arduino.ru/tutorials/BlinkWithoutDelay

Заменяем включение светодиода на вызов нужной функции и дело в шляпе.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
uint32_t tmr = 0;
bool onTimer = false;

void test()
{
	Serial.println("test");
}

void setup()
{
	Serial.begin(9600);
}

void loop() 
{
	if(btn && !onTimer)
	{
		onTimer = true;
		tmr = millis();
	}

	if(onTimer && millis() - tmr >= 2000)
	{
		onTimer = false;
		test();
	}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

sound пишет:

Если нажата кнопка btn ждем 2сек. и запускаем функцию test(). Как это сделать с использованием millis()

пока вы так формулируете, вам будет трудно найти решение. Ведь раз вы говорите "ждем" - это как бы намекает, что "ждать" - это отдельное дело. Именно так пишутся программы с delay() - и контроллер именно "ждет 2 секунды". А поскольку контроллер может делать только одно действие в каждый момент, то пока он "ждет" - никакие другие действия невозможны.

Чтобы писать программы с использованием millis() - нужно менять подход, нужно перестать "ждать".  В момент нажатия кнопки мы только запоминаем текущее время. И все, дальше программа занимается другими делами и ничего не "ждет". При следуюшем проходе через участок кода с кнопкой (не обязательно именно в этом месте, но так просто удобнее обьяснять) -  мы сравниваем текущее время с запомненным - если разница менее 2х секунд - продолжаем программу дальше, если превысила 2 секунды - запускаем функцию test().