Кнопка устраняет дребезг с помощью millis() в этом примере

Я пытался найти способ использовать millis() вместо delay(), чтобы нажимать 2 кнопки для включения и выключения синего светодиода.

ОТРЕДАКТИРОВАНО:

const int right_button = 8, left_button = 9, yellow_led = 7, blue_led = 6, green_led = 5, red_led = 4;
int previous_left_button_status = LOW, previous_right_button_status = LOW, blue_status = LOW, green_status = LOW;
unsigned long time_setup = millis();
const int delay_task = 250;

void setup()
{
  pinMode(right_button, INPUT_PULLUP);
  pinMode(left_button, INPUT_PULLUP);
  pinMode(blue_led, OUTPUT);
  pinMode(green_led, OUTPUT);
  pinMode(red_led, OUTPUT);
  pinMode(yellow_led, OUTPUT);
  Display.clear();
}

void loop()
{
  int right_button_status = digitalRead(right_button);
  int left_button_status = digitalRead(left_button);
  unsigned long time_passes = millis();
  if (time_passes - time_setup >= delay_task)
  {
    time_setup = time_passes;
    if (right_button_status == previous_right_button_status)
    {
      green_status = !green_status;
      digitalWrite(green_led, green_status);
    }
  }
}

, 👍0

Обсуждение

начните с примера скетча arduino debounce ..https://www.arduino.cc/en/Tutorial/Debounce, @jsotola

этот код не работает - это очень плохое описание поведения программы... что на самом деле происходит, когда вы запускаете скетч?, @jsotola

@jstola, мне плохо, что я не конкретен; / моя проблема здесь с обеими кнопками, right/left_button_press не работают, так как я хочу, чтобы они включали и выключали светодиод, используя только задержку, @Ryan johnson

у вас есть логические ошибки в вашем коде .. . использование ключевого слова else создает код, который исключает одну из кнопок, если нажата другая кнопка... каждая кнопка должна иметь отдельный оператор if, @jsotola

@jstola, так что «иначе, если» здесь означает то же самое, что и «иначе», если условие выполнено, сделайте это, а если нет (иначе), сделайте другое, но не выполняйте первое условие, правильно?, @Ryan johnson

@jstola, почему это считается логической ошибкой? что, если сценарий, который я хочу, исключает одно условие и активирует другое? или вы имеете в виду под ошибкой, что если я нажму правую кнопку, чтобы включить светодиод, я не смогу включить этот светодиод навсегда из-за «иначе, если»?, @Ryan johnson

логическая ошибка - это что-то вроде сложения двух чисел, когда вы хотели умножить ... вы отслеживаете два нажатия кнопок, но исключаете нажатие кнопки при определенных условиях, потому что считаете, что обнаружение нажатия кнопки как-то связано с освещением светодиод .... но светодиодное освещение и обнаружение нажатия кнопки на самом деле являются совершенно отдельными функциями ... нажатие кнопки должно устанавливать значение переменной, ничего больше .... полученное значение может быть использовано для определения того, светодиод должен гореть, @jsotola

Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/106446/discussion-between-ryan-johnson-and-jsotola)., @Ryan johnson


1 ответ


1

Вы правильно объявили переменную для функции millis внутри цикла и указали продолжительность задержки, которую хотите использовать. Вы пропустили две вещи: вы объявили 2 переменные с помощью функции millis и использовали ее для управления потоком программы на основе некоторого условия для выполнения некоторого кода, в вашем случае для нажатия 2 кнопок для включения и выключения светодиода .

Для этого нужно использовать оператор if-else внутри функции цикла с одной переменной, объявленной с помощью функции millis, delay_duration в качестве ссылки и 1 переменной, объявленной с нулевым значением.

unsigned long storeMillis = 0;
const int delay_duration = 500;

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

void loop() {
unsigned long currentMillis = millis();
if (currentMillis - storeMillis > 500) {
storeMillis = currentMillis; //обновляем и сохраняем значение storeMillis для следующей итерации
// код, который вы хотите сделать
}
,

Спасибо за ваш ответ, я немного понял ваш millis(). Во-первых, у вас есть unsigned long, который не использовался, вы использовали firstMillis, я думаю, вы имели в виду storeMillis в этом условии «если», правильно? Во-вторых, как мне использовать это в отмене дребезга кнопки, я до сих пор не понимаю часть устранения дребезга кнопки с использованием millis(), @Ryan johnson

Я предлагаю вам сначала изменить переменные, которые вы использовали для хранения состояний кнопок, с true/false на high/low. Вы установили свою переменную «left_state» как логическое значение, в котором вы дали ей уровень вывода «LOW», что является большим нет. Помните, что логическое значение используется для определения логических уровней, представляющих истину или нет, в то время как HIGH/LOW используется для представления уровней выводов в Arduino., @Phil Fredric Hermosa

спасибо за объяснение, не могли бы вы взглянуть на мой отредактированный код? millis() не работает в моей части EDITED, я до сих пор не знаю, почему моя правая кнопка не устраняет дребезг (идя по течению, каждый раз, когда я ее нажимаю), она пропускает, ждет или не включает светодиод, @Ryan johnson

Отлично, теперь вам нужно тщательно проверить, правильные ли переменные вы сравниваете в своем состоянии. Помните, что функция millis() начинает отслеживать время там, где вы объявили ее в своем коде. Переменная «time_setup» — это та, которая начнет отсчет, скажем, от 0 до 5000 мс, пока не запустится функция цикла. Тогда это будет время, когда ваша переменная «time_passes» начнет отсчет, поэтому ее значение времени должно быть меньше, чем значение времени «time_setup»., @Phil Fredric Hermosa

Я предлагаю вам напечатать эти значения в последовательном мониторе, чтобы вы знали, что на самом деле происходит и как он хранит время в миллисекундах., @Phil Fredric Hermosa

я действительно запутался, сначала у вас есть переменная с именем secondMillis, которая никогда нигде не объявлялась, а затем вы сделали storeMillis = millis(); почему вы не сохранили storeMillis в currentMillis? ;/, @Ryan johnson

Плохо, я уже отредактировал. Я имел в виду вторую переменную, которую я объявил, когда писал это (это currentMillis), @Phil Fredric Hermosa