Почему этот простой скетч не работает? Мне нужно перебирать три переменные при последовательном нажатии кнопок. Всё время зависает на первой. Вот код.

Я знаю, что упускаю что-то элементарное, но не могу найти проблему. Кнопка работает правильно. Плата — Nano Connect. Показания монитора застряли на первой строке, хотя, очевидно , всё повторяется как надо.

int var = 0;
int sens = 2;
int grn = 0;
int red = 0;
int blu = 0;

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(5, INPUT);   //switch pulled low
  pinMode(12, OUTPUT); // N/A
  pinMode(11, OUTPUT); // N/A
  pinMode(10, OUTPUT); // N/A
  digitalWrite(3, HIGH); //supply to switch
  grn = HIGH;
}

void loop() {
  int button = 0;
  button = digitalRead(5);
  // Serial.println(button);

  if (button == HIGH && blu == HIGH) {
    blu = HIGH;
  }
  if (blu == HIGH) {
    blu = LOW;
    red = HIGH;
  }
  if (button == HIGH && red == HIGH) {
    red = HIGH;
  }
  if (red == HIGH) {
    red = LOW;
    grn = HIGH;
  }
  if (button == HIGH && grn == HIGH) {
    grn = HIGH;
  }
  if (grn == HIGH) {
    grn = LOW;
    blu = HIGH;
  }
  
  if (blu == HIGH) {
    Serial.println("blu");
  }
  if (red == HIGH) {
    Serial.println("red");
  }
  if (grn == HIGH) {
    Serial.println("grn");
  }
}

, 👍-1

Обсуждение

Вы также можете рассмотреть возможность использования конструкции else if вместо просто if, чтобы предотвратить переопределение предыдущих условий более простыми условиями. if (blu == HIGH) переопределяет if (button == HIGH && blu == HIGH). Другой подход, поскольку вы имеете дело только с четырьмя булевыми переменными: button, blue, red и grn, заключается в использовании 16 условных выражений, перечисляющих все возможные комбинации значений этих переменных и действия, которые необходимо выполнить., @6v6gt

ваш эскиз излишне сложен... вы отслеживаете три флага: красный, синий, зеленый... все, что вам нужно, это счетчик, который считает от 0 до 2 и повторяет... а затем зажигает светодиод в ответ на значение счетчика, @jsotola


1 ответ


2

Причина в следующем: Ваша логика цикла такова, что условия if (<color> == HIGH) всегда истинны. Перед последовательным выводом переменные содержат следующие значения:

  • blu — ВЫСОКИЙ;
  • красный — НИЗКИЙ;
  • grn — НИЗКИЙ.

Это также не зависит от уровня на button.

Если бы все переменные имели значение LOW, не было бы пути установить значение HIGH для одной из них. Поскольку вы начинаете с grn, установленного в значение HIGH, эта комбинация не может быть достигнута.

Это показано в следующей таблице.

Исходная строка Замечание синий красный grn
повторяется из предыдущего цикла ВЫСОКИЙ НИЗКИЙ НИЗКИЙ
если (button == HIGH && blu == HIGH) { не имеет значения : : :
blu = ВЫСОКИЙ; казнен или нет уже ВЫСОКИЙ : :
} : : : :
если (blu == HIGH) { верно : : :
blu = НИЗКИЙ; казнен установить LOW : :
красный = ВЫСОКИЙ; казнен : установить ВЫСОКИЙ :
} : : : :
если (кнопка == ВЫСОКИЙ && красный == ВЫСОКИЙ) { не имеет значения : : :
красный = ВЫСОКИЙ; казнен или нет : уже ВЫСОКИЙ :
} : : : :
если (красный == ВЫСОКИЙ) { верно : : :
красный = НИЗКИЙ; казнен : установить LOW :
grn = HIGH; казнен : : установить ВЫСОКИЙ
} : : : :
если (button == HIGH && grn == HIGH) { не имеет значения : : :
grn = HIGH; казнен или нет : : уже ВЫСОКИЙ
} : : : :
если (grn == HIGH) { верно : : :
grn = НИЗКИЙ; казнен : : установить LOW
blu = ВЫСОКИЙ; казнен установить ВЫСОКИЙ : :
} : : : :

При исследовании подобных проблем возьмите ручку и бумагу и попробуйте себя в роли Arduino. В качестве альтернативы можно использовать множество функций Serial.print() для отслеживания значений переменных.

,