Puslapiai

2012 m. balandžio 4 d., trečiadienis

RGB LED mirksėjimas. 3 dalis.

Šiandien ypatinga diena, nes šiandien išmokysiu daugiau programavimo subtilybių. Jos bus kur kas sudėtingesnės už prieš tai buvusiose pamokose ir turbūt tik keli žmonės supras kodą be papildomų paaiškinimų, todėl raginu susikaupti ir pasiruošti sudėtingesnio programavimo pagrindams.


Ko prireiks šiai pamokai?

Be prieš tai naudojamų elektronikos komponentų prireiks:

  • 1x 10k omų 0.25W rezistoriaus
  • DIP jungiklis
Žinoma, norint galima naudoti kelias varžas ir išgauti 10 kilo omų, bet atsižvelgiant į tai, kad jų prireiks ne tik šiam kartui, tai rekomenduoju nusipirkti ir nevargti. Su jungikliu ta pati situacija - galima sujunginėti laidukus rankiniu būdu apart mygtuko junginėjimo. Spręsti Jums.

Aš naudosiu DIP jungiklį (žr. nuotrauką), bet Jūs galite naudoti bet kokį kitą, svarbu tik tai, kad kojelės tilptų į maketavimo plokštę. Kelių jungčių jungiklis nesvarbu, nes naudosime tik vieną.



Sujunginėjam laidus

Šį kartą atliksime patobulinimų, bet pagrindinė schema nepakitusi, todėl jei pamiršote ką su kuo sujunginėjome, tai paprašysiu grįžti į pirmą dalį ir susijunginėti, o tada galima tęsti sugrįžus čia.
Braižymo programos dar neįsirašiau, todėl vėl pabandysiu nupasakoti kas su kuo jungiama.
Ties DIP jungiklio įėjimu sujungiame laiduką su 5V pin, o ties jungiklio išėjimu įkišame 10k omų varžą, kuri sujungiama su GND (minusas) pin, kuris yra šalia 5V pin. Tuomet ties varžos įėjimu (pliuso atžvilgiu) sujungiame dar vieną laiduką su pin 2.

Kodas

Šį kartą nebebus jokių paaiškinimų.

/* RGB LED mirksėjimas
  Naudoja viena RGB LED.
  Spalvu keitinejimosi ijungimas su DIP jungikliu.
  http://arduinorobot.blogspot.com
*/

const int rgb[] = {9,10,11};
const int time = 250;
const int switchPin = 2;

void setup () {
  for (int i=0; i<3; i++) pinMode(rgb[i], OUTPUT);
  pinMode (switchPin, INPUT);
}

void loop () {
  int newPin = 0;
  int oldPin = 0;
  int bounce1 = digitalRead (switchPin);
  delay(25);
  int bounce2 = digitalRead (switchPin);
  
  while ((bounce1 == bounce2) && (bounce1 == LOW)) {
    oldPin = newPin;
    newPin++;
    
    if (newPin == 3) newPin = 0;
    
    digitalWrite(rgb[oldPin], HIGH);
    delay(time);
    digitalWrite(rgb[newPin], HIGH);
    delay(time);
    digitalWrite(rgb[oldPin], LOW);
    
    if (newPin == 0) {
      for (int i=0; i<3; i++) digitalWrite(rgb[i], HIGH);
      delay(time);
      for (int i=0; i<3; i++) digitalWrite(rgb[i], LOW);
    }
    bounce1 = digitalRead(switchPin);
    delay(25);
    bounce2 = digitalRead(switchPin);
  }
  for (int i=0; i<3; i++) digitalWrite(rgb[i], LOW);
  delay(25);
}


Nėra taip sudėtinga, kaip gali pasirodyti iš pirmo žvilgsnio. Trumpai tariant, tai rgb[] yra masyvas, kuriame patalpinome 9, 10 ir 11 skaičius, jų indeksai yra 0, 1, 2, todėl rgb[1] = 10.  Šis RGB masyvas buvo naudojamas OUTPUT pin. bounce1 ir bounce2 naudojami, kad nuskaityti INPUT pinMode(switchPin, INPUT).  Nuskaitom 2 kartus ir palyginame ar vienodos reikšmės, jei vienodos, tai keitinėjame spalvas. oldPin ir newPin naudojami kaip rgb lemputės spalvų keitinėjimams, tarkim oldPin įjungiamas, tada įjungiamas newPin, tada užgesinamas oldPin ir ciklas kartojasi pridedant +1 prie newPin, taip keitinėjame spalvas, bet kai newPin = 3, tai pakeičiama jo reikšmė į 0, nes rgb[3] masyve nėra, todėl nebeveiktų programa. Kai newPin = 0, tai iš pradžių uždegame visas RGB spalvas, o tada užgesiname visas spalvas. Atkreipkite dėmesį, kad užgesinus vieną spalvą nėra laukiama, todėl prieš užsidegant visoms spalvoms akis net nepastebi jog prieš tai turėjo pasirodyti raudona spalva dar kartą, bet taip greitai mikrokontroleris įjungia visas spalvas, kad nepastebime.  Jei jungiklis įjungiamas, tai visos spalvos užgesinamos iki jungilį vėl įjungsime. Kodas nėra idealus, bet naudoti laisvai galima. Jei kažko niekaip nesuprantate, tai parašykite, paaiškinsiu komentaruose.

Komentarų nėra:

Rašyti komentarą