Ko’p hollarda, Arduino loyihalarini yaratishda asosiy sketchdan tashqari, unga qo’shib olinadigan yordamchi fayllardan keng foydalaniladi. Yirik hajmdagi va murakkab dasturlarni tushunishni osonlashtirish uchun ularni (yaxlit funksiyalarni) bir nechta qismlarga ham bo’lib yuborish mumkin. Bunday hollarda “Setup()” va “loop()” funksiyalarini o’z ichiga oluvchi asosiy sketchning boshlang’ich qismida (global o’zgaruvchilar sohasida) yordamchi sketchlar faylining nomi kod yordamida qo’shib olinadi.
Shu bilan birga, qo’shib olinadigan fayllarning shunday turi ham mavjudki, u barcha boshqa foydalanuvchilar ham erkin foydalanishlari uchun, maxsus qoidalar asosida yaratiladi. Ularni Arduino bibliotekalari deb yuritiladi.
Arduino bibliotekasi tushunchasi
Arduino bibliotekalari – turli datchiklar va modullardan foydalanishni soddalashtirish uchun kerak bo’ladigan kodni o’z ichiga olgan, shuningdek o’zida ko’p foydalaniladigan dasturiy yechimlarni saqlaydigan tayyor fayllar to’plami bo’lib, ular Arduino foydalanuvchilari va ayrim datchik, modul yoki bog’lanish interfeyslarini ishlab chiqaruvchilar tomonidan yaratiladi hamda ular tomonidan umumfoydalanishdagi veb-resurslarga (masalan, GitHubda) joylashtirib boriladi.
Dasturlash nuqtai nazaridan esa, biblioteka Arduino sketchiga biriktirib olinishi va foydalanilishi mumkin bo’lgan, C++ dasturlash tilidan meros bo’lib o’tgan klassni o’zida saqlovchi fayl hisoblanadi (klasslar va metodlar haqida quyiroqda batafsil ma’lumot beriladi).
Arduino bibliotekalarini shartli ravishda 2 xil turga bo’lish mumkin – ichki va tashqi bibliotekalarga. Ichki biblioteka deganda, Arduino IDE dasturi o’rnatilgan paytda u bilan birga avtomatik ravishda o’rnatilgan bibliotekalar tushuniladi. Tashqi biblioteka deganda esa, zarurat tug’ilganda umumfoydalanishdagi veb-resurslardan yuklab olinadigan va Arduino IDEga qo’lda o’rnatilishi talab etiladigan bibliotekalar tushuniladi.
Biblioteka bir yoki bir nechta fayllardan tashkil topgan bo’lishi mumkin. Juda ko’p hollarda biblioteka 1 ta asosiy va 1 ta yordamchi faylidan tashkil topadi. Bibliotekaning asosiy (“заголовок” – “sarlavha”) fayli “.h” (<biblioteka_fayli_nomi>.h) kengaytmasiga, yordamchi (“реализация” – “bajaruvchi”) fayli esa, “.cpp” (<biblioteka_fayli_nomi>.cpp) kengaytmasiga ega bo’ladi. Tashqi biblioteka ko’plab fayllardan tashkil topgan bo’lsa, odatda veb-resurslarda ularning barchasi yagona (<biblioteka_fayli_nomi>.zip nomli) zip formatidagi arxiv faylda saqlanadi. O’rnatish davomida Arduino IDE uni o’zi ochib, kerakli papkalarga nusxalab oladi.
Tashqi bibliotekani o’rnatish uchun Arduino IDE da “Скетч” menyusi “Подключить библиотеку” bo’limidan “Добавить .ZIP библиотеку…” elementini tanlanadi va yuklab olingan zip formatli biblioteka fayli ko’rsatiladi. Shuningdek, kerakli biblioteka fayllarini ZIP arxividan chiqarilgan holda, asosiy papkasi bilan birga Arduino IDE dasturining foydalanuvchi sketchlari saqlanadigan asosiy “Arduino” papkasidagi ichki “Libraries” papkasi ichiga qo’shib olish orqali ham qo’lda o’rnatish mumkin. Bunda, yangi qo’shilgan bibliotekani faollashtirish uchun, Arduino IDE dasturini qayta yuklash talab etiladi.
Bibliotekalardan foydalanishda ularning versiyalariga ham e’tibor qaratish zarur. Aks holda, ilgari normal ishlab kelgan sketchlar bibliotekaning keskin o’zgarishlar kiritilgan yangi versiyasi bilan ishlamay qolishi holatlari ham kuzatiladi (Masalan, ArduinoJSON biliotekasining 5-versiyasi yordamida yaratilgan sketch uning 7-versiyasida mutlaqo ishga tushmasligi mumkin. Chunki, yangi versiyada muallif tomonidan bibliotekaning asosiy funksiyalari, klass va metodlariga jiddiy o’zgartirishlar kiritilgan).
Bibliotekadan foydalanish tartibi
Bibliotekadan foydalanish uchun, kerakli sketch boshidagi global o’zgaruvchilarni e’lon qilish sohasida “#include <biblioteka_nomi>.h” buyrug’i yordamida u sketchga biriktirib (ulab, qo’shib) olinadi va “biblioteka_nomi sarlavha(argument1, argument2, …);” buyrug’i yordamida ko’rsatilgan nomdagi yangi obyekt-funksiya e’lon qilib olinadi. Shuningdek, uning ayrim boshqa o’zgaruvchilari ham define buyrug’i yordamida e’lon qilinishi mumkin.
Arduino IDE dasturining ayrim muhim ichki bibliotekalarini sketchga ulash talab ham etilmaydi. Masalan, ketma-ket port bilan ishlovchi Serial obyekti alohida biblioteka, aniqrog’i bibliotekadagi klass yordamida hosil qilinadi va o’z tarkibiy qismlariga (metodlarga) ega. Biroq uning metodlaridan (funksiyalaridan) sketchda to’g’ridan to’g’ri foydalanib ketish mumkin (Klass va metod tushunchalariga quyoriqda alohida to’xtalib o’tiladi).
Obyekt-funksiyaning argumentlari soni va turlari har bir bibliotekaning o’ziga xos bo’ladi. Sketch davomida biblioteka imkoniyatlaridan foydalanish uchun tegishli obyekt Arduinoning “setup()” majburiy funksiyasi ichida (masalan, obyekt.begin(), obyekt.init() kabi) faollashtirib olinadi va uning (biblioteka_obyekti.buyruq) metodi (buyruq yoki funksiyasi) yordamida boshqariladi. Tushunish osonroq bo’lishi uchun misol keltiramiz.
Quyidagi DHT11 raqamli termodatchigidan foydalanilgan termometr sketchi misolida, tegishli “DHT.h” bibliotekasidan foydalanish jarayonini izohlaymiz.

