Заставляя кнопку вести себя как тумблер с ezButton - должен ли я использовать оператор ledstate with =!

Я использую ezbutton, чтобы заставить кнопку действовать как тумблер, первое нажатие делает постоянное включение, второе нажатие делает постоянное выключение. Я просто пытаюсь понять базовое кодирование. Этот проект - просто тестовая площадка для того, что я планирую сделать позже-подключить тумблеры автомобиля к Arduino и подать выходной сигнал на mosfet, который будет контролировать состояние нагрузки. Поэтому я пытаюсь получить код как можно аккуратнее. В приведенном ниже коде я хотел бы знать, будет ли ledState применим, когда этот скетч будет управлять МОП - транзистором вместо тестового светодиода, и я видел комментарии, говорящие "ledState = !ledState;" не является оптимальным-но будучи новичком, я не уверен, что это означает, и есть ли лучший более разумный способ его решения. Спасибо!

#include <ezButton.h>

// ---
// Declaration
// ---

const int button1  = 9;    
const int led1     = 4;    
int ledState = LOW;

ezButton button(button1);

// ---
// Setup
// ---

void setup()
{

  pinMode(led1, OUTPUT);    
  pinMode(button1, INPUT_PULLUP);    
  button.setDebounceTime(50);

}

// ***
// Main Loop
// ***
void loop()
{

  button.loop();

  if (button.isPressed()) {
    ledState = !ledState;
    digitalWrite(led1, ledState);
  }

}

, 👍2

Обсуждение

какие комментарии? если нажатие кнопки должно изменить состояние с true на false и с false на true, то это делает все правильно., @Juraj

Спасибо @Juraj Я просто пытаюсь понять код, который мне удалось объединить из различных примеров, которые я нашел, а что касается ledState, то я не нашел объяснения этому на официальных справочных страницах Arduino, поэтому я не знал, что именно он делает, @Varonne

если : это работает + вы понимаете , как это работает, то это найти ; ledstate = !ledstate ; // является коротким и эффективным для "откидывания заслонки" логического значения, @jo_

пожалуйста, пройдите курс кодирования, @Juraj

@Varonne, действительно ли этот код включает и выключает ledState при каждом нажатии кнопки? Я думаю, что когда вы нажимаете кнопку, светодиодное состояние будет включаться и выключаться снова и снова так же быстро, как процессор будет выполнять код. Затем случайным образом оставайтесь включенными или выключенными в зависимости от того, когда вы отпустите кнопку., @st2000

@st2000 он работает точно так, как задумано, с помощью кнопки он работает как "первый толчок = постоянное включение, второй толчок постоянное выключение" и не делает никакого случайного поведения., @Varonne

Спасибо, мне придется попробовать класс кнопок. Я не знал, что в нем есть STATE машина. Я просто думал, что он де-отскочил переключатели., @st2000


1 ответ


1

Я просматривал исходный код ezButton.c

Функция IsPressed() является чем-то неправильным и имеет смысл только для кнопки push-to-make на нижней стороне подтягивающего резистора. Он действительно обнаруживает падающие края сигнала, поэтому его следует назвать isFallingEdge(), но сам код хорош.

Аналогично для isReleased (), который обнаруживает восходящие края сигнала, поэтому следует называть isRisingEdge().

Конструктор по умолчанию INPUT_PULLUP которых может (или не может) быть то, что вы хотите для кнопок и тумблеров, так это то, чтобы иметь в виду, особенно для нижних пуш-ломаются кнопки или высокой боковой толчок, чтобы сделать кнопки, которые будут способствовать повышению края при нажатии и осыпание краев при отпускании таким образом, обращая смыслы isPressed() и isReleased(), следовательно, почему они на самом деле должны называться isFallingEdge() и isRisingEdge().

Алгоритм в ezButton::loop() может быть немного оптимизирован, избавившись от previousSteadyState и вложив окончательный оператор if во второй оператор if.

Кроме того, это довольно хороший алгоритм, который использует гистерезис для сброса таймера debounce.

Для сравнения вы можете взглянуть на мой алгоритм в этом простом дебаунсере для Arduino, который просто обнаруживает восходящие края, падающие края или оба края независимо от того, была ли нажата или отпущена кнопка, и может использоваться в цикле опроса или с прерываниями. Вот суть алгоритма:

    bool input_state = digitalRead(INPUT_PIN);
    unsigned long current_ms = millis();

    edge = rise = fall = false;

    // Гистерезис:
    // Если нет изменений, сбросьте таймер debounce.
    // В противном случае сравните разницу во времени с задержкой дебоунса.
    if (input_state == output_state)
    {
      last_ms = current_ms;
    }
    else if ((current_ms - last_ms) >= DEBOUNCE_DELAY_ms)
    {
      // Успешно дебютировал, поэтому обновите выходные данные.
      rise = input_state && !output_state;
      fall = !input_state && output_state;
      edge = rise || fall;
      output_state = input_state;
    }

And ledState = !ledState; simple переключает значение ledState, которое вы записываете на свой светодиод с помощью digitalWrite(led1, ledState); каждый раз, когда во входном сигнале обнаруживается падающий фронт.

,

Спасибо за понимание @tim ! Я буду честен, я борюсь с этим, потому что я совершенно новичок в электронике, и в прошлом месяце я познакомился с обжимом, пайкой, Arduino, разъемами и всем прочим, и это немного ошеломляет, но я постараюсь понять :D, @Varonne