Quyida Arduino bilan ishlashda qo’llaniladigan deyarli barcha buyruqlar, funksiyalar va operatorlar royxati qisqacha misollar bilan keltirilgan. Ularning aksariyati rus va ingliz tilidagi Internet materiallari asosida tayyorlangan, biroq muallif tomonidan amalda sinab ko’rilgandan keyingina qilingan va ro’yxatga qo’shilgan. Arduino buyruqlari va umuman platforma bilan yaqindan tanishish uchun platformaning ingliz tilidagi rasmiy saytiga tashrif buyurish mumkin. Ushbu buyruqlar ro’yxati bilan rus tilida tanishish uchun esa, alexgyver.ru saytiga tashrif buyurish tavsiya etiladi. Ushbu ro’yxat muallif tomonidan muntazam takomillashtirilishi, misollar bilan to’ldirilishi rejalashtirilgan va hozircha dastlabki variant sifatida tuzildi. Arduino tizimi bilan batafsil tanishish uchun ushbu sahifada keltirilgan ro’yxatdagi adabiyotlardan foydalanish mumkin.
Arduino IDE C++ dasturlash tiliga asoslanganligi sababli, uning aksariyat buyruqlari Arduino IDE da ham qo’llanilishi mumkin. Shuning uchun, C++ dasturlash tili bo’yicha onlayn qo’llanmadan foydalanish ham tavsiya etiladi.
Ushbu ro’yxatdagi ayrim murakkab buyruq, funksiya va operatorlar ko’pchilik boshlovchi arduinochilar tomonidan amaliyotda umuman qo’llanilmasligi ham mumkin. Shunday bo’lsa-da, izlanuvchan arduinochilarga ko’mak bo’lishi mumkinligini hisobga olinib, ma’lumot uchun qo’shimcha ma’lumot olish mumkin bo’lgan manbasiga havolalar bilan birga keltirildi.
Qulaylik uchun ro’yxat spoyler ko’rinishida keltirilgan. Kerakli buyruq haqidagi ma’lumotni ochish uchun spoylerning chap tomonidagi ‘+‘ belgisini tanlash zarur (‘–‘ yopish).
Skechning tuzilishi
Kodning sintaksisi va tuzilishi
/* ushbu kodkompilyatsiya qilinmaydi */
// ushbu kod ham
// kompilyatsiya qilinmaydi
#include <Servo.h> // Servo.h bibliotekasini bog’lab olish
#include “Servo.h” // Servo.h bibliotekasini bog’lab olish
Bunda:
<> belgilari ichiga olinganda faylni kompilyator faqat bibliotekalar papkasidan qidiradi.
“” belgilari ichiga olinganda faylni kompilyator avval skech papkasidan, keyin bibliotekalar papkasidan qidiradi.
#define LED_PIN 3 // mikrokontrollerning svetodiodga bog’langan pini raqami ‘3’ ekanligi belgilab olinmoqda
#define MOTOR_PIN 10 // mikrokontrollerning motorga bog’langan pini raqami ’10’ ekanligi belgilab olinmoqda
Natijada, kompilyatsiyadan keyin barcha MOTOR_PIN va LED_PIN so’zlari tegishli konstantalarga almashtiriladi.
Oddiy o’zgaruvchilardan farqli ravishda, bunday usulda konstantalar uchun mikrokontrollerning tezkor xotirasi qo’llanilmaydi (joy band qilinmaydi). Bundan tashqari, define ko’rsatmasi yordamida makro-funksiya deb ataluvchi funksiyalarni belgilashda ham qo’llaniladi. Masalan, Arduinoning sq (kvadrat) funksiyasi makro-funksiya bo’lib, kompilyatsiya jarayonida ko’paytmaga aylantirib olinadi.
#define TEST 1 // 1 qiymatini TEST sifatida belgilab olamiz
#if (TEST == 1) // “agar TEST 1 ga teng bo’lsa”
#define VALUE 10 // “10 qiymatini VALUE sifatida belgilab olinsin”
#elif (TEST == 0) // “aksincha, agar TEST 0 ga teng bo’lsa, “
#define VALUE 20 //”20 qiymatini VALUE sifatida belgilab olinsin”
#else // “aksincha”
#define VALUE 30 // “30 qiymatini VALUE sifatida belgilab olinsin”
#endif // “shart oxiri”
Misol:
#define DEBUG 1
void setup() {
#if (DEBUG == 1)
Serial.begin(9600);
Serial.println(“Hello!”);
#endif
}
Ma’nosi:
ifdef – “belgilab olindimi?” ifndef – “belgilab olinmadimi?”. Misol:
#define TEST // TEST ni belgilab olamiz
#ifdef TEST // “Agar TEST belgilab olingan bo’lsa”
#define VALUE 10 // “u holda VALUE ni 10 ga tenglansin”
#else // “aksincha” (“ya’ni yuqoridagi #define TEST buyrug’i vaqtincha izohga aylantirilgan yoki o’chirib yuborilgan bo’lsa”)
#define VALUE 20 // “u holda VALUE ni 20 ga tenglansin”
#endif // “shart oxiri”
for (byte r = 0; r < 255; r++){
for (byte g = 255; g > -1; g–){
for (byte b = 0; b < 255; b++){
if (analogRead(0)> 250){ //tsikldan chiqib ketish
goto belgi;
}
// turli kod
}
}
}
belgi: // shu joyga o’tiladi
// kod davomi
if, ?, switch shartli (solishtirish) operatorlari
// Shartdan keyin faqat 1 ta amal bajarilganda {} belgilari shart emas:
if (a > b) c = 10; // “agar a b dan katta bo’lsa, c = 10 bo’lsin”
else c = 20; // “aksincha, с = 20 bo’lsin”.
// solishtirish amali o’rniga mantiqiy o’zgaruvchini qo’llasa ham bo’ladi:
boolean myFlag, myFlag2;
if(myFlag) c = 10; //”Agar myFlag = true bo’lsa c=10″
// murakkab shartlar:
if(!myflag && !myFlag2) c = 10; // “agar ikkala o’zgaruvchi qiymati ham false bo’lsa, c=10”
// 2 ta yoki undan ortiq amallar bajarilganda, {} belgilari ko’rsatilishi shart:
if (myFlag) {
с = 10;
b = c;
} else {
с = 20;
b = a;
}
//yoki, yuqoridagi kodni qisqatrirsak:
if(myFlag){с = 10; b = c;} else {с = 20; b = a;} //ham o’rinli
byte buttonState;
if(buttonState == 1) a = 10; // “agar buttonState=1 bo’lsa a=10”
else if(buttonState == 2) a = 20; // “aksincha, agar buttonState=2 bo’lsa, a=20”
else a = 30; // “aksincha, a=30”
(shart) ? u holda : aksincha
Misol:
(a > b) ? c=10 : c=-20; // “agar a > b bo’lsa, u holda с = 10. Aksincha с = -20”, yoki:
с = (a > b) ? 10 : -20; // “agar a > b bo’lsa, u holda с = 10. Aksincha с = -20”
boolean flag = true;
Serial.println((flag) ? (“bayroq ko’tarildi”) : (“bayroq tushirildi”)); //Ya’ni, agar flag=true bo’lsa, ‘bayroq ko’tarildi’ yozuvi, aksincha ‘bayroq tushirildi’ yozuvi port monitorida ko’rsatiladi
if/else operatori o’rnini bosishi mumkin.
Misol:
switch (val){
case 1: // “agar val = 1 bo’lsa kod bajarilsin”
// kod
break; //shartdan chiqiladi
case 2: // “agar val = 2 bo’lsa kod bajarilsin”
// kod
break; //shartdan chiqiladi
default: // “agar val hech qaysi qiymatga teng bo’lmasa, kod bajarilsin”
// kod
break; //shartdan chiqiladi
} //shartli operator oxiri
// default – qo’llanishi majburiy emas
// break – qo’llanishi majburiy
//yana bir misol:
switch (val){
case 1:
case 2:
case 3:
case 4:
// “agar val = 1, 2, 3 yoki 4 bo’lsa kod bajarilsin”
// kod
break;
case 4:
// “agar val = 5 bo’lsa kod bajarilsin”
// kod
break;
}
for, while, do/while takrorlash operatorlari
for (o’zgaruvchi; shart; o’zgarish qadami)
//Misol:
for(int i = 0; i < 10; i++){ // “i o’zgaruvchisi 0 dan 9 gacha 1 qadam bilan o’sganda…”
a = i; // “a o’zgaruvchisiga i qiymati o’zlashtirilsin”
Serial.println(a); // “port monitoriga a ning qiymati chiqarilsin”
}
// Xuddi if/else operatori kabi faqat 1 ta amal uchun {} shart emas:
for(int i = 0; i < 10; i++)
Serial.println(i);
//Yoki, 1 ta satrga sig’dirish mumkin:
for(int i = 0; i < 10; i++) Serial.println(i);
//Yana bir misol:
for(;;); // to’xtovsiz takrorlanish tsikli. Undan faqat break yoki goto operatorlari yordamida chiqiladi
while(a< b){ // “qachonki a<b bo’lsa, quyidagi kod to’xtovsiz bajarilaversin:”
// kod
}
//Yana bir misol:
while(true){// to’xtovsiz takrorlanish tsikli. Faqat break yoki goto operatorlari yordamida chiqiladi
// kod
}
do { // “quyidagi kod bajarilaversin:”
// kod
} while(a < b); //”qachonki a<b bo’lsa”
//yuqoridagi ‘while’ operatoridan farqi shuki, kod kamida 1 marta bajarilib ulguradi 🙂
Sanash, hisoblash, solishtirish operatorlari (amallari)
- bir xil turdagi o’zgaruvchilarni sanab o’tishda
- massivdagi elementlarni sanab o’tishda
- funksiyaning argumentlarini sanab o’tishda
- amallarni ketma-ket bajarishda
int a, b, c;
int raqamlar[4] = {1,3,5,7};
void yigindi(int a, int b, int c) {// kod };
//4-holatga misol:
// a va b ga qiymat o’zlashtirish:
int a = 5, b = 10;
// “dastlab b = 3 bo’lsin, keyin b ga 1 qo’shilsin, oxirida a ga o’zlashtirilsin:”
a = (b = 3, ++b);// natija: a = 4
// “‘i’ va ‘j’ musbat o’zgaruvchilari e’lon qilinsin, ularning qiymatlari soni 9 ta dan oshmasin, ‘i’ o’zgaruvchisi o’zgarish qadami 1, ‘j’ o’zgaruvchisi o’zgarish qadami 2”:
for(byte i = 0, j = 0; i < 10; i++, j += 2){
// ‘i’ 0 dan 9 gacha o’zgaradi
// ‘j’ 0 dan 18 gacha o’zgaradi
//kod
}
+ – qo’shish // c=a+b;
– – ayirish // c=a-b;
* – ko’paytirish // c=a*b;
/ – bo’lish // c=a/b;
% – bo’linma qoldig’i; // int c=a%amp;b;
< – kichik // if (a<=b) c=b-a;
>= – katta yoki teng // if (a>=b) c=a-b;
<= – kichik yoki teng // if (a<=b) c=b-a;
== – tenglik // if (a==b) c=a+b; else c=a*b;
!= – teng emaslik // if (a!=b) c=a+b; (a=!b dan farqlanadi!)
! (not) – mantiqiy ‘EMAS’ (‘НЕ’), ya’ni inkor qilish operatori
// Misol: agar bool a=false, b=false; a=!b bo’lsa, natija: a=true bo’ladi. Chunki, a o’zgaruvchisiga b ning qarama-qarshi qiymati o’zlashtirilmoqda. (Bu yerda ‘a=!b’ yozuvini “a b ga teng emas” tarzida emas, “a b ning qarama-qarshi qiymatiga teng” tarzida qabul qilish kerak!)
&& (and) – mantiqiy ‘VA’ operatori // if (a>b && b<=c) d=a+c-b;
|| (or) – mantiqiy ‘YOKI’ operatori // if (a>b || c<b) d=a-b;
// ‘a++’ (pre-inkrement) va ‘a=a+1’ amallari natijasi bir xil; ‘++b’ (post-inkrement) va ‘b=b+1’ natijasi bir xil; biroq pre-inkrement va post-inkrement natijasini boshqa o’zgaruvchiga o’zlashtirilganda bir-biridan farqli natija olinadi. Chunki pre-inkrementda qiymat inkrement bajarilishidan oldingi qiymat, post-inkrementda esa, inkrement bajarib bo’lingandagi qiymat olinadi. Misol:
int a = 0; int b = 0;
a++; //a ning qiymati 1 ga teng
b=a++; //b ning qiymati 0 ga teng (pre-inkrement qiymati)
b=++a; //b ning qiymati 1 ga teng (post-inkrement qiymati)
— – dekrement (1 ta qiymatga kamaytirish) // ‘a–‘ va ‘a=a-1’ natijasi bir xil
+= – qo’shma yig’indi // ‘a += 10’ va ‘a=a + 10’ natijasi bir xil
-= – qo’shma ayirma // ‘a -= 10’ va ‘a = a – 10’ natijasi bir xil
*= – qo’shma ko’paytma // ‘a *= 10’ va ‘a = a * 10’ natijasi bir xil
/= – qo’shma ko’paytma // ‘a /= 10’ va ‘a = a / 10’ natijasi bir xil
%= – bo’linmaning qoldig’ini qo’shish // ‘a %= 10’ va ‘a = a + a % 10’ natijasi bir xil
&= – qo’shma ‘bitli VA’ // ‘a &= b’ yozuvi ‘a = a & b’ bilan bir xil (8 bit = 1 bayt).
// ‘bitli VA’ (битовое И) mazmuni va vazifasi keyingi qismda keltiriladi
^= – qo’shma ‘bitli chiqarib yuboruvchi YOKI’ // ‘a ^= b’ yozuvi ‘a = a ^ b’ bilan bir xil
// ‘bitli chiqarib yuboruvchi YOKI’ (битовое исключающее ИЛИ) mazmuni va vazifasi keyingi qismda keltirilgan
|= – qo’shma ‘bitli YOKI’ // ‘a |= b’ yozuvi ‘a = a | b’ bilan bir xil
// ‘bitli YOKI’ (исключающее ИЛИ) mazmuni va vazifasi keyingi qismda keltirilgan
<< – bitli ‘chapga surish’ (битовый сдвиг влево)
>> – bitli ‘o’ngga surish’ (битовый сдвиг вправо)
^ (XOR) – bitli ‘chiqarib yuboruvchi YOKI’ (битовое исключающее ИЛИ)
| – bitli ‘YOKI’ (битовое ИЛИ)
~ – bitli ‘EMAS’ (битовое НЕ)
Misollar:
…
& – qiymatning xotiradagi manzili (1-bloki manzili)
* – ko’rsatilgan manzildagi qiymatni bildiradi
–> – strukturaga va klassga ko’rsatkichlar uchun, a’zolarga va metodlarga bilvosita murojaat qilish operatori (amali). Konstruksiyaning ko’rsatkich orqali qisqartirilgan yozuvi hisoblanadi: a->b yozuvi (*a).b yozuvi bilan bir xil.
Ko’rsatkichni hosil qilish formati quyidagicha:
qiymat_turi* ko’rsatkich_nomi (yoki qiymat_turi * ko’rsatkich_nomi, qiymat_turi *ko’rsatkich_nomi, ya’ni, bu yerdagi * belgisining joylashuvi ahamiyatga emas).
Qiymat turlari bilan ishlash
O’zgaruvchi – berilganlarni (raqamlarni) saqlash uchun ajratilgan katak. O’zgaruvchilar turli o’lchamdagi kataklarlarga ega bo’lishi mumkin.
| Nomlanishi | Boshqacha nomi |
O’lchami | Qiymat oralig’i | Xususiyati |
|
boolean
|
bool
|
1 bayt | 0 yoki 1, LOW yoki HIGH, false yoki true | Mantiqiy o’zgaruvchi. bool Arduinoda ham 1 bayt joy talab qiladi (1 bit emas) |
|
char
|
– | 1 bayt | -128… 127 | ASCII belgilar jadvalidagi belgining tartib raqamini saqlaydi |
| – |
int8_t
|
1 bayt | -128… 127 | Butun sonlar |
|
byte
|
uint8_t
|
1 bayt | 0… 255 | Butun sonlar |
|
int
|
int16_t, short
|
2 bayt | -32 768… 32 767 | Butun sonlar |
|
unsigned int
|
uint16_t, word
|
2 bayt | 0… 65 535 | Butun sonlar |
|
long
|
int32_t
|
4 bayt | -2 147 483 648… 2 147 483 647 | Butun sonlar |
|
unsigned long
|
uint32_t
|
4 bayt | 0… 4 294 967 295 | Butun sonlar |
|
float
|
–
|
4 bayt | -3.4E+38 3.4E+38 | Kasr sonlar. Aniqligi: 6-7 ta belgigacha, ya’ni 100% emas! |
|
double
|
–
|
4 bayt | -1.7E+308.. 1.7E+308 | AVR uchun float bilan bir xil. Aslida 8 baytga teng. |
|
–
|
int64_t
|
8 bayt | -(2^64)/2… (2^64)/2-1 | Butun sonlar |
|
–
|
uint64_t
|
8 bayt | 2^64-1 | Butun sonlar |
Qiymatlarning yana ayrim maxsus turlari mavjud:
-
wchar_t
– 16 bitli belgi
-
char16_t
– 2 baytli char
-
char32_t
– 4 baytli char
Qiymat turini qayta belgilash //Eski turni boshqacha nom bilan e’lon qilish:
typedef <tur> <nom>; – <nom> nomi bilan <tur> qiymat turini yaratish. Misol:
Keyinchalik bu tur bilan o’zgaruvchilarni e’lon qilish mumkin:
<yorliq> <struktura nomi>; // 1 ta strukturani e’lon qilish
<yorliq> <1-struktura nomi>, <2-struktura nomi>; // <yorliq> turli 2 ta strukturani e’lon qilish
<yorliq> <struktura nomi>[3]; // <yorliq> turli strukturalar massivini e’lon qilish
Shuningdek, strukturani yorliq yaratmasdan ham e’lon qilish mumkin.
- Struktura a’zosiga murojaat qilish quyidagicha amalga oshiriladi (klass kabi): <struktura nomi>.<o’zgaruvchi nomi> qiymatini o’qish va o’zgartirish imkonini beradi.
- agar 2 ta struktura bir xil tuzilgan bo’lsa (1 ta yorliq asosida e’lon qilingan bo’lsa), 1 ta strukturani boshqasiga o’zlashtirish ham mumkin. Barcha o’zgaruvchilar mos ravishda o’z o’rinlariga yoziladi.
- Strukturani o’zlashtirishning yana bir qulay usuli: <struktura nomi>=(<yorliq>){<1-o’zgaruvchi qiymati>,<2-o’zgaruvchi qiymati>,<3-o’zgaruvchi qiymati>}
//Misollar:
// 1-qadam: ‘yorliq1‘ turli struktura yorlig’i yaratiladi va uning o’zgaruvchilari e’lon qilinadi:
void setup() {
Sanoqlar (enum – enumeration) – nomlangan va bir biridan 1 ta qiymatga farq qiladigan konstantalarning top’lami hisoblanadi. Masalan, #define yordamida belgilanadigan TOVUSH_REJIMI, EKRAN_REJIMI, YORUGLIK_DARAJASI kabi konstantalar qiymati mos ravishda 1, 2 va 3 bo’lsa, ularni umumiy ‘sozlamalar’ yorlig’i bilan ‘int’ turida sanoq sifatida e’lon qilish mumkin:
enum sozlamalar {TOVUSH_REJIMI, EKRAN_REJIMI, YORUGLIK_DARAJASI};//Endi yorliqdan foydalanib sanoqning o’zini e’lon qilish mumkin:
sozlamalar sozlama; // ‘sozlamalar’ yorliqli, ‘sozlama’ nomli sanoq hosil qilindi.
//Sanoqni xuddi, struktrular kabi soddalashtirilgan holda ham e’lon qilish mumkin (ya’ni, bunda yorliq qo’llanilmaydi):
enum {TOVUSH_REJIMI, EKRAN_REJIMI, YORUGLIK_DARAJASI} sozlama;
//Sanoqlarni raqam sifatida yoki nomiga ko’ra o’zaro solishtirish, o’zlashtirish mumkin.
//Misollar:
enum {TOVUSH_REJIMI, EKRAN_REJIMI, YORUGLIK_DARAJASI} sozlama;
void setup() {
Serial.begin(9600);
sozlama = TOVUSH_REJIMI; //sanoqqa dastlabki qiymat o’zlashtirildi;
//Sanoqning qiymatlarini o’zgartirish zarurati tug’ilganda faqat 1-tartibdagi konstanta qiymatini o’zgartirish yetarli, qolgan konstantalar qiymati ketma-ket ravishda o’zgarib qoladi:
enum {TOVUSH_REJIMI=0, EKRAN_REJIMI, YORUGLIK_DARAJASI} sozlama;
//0 dan 2 gacha o’zgarib qoladi
- Klass
- Obyekt
- Xususiyatlar va metodlar
Klass quyidagicha e’lon qilinadi:
Klasslar haqida batafsil bu yerda tanishing.