Navbatdagi misolda analog datchiklar bo’yicha darsda ko’rib chiqilgan, termistor asosidagi termometrni GyverNTC nomli maxsus bibliotekani qo’llagan holda qayta yaratilgan. Buning uchun bibliotekani yuklab olamiz. Termistor asosidagi termometrning ushbu variantida bibliotekadan foydalanish hisobiga sketch sewzilarli darajada soddalashganini ko’rishimiz mumkin.
Port monitori va plotterda natijani kuzatamiz:

Temperatura ko’rsatkichlari port monitorida.

Temperatura ko’rsatkichlari plotterda.
Endi yuqoridagi termometr loyihasiga LCD1602 displeyini qo’shish orqali, harorat ko’rsatkichlarini nafaqat ketma-ket port, balki displey orqali ham kuzatishimiz mumkin bo’ladi. Ya’ni, yaratadigan sketchimiz yordamida to’laqonli termometr qurilmasini hosil qilishimiz mumkin. Buning uchun qurilma uchun tashqi korpus o’ylab topish talab etiladi xolos. Sketchga esa, LiquidCrystal_I2C bibliotekasini ulaymiz. LCD1602 displeyi va undan foydalanish bo’yicha, alohida dars orqali batafsil ma’lumotga ega bo’lish mumkin.
Sxema:

Klass va metod
Ilgari aytib o’tilganidek, dasturlash nuqtai nazaridan qaraganda, biblioteka – C++ dasturlash tilida yaratilgan klassni o’z ichiga oladigan fayl. Arduino IDE da qo’llaniladigan Wiring dasturlash tili esa, C++ ning soddalashtirilgan ko’rinishi hisoblanadi. Shuning uchun ham, sketchlarda C++ kodlaridan bevosita foydalanish mumkin. C++ klasslari va metodlari ham shunday kodlar jumlasidan. Quyida klasslar va metodlar haqida ayrim muhim ma’lumotlar keltiriladi.
Klass – o’z o’zgaruvchilari va funksiyalari to’plamiga ega bo’lgan mustaqil ostki dastur. Klass bevosita asosiy dasturda (sketchda) yoki alohida biblioteka fayllarida yaratilishi mumkin.
Klass alohida fayllarda yaratilgan taqdirda, undan foydalanish uchun asosiy dasturda (sketchda) klassning nusxasini (ekzemplyarini) yaratib olishimiz mumkin. Klassning alohida nom bilan e’lon qilinadigan bunday nusxasini obyekt deb ataladi va uning yordamida klassning barcha instrumentlaridan foydalanish mumkin.
Alohida fayldagi klassga asosiy dasturdan murojaat qilish uchun, uni o’z ichiga olgan biblioteka #include operatori yordamida sketchga qo’shib olinadi. Shundan so’ng, klass nomi yordamida obyekt nomi e’lon qilinadi. Klass nomini obyekt nomi va boshqa elementlardan ajratish uchun u odatda faqat bosh harflar bilan belgilanadi (lekin majburiy emas).
Klassning imkoniyatlari:
- murakkab sketchni yoki dasturiy yechimni alohida mustaqil qismlarga ajratish;
- qulay bibliotekalarni yaratish;
- bir sketchda foydalanilgan dasturiy yechimdan boshqa loyihada, undan nusxa olmagan holda foydalana olish;
- sketchda takrorlanuvchi yechimlar va algoritmlar qo’llanilsa, uni yengillashtirish va soddalashtirish.
Klass sketchning o’zgaruvchi va konstantalari sohasida quyidagicha e’lon qilinishi mumkin (bu yerda klass a’zosi – metod, o’zgaruvchi yoki konstantalarni bildiradi):
Klass o’z navbatida metod deb nomlanadigan tarkibiy qismga ega bo’ladi.
Metod – klass asosida yaratilgan obyektga nisbatan qo’llaniladigan, klass tarkibidagi funksiya. Xuddi boshqa funksiyalardek, metodlar ham har xil qiymat turlari asosida alohida nom bilan e’lon qilinishi, o’zgaruvchilarga, konstantalarga (argumentlarga) ega bo’lishi (yoki ega bo’lmasligi) mumkin. Masalan, “Serial.println()” buyrug’ida: Serial obyekti shu nomli klass yordamida yaratilgan va shu klassni ifodalovchi nusxasi. Serial obyekti bilan birga qo’llaniladigan println funksiyasi esa, klassning metodi hisoblanadi.
Metod obyektning sarlavhasidan “.” (nuqta) bilan ajratiladi. Masalan, Serial.begin() – “Serial” obyektining “begin” metodi qo’llanayotganini bildiradi.
Klass obyektini e’lon qilish va metodlardan foydalanish tartibini quyidagi misol yordamida ko’rishimiz mumkin:
#include <Wire.h> // I2C moduli bibliotekasini qo’shib olish
#include <LiquidCrystal_I2C.h> // I2C modulga ulangan LiquidCrystal displeyi bibliotekasini qo’shib olish
LiquidCrystal_I2C lcd(0x27, 16, 2); // LiquidCrystal_I2C klassining ekzemplyari – lcd obyektini tegishli parametrlar bilan e’lon qilish.
Shundan keyin sketchda klassning metodlaridan quyidagi tartibda foydalanish mumkin bo’ladi:
void setup(){
lcd.begin(); // lcd obyektining begin metodini qo’llash, ya’ni lcd obyektini faollashtirish
lcd.backlight(); // lcd obyektining backlight metodini qo’llash, ya’ni displey fon yorug’ligini ishga tushirish
lcd.print(“Salom, yarat.uz!”); // lcd obyektining print metodini tegishli parametrlar bilan qo’llash, ya’ni displey ekranida matnni ko’rsatish
lcd.noBacklight(); // lcd obyektining noBacklight metodini qo’llash, ya’ni displey fon yorug’ligini o’chirish
}
void loop(){
}
Misol sifatida, Arduinoning ichki bibliotekalaridan biri bo’lgan, servomotorlarni boshqarishni osonlashtirish maqsadida yaratilgan “servo.h” faylidagi Servo klassi bilan yaqinroq tanishamiz (misolda qalin shrift bilan ajratilgan, fayl boshidagi ayrim izohlar ko’rsatilmagan):
Ushbu misoldan klassning public sohasida bibliotekaning barcha muhim metodlari e’lon qilinganiga guvoh bo’lishimiz mumkin (attach(…), detach(), write(…), writeMicroseconds(…), read(), readMicroseconds(), attached() metodlari). Metodlarning e’lon qilinishi funksiyalarning e’lon qilinishi bilan bir xil ekanligini ham ko’rishimiz mumkin.
klassning private sohasida e’lon qilingan servoIndex, min, max o’zgaruvchilariga esa, sketchdan murojaat qilib bo’lmaydi. Ularga faqat klassning metodlari murojaat qilishi mumkin.
Yuqoridagilardan tashqari, klassning public sohasida yana bir Servo() konstruktori ham ko’rsatilganini ko’rishimiz mumkin. U funksiya sifatida sketchda obyekt e’lon qilingan paytda chaqiriladi va uning nomi aynan klassning nomi bilan bir xil bo’lishi kerak. U o’zgaruvchilarni e’lon qilish, sozlamalarni uzatish va maqsadlarda qo’llanilishi mumkin.
Obyektni e’lon qilish
Obyektni e’lon qilish (yaratish) ham xuddi strukturani yaratgandagidek, klass nomi bo’yicha bajariladi:
<klass_nomi> <obyekt_nomi>; // obyekt e’lon qilish
masalan:
Servo servo1; // Servo klassining servo1 nomli obyektini e’lon qilish
<klass_nomi> <obyekt_nomi><[massiv_o’lchami]>; // obyektlar massivini e’lon qilish
masalan:
Servo servo2[5]; // Servo klassining 5 ta elementdan iborat servo2 obyektlar massivini yaratish
Asosiy dasturdan klass a’zolariga (metodlarga) murojaat qilish ham xuddi struktura bilan bir xil tartibda, “.” (nuqta) belgisi yordamida bajariladi. Masalan:
Servo.attach(); // sketchdan Servo obyektining attach metodini chaqirish
myClass[5].myMethod(); // sketchdan myClass obyektlar massividagi 5-indeksli obyekt uchun myMethod metodini chaqirish.
Klass hamda obyektlarni, shuningdek ular asosida Arduino bibliotekalarini yaratish jarayonlari alohida darsda aniq misollar bilan batafsil ko’rib chiqiladi.