Заставляя кнопку вести себя как тумблер с 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);
}
}
@Varonne, 👍2
Обсуждение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
- Определение того, была ли нажата и отпущена кнопка
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Как прервать функцию цикла и перезапустить ее?
- Как перезапустить счетчик в программе с помощью кнопки в настройке LDR Tripwire
какие комментарии? если нажатие кнопки должно изменить состояние с true на false и с false на true, то это делает все правильно., @Juraj
Спасибо @Juraj Я просто пытаюсь понять код, который мне удалось объединить из различных примеров, которые я нашел, а что касается ledState, то я не нашел объяснения этому на официальных справочных страницах Arduino, поэтому я не знал, что именно он делает, @Varonne
если : это работает + вы понимаете , как это работает, то это найти ; ledstate = !ledstate ; // является коротким и эффективным для "откидывания заслонки" логического значения, @jo_
пожалуйста, пройдите курс кодирования, @Juraj
@Varonne, действительно ли этот код включает и выключает ledState при каждом нажатии кнопки? Я думаю, что когда вы нажимаете кнопку, светодиодное состояние будет включаться и выключаться снова и снова так же быстро, как процессор будет выполнять код. Затем случайным образом оставайтесь включенными или выключенными в зависимости от того, когда вы отпустите кнопку., @st2000
@st2000 он работает точно так, как задумано, с помощью кнопки он работает как "первый толчок = постоянное включение, второй толчок постоянное выключение" и не делает никакого случайного поведения., @Varonne
Спасибо, мне придется попробовать класс кнопок. Я не знал, что в нем есть STATE машина. Я просто думал, что он де-отскочил переключатели., @st2000