|

«Северное сияние» на Arduino

В этой статье расскажу про свой проект на Arduino — «Северное сияние».

Компоненты:

  1. Arduino (любая);
  2. RGB-светодиод;
  3. Резистор на 300-1000 Ом;
  4. Провода;
  5. Макетная плата по желанию.

Заключается проект в том, что цвет свечения светодиода плавно меняется. Реализовано это в скетче «просто, но сложно», потому что есть много простых функций с циклами for.

Скопировать код можно здесь:

// Пины для RGB светодиода
#define RED_PIN 3
#define GREEN_PIN 5
#define BLUE_PIN 6

// Служебные переменные
int redLight = 0;
int blueLight = 0;
int greenLight = 0;
int delTime = 1;

void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
}

void loop() {
  for(int Gi = 0; Gi < 255; Gi++){ // Прибавляем зеленый (красный - жёлтый)
    analogWrite(RED_PIN, 255);
    analogWrite(GREEN_PIN, Gi);
    analogWrite(BLUE_PIN, 0);
    delay(delTime);
  }
  for(int Ri = 255; Ri > 0; Ri--){ // Уменьшаем красный (жёлтый - зеленый)
    analogWrite(RED_PIN, Ri);
    analogWrite(GREEN_PIN, 255);
    analogWrite(BLUE_PIN, 0);
    delay(delTime);
  }
  for(int Bi = 0; Bi < 255; Bi++){ // Прибавляем синий (зелёный - салатовый)
    analogWrite(RED_PIN, 0);
    analogWrite(GREEN_PIN, 255);
    analogWrite(BLUE_PIN, Bi);
    delay(delTime);
  }
  for(int Gi = 255; Gi > 0; Gi--){ // Уменьшаем зелёный (салатовый - синий)
    analogWrite(RED_PIN, 0);
    analogWrite(GREEN_PIN, Gi);
    analogWrite(BLUE_PIN, 255);
    delay(delTime);
  }
  for(int Ri = 0; Ri < 255; Ri++){ // Прибавляем красный (синий - фиолетовый)
    analogWrite(RED_PIN, Ri);
    analogWrite(GREEN_PIN, 0);
    analogWrite(BLUE_PIN, 255);
    delay(delTime);
  }
  for(int Bi = 255; Bi > 0; Bi--){ // Уменьшаем синий (фиолетовый - красный)
    analogWrite(RED_PIN, 255);
    analogWrite(GREEN_PIN, 0);
    analogWrite(BLUE_PIN, Bi);
    delay(delTime);
  }
}

Подключаем светодиод к пинам с ШИМ — 3, 5 и 6. А также к земле через резистор — 300-1000 Ом.


Я доработал этот проект, добавил потенциометр на пине А0. С его помощью можно управлять яркостью свечения светодиода.

Код можно скопировать здесь:

// Пины для RGB светодиода
#define RED_PIN 3
#define GREEN_PIN 5
#define BLUE_PIN 6

// Пин для потенциометра
#define LIGHTPOT_PIN A0

// Служебные переменные
int redLight = 0;
int blueLight = 0;
int greenLight = 0;
int delTime = 10;
int potVal = 0;
float brightness;

void setup() {
  pinMode(LIGHTPOT_PIN, INPUT);
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
}

void loop() {
  for(int Gi = 0; Gi < 255; Gi++){ // Прибавляем зеленый (красный - жёлтый)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    greenLight = Gi - brightness;
    if(Gi < brightness){
      greenLight = 0;
    }
    analogWrite(RED_PIN, 255-brightness);
    analogWrite(GREEN_PIN, greenLight);
    analogWrite(BLUE_PIN, 0);
    delay(delTime);
  }
  for(int Ri = 255; Ri > 0; Ri--){ // Уменьшаем красный (жёлтый - зеленый)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    redLight = Ri - brightness;
    if(Ri < brightness){
      redLight = 0;
    }
    analogWrite(RED_PIN, redLight);
    analogWrite(GREEN_PIN, 255-brightness);
    analogWrite(BLUE_PIN, 0);
    delay(delTime);
  }
  for(int Bi = 0; Bi < 255; Bi++){ // Прибавляем синий (зелёный - салатовый)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    blueLight = Bi - brightness;
    if(Bi < brightness){
      blueLight = 0;
    }
    analogWrite(RED_PIN, 0);
    analogWrite(GREEN_PIN, 255-brightness);
    analogWrite(BLUE_PIN, blueLight);
    delay(delTime);
  }
  for(int Gi = 255; Gi > 0; Gi--){ // Уменьшаем зелёный (салатовый - синий)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    greenLight = Gi - brightness;
    if(Gi < brightness){
      greenLight = 0;
    }
    analogWrite(RED_PIN, 0);
    analogWrite(GREEN_PIN, greenLight);
    analogWrite(BLUE_PIN, 255-brightness);
    delay(delTime);
  }
  for(int Ri = 0; Ri < 255; Ri++){ // Прибавляем красный (синий - фиолетовый)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    redLight = Ri - brightness;
    if(Ri < brightness){
      redLight = 0;
    }
    analogWrite(RED_PIN, redLight);
    analogWrite(GREEN_PIN, 0);
    analogWrite(BLUE_PIN, 255-brightness);
    delay(delTime);
  }
  for(int Bi = 255; Bi > 0; Bi--){ // Уменьшаем синий (фиолетовый - красный)
    potVal = analogRead(A0);
    brightness = map(potVal, 0, 1023, 255, 0);
    blueLight = Bi - brightness;
    if(Bi < brightness){
      blueLight = 0;
    }
    analogWrite(RED_PIN, 255-brightness);
    analogWrite(GREEN_PIN, 0);
    analogWrite(BLUE_PIN, blueLight);
    delay(delTime);
  }
}

Протестировать работу обновлённого проекта можно в симуляторе Wokwi (регистрация не обязательна).

Посмотреть видео демонстрацию проекта на Rutube.

Удачи в сборке проекта! 😊

5/5 - (4 голоса)


Поделись!