RGB LED valdymas trim potenciometrais 2015.11.12 at 18:08

Labai nesudėtinga programėlė, gavosi labai trumpa, nes norėjau prasisukti su kuo mažiau teksto, prisioptimizavau tiek, kad net jokio kintamojo nereikia :).

 

// Iejimai

const int raudonas_pot = A0;          // ********************************
const int zalias_pot = A1;            // * Nustatom potenciometru pinus *
const int melynas_pot = A2;           // ********************************

// Isejimai

const int raudonas_led = 3;           // ********************************
const int zalias_led = 5;             // * Nustatom PWM isejimus LEDams *
const int melynas_led = 6;            // ********************************

void setup() {
  pinMode (raudonas_led, OUTPUT);     // ***************************************
  pinMode (zalias_led, OUTPUT);       // * Nustatom, kad LEDu pinai - isejimai *
  pinMode (melynas_led, OUTPUT);      // ***************************************
  digitalWrite (raudonas_led, HIGH);  // ***************************************
  digitalWrite (zalias_led, HIGH);    // * Inicializuojam LEDus (isjungiam)    *
  digitalWrite (melynas_led, HIGH);   // ***************************************
}

void loop() {

  analogWrite (raudonas_led, map (analogRead (raudonas_pot), 0, 1023, 0, 255));
  analogWrite (zalias_led, map (analogRead (zalias_pot), 0, 1023, 0, 255));
  analogWrite (melynas_led, map (analogRead (melynas_pot), 0, 1023, 0, 255));
}

Pačios programos gavosi tik trys eilutės, po vieną kiekvienam LEDui. Logika tokia – rašom (analorWrite) į atitinkamo LEDo išėjimą (pvz, raudonas_led) reikšmę, kuri gaunama „pavertus” (map)  nuskaitytą potenciometro vertę (analogRead (raudonas_pot)) į vertes nuo 0 iki 255 (0, 1023, 0, 255). Šito map’inimo reikia todėl, kad nuskaityto potenciometro reikšmės kinta nuo 0 iki 1023, o išėjimo PWM’as valdomas vertėm nuo 0 iki 255 (8 bitų PWM). Taigi, nenuMAPinus persipildys skaitliukas, ir nuo 0 iki 255 viskas bus OK, nuo 256 iki 512 (ir 513 – 768, ir 768 – 1023) vėl elgsis taip, lyg būtų nuo 0 iki 255, tai sukant potenciometrą bus net 4 zonos, kur LEDas nuo tamsaus keisis į maksimaliai degantį. Dar toks niuansas – Arduino Due ir Zero su defaultiniu 8 bitų PWMu gali būti nustatytas dirbti aukštesne 12 bitų rezoliucija, ir dirbti su reikšmėm nuo 0 iki 4095 (komanda analogWriteResolution(12)).

Ir trumpas video:

Patobulinimas – naudoti skaitmeninius potenciometrus, o ne tokius, analoginius/varžinius. Mano atveju RGB LEDas buvo su bendru anodu, jeigu kartais tektų pakeistį į LED su bendru katodu – truputį keičiasi ir programa. Iš esmės užtektų pakeisti tik čia:

digitalWrite (raudonas_led, LOW);
digitalWrite (zalias_led, LOW);
digitalWrite (melynas_led, LOW);

Leave a Reply

*