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