Нужна помощь в кодировании «таймера» в операторе if else
Я хочу запрограммировать что-то вроде «таймера» (не знаю, как его назвать) в операторе if else в моем Arduino Uno.
По сути у меня есть 2 кнопки. Если кнопка 1 нажата, а кнопка 2 также нажата в течение определенного времени (скажем, 3 секунд), код выполнится. Если кнопка 1 нажата, но кнопка 2 не нажата в течение 3 секунд, произойдет возврат в исходное состояние. Как мне написать этот код?
Я включил блок-схему, чтобы прояснить мой вопрос.
Всем спасибо :)
if(digitalRead(button1) == LOW) // здесь мне нужна помощь
{
if(digitalRead(selectbutton) == LOW)
{
for(x=1; x<=30; x++)
{
digitalWrite(dir, HIGH);
delayMicroseconds(10);
time_now = millis();
digitalWrite(led, HIGH);
while(millis() < time_now + 50)
{
}
time_now = millis();
digitalWrite(led, LOW);
while(millis() < time_now + 50)
{
}
}
x=0;
}
}
else if(digitalRead(button2) == LOW) //то же самое здесь >_<
{
if(digitalRead(selectbutton) == LOW)
{
for(x=1; x<=10; x++)
{
digitalWrite(dir, LOW);
delayMicroseconds(10);
time_now = millis();
digitalWrite(led, HIGH);
while(millis() < time_now + 150)
{
}
time_now = millis();
digitalWrite(led, LOW);
while(millis() < time_now + 150)
{
}
}
x=0;
}
}
@BreadPig, 👍1
Обсуждение2 ответа
Лучший ответ:
Похоже, ваша блок-схема противоречит коду.
button1
и button2
говорят сами за себя, но что такое selectButton
?
Вот код, который может выполнить то, что вы пытаетесь сделать:
uint8_t bool_waitforbutton2 = 0;
uint32_t num_timeatbutton1 = 0;
void loop() {
//ваш другой код цикла здесь
if(digitalRead(button1) == LOW) {
num_timeatbutton1 = millis();
bool_waitforbutton2 = 1;
}
if(bool_waitforbutton2 == 1 && digitalRead(button2) == LOW){
bool_waitforbutton2 = 0;
//Ваш код здесь
}
if (millis() > (num_timeatbutton1 + 3000)) {
bool_waitforbutton2 = 0;
}
}
Это даст вам 3000 мс для нажатия button2
после того, как вы отпустите button1
для выполнения вашего кода, в противном случае «флаг готовности» bool_waitforbutton2
сбрасывается.
извините за неясность, «кнопка 1» предназначена для выбора первой функции, а «кнопка выбора» — для подтверждения запуска функции 1. Аналогично для «кнопки 2» — для выбора функции 2, а «кнопка выбора» — для подтверждения., @BreadPig
Блок-схема — это неплохо, но это не самый подходящий вариант. диаграмма для такого рода задач. Вам следует попытаться мыслить с точки зрения Вместо этого конечные автоматы, что является очень полезной концепцией. всякий раз, когда вы пытаетесь реализовать «реактивные» системы, то есть системы, которые реагировать на какой-либо ввод.
Вот ваша проблема, я так понимаю, переведенная в состояние диаграмма:
Эта система имеет два состояния:
- «ожидание», когда он ожидает нажатия первой кнопки
- «режим ожидания», когда была нажата первая кнопка, и он ожидает второй.
Нажатие кнопки 1 переключает режим ожидания в режим ожидания. переход обратно в исходное состояние «ожидания» может быть инициирован двумя отдельные события:
- 3 секунды в режиме ожидания.
- пользователь нажимает кнопку 2.
Обратите внимание, что во втором случае система запускает ваш код, одновременно создавая переход.
После того, как у вас есть диаграмма состояний и вы прочитали (и понял) учебник по конечному автомату, на который я ссылался, перевод преобразование диаграммы в код почти тривиально.
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
Привет, я отредактировал свое сообщение. Надеюсь, вы сможете помочь. :), @BreadPig