Arduino - Кнопка для запуска/остановки цикла

button loop

По сути, я пытаюсь создать устройство, в котором при нажатии кнопки запускается цикл. Когда я снова нажимаю эту кнопку, цикл останавливается. Сейчас я подключил его к последовательному порту. Он запускается правильно, без выходных данных. Когда я нажимаю кнопку, цикл начинается, и он непрерывно выдает «включено». Когда я снова нажимаю кнопку... ничего не происходит. В идеале он должен перестать выдавать «включено» и просто вернуться к ничегонеделанию.

#include <Bounce2.h>

Bounce bouncer = Bounce();
const int W = 10;
bool wOn = false;

void setup() {
  Serial.begin(9600);
  pinMode(W, INPUT_PULLUP);
  bouncer.attach(W);
  bouncer.interval(5);
}

void loop() {
  bouncer.update();
  if (bouncer.read() == LOW) {
    wOn = !wOn;
  }

  if (wOn > 0) {
    Serial.println("toggled on");
  }
}

, 👍1


2 ответа


1

Если вы измените свой эскиз на этот, вы увидите проблему:

const int W = 10;
bool wOn = false;

void setup() {
  Serial.begin(9600);
  pinMode(W, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(W) == LOW) {
    wOn = !wOn;
  }

  if (wOn) {
    //Serial.println("toggled on");
  }
  Serial.println(wOn);
}

Контакты кнопки «дребезжат» (Google «contact bounce»), отправляя несколько сигналов от низкого к высокому. Есть несколько программных решений, которые устранят эту проблему. Взгляните на: arduino.cc/en/Tutorial/Debounce. Есть несколько библиотек, которые упрощают устранение дребезга кнопок: playground.arduino.cc/Code/Debounce и playground.arduino.cc/Code/Bounce

,

Я добавил Bounce2 (я считаю, правильно), и результат все еще тот же. Я добавил этот бит, чтобы увидеть значение wOn, и оно правильно меняется между 0 и 1. Все еще тот же конечный результат. Я обновил свой фрагмент кода, чтобы отразить свои изменения., @C Steph

Кажется, он только меняет wOn обратно на false, когда я нажимаю на него, а затем мгновенно возвращается к 1. Проблема, похоже, в том, что он бесконечно меняет wOn обратно. Может быть, мне нужно учитывать изменения состояния?, @C Steph


-1

Исправлено. Решение, которое я использовал, состояло в том, чтобы добавить проверку изменения состояния с помощью .fell(), что вы увидите ниже. Я добавил проверку изменения состояния с помощью Bounce2.fell(), вот так:

  if (bouncer.read() == LOW && bouncer.fell()) {
,

Пожалуйста, используйте ссылку «Изменить» в вашем вопросе, чтобы добавить дополнительную информацию. Кнопка «Отправить ответ» должна использоваться только для полных ответов на вопрос. - [Из обзора](/review/low-quality-posts/36734), @VE7JRO

Я предлагаю @C Steph отредактировать свой вопрос и вернуть исходный неработающий код. Затем вы можете отредактировать свой ответ и использовать свой полный функциональный скетч с библиотекой Bounce2. Ваш текущий ответ состоит всего из 7 слов, поэтому он неполный. Примерно через 24 часа вы сможете принять свой собственный ответ, и я призываю вас это сделать. Это даст вам дополнительную репутацию в сети Arduino.SE., @VE7JRO

Если вы отредактируете свой вопрос с помощью исправления, то ответы (и ваш вопрос) не будут иметь *никакого* смысла. @VE7JRO - Я сделал это для OP., @Greenonline

Я искал, Вопрос = сломанный код, Ответ = полностью исправленный и рабочий код. Было 2 правки OP в их исходном Вопросе. Я надеялся, что OP изменит Вопрос обратно на эскиз, который они впервые опубликовали (он не использовал библиотеку Bounce2 и был идентичен эскизу в моем ответе, за исключением комментария к коду и дополнительного Serial.println, который я добавил). Есть ли способ вернуться назад через процесс редактирования вопроса, чтобы восстановить первый пост OP?, @VE7JRO

Я только что попытался отредактировать вопрос и не смог вернуться к первому посту OP. Скорее всего, мой уровень репутации недостаточно высок для доступа к информации или только модератор сайта может вносить такие изменения., @VE7JRO