Попытка включить RGB с помощью кнопок с analogWrite не работает.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я только что запустил Arduino, как 2 дня назад, я следил за некоторыми учебными пособиями на YouTube, и я пытался сделать это сам, но я не могу понять, почему это не работает, не могу найти, что я делаю неправильно.

НАСТРОЙКА (я уже протестировал ее с помощью другого кода, который доказал мне, что настройка работает, каждая кнопка и каждый вывод RGB-светодиода, я точно знаю, что этот код не работает)

SIDE PICTURE ABOVE PICTURE

Я пытаюсь зажечь светодиод КРАСНЫМ цветом благодаря второй кнопке (слева), зеленым - с третьей, синим - с четвертой, и первой, чтобы выключить светодиод. Я также пытаюсь сделать идеальный визуальный переход между каждым цветом от 255 до 0 десятичных знаков.

Вот мой код:

#define BLUE 10
#define GREEN 11
#define RED 5

int buttonBlueOn = 9;
int buttonGreenOn = 8;
int buttonRedOn = 3;
int buttonRgbLedOff = 2;


void setup() {
  // поместите сюда свой установочный код, чтобы запустить его один раз:
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(buttonRedOn, INPUT_PULLUP);
  pinMode(buttonGreenOn, INPUT_PULLUP);
  pinMode(buttonBlueOn, INPUT_PULLUP);
  pinMode(buttonRgbLedOff, INPUT_PULLUP);

}

int redValue;
int greenValue;
int blueValue;

void loop() {
  // поместите сюда свой основной код для повторного запуска:

  // -------------------------------- КРАСНЫЙ ------------------------------ //

#define delayTime 20

  if (digitalRead(buttonRedOn) == LOW)
  {
    digitalWrite(RED, HIGH);
    redValue = 255;
  }

  if (digitalRead(buttonRedOn) == LOW and GREEN == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // зеленый исчезает, красный становится полным
    {
      redValue += 1;
      greenValue -= 1;
      analogWrite(RED, redValue);
      analogWrite(GREEN, greenValue);
      delay(delayTime);
    }
  }

  if (digitalRead(buttonRedOn) == LOW and BLUE == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // синий исчезает, красный становится полным
    {
      redValue += 1;
      blueValue -= 1;
      analogWrite(RED, redValue);
      analogWrite(BLUE, blueValue);
      delay(delayTime);
    }
  }


  // -------------------------------- ЗЕЛЕНЫЙ ------------------------------ //

  if (digitalRead(buttonGreenOn) == LOW)
  {
    digitalWrite(GREEN , HIGH);
    greenValue = 255;
  }

  if (digitalRead(buttonGreenOn) == LOW and RED == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // исчезает красный, появляется зеленый.
    {
      greenValue += 1;
      redValue -= 1;
      analogWrite(RED, redValue);
      analogWrite(GREEN, greenValue);
      delay(delayTime);
    }
  }

  if (digitalRead(buttonGreenOn) == LOW and BLUE == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // исчезает синий, появляется зеленый.
    {
      greenValue += 1;
      blueValue -= 1;
      analogWrite(BLUE, blueValue);
      analogWrite(GREEN, greenValue);
      delay(delayTime);
    }
  }

  // -------------------------------- СИНИЙ ------------------------------ //

  if (digitalRead(buttonBlueOn) == LOW)
  {
    digitalWrite(BLUE, HIGH);
    blueValue = 255;
  }

  if (digitalRead(buttonBlueOn) == LOW and RED == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // исчезает красный, синий становится полным
    {
      blueValue += 1;
      redValue -= 1;
      analogWrite(RED, redValue);
      analogWrite(BLUE, blueValue);
      delay(delayTime);
    }
  }

  if (digitalRead(buttonBlueOn) == LOW and GREEN == HIGH)
  {
    for (int i = 0; i < 255; i += 1) // зеленый исчезает, синий становится полным
    {
      blueValue += 1;
      greenValue -= 1;
      analogWrite(BLUE, blueValue);
      analogWrite(GREEN, greenValue);
      delay(delayTime);
    }
  }

  // -------------------------------- ВЫКЛЮЧЕН ------------------------------ //


  if (digitalRead (buttonRgbLedOff) == LOW)
  {
    digitalWrite(GREEN, LOW);
    digitalWrite(RED, LOW);
    digitalWrite(BLUE, LOW);
  }


}

ЧТО ОН ДЕЛАЕТ: Вообще ничего, ничего не загорается, ничего не происходит, я немного сбит с толку

Я такой новичок в этом, извините, если я делаю что-то не так на этом форуме

, 👍1

Обсуждение

Похоже, вы не подключили кнопки к заземлению., @Edgar Bonet

Вы подключили кнопки к синей шине питания макетной платы, но не подключили ее к заземлению на Arduino, @chrisl

вставьте слой разделения между обнаружением нажатия клавиши и результирующим изменением яркости светодиода ... не выполняйте команду "при нажатии кнопки установить яркость светодиода... вместо этого сделайте "если нажата кнопка, установите переменную deltaRed=1" ... затем далее в loop() делаем redValue += deltaRed; горит красный светодиод`, @jsotola

ЗЕЛЕНЫЙ == ВЫСОКИЙ никогда не будет истинным, это сравнение между двумя константами, @Ben Voigt


1 ответ


2

Ваша программа делает вещи слишком сложными. Вам следует переосмыслить всю свою стратегию.

Мой предпочтительный метод - иметь "целевой" цвет и "текущий" цвет. Когда вы нажимаете кнопку, вы просто меняете свой целевой цвет. И затем на каждой итерации с помощью функции loop() (либо замедленной с небольшой задержкой (), либо запускаемой с помощью millis()) вы сравниваете целевой и текущий цвета, и если они отличаются, то перемещаете текущий цвет на шаг ближе к целевому цвету.

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

Некоторое время назад я написал сообщение в блоге на эту тему, которое может оказаться вам полезным.

,