Valguskett

Projektiülesanne: Valguskett

Eesmärk:

Luua valguskett, mis koosneb mitmest LED-ist (tavalised või RGB), ning töötab mitmes erinevas valgusrežiimis. 

Režiimi saab valida potentsiomeetri abil. Iga režiim annab valguskettale erineva käitumise või visuaalse efekti. 

Projekt arendab teadmisi Arduino programmeerimisest, LED-ide juhtimisest, massiivide kasutamisest ja andurite lugemisest.

Töö kirjeldus:
Koostage diagramm 5 LED-i töörežiimiga, mida lülitatakse potentsiomeetrit pöörates

Kasutatud komponendid:
Arduino UNO plaat (1tk)
Juhtmed (14tk)
Takisti (9tk,  220 Ω)
LED (9tk: 3 punane, 3 roheline, 3 kollane)
Potentsiomeeter (1tk, 250 kΩ)

Töö protsess:
Ühendage dioodid, takisti, juhtmed ja potentsiomeeter plaadiga.
Režiim muutub, keerates potentsiomeetril olevat nuppu.

Loodud režiimid:
1. Kõik LED-id vilguvad korraga. (void all_on)
2. LED-id vilguvad järjest ükshaaval. (void consecutive)
3. LED-id vilguvad värvi kaupa (RGB korral – punased, rohelised, sinised). (void rgb)
4. LED-id vilguvad juhuslikus järjekorras (küünlaefekt). (void candleEffect)
5. “Jooksva tule” efekt – valgus liigub järjest läbi LED-ide. (void running_light)

Uued funktsioonid, mis oli kasutatud

Massiiv LED-ide jaoks:

int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10};
int arrayLength = sizeof(ledPins) / sizeof(ledPins[0]);
LED-ide seadistamine:
void setup() {
  for (int i = 0; i < arrayLength; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

Režiimi valimine potentsiomeetri abil:

int potValue = analogRead(A0);
int mode = map(potValue, 0, 1023, 0, 4); // 0–4 = viis režiimi
mode = constrain(mode, 0, 4);

random() funktsioon candleEffect režiimis:

void candleEffect() {
  for (int i = 0; i < arrayLength; i++) {
    int flickerChance = random(0, 10); // 0–9
    if (flickerChance < 3) { // Umbes 30% tõenäosus, et LED vilgub
      digitalWrite(ledPins[i], HIGH);
      delay(random(10, 100)); // juhuslik vilkumise kestus
      digitalWrite(ledPins[i], LOW);
      delay(random(10, 50));  // juhuslik paus
    }
  }
}
Käivitav kood:
// объявление используемых пинов
int ledPins[] = {13, 12, 11, 10, 9, 8, 7, 6, 5};
int arrayLength = sizeof(ledPins) / sizeof(ledPins[0]);
 
// разделение на массивы по цвету для функции candleEffect()
const uint8_t redPins[]   = {5, 8, 11};
const uint8_t greenPins[] = {6, 9, 12};
const uint8_t bluePins[]  = {7, 10, 13};
 
void setPins(const uint8_t pins[], size_t n, uint8_t state)
{
    for (size_t i = 0; i < n; ++i) {
        digitalWrite(pins[i], state);
    }
}
 
void setup() {
  for (int i = 0; i < arrayLength; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
} 
 
//горят все леды
void all_on()
{
  for (int i = 0; i < arrayLength; i++) {
    digitalWrite(ledPins[i], HIGH);}
    delay(1000);
  for (int i = 0; i < arrayLength; i++) {
    digitalWrite(ledPins[i], LOW);}
    delay(1000);
}
 
//все леды горят по порядку
void consecutive()
{
  for (int i = 0; i < arrayLength; i++) {
    digitalWrite(ledPins[i], HIGH);
    delay(1000);
    digitalWrite(ledPins[i], LOW);
    delay(1000);
}
}
 
//горят только леды своего цвета
void rgb()
{
    // горит только массив из красных ледов
    setPins(redPins,   sizeof(redPins),   HIGH);
    delay(1000);
    setPins(redPins,   sizeof(redPins),   LOW);
    delay(1000);
 
    // горит только массив из зеленых ледов
    setPins(greenPins, sizeof(greenPins), HIGH);
    delay(1000);
    setPins(greenPins, sizeof(greenPins), LOW);
    delay(1000);
 
    // горит только массив из синих ледов
    setPins(bluePins,  sizeof(bluePins),  HIGH);
    delay(1000);
    setPins(bluePins,  sizeof(bluePins),  LOW);
    delay(1000);
}
 
//эффект свечи - загораются случайные леды быстро
void candleEffect() {
  for (int i = 0; i < arrayLength; i++) {
    int flickerChance = random(0, 10); // 0–9
    if (flickerChance < 3) { // Umbes 30% tõenäosus, et LED vilgub
      digitalWrite(ledPins[i], HIGH);
      delay(random(10, 100)); // juhuslik vilkumise kestus
      digitalWrite(ledPins[i], LOW);
      delay(random(10, 50));  // juhuslik paus
    }
  }
}
 
//бегущий свет - быстро загораются и тухнут леды по порядку
void running_light()
{
  for (int i = 0; i < arrayLength; i++) {
    digitalWrite(ledPins[i], HIGH);
    delay(50);
    digitalWrite(ledPins[i], LOW);
    delay(50);
}
}
 
void loop() {
  int potValue = analogRead(A0);
  int mode = map(potValue, 0, 1023, 0, 4); // 0–4 = viis režiimi
 
// передача значений режимов потенциометру
  mode = constrain(mode, 0, 4);
  if (mode==0)
  {
    all_on();
  }
  else if (mode==1)
  {
    consecutive();
  }
  else if (mode==2)
  {
    rgb();
  }
  else if (mode==3)
  {
    running_light();
  }
  else if (mode==4)
  {
    candleEffect();
  }
}
Skeem Tinkercad'is

ru_RUРусский