Код для попеременного выгорания двух лампочек

Я написал этот код

const int A = 3;
const int B = 5;
void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);

}

void loop() {
  for(int i=1;i<=255;i++)
  {
    int j =255-i;
    analogWrite(A,i);
    analogWrite(B,j);
    delay(100);
  }
  for(int i=255;i>0;i--)
  {
    int j =255-i;
    analogWrite(B,j);
    analogWrite(A,i);
    delay(100);
  }
}

Это правильный код? Если да, то можно ли его каким-либо образом изменить, чтобы сделать его лучше?

, 👍1

Обсуждение

Если не считать небольшой асимметрии, я не вижу проблемы (i меняется от 1 до 255, а j — от 0 до 254). Почему? Это не работает?, @st2000

Выбранные вами контакты должны работать на большинстве плат Arduino. Но задавая подобные вопросы, вам следует указать, какой тип платы Arduino вы используете., @st2000

Дайте определение «лучше». В вашем коде используется «задержка», что нормально, если вашему коду больше нечего делать, но совершенно неприемлемо, если ваш код будет использоваться в контексте другого кода. Это то, что вы хотите/нужно сделать «лучше» или нет?, @AnT

В зависимости от того, какого эффекта вы хотите добиться, вы можете добавить гамма-коррекцию., @Gerben


1 ответ


Лучший ответ:

0

Чтобы два цикла были более симметричными, пусть первый цикл проходит от 0 до 254: [0 .. 255), а второй цикл — от 255 до 1: [255 .. 0), поэтому обе итерации имеют по 255 значений каждая. .

Кроме того, в программировании довольно часто включается начальный элемент, а не конечный элемент (как в приведенных выше значениях: [start_element .. end_element).

Кроме того, для простой формулы (255 - i) я бы не использовал формулу. А чтобы было понятнее, задайте константы для значений min/max (0,255) и задержки.

Что вы получаете:

const int A = 3;
const int B = 5;

const int MIN_INTENSITY = 0;
const int MAX_INTENSITY = 255;
const int DELAY_TIME    = 100;

void setup() {
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() 
{
  for(int i = MIN_INTENSITY; i < MAX_INTENSITY ; i++)
  {
    analogWrite(A, i);
    analogWrite(B, MAX_INTENSITY - i);
    delay(DELAY_TIME);
  }

  for(int i = MAX_INTENSITY ; i > MIN_INTENSITY; i--)
  {
    analogWrite(B, MAX_INTENSITY - i);
    analogWrite(A, i);
    delay(DELAY_TIME);
  }
}

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

const int LED_1_PIN     =   3;
const int LED_2_PIN     =   5;

const int MIN_INTENSITY =   0;
const int MAX_INTENSITY = 255;
const int DELAY_TIME    = 100;

void setup()
{
  pinMode(LED_1_PIN, OUTPUT);
  pinMode(LED_2_PIN, OUTPUT);
}

void loop() 
{
  fade(MIN_INTENSITY, MAX_INTENSITY,  1);
  fade(MAX_INTENSITY, MIN_INTENSITY, -1);
}

void fade(int startIntensity, int endIntensity, int stepValue)
{
  for(int intensity = startIntensity; intensity < endIntensity; intensity += stepValue)
  {
    analogWrite(LED_1_PIN, intensity);
    analogWrite(LED_2_PIN, MAX_INTENSITY - intensity);
    delay(DELAY_TIME);
  }
}
,