Как прервать цикл, если он не закончился за 10 секунд?
В настоящее время я использую OneButton.h библиотека для кодирования моего кнопочного проекта.
Когда я нажимаю кнопку 1, она делает цикл в течение 10 секунд и печатает триггер, а после этого разрывает цикл.
Однако теперь я хочу запрограммировать его так, чтобы при нажатии кнопки button1 он перескочил в функцию void(singleclick)
, но прямо сейчас, в течение 4-й секунды (в любое время до 10-й секунды) , я нажал другую кнопку, таким образом Arduino разорвет цикл 10 секунд и запустит другую функцию.
Таким образом, мне нужна помощь, как убедиться, что Arduino активно читает другую кнопку и при нажатии она разорвет текущий цикл/функцию на другие связанные функции.
#include <OneButton.h>
OneButton button1(2, true);
OneButton button2(3, true);
OneButton button3(4, true);
OneButton button4(5, true);
int led1=12;
int led2=11;
int led3=10;
int led4=9;
int flag;
unsigned long mode;
void setup()
{
Serial.begin(9600);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
button1.attachClick(singleclick1);
button1.attachLongPressStop(longclick);
button2.attachClick(singleclick2);
button3.attachClick(singleclick3);
button4.attachClick(singleclick4);
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
digitalWrite(led3,HIGH);
digitalWrite(led4,HIGH);
}
void loop()
{
button1.tick();
delay(20);
button2.tick();
delay(20);
button3.tick();
delay(20);
button4.tick();
delay(20);
Serial.println("No button");
}
void singleclick1()
{
mode=millis();
flag=1;
while(flag==1)
{
Serial.println("button1");
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
if(millis()-mode>5000)
{
Serial.println("TRIG");
flag=0;
button2.tick();
delay(20);
button3.tick();
delay(20);
button4.tick();
delay(20);
return;
}
}
}
void singleclick2()
{
Serial.println("button2");
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
}
@Peterhan123, 👍1
Обсуждение1 ответ
Лучший ответ:
Это всего лишь грубый, неполный и непроверенный код.
void singleclick1() { startTimer = true; } // это только устанавливает флаг
void singleclick2() { runTimer = false;} // это только очищает фла
void loop() {
button1.tick();
button2.tick();
if startTimer { // это происходит один раз при каждом щелчке 1
mode = millis();
runTimer = true;
startTimer = false; // запускайте этот блок только один раз при каждом клике 1
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW );
digitalWrite(led3, LOW );
digitalWrite(led4, LOW );
}
unsigned long currentMillis = millis();
if (currentMillis - mode > 10000) {
runTimer = false; // истек срок действия 10-секундного таймера
}
if (runTimer) {
Serial.println("TRIG");
}
else {
// необязательные вещи, которые нужно сделать
}
}
Большое вам спасибо!, @Peterhan123
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вы можете запустить таймер, который переключает флаг через 10 секунд. Затем цикл будет проверять этот флаг на каждой итерации., @Kwasmich