Почему этот простой скетч не работает? Мне нужно перебирать три переменные при последовательном нажатии кнопок. Всё время зависает на первой. Вот код.
Я знаю, что упускаю что-то элементарное, но не могу найти проблему. Кнопка работает правильно. Плата — 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");
}
}
@modelralph, 👍-1
Обсуждение1 ответ
Причина в следующем: Ваша логика цикла такова, что условия 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() для отслеживания значений переменных.
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
- Вопрос новичка с 4-контактной кнопкой
Вы также можете рассмотреть возможность использования конструкции
else ifвместо простоif, чтобы предотвратить переопределение предыдущих условий более простыми условиями.if (blu == HIGH)переопределяетif (button == HIGH && blu == HIGH). Другой подход, поскольку вы имеете дело только с четырьмя булевыми переменными: button, blue, red и grn, заключается в использовании 16 условных выражений, перечисляющих все возможные комбинации значений этих переменных и действия, которые необходимо выполнить., @6v6gtваш эскиз излишне сложен... вы отслеживаете три флага: красный, синий, зеленый... все, что вам нужно, это счетчик, который считает от 0 до 2 и повторяет... а затем зажигает светодиод в ответ на значение счетчика, @jsotola