Я хочу создать 10 уровней с помощью одной кнопки, но этот код показывает только уровень 1?

#include <Adafruit_NeoPixel.h>
const int PIN = 4;
const int NUMPIXELS = 10;
const int BUTTONPIN = 6;
int buttonState = 0;
int PINState = 0;
int level = 1;
int dt = 100;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pinMode(BUTTONPIN, INPUT);
  Serial.begin(9600);
}

void loop(void) {
Serial.println(buttonState);
  buttonState = digitalRead(BUTTONPIN);
  if (digitalRead(BUTTONPIN) == HIGH) {
    if (buttonState == 0) {
      buttonState = 1;
    } else {
      buttonState = 0;
    }
  }

  if (buttonState == 1) {
    opdracht(level);
  }
  else {
    if (level >= 10) {
      level++;
    } else {
      level = 1;
    }
    pixels.clear();
  }
}

//level 1
//void opdracht1() {
//  pixels.setPixelColor(0, pixels.Color(150, 0, 0));
//  pixels.setPixelColor(5, pixels.Color(0, 0, 150));
//  pixels.show();
//}

void opdracht(int x) {
  if (x == 1) { //level 1
    pixels.setPixelColor(0, pixels.Color(150, 0, 0));
    pixels.setPixelColor(5, pixels.Color(0, 0, 150));
    pixels.show();
  }

  if (x == 2) { //level 2
pixels.setPixelColor(8, pixels.Color(150, 0, 0));
pixels.setPixelColor(6, pixels.Color(150, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 0, 150));
pixels.show();
  }

, 👍1

Обсуждение

Я думаю, что if (level >= 10) { должно быть if (level < 10) {?, @Gerben

Ваш код чтения кнопки не работает. Он регистрирует нажатие кнопки только в том случае, если кнопка нажата, когда код находится точно между двумя строками digitalRead. Что очень маловероятно. Попробуйте добавить еще несколько переменных вместо того, чтобы пытаться использовать buttonState для трех разных целей. Подсказка: используйте buttonState для текущего состояния кнопки; используйте что-то вроде oldButtonState для состояния кнопки в последнем цикле; и используйте что-то вроде buttonPressed, чтобы указать, когда кнопка впервые нажата (что вы затем используете для увеличения level), @Gerben

спасибо! Я попытаюсь использовать oldButtonState и buttonPressed., @louise moons


1 ответ


1

Вы забыли задать вопрос. Поэтому я предполагаю, что предполагаемый вопрос звучит так: “Почему этот код всегда показывает уровень 1?”, И я попытаюсь ответить на этот вопрос.

Переменный уровень определяется здесь:

int level = 1;

Его начальное значение равно 1. Затем он обновляется здесь:

if (level >= 10) {
  level++;
} else {
  level = 1;
}

При первом запуске этого раздела кода level имеет свое начальное значение, а именно 1. Условие в if принимает значение false, тогда уровень оператора

level = 1;

выполняется, который присваивает значение 1 уровню (что не имеет никакого эффекта, так как это уже было его значением в любом случае).

При следующем запуске этого раздела кода уровень по-прежнему будет иметь значение 1, и эффект будет таким же, как и в предыдущий раз.

,

оу я понял спасибо!! что мне нужно изменить, чтобы изменить значение?, @louise moons

@louisemoons: При каком условии вы хотите, чтобы «уровень» увеличивался? Можете ли вы закончить предложение «уровень должен быть увеличен, если…”?, @Edgar Bonet

Еще один, более сильный намек. Ваш текущий код говорит: «Если уровень больше или равен 10, увеличьте его». Он начинается с 1, и никакой другой код не меняет его, так что выражение if никогда не будет истинным. Разве вы не хотите увеличивать его, если оно меньше 10?, @Duncan C

Уровень @EdgarBonet должен увеличиваться при нажатии кнопки, @louise moons