Friday, June 3, 2016

Arduino 6 වන ලිපිය - Delay නැතුව LED එකක් නිවි නිවි පත්තු කරමු


අද ලිපියෙන් මම කියල දෙන්න යන්නෙ Delay දාන්නෙ නැතුව කොහොමද LED එකක් දල්වන්නෙ සහ නිවන්නෙ කියල. මෙීක අපිට ගොඩක් වැදගත් මොකද කිවුවොත් අපිට බල්බ් එකක් දල්වන ගමන් වෙන මොනව හරි දෙයකුත් Arduino එකෙන් කරගන්න ඔීන වුනා කියමු. ඒ වෙලාවට Delay පාවිච්චි කරන්න බෑ. සරලව කිව්වොත්  LED එක නිවි නිවි පත්තු වෙන අතර අපිට Motor එක කරකවන්න ඔීන වුන වෙලාවක අපිට Delay පාවිච්චි කරන්න බෑ. මොකද Delay එකක් පාවිච්චි කරනකොට ඔයාගේ program එක තාවකාලිකව නවත්තනව (pause) ඒ වෙලාව පිරෙනකන්. එතකොට තමයි මෙී වගේ method පාවිච්චි කරන්න වෙන්නෙ. 




අපිට මෙීකට ඔීන කරනව

  •    Arduino or Genuino Board එකක්
  •    LED එකක්
  •    220 ohm resistor එකක් (1K එකක් වුනත් අවුලක් නෑ)



හරි දැන් අර කලින් ලිපියෙ බල්බ් එකක් නිවි නිවි පත්තු කරන්න හදා ගත්ත වගේ Breadboard එකට බල්බ් එකයි  resistor එකයි දාල වයර් අමුන ගන්න. (කලින් ලිපිය:- http://sinhalaarduino.blogspot.com/2016/05/arduino-3-code_28.html)

13 වෙනි Pin එකට තමයි LED එක සම්බන්ද වෙන්නෙ. හැබැයි CODE එක දෙන්න එපා. මොකද පහල තියෙන code එක තමයි අපි upload කරන්න ඔීන.


Software code source:-  FILE -- 02.Digital -- BlinkWithoutDelay



CODE
--------------------------------------------------------------------------------

// constants කවදාවත් වෙනස් වෙන්නෙ නෑ. මෙතන LED pin එක Const කරල තියෙන්නෙ. ඉතින් 13 කියන අගය ආයෙ වෙනස් වෙන්නෙ නෑ.

const int ledPin =  13;      // 13 වන Pin එක ledpin එක

int ledState = LOW; // මෙී තියෙන ledState කියන variable එක const කරල නෑ. ඉතින් LOW කියන අගය ඔීනෑම වෙලාවක අපිට වෙනස් කරන්න පුළුවන්


// සාමාන්‍යයෙන් වෙලාවක් (time) store කරන්න අපි unsigned long කියන variable එක පාචිච්චි කරනවා. *පහල තියෙන වගුවෙ දාල තියෙනවා int, char, long වැනි ගොඩක් Data types වල sizes. 

unsigned long previousMillis = 0;  //මෙීකෙදි LED එක අන්තිම වතාවට update වුන වෙලාව store කර ගන්නවා

const long interval = 1000;           // blink වෙන්න කාල පරාසය (milliseconds වලින් තියෙන්නෙ මෙතන)

void setup() 
{
pinMode(ledPin, OUTPUT); //අර උඩදි දීපු ledPin (13 වන pin එක) දැන් digital output pin එක ලෙස දෙනවා.
}



void loop() 
{
//දැන් වෙලාව (currentMillis ) අන්තිමට UPDATE වූ වෙලාව    (previousMillis) වලින් අඩු කරාම ලැබෙන පිලිතුර අර අපි උඩදි  interval කියල දීපු milliseconds 1000ට (තත්පර නම් 1යි) වඩා විශාල  හෝ සමාන නම් previousMillis එක සමාන කරනව currentMillis  කියන එකට. **තේරුනෙ නැත්තම් පහලින් ගාන හදල දාල තියෙනවා

unsigned long currentMillis = millis(); //millis(); කියන්නෙ අපි code එක run කරපු වෙලාවෙ ඉදන් මිලිතත්පර වලින් ගනන් කරන්න පටන් ගන්නවා. ඒක තමයි currentMillis කියල අරන් තියෙන්නෙ.

  if (currentMillis - previousMillis >= interval) 
  {

       previousMillis = currentMillis;
// කලින් තිබුන වෙලාව දැන්  තිබුන වෙලාව ලෙස වෙනස් කරන්න. ***

        if (ledState == LOW) // බල්බ් එක නිවිලද තිබෙන්නෙ කියා  check කරනවා. එය සත්‍ය නම් පහත දේ කරන්න

          {
            ledState = HIGH; //බල්බය දල්වන්න
         
      

                else //එය අසත්‍ය නම් පහත දේ කරන්න
          {
            ledState = LOW; // බල්බය නිවන්න

           }
       digitalWrite(ledPin, ledState); //ledPin කියන 13 වන  චසබ එකට ledState කියන කලින් කලට වෙනස් වෙන variable එකට එක යවන්න         
    }
}


---------------------------------------------------------------------------------

*වගුව
int
-32,768 to 32,767
or
-2,147,483,648 to 2,147,483,647
unsigned int
0 to 65,535
or
0 to 4,294,967,295
long
-2,147,483,648 to 2,147,483,647
unsigned long
0 to 4,294,967,295
short
-32,768 to 32,767
unsigned short
0 to 65,535
char
-128 to 127
or
0 to 255
signed char
-128 to 127
unsigned char
0 to 255

**ගනිතමය උදාහරනය
 code  එක run කරල දැනට තත්පර 2 ක් ගිහින් (2000 milliseconds). එතකොට millis(); කියන syntax එකේ දැන් 2000යි කියල තියෙනවා. අපි ඒ අගය සමාන කරල තියෙනව currentMillis කියන එකට. අපි උඩින්ම assign කරල තියෙනව previousMillis = 0 කියල. තව interval කියල එකක් දීල තියෙනව 1000යි කියල (milliseconds 1000, තත්පර නම් 1යි)ග ඊට පස්සෙ ඔය යටින් තියෙන if කියන තැනදි අපි check කරනවා,
දැන් ගනන් වෙලා තියෙන තත්පර ගානෙන්, කලින් තිබුන වෙලාව අඩුකරාම ලැබෙන අගය අර  interval කියන තත්පර ගානට විශාල හො සමානද කියල.

currentMillis - previousMillis >= interval
2000 - 0 >=1000 කියල තමයි බලන්නෙ. 
තත්පර 2 - තත්පර 0 >= තත්පර 1ට

මෙීක සත්‍යයිනෙ. 2000 කියන අගය 1000 කියන අගයට වඩා විශාලයි නෙ. ඒක නිසා if එක ඇතුලෙ තියෙන code එක run වෙනවා. 

***ඒ code එකේදි  previousMillis = currentMillis; කියල දාල තියෙනව නේද. ඒ කියන්නෙ දැන් කලින් තිබුන වෙලාව(previousMillis ) කියන එක දැන වෙලාව කරන්න කියන (currentMillis). ඒ කියන්නෙ 0 කියල තිබුන අගය දැන් 2000 වෙලා. හැබැයි current mills කියන එක හැම මිලිතත්පරයකදිම වෙනස් වෙන ඔය ඉහත සමාන වීම වෙලා ක්ෂනයකින් currentMillis කියන එකේ අගය වෙනස් වෙනවා. ඒ කියන්නෙ ඊට තත්පරේකට පස්සෙ අගය 3000 වෙනව කියන එක. 

ඔය (currentMillis - previousMillis) අගය interval කියන අගය ට වඩා කුඩාවට තියෙන තුරාවටම else කියන code එක තමයි run වෙන්නෙ. ඒ කියන්නෙ බල්බ් එක නිවිල තියෙන්නෙ.

millis(); - කියන්නෙ අපි code එක run කරපු වෙලාවෙ ඉදන් මිලිතත්පර වලින් ගනන් කරන්න පටන් ගන්නවා.  සාමාන්‍යයෙන් දවස් 50ක් විතර මෙීකෙන් ගනන් කරන්න පුළුවන්. ඊට පස්සෙ ඒක 0 බවට පත් වෙලා මුල ඉදන් යනවා. මෙීකෙ return value එක නිතරම unsigned long වලින් තමයි ලැබෙන්නෙ. මෙීකට int වගේ data type එකක් දුන්නොත් code  එකේ error දෙන්න ගන්නවා. 


සැ.යු. - මෙම code එකෙහි // වලින් පටන්ගෙන ඇති දේවල් ඔබ code කරන විට ලිවීම අවශ්‍ය නොවෙී. අප මෙීවා හදුන්වන්නේ comments ලෙසටය. ඒවා අපගේ පහසුව වෙනුවෙන් අපි දමා ගන්නා කුඩා note එකක් වැනි දෙයකි.

එහෙනම් යාළුවනේ තවත් වැඩ කෑල්ලකින් හම්බවෙමු

මතක ඇතුව ඔයාලගෙ අදහස් යටින් දාන්න යාළුවනේ. ඊලග ලිපියෙන් හමුවෙමු. මෙී ලිපියෙ තියෙන වැරදි අඩුපාඩු මතක ඇතුව පහතින් සදහන් කරන්න. 

No comments:

Post a Comment