Puslapiai

2012 m. kovo 27 d., antradienis

RGB LED mirksėjimas. 2 dalis.

Pirmoje pamokoje išmokome RGB šviesos diodo spalvas keitinėti po vieną, o šioje pamokoje pabandysime panaudoti sudėtingesnius veiksmus, kaip spalvų maišymas ir išgavimas naujų, taip gilinsimės toliau į programavimo pagrindus. Tie kurie lengvai supratote pirmąją dalį, tai manau ši pamoka taip pat bus lengvai įkandama.

Šioje dalyje nereikės jokių papildomų dalių ar perjunginėti laidukus. Jei visgi reikia per naujo susijunginėti, tai skaitykite 1 dalį ir sujunginėkite per naujo.

Šį kartą pradėsiu iškart nuo naujojo kodo, o komentarus stengsiuosi neberašyti ten, kur akivaizdžiai matosi kas yra kas. Pabandykite peržiūrėti kodą ir suprasti kas vyksta, manau dauguma skaitytojų supras be mano paaiškinimų. Prieš rašant kodą norėčiau priminti pagrindinių spalvų maišymo taisykles kurias rodžiau prieš tai.

O dabar galime drąsiai eiti prie naujojo kodo.


Kodas:

/* RGB LED mirksėjimas
  Naudoja viena RGB LED.
  Isgauname daugiau spalvu nei 3 (raudona, zalia, melyna).
  http://arduinorobot.blogspot.com
*/

const int red = 9;          // priskiriame konstantos red reiksme 9
const int green = 10;
const int blue = 11;

int time = 1000;
int multiple = 2;

void setup () {
  pinMode(red, OUTPUT);    // pasirenka pin 9, kaip isejima (OUTPUT)
  pinMode(green, OUTPUT);
  pinMode(blue, OUTPUT);
}

void loop () {
  digitalWrite(red, HIGH);    // raudona
  delay(time);
  digitalWrite(green, HIGH);  // geltona
  delay(time);
  digitalWrite(red, LOW);     // zalia
  delay(time);
  digitalWrite(blue, HIGH);   // zalsvai melyna?
  delay(time);
  digitalWrite(green, LOW);   // melyna
  delay(time);
  digitalWrite(red, HIGH);    // rausvai raudona?
  delay(time);
  digitalWrite(green, HIGH);  // balta?
  delay(time*=multiple);
  digitalWrite(blue, LOW);    // resetinam
  digitalWrite(green, LOW);
  time/=multiple;
}

Pirma naujovė šiame kode jau pirmoje eilutėje:
const int red = 9;
Šis užrašas nurodo, kad žodis "red" yra konstanta "const", o jo reikšmė yra int (sveikasis skaičius. ang. integer) ir yra lygus "9", o pagal prieš tai buvusią pamoką turėtumėte pastebėti, kad nustatytosios konstantos naudojamos ten kur reikia nurodyti pin (jungtis). Kodėl nustačiau konstantas? Todėl, kad būtų aiškiau ir paprasčiau. Pirmiausia, tai mes dabar žinome tiksliai kuri jungtis su kokia spalva sujungiama, todėl lengviau rašyti kodą, o norint pakeisti jungtį pin (tarkim iš 9 į 13), tai neprivalau keitinėti visame kode, užteks pakeisti konstantos reikšmę, taip pakeitimai bus lengvesni ir nerizikuojama pamiršti ar nepastebėti ir praleisti keičiant reikšmes. Vienu šūviu du zuikiai ir tai akivaizdu.
Toliau:
int time = 1000;
Ši eilutė tai paprasčiausias skaičius kurį priskyrėme žodžiui time. Todėl funkcijoje delay() galime rašyti time, o kai norėsime pakeisti veikimo laiką, tai užteks pakeisti time reikšmę, todėl nereikės vargti su visomis delay() funkcijomis perašinėjant.
Sekantis:
int multiple = 2;
Manau jau supratote, kad tai analogiškas variantas kaip su "time", tik žodį "multiple" naudosime, kaip daugiklį ar daliklį. Kaip matėte kode, tai mes prailginome baltos spalvos degimo laiką padaugindami iš dviejų, o pabaigoje ciklo atstatėme padalindami iš dviejų į buvusią reikšmę, kad kartojantis ciklui delay() funkcijos laikas kaskart dvigubai neprailgėtų. Pabandymui galite ištrynti paskutinę eilutę, tuo atveju po kiekvieno ciklo pasikartojimo laikas tarp spalvų pasikeitimo dvigubės.
Tiesa, galbūt kažkam sunku suprasti šias dvi eilutes:
delay(time*=multiple);
time/=multiple;
Paprastai tariant jas buvo galima užrašyti ir taip:
delay(time=time*multiple);
time=time/multiple;
Na, turbūt daug aiškiau. Mes naudojome sutrumpinimą. Nebūtina naudoti tik daugyba ir dalybą, galėjom ir atimti, tarkim:
delay(time-=multiple);
time+=multiple;
arba
delay(time=time+multiple);
time=time-multiple;
Ateityje galite susidurti ir su:
time++;
time--;
Šie du veiksmai reiškia, kad prie time reikšmės, pirmu atveju pridedame 1, o antroje eilutėje atimame -1, t.y. "++ = 1" ir "-- = -1".
Galite pabadyti pakeisti į:
delay(time--);
O, paskutinę eilutę ištrynti:
time/=multiple;
Kad būtų greičiau matomas rezultatas, pakeičiame time reikšmę į 1:
int time = 1;
Dabar paleidus programą išvystumėte vis labiau lėtėjantį spalvų keitimąsi, kas būtų panašiau iš vientisos spalvos perėjimo į mirksėjimą kuris vis labiau lėtėtų. Galima buvo ir atiminėti iš 1000, bet vaizdas nebūtų buvęs toks efektingas ir pradžioje sunkiai pastebimas. Mūsų atveju, tik po 1000 ciklų pasikartojimo išvysime tai ką matėme prieš tai naudotam kode ir tai truks tik vieną ciklą. Kuo toliau tuo išmoksite daugiau ir ateis metas, kai sugalvosite savo algoritmą kalėdinei eglutei :) Na, bet kalėdos dar toli, tad turime laiko išmokti ne tik pagrindus, bet ir sudėtingesnes programavimo subtilybes. :)
Bet kokiu atveju nenusiminkite, kad programavimo mokymaisi prasideda nuo šviesos diodų, nes kaip žinia jie dažnai būna naudojami testavimams ir klaidų ar veiksmų identifikavimui, kad lengviau būtų suprasti roboto ar kito įrenginio veiksmus, todėl būtina viską suprasti iki galo, nes kuo toliau tuo viskas bus sudėtingiau, nepaisant to, kad Arduino C yra gerokai supaprastintas.

Tai tiek šiam kartui, o sekančioje dalyje jau pabandysime atlikti sprendimus priklausomai nuo sąlygų, tad laukite 3 dalies.

1 komentaras:

  1. Borgata Hotel Casino & Spa - MapyRO
    Hotel 경기도 출장마사지 reviews: Borgata Hotel Casino 삼척 출장마사지 & 창원 출장마사지 Spa, Atlantic City. 구미 출장샵 Atlantic City Borgata Hotel 오산 출장마사지 Casino & Spa in Atlantic City features casino, luxury hotel rooms,

    AtsakytiPanaikinti