Светодиод Arduino мигает одним нажатием кнопки

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

int led=13,button=12;
void setup() {
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}
void loop() {
if (digitalRead(button)==HIGH)
  digitalWrite(led,HIGH);
}

и это сработало; он оставался включенным после того, как я один раз нажал кнопку, поэтому для мигающего светодиода я написал:

int led=13,button=12;
void setup() {
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}
void loop() {
if (digitalRead(button)==HIGH)
{
  digitalWrite(led,HIGH);
delay(1000);
 digitalWrite(led,LOW);
 delay(1000);

} }

но это не сработало. Он перестает мигать после того, как я убираю руку с выключателя. Почему это происходит?

, 👍1

Обсуждение

Добро пожаловать на EE.SE. Пожалуйста, отредактируйте вопрос и используйте теги {} для правильного форматирования кода. Убедитесь, что он имеет правильный отступ. Вам также необходимо исправить заглавные буквы в заголовке и в посте для удобочитаемости и достоверности. Ваш компилятор не отпустит вас с этим. Почему мы должны? Обратите внимание, что в вашем вопросе нет элемента электрического дизайна, поэтому он, вероятно, будет перемещен на сайт Arduino StackExchange., @Transistor

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

Это то, что я пытаюсь сделать, я понимаю, что это должно выполняться так же, как внутри if {}.. но этого не происходит, @sumer fattoum

Если вы хотите, чтобы светодиод оставался включенным на неопределенный срок, удалите строку, которая устанавливает светодиод на НИЗКИЙ уровень., @Nick Gammon

Я перечитал ваш вопрос, и это не имеет смысла. ... Я хочу, чтобы светодиод мигал, когда я нажимаю переключатель один раз, но он продолжает мигать. .. Это означает, что вы нажимаете переключатель один раз, и вы ожидаете, что светодиод мигнет (я предполагаю, что вы хотите, чтобы он мигал один раз). Светодиод постоянно мигает, а вы этого не хотите. .... В конце вопроса вы говорите, что светодиод перестал мигать., @jsotola

Почему этот вопрос такой сложный, я повторял его много раз, я сравниваю два кода, хотя они имеют одинаковую структуру, но ведут себя по-разному, я хочу знать, почему, @sumer fattoum


2 ответа


2

Поскольку цифровая запись применяется только к if (digitalRead(button)==HIGH). Если не нажимать кнопку, то идет код:

void loop() {
}

По сути, ничего не делать. Вашему коду нужно немного больше, чтобы отслеживать нажатие кнопки. Псевдокод:

if button == pressed {
    int tracker=1;
}
if tracker == 1 {
    led on;
    wait;
    led off;
    wait;
}
loop
,

Спасибо, не могли бы вы объяснить больше, я понимаю, что он должен выполнять то, что находится в if {}, таким же образом, так почему один раз он продолжал выполняться после того, как я нажал кнопку, а в другом примере он перестал выполнять то, что находится в if { } После того, как я нажал кнопку, я могу отправлять видео, если кто-то пришлет мне электронное письмо, @sumer fattoum

Попробуйте опубликовать новый код, если вы изменили свой на основе этого ответа. Не меняйте исходный код, иначе вопрос не будет иметь никакого смысла. Добавьте новую часть к своему вопросу (отредактируйте вопрос), указав, что вы пробовали XYZ, и показав, что это было., @Nick Gammon


0

Это то, что вам нужно. Когда вы нажимаете кнопку, ваш светодиод включается. И он все еще включен, пока вы снова не нажмете кнопку. Надеюсь, это поможет вам.

const int kPinBtn = 2;
const int kPinLed = 13;

boolean kPress = false;

void setup()
{
  pinMode(kPinBtn, INPUT_PULLUP);
  pinMode(kPinLed, OUTPUT);
}

void loop()
{
  if(digitalRead(kPinBtn) == LOW && kPress == false)
  {
    digitalWrite(kPinLed, HIGH);
    kPress = true;
  }
  if(digitalRead(kPinBtn) == LOW && kPress == true)
  {
    digitalWrite(kPinLed, LOW);
    kPress = false;
  }  
}
,

ок, спасибо, я изучу этот код, но все же вопрос, почему в первом коде он продолжал выполнять то, что внутри if {} даже после того, как я убрал руку с кнопки, а во втором коде он перестал выполнять то, что внутри if {} после того, как я убрал руку с кнопки переключателя, хотя оба кода имеют одинаковую структуру, но разница только в том, что внутри, if {}, я могу отправить видео, если вы не поняли, что я имею в виду, @sumer fattoum

@sumerfattoum Поскольку вы можете видеть, что здесь я использую один флаг, который означает логическое значение с именем kPress. По умолчанию это значение ложно. Когда вы нажимаете кнопку в первый раз, код проверяет значение kPress. Если это ложь, то ваш светодиод загорается, и в тот раз, когда мы изменили значение kPress, это означает, что теперь это правда. Теперь ваш светодиод горит до тех пор, пока вы не нажмете второй раз. Это происходит из-за значения kPress. Теперь, когда вы нажали второй раз, код снова проверяет значение kPress. Если это правда, то светодиод выключается., @Hasan

Мой друг, это два разных кода и два разных случая для моих кодов выше. Я загружаю код в Arduino по-разному, не учитывается, нажата ли кнопка в первый и второй раз., @sumer fattoum

Дело в том, что когда я загружаю первый код, затем нажимаю кнопку, он продолжает применять то, что есть в if {}, это означает, что он остается включенным, хотя я убрал руку с кнопки, теперь, когда я загружаю второй код и нажимаю кнопку он применяет то, что есть в if {} (означает, что оно мигает) только тогда, когда моя рука все еще находится на кнопке, но оно перестает мигать, когда я убираю руку, в отличие от первого случая, хотя у них есть структура, и разница только в том, что внутри, если {}, @sumer fattoum