Быстро написал этот код для постепенного исчезновения RGB-светодиода по всему спектру RGB (я думаю) и задался вопросом, есть ли более эффективный способ кодирования всего в основном цикле? Это кажется слишком сложным.

(Кстати, я знаю, что скорость меняется, когда я меняю яркость.)

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

int brightness = 255;
int fadeSpeed = 25;

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, i);
    delay(fadeSpeed);
  }
}

void loop() {
  for (int i=0; i<brightness; i++) {
    analogWrite(greenPin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, brightness - i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(bluePin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(greenPin, brightness - i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(bluePin, brightness - i);
    delay(fadeSpeed);
  }
}
-1
A_HotMashing 21 Янв 2021 в 01:34

2 ответа

Лучший ответ

Если это просто для минимизации повторяющихся похожих строк кода, вы можете определить столько функций, сколько хотите, и определить параметры так, как вам удобно:

void loop() {
   fadeUp(greenPin);
   fadeUp(redPin);
   fadeUp(bluePin);
   fadeDn(greenPin);
   fadeDn(redPin);
   fadeDn(bluePin);
}

void fadeUp(byte pin) {
   fade(pin, 0, brightness, +1);
}
void fadeDn(byte pin) {
   fade(pin, brightness, 0, -1);
}

void fade(byte pin, byte start, byte end, byte delta) {
   for (byte i=start; i!=end; i+=delta) {
       analogWrite(pin, i);
       delay(fadeSpeed);
   }
}

Кстати: ваше решение не покрывает «весь спектр RGB»

0
datafiddler 21 Янв 2021 в 13:45

Для того, что вы делаете, можно использовать несколько циклов. Вы могли бы создать таблицу цветов и интерполировать между ними или объединить общие части в одну процедуру, которую вы вызываете ... Определите текущие значения r, g, b и сделайте процедуру setleds(r, g, b). Каждый ваш цикл просто настроит один цвет и вызовет общую процедуру. Это дает хороший эффект отвода аппаратных частей от решений, связанных с управлением. (обновление выводов по сравнению с вычислением значений rgb). Но, может быть, это не имеет значения.

Обратите внимание, что loop() не будет запускаться очень часто из-за всех ваших задержек, и это может повлиять на последовательное чтение, если оно вам понадобится позже.

Другая проблема заключается в том, что вы меняете RGB, но для создания радуги нам понадобится HSV - значение насыщенности оттенка. Есть много людей с примерами. Вот один: https://eduardofv.com/ 15.01.2011 / arduino-rgb-led-hsv-color-wheel /

Я бы пошел дальше его примера и избавился от цикла в цикле. Следите за текущим оттенком и увеличивайте его каждый раз при вызове loop и обновляйте светодиоды. Оберните вокруг, когда вы нажмете 360. Кроме того, это упростит обратное направление или случайное перемещение цветов.

HTH! Радоваться, веселиться!

2
aMike 20 Янв 2021 в 23:49