19.04.2026

Arduino bibliotekalari [18+]

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.

DHT.h bibliotekasidan foydalanish
#include <DHT.h> // DHT datchiklari bibliotekasini ulash
#define DHTPIN D2 // DHT datchigiga ulanadigan raqamli pinni ko’rsatish
DHT dht(DHTPIN, DHT11); // dht nomli obyektni e’lon qilish (2-argumentni DHT21, DHT22 ga almashtirish mumkin)
void setup() {
Serial.begin(9600);
dht.begin(); // dht (termodatchik) obyektini faollashtirish
}

void loop() {
float temp = dht.readTemperature(); //readTemperature() metodi yordamida temperaturani o’lchash va o’zgaruvchiga o’zlashtirish
float namlik = dht.readHumidity(); //readHumidity() metodi yordamida havo namligini o’lchash va o’zgaruvchiga o’zlashtirish
delay(1000); // o’lchash uchun yetarli pauza o’rnatish
Serial.println(“Temperatura: ” + (String)temp + ” °C, havo namligi: ” + (String)namlik + ” %”); // natijalarni port monitoriga chiqarish
}

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.

'Termistor asosidagi termometr. GyverNTC.h bibliotekasi bilan
#include <GyverNTC.h> // “GyverNTC” nomli bibliotekani sketchga bog’laymiz
int pin = 0; // Termistor ulangan analog pin (0 – A0 analog pin)
int rez = 10000; // Musbat qutbga tortuvchi rezistor qarshiligi, Om
int koeff = -3950; // Issiqlik koeffitsienti
float temp; // Temperatura qiymati o’zgaruvchisi
GyverNTC therm(pin, rez, koeff); // GyverNTC bibliotekasiga murojaat qilish uchun “therm” nomli obyektni faollashtiramiz. Uning nomini va argumentlarini o’zgartirish mumkin
void setup() {
Serial.begin(9600);
}
void loop() {
temp = therm.getTempAverage(); // therm obyektining “getTempAverage()” metodi (funksiyasi) yordamida temperaturani o’qiymiz va uni o’zgaruvchiga o’zlashtiramiz
Serial.println(temp); // Temperaturani portga chiqaramiz
delay(1000); // o’lchashlar orasida pauza o’rnatamiz
}

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:

'Termistor va LCD1602 displeyi asosidagi termometr
#include <GyverNTC.h> // “GyverNTC” nomli bibliotekani sketchga bog’laymiz
#include <Wire.h>
// “Wire” nomli Arduino ichki bibliotekasini sketchga bog’laymiz
#include <LiquidCrystal_I2C.h> // “LiquidCrystal_I2Cnomli tashqi bibliotekani sketchga bog’laymiz
int pin = 0; // Termistor ulangan analog pin (0 – A0 analog pin)
int rez = 10000; // Musbat qutbga tortuvchi rezistor qarshiligi, Om
int koeff = -3950; // Issiqlik koeffitsienti
float temp; // Temperatura qiymati o’zgaruvchisi
GyverNTC therm(pin, rez, koeff); // GyverNTC bibliotekasiga murojaat qilish uchun “therm” nomli obyekt e’lon qilinmoqda
LiquidCrystal_I2C lcd(0x27, 16, 2); // LiquidCrystal_I2C bibliotekasiga murojaat qilish uchun 0x27 manziliga ega bo’lgan lcd nomli obyekt e’lon qilinmoqda
void setup() {
Serial.begin(9600);
lcd.begin(); // lcd nomli obyekt (displey) faollashtirilmoqda
lcd.backlight(); // Displey yoritkichi (podsvetkasi) yoqilmoqda. Uzish – lcd.noBacklight();
}
void loop() {
temp = therm.getTempAverage(); // therm obyektining “getTempAverage()” metodi (funksiyasi) yordamida temperaturani o’qiymiz va uni o’zgaruvchiga o’zlashtiramiz
Serial.println(temp); // Temperaturani portga chiqaramiz
lcd.print(“Temp.: “+ (String)temp + ” C”); // Temperaturani displeyga chiqaramiz
delay(1000); // o’lchashlar orasida pauza o’rnatamiz
}

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):

'Servo' bibliotekasi

/*
A servo is activated by creating an instance of the Servo class passing
the desired pin to the attach() method.
The servos are pulsed in the background using the value most recently
written using the write() method.

Note that analogWrite of PWM on pins associated with the timer are
disabled when the first servo is attached.
Timers are seized as needed in groups of 12 servos – 24 servos use two
timers, 48 servos will use four.
The sequence used to seize timers is defined in timers.h

The methods are:

Servo – Class for manipulating servo motors connected to Arduino pins.

attach(pin ) – Attaches a servo motor to an I/O pin.
attach(pin, min, max ) – Attaches to a pin setting min and max values in microseconds
default min is 544, max is 2400

write() – Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)
writeMicroseconds() – Sets the servo pulse width in microseconds
read() – Gets the last written servo pulse width as an angle between 0 and 180.
readMicroseconds() – Gets the last written servo pulse width in microseconds. (was read_us() in first release)
attached() – Returns true if there is a servo attached.
detach() – Stops an attached servos from pulsing its I/O pin.
*/

#ifndef Servo_h
#define Servo_h

#include <inttypes.h>

/*
* Defines for 16 bit timers used with Servo library
*
* If _useTimerX is defined then TimerX is a 16 bit timer on the current board
* timer16_Sequence_t enumerates the sequence that the timers should be allocated
* _Nbr_16timers indicates how many 16 bit timers are available.
*/

// Architecture specific include
#if defined(ARDUINO_ARCH_AVR)
#include “avr/ServoTimers.h”
#elif defined(ARDUINO_ARCH_SAM)
#include “sam/ServoTimers.h”
#elif defined(ARDUINO_ARCH_SAMD)
#include “samd/ServoTimers.h”
#elif defined(ARDUINO_ARCH_STM32F4)
#include “stm32f4/ServoTimers.h”
#elif defined(ARDUINO_ARCH_NRF52)
#include “nrf52/ServoTimers.h”
#elif defined(ARDUINO_ARCH_MEGAAVR)
#include “megaavr/ServoTimers.h”
#elif defined(ARDUINO_ARCH_MBED)
#include “mbed/ServoTimers.h”
#else
#error “This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor.”
#endif

#define Servo_VERSION 2 // software version of this library

#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds

#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer
#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)

#define INVALID_SERVO 255 // flag indicating an invalid servo index

#if !defined(ARDUINO_ARCH_STM32F4)

typedef struct {
uint8_t nbr :6 ; // a pin number from 0 to 63
uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false
} ServoPin_t ;

typedef struct {
ServoPin_t Pin;
volatile unsigned int ticks;
} servo_t;

class Servo
{
public:
Servo();
uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes.
void detach();
void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds
void writeMicroseconds(int value); // Write pulse width in microseconds
int read(); // returns current pulse width as an angle between 0 and 180 degrees
int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release)
bool attached(); // return true if this servo is attached, otherwise false

private:
uint8_t servoIndex; // index into the channel data for this servo
int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH
int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH
};

#endif
#endif

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.

Добавить комментарий