Запуск по таймеру
- Войдите на сайт для отправки комментариев
Втр, 14/01/2020 - 02:47
Вобщем нужно запустить некую функцию по нажатию кнопки через 2 сек. Вроде простая задачка, но решения немогу найти.
void loop() {
if(btn){
test();
}
}
void test(){
Serial.println(test);
}
Если нажата кнопка btn ждем 2сек. и запускаем функцию test(). Как это сделать с использованием millis() или другими методами, чтобы неостанавливать выполнение всей програмы.
Ну есть масса способов. С помощью миллис, например здесь - http://arduino.ru/tutorials/BlinkWithoutDelay
Заменяем включение светодиода на вызов нужной функции и дело в шляпе.
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(); } }Если нажата кнопка btn ждем 2сек. и запускаем функцию test(). Как это сделать с использованием millis()
пока вы так формулируете, вам будет трудно найти решение. Ведь раз вы говорите "ждем" - это как бы намекает, что "ждать" - это отдельное дело. Именно так пишутся программы с delay() - и контроллер именно "ждет 2 секунды". А поскольку контроллер может делать только одно действие в каждый момент, то пока он "ждет" - никакие другие действия невозможны.
Чтобы писать программы с использованием millis() - нужно менять подход, нужно перестать "ждать". В момент нажатия кнопки мы только запоминаем текущее время. И все, дальше программа занимается другими делами и ничего не "ждет". При следуюшем проходе через участок кода с кнопкой (не обязательно именно в этом месте, но так просто удобнее обьяснять) - мы сравниваем текущее время с запомненным - если разница менее 2х секунд - продолжаем программу дальше, если превысила 2 секунды - запускаем функцию test().