{"id":64,"date":"2023-05-15T15:00:38","date_gmt":"2023-05-15T10:00:38","guid":{"rendered":"http:\/\/yarat.uz\/?p=64"},"modified":"2025-03-19T15:27:06","modified_gmt":"2025-03-19T10:27:06","slug":"arduino-bibliotekalari","status":"publish","type":"post","link":"https:\/\/yarat.uz\/?p=64","title":{"rendered":"Arduino bibliotekalari [18+]"},"content":{"rendered":"<p style=\"text-align: justify;\">Ko&#8217;p hollarda, Arduino loyihalarini yaratishda asosiy sketchdan tashqari, unga qo&#8217;shib olinadigan yordamchi fayllardan keng foydalaniladi. Yirik hajmdagi va murakkab dasturlarni tushunishni osonlashtirish uchun ularni (yaxlit funksiyalarni) bir nechta qismlarga ham bo&#8217;lib yuborish mumkin. Bunday hollarda &#8220;Setup()&#8221; va &#8220;loop()&#8221; funksiyalarini o&#8217;z ichiga oluvchi asosiy sketchning boshlang&#8217;ich qismida (global o&#8217;zgaruvchilar sohasida) yordamchi sketchlar faylining nomi kod yordamida qo&#8217;shib olinadi.<\/p>\n<p style=\"text-align: justify;\">Shu bilan birga, qo&#8217;shib olinadigan fayllarning shunday turi ham mavjudki, u barcha boshqa foydalanuvchilar ham erkin foydalanishlari uchun, maxsus qoidalar asosida yaratiladi. Ularni Arduino bibliotekalari deb yuritiladi.<\/p>\n<p style=\"text-align: center;\"><strong>Arduino bibliotekasi tushunchasi<br \/>\n<\/strong><\/p>\n<p style=\"text-align: justify;\"><strong>Arduino bibliotekalari<\/strong> &#8211; turli datchiklar va modullardan foydalanishni soddalashtirish uchun kerak bo&#8217;ladigan kodni o&#8217;z ichiga olgan, shuningdek o&#8217;zida ko&#8217;p foydalaniladigan dasturiy yechimlarni saqlaydigan tayyor fayllar to&#8217;plami bo&#8217;lib, ular Arduino foydalanuvchilari va ayrim datchik, modul yoki bog&#8217;lanish interfeyslarini ishlab chiqaruvchilar tomonidan yaratiladi hamda ular tomonidan umumfoydalanishdagi veb-resurslarga (masalan, <a href=\"http:\/\/github.com\">GitHub<\/a>da) joylashtirib boriladi.<\/p>\n<p style=\"text-align: justify;\">Dasturlash nuqtai nazaridan esa, biblioteka Arduino sketchiga biriktirib olinishi va foydalanilishi mumkin bo&#8217;lgan, C++ dasturlash tilidan meros bo&#8217;lib o&#8217;tgan klassni o&#8217;zida saqlovchi fayl hisoblanadi (klasslar va metodlar haqida quyiroqda batafsil ma&#8217;lumot beriladi).<\/p>\n<p style=\"text-align: justify;\">Arduino bibliotekalarini shartli ravishda 2 xil turga bo&#8217;lish mumkin &#8211; <strong>ichki<\/strong> va <strong>tashqi <\/strong>bibliotekalarga. <strong>Ichki biblioteka<\/strong> deganda, Arduino IDE dasturi o&#8217;rnatilgan paytda u bilan birga avtomatik ravishda o&#8217;rnatilgan bibliotekalar tushuniladi. <strong>Tashqi biblioteka<\/strong> deganda esa, zarurat tug&#8217;ilganda umumfoydalanishdagi veb-resurslardan yuklab olinadigan va Arduino IDEga qo&#8217;lda o&#8217;rnatilishi talab etiladigan bibliotekalar tushuniladi.<\/p>\n<p style=\"text-align: justify;\">Biblioteka bir yoki bir nechta fayllardan tashkil topgan bo&#8217;lishi mumkin. Juda ko&#8217;p hollarda biblioteka 1 ta asosiy va 1 ta yordamchi faylidan tashkil topadi. Bibliotekaning asosiy (&#8220;\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&#8221; &#8211; &#8220;sarlavha&#8221;) fayli &#8220;<strong>.h<\/strong>&#8221; (<strong>&lt;biblioteka_fayli_nomi&gt;.h<\/strong>) kengaytmasiga, yordamchi (&#8220;\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f&#8221; &#8211; &#8220;bajaruvchi&#8221;) fayli esa, &#8220;<strong>.cpp<\/strong>&#8221; (<strong>&lt;biblioteka_fayli_nomi&gt;.cpp<\/strong>) kengaytmasiga ega bo&#8217;ladi. Tashqi biblioteka ko&#8217;plab fayllardan tashkil topgan bo&#8217;lsa, odatda veb-resurslarda ularning barchasi yagona (<strong>&lt;biblioteka_fayli_nomi&gt;.zip<\/strong> nomli) zip formatidagi arxiv faylda saqlanadi. O&#8217;rnatish davomida Arduino IDE uni o&#8217;zi ochib, kerakli papkalarga nusxalab oladi.<\/p>\n<p style=\"text-align: justify;\">Tashqi bibliotekani o&#8217;rnatish uchun Arduino IDE da <strong>&#8220;\u0421\u043a\u0435\u0442\u0447&#8221;<\/strong> menyusi <strong>&#8220;\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443&#8221;<\/strong> bo&#8217;limidan <strong>&#8220;\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c .ZIP \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443&#8230;&#8221;<\/strong> elementini tanlanadi va yuklab olingan zip formatli biblioteka fayli ko&#8217;rsatiladi. Shuningdek, kerakli biblioteka fayllarini ZIP arxividan chiqarilgan holda, asosiy papkasi bilan birga Arduino IDE dasturining foydalanuvchi sketchlari saqlanadigan asosiy <strong>&#8220;Arduino&#8221;<\/strong> papkasidagi ichki &#8220;<strong>Libraries<\/strong>&#8221; papkasi ichiga qo&#8217;shib olish orqali ham qo&#8217;lda o&#8217;rnatish mumkin. Bunda, yangi qo&#8217;shilgan bibliotekani faollashtirish uchun, Arduino IDE dasturini qayta yuklash talab etiladi.<\/p>\n<p style=\"text-align: justify;\">Bibliotekalardan foydalanishda ularning versiyalariga ham e&#8217;tibor qaratish zarur. Aks holda, ilgari normal ishlab kelgan sketchlar bibliotekaning keskin o&#8217;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&#8217;zgartirishlar kiritilgan).<\/p>\n<p style=\"text-align: center;\"><strong>Bibliotekadan foydalanish tartibi<br \/>\n<\/strong><\/p>\n<p style=\"text-align: justify;\">Bibliotekadan foydalanish uchun, kerakli sketch boshidagi global o&#8217;zgaruvchilarni e&#8217;lon qilish sohasida &#8220;<strong>#include &lt;biblioteka_nomi&gt;.h<\/strong>&#8221; buyrug&#8217;i yordamida u sketchga biriktirib (ulab, qo&#8217;shib) olinadi va &#8220;<strong>biblioteka_nomi <em>sarlavha<\/em>(argument1, argument2, &#8230;);<\/strong>&#8221; buyrug&#8217;i yordamida ko&#8217;rsatilgan nomdagi yangi obyekt-funksiya e&#8217;lon qilib olinadi. Shuningdek, uning ayrim boshqa o&#8217;zgaruvchilari ham <em><strong>define<\/strong><\/em> buyrug&#8217;i yordamida e&#8217;lon qilinishi mumkin.<\/p>\n<p style=\"text-align: justify;\">Arduino IDE dasturining ayrim muhim ichki bibliotekalarini sketchga ulash talab ham etilmaydi. Masalan, ketma-ket port bilan ishlovchi <strong>Serial<\/strong> obyekti alohida biblioteka, aniqrog&#8217;i bibliotekadagi klass yordamida hosil qilinadi va o&#8217;z tarkibiy qismlariga (metodlarga) ega. Biroq uning metodlaridan (funksiyalaridan) sketchda to&#8217;g&#8217;ridan to&#8217;g&#8217;ri foydalanib ketish mumkin (<strong>Klass<\/strong> va <strong>metod<\/strong> tushunchalariga quyoriqda alohida to&#8217;xtalib o&#8217;tiladi).<\/p>\n<p style=\"text-align: justify;\">Obyekt-funksiyaning argumentlari soni va turlari har bir bibliotekaning o&#8217;ziga xos bo&#8217;ladi. Sketch davomida biblioteka imkoniyatlaridan foydalanish uchun tegishli obyekt Arduinoning &#8220;setup()&#8221; 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&#8217;lishi uchun misol keltiramiz.<\/p>\n<p style=\"text-align: justify;\">Quyidagi DHT11 raqamli termodatchigidan foydalanilgan termometr sketchi misolida, tegishli &#8220;<strong>DHT.h<\/strong>&#8221; bibliotekasidan foydalanish jarayonini izohlaymiz.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2078 size-large\" src=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/fritzing_ntc_termistor-861x1024.jpg\" alt=\"\" width=\"640\" height=\"761\" srcset=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/fritzing_ntc_termistor-861x1024.jpg 861w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/fritzing_ntc_termistor-252x300.jpg 252w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/fritzing_ntc_termistor-768x913.jpg 768w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/fritzing_ntc_termistor.jpg 921w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>DHT.h bibliotekasidan foydalanish<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<strong>#include &lt;DHT.h&gt;<\/strong> \/\/ DHT datchiklari bibliotekasini ulash<br \/>\n<strong>#define DHTPIN D2<\/strong> \/\/ DHT datchigiga ulanadigan raqamli pinni ko\u2019rsatish<br \/>\n<strong>DHT dht(DHTPIN, DHT11);<\/strong> \/\/ dht nomli obyektni e\u2019lon qilish (2-argumentni DHT21, DHT22 ga almashtirish mumkin)<br \/>\nvoid setup() {<br \/>\nSerial.begin(9600);<br \/>\n<strong>dht.begin();<\/strong> \/\/ dht (termodatchik) obyektini faollashtirish<br \/>\n}<\/p>\n<p>void loop() {<br \/>\nfloat temp = <strong>dht.readTemperature();<\/strong> \/\/readTemperature() metodi yordamida temperaturani o\u2019lchash va o\u2019zgaruvchiga o\u2019zlashtirish<br \/>\nfloat namlik = <strong>dht.readHumidity();<\/strong> \/\/readHumidity() metodi yordamida havo namligini o\u2019lchash va o\u2019zgaruvchiga o\u2019zlashtirish<br \/>\ndelay(1000); \/\/ o\u2019lchash uchun yetarli pauza o&#8217;rnatish<br \/>\nSerial.println(&#8220;Temperatura: &#8221; + (String)temp + &#8221; \u00b0C, havo namligi: &#8221; + (String)namlik + &#8221; %&#8221;); \/\/ natijalarni port monitoriga chiqarish<br \/>\n}<span class=\"enlighter-g1 wp-dark-mode-ignore\"><\/div><\/div><\/span><\/p>\n<p style=\"text-align: justify;\">Navbatdagi misolda <a href=\"https:\/\/yarat.uz\/?p=1875\">analog datchiklar bo&#8217;yicha darsda<\/a> ko&#8217;rib chiqilgan, termistor asosidagi termometrni <a href=\"https:\/\/github.com\/GyverLibs\/GyverNTC\"><strong>GyverNTC<\/strong><\/a> nomli maxsus bibliotekani qo&#8217;llagan holda qayta yaratilgan. Buning uchun bibliotekani yuklab olamiz. Termistor asosidagi termometrning ushbu variantida bibliotekadan foydalanish hisobiga sketch sewzilarli darajada soddalashganini ko&#8217;rishimiz mumkin.<\/p>\n<p style=\"text-align: justify;\"><div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>'Termistor asosidagi termometr. GyverNTC.h bibliotekasi bilan<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<strong>#include &lt;GyverNTC.h&gt;<\/strong> \/\/ &#8220;GyverNTC&#8221; nomli bibliotekani sketchga bog&#8217;laymiz<br \/>\nint pin = 0; \/\/ Termistor ulangan analog pin (0 &#8211; A0 analog pin)<br \/>\nint rez = 10000; \/\/ Musbat qutbga tortuvchi rezistor qarshiligi, Om<br \/>\nint koeff = -3950; \/\/ Issiqlik koeffitsienti<br \/>\nfloat temp; \/\/ Temperatura qiymati o&#8217;zgaruvchisi<br \/>\n<strong>GyverNTC therm(pin, rez, koeff);<\/strong> \/\/ GyverNTC bibliotekasiga murojaat qilish uchun &#8220;therm&#8221; nomli obyektni faollashtiramiz. Uning nomini va argumentlarini o&#8217;zgartirish mumkin<br \/>\nvoid setup() {<br \/>\nSerial.begin(9600);<br \/>\n}<br \/>\nvoid loop() {<br \/>\ntemp = <strong>therm.getTempAverage();<\/strong> \/\/ therm obyektining &#8220;getTempAverage()&#8221; metodi (funksiyasi) yordamida temperaturani o&#8217;qiymiz va uni o&#8217;zgaruvchiga o&#8217;zlashtiramiz<br \/>\nSerial.println(temp); \/\/ Temperaturani portga chiqaramiz<br \/>\ndelay(1000); \/\/ o&#8217;lchashlar orasida pauza o&#8217;rnatamiz<br \/>\n}<\/div><\/div>\n<p data-wp-editing=\"1\">Port monitori va plotterda natijani kuzatamiz:<\/p>\n<p data-wp-editing=\"1\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2083 size-full\" src=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_port.jpg\" alt=\"\" width=\"897\" height=\"391\" srcset=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_port.jpg 897w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_port-300x131.jpg 300w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_port-768x335.jpg 768w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/p>\n<p style=\"text-align: center;\" data-wp-editing=\"1\"><em>Temperatura ko&#8217;rsatkichlari port monitorida.<\/em><\/p>\n<p data-wp-editing=\"1\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2084 size-full\" src=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_plotter-e1709472393150.jpg\" alt=\"\" width=\"458\" height=\"391\" srcset=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_plotter-e1709472393150.jpg 458w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/02\/termistor_plotter-e1709472393150-300x256.jpg 300w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><\/p>\n<p style=\"text-align: center;\" data-wp-editing=\"1\"><em>Temperatura ko&#8217;rsatkichlari plotterda.<\/em><\/p>\n<p style=\"text-align: justify;\" data-wp-editing=\"1\">Endi yuqoridagi termometr loyihasiga LCD1602 displeyini qo&#8217;shish orqali, harorat ko&#8217;rsatkichlarini nafaqat ketma-ket port, balki displey orqali ham kuzatishimiz mumkin bo&#8217;ladi. Ya&#8217;ni, yaratadigan sketchimiz yordamida to&#8217;laqonli termometr qurilmasini hosil qilishimiz mumkin. Buning uchun qurilma uchun tashqi korpus o&#8217;ylab topish talab etiladi xolos. Sketchga esa, <strong>LiquidCrystal_I2C<\/strong> bibliotekasini ulaymiz. LCD1602 displeyi va undan foydalanish bo&#8217;yicha, <a href=\"https:\/\/yarat.uz\/?p=2044\">alohida dars<\/a> orqali batafsil ma&#8217;lumotga ega bo&#8217;lish mumkin.<\/p>\n<p data-wp-editing=\"1\"><em>Sxema:<\/em><\/p>\n<p data-wp-editing=\"1\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2433 size-large\" src=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700-1024x635.jpg\" alt=\"\" width=\"640\" height=\"397\" srcset=\"https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700-1024x635.jpg 1024w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700-300x186.jpg 300w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700-768x477.jpg 768w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700-1536x953.jpg 1536w, https:\/\/yarat.uz\/wp-content\/uploads\/2024\/04\/uno_termistor_lcd1602_i2c_bb-e1711955155700.jpg 1829w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: justify;\" data-wp-editing=\"1\"><div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>'Termistor va LCD1602 displeyi asosidagi termometr<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<strong>#include &lt;GyverNTC.h&gt; \/\/ <em>&#8220;GyverNTC&#8221;<\/em><\/strong><em> nomli bibliotekani sketchga bog&#8217;laymiz<\/em><strong><br \/>\n#include &lt;Wire.h&gt;<\/strong> \/\/ <strong>&#8220;Wire&#8221;<\/strong><em> nomli Arduino ichki bibliotekasini sketchga bog&#8217;laymiz<\/em><br \/>\n<strong>#include &lt;LiquidCrystal_I2C.h&gt;<\/strong> \/\/ &#8220;<strong>LiquidCrystal_I2C<\/strong>&#8221; <em>nomli tashqi bibliotekani sketchga bog&#8217;laymiz<\/em><br \/>\nint pin = 0; \/\/ <em>Termistor ulangan analog pin (0 &#8211; A0 analog pin)<\/em><br \/>\nint rez = 10000; \/\/ <em>Musbat qutbga tortuvchi rezistor qarshiligi, Om<\/em><br \/>\nint koeff = -3950; \/\/ <em>Issiqlik koeffitsienti<\/em><br \/>\nfloat temp; \/\/ <em>Temperatura qiymati o&#8217;zgaruvchisi<\/em><br \/>\n<strong>GyverNTC therm(pin, rez, koeff);<\/strong> \/\/ <em>GyverNTC bibliotekasiga murojaat qilish uchun &#8220;therm&#8221; nomli obyekt e&#8217;lon qilinmoqda<\/em><br \/>\n<strong>LiquidCrystal_I2C lcd(0x27, 16, 2);<\/strong> \/\/ <em><strong>LiquidCrystal_I2C<\/strong> bibliotekasiga murojaat qilish uchun\u00a0<strong>0x27<\/strong> manziliga ega bo&#8217;lgan <strong>lcd<\/strong> nomli obyekt e\u2019lon qilinmoqda<\/em><br \/>\nvoid setup() {<br \/>\nSerial.begin(9600);<br \/>\nlcd.begin(); \/\/ <strong>lcd<\/strong> <em>nomli obyekt (displey) faollashtirilmoqda<\/em><br \/>\nlcd.backlight(); \/\/ <em>Displey yoritkichi (podsvetkasi) yoqilmoqda. Uzish <\/em>&#8211; lcd.noBacklight();<br \/>\n}<br \/>\nvoid loop() {<br \/>\ntemp = <strong>therm.getTempAverage();<\/strong> \/\/ <em>therm obyektining &#8220;getTempAverage()&#8221; metodi (funksiyasi) yordamida temperaturani o&#8217;qiymiz va uni o&#8217;zgaruvchiga o&#8217;zlashtiramiz<\/em><br \/>\nSerial.println(temp); \/\/ <em>Temperaturani portga chiqaramiz<\/em><br \/>\n<strong>lcd.print(&#8220;Temp.: &#8220;+ (String)temp + &#8221; C&#8221;);<\/strong> \/\/ <em>Temperaturani displeyga chiqaramiz<\/em><br \/>\ndelay(1000); \/\/ o&#8217;lchashlar orasida pauza o&#8217;rnatamiz<br \/>\n}<\/div><\/div>\n<p id=\"klass_metod\" style=\"text-align: center;\"><strong>Klass va metod<\/strong><\/p>\n<p style=\"text-align: justify;\">Ilgari aytib o&#8217;tilganidek, dasturlash nuqtai nazaridan qaraganda, biblioteka &#8211; C++ dasturlash tilida yaratilgan <strong>klass<\/strong>ni o&#8217;z ichiga oladigan fayl. Arduino IDE da qo&#8217;llaniladigan <strong>Wiring<\/strong> dasturlash tili esa, C++ ning soddalashtirilgan ko&#8217;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&#8217;lumotlar keltiriladi.<\/p>\n<p style=\"text-align: justify;\"><strong>Klass<\/strong> &#8211; o&#8217;z o&#8217;zgaruvchilari va funksiyalari to&#8217;plamiga ega bo&#8217;lgan mustaqil ostki dastur. Klass bevosita asosiy dasturda (sketchda) yoki alohida biblioteka fayllarida yaratilishi mumkin.<\/p>\n<p style=\"text-align: justify;\">Klass alohida fayllarda yaratilgan taqdirda, undan foydalanish uchun asosiy dasturda (sketchda) klassning nusxasini (ekzemplyarini) yaratib olishimiz mumkin. Klassning alohida nom bilan e&#8217;lon qilinadigan bunday nusxasini <strong>obyekt<\/strong> deb ataladi va uning yordamida klassning barcha instrumentlaridan foydalanish mumkin.<\/p>\n<p style=\"text-align: justify;\">Alohida fayldagi klassga asosiy dasturdan murojaat qilish uchun, uni o&#8217;z ichiga olgan biblioteka <strong>#include<\/strong> operatori yordamida sketchga qo&#8217;shib olinadi. Shundan so&#8217;ng, klass nomi yordamida obyekt nomi e&#8217;lon qilinadi. Klass nomini obyekt nomi va boshqa elementlardan ajratish uchun u odatda faqat bosh harflar bilan belgilanadi (lekin majburiy emas).<\/p>\n<p style=\"text-align: justify;\">Klassning imkoniyatlari:<\/p>\n<ul>\n<li style=\"text-align: justify;\">murakkab sketchni yoki dasturiy yechimni alohida mustaqil qismlarga ajratish;<\/li>\n<li style=\"text-align: justify;\">qulay bibliotekalarni yaratish;<\/li>\n<li style=\"text-align: justify;\">bir sketchda foydalanilgan dasturiy yechimdan boshqa loyihada, undan nusxa olmagan holda foydalana olish;<\/li>\n<li style=\"text-align: justify;\">sketchda takrorlanuvchi yechimlar va algoritmlar qo&#8217;llanilsa, uni yengillashtirish va soddalashtirish.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Klass sketchning o&#8217;zgaruvchi va konstantalari sohasida quyidagicha e&#8217;lon qilinishi mumkin (bu yerda <strong>klass a&#8217;zosi<\/strong> &#8211; metod, o&#8217;zgaruvchi yoki konstantalarni bildiradi):<\/p>\n<p>Klass o&#8217;z navbatida\u00a0<strong>metod<\/strong> deb nomlanadigan tarkibiy qismga ega bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\"><strong>Metod<\/strong> &#8211; klass asosida yaratilgan obyektga nisbatan qo&#8217;llaniladigan, klass tarkibidagi funksiya. Xuddi boshqa funksiyalardek, metodlar ham har xil qiymat turlari asosida alohida nom bilan e&#8217;lon qilinishi, o&#8217;zgaruvchilarga, konstantalarga (argumentlarga) ega bo&#8217;lishi (yoki ega bo&#8217;lmasligi) mumkin. Masalan, &#8220;<strong>Serial.println()&#8221;<\/strong> buyrug&#8217;ida: <strong>Serial<\/strong> obyekti shu nomli klass yordamida yaratilgan va shu klassni ifodalovchi nusxasi. Serial obyekti bilan birga qo&#8217;llaniladigan <strong>println<\/strong> funksiyasi esa, klassning metodi hisoblanadi.<\/p>\n<p style=\"text-align: justify;\">Metod obyektning sarlavhasidan &#8220;<strong>.&#8221;<\/strong> (nuqta) bilan ajratiladi. Masalan, Serial.begin() &#8211; &#8220;<strong>Serial<\/strong>&#8221; obyektining &#8220;<strong>begin<\/strong>&#8221; metodi qo&#8217;llanayotganini bildiradi.<\/p>\n<p style=\"text-align: justify;\">Klass obyektini e&#8217;lon qilish va metodlardan foydalanish tartibini quyidagi misol yordamida ko&#8217;rishimiz mumkin:<\/p>\n<p style=\"text-align: justify;\"><strong>#include &lt;Wire.h&gt;<\/strong> \/\/ I2C moduli bibliotekasini qo&#8217;shib olish<strong><br \/>\n#include &lt;LiquidCrystal_I2C.h&gt;<\/strong> \/\/ I2C modulga ulangan LiquidCrystal displeyi bibliotekasini qo&#8217;shib olish<strong><br \/>\nLiquidCrystal_I2C lcd(0x27, 16, 2);<\/strong> \/\/ <strong>LiquidCrystal_I2C<\/strong> klassining ekzemplyari &#8211; <strong>lcd<\/strong> obyektini tegishli parametrlar bilan e&#8217;lon qilish.<\/p>\n<p>Shundan keyin sketchda klassning metodlaridan quyidagi tartibda foydalanish mumkin bo&#8217;ladi:<\/p>\n<p>void setup(){<br \/>\nlcd.<strong>begin<\/strong>(); \/\/ <strong>lcd<\/strong> obyektining\u00a0<strong>begin <\/strong>metodini qo&#8217;llash, ya&#8217;ni <strong>lcd<\/strong> obyektini faollashtirish<br \/>\nlcd.<strong>backlight<\/strong>(); \/\/ <strong>lcd<\/strong> obyektining <strong>backlight <\/strong>metodini qo&#8217;llash, ya&#8217;ni displey fon yorug&#8217;ligini ishga tushirish<br \/>\nlcd.<strong>print<\/strong>(&#8220;Salom, yarat.uz!&#8221;); \/\/ <strong>lcd<\/strong> obyektining <strong>print <\/strong>metodini tegishli parametrlar bilan qo&#8217;llash, ya&#8217;ni displey ekranida matnni ko&#8217;rsatish<br \/>\nlcd.<strong>noBacklight<\/strong>(); \/\/ <strong>lcd<\/strong> obyektining <strong>noBacklight <\/strong>metodini qo&#8217;llash, ya&#8217;ni displey fon yorug&#8217;ligini o&#8217;chirish<br \/>\n}<br \/>\nvoid loop(){<br \/>\n}<\/p>\n<p style=\"text-align: justify;\">Misol sifatida, Arduinoning ichki bibliotekalaridan biri bo&#8217;lgan, servomotorlarni boshqarishni osonlashtirish maqsadida yaratilgan &#8220;<strong>servo.h<\/strong>&#8221; faylidagi <strong>Servo<\/strong> klassi bilan yaqinroq tanishamiz (misolda qalin shrift bilan ajratilgan, fayl boshidagi ayrim izohlar ko&#8217;rsatilmagan):<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>'Servo' bibliotekasi<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>\/*<br \/>\nA servo is activated by creating an instance of the Servo class passing<br \/>\nthe desired pin to the attach() method.<br \/>\nThe servos are pulsed in the background using the value most recently<br \/>\nwritten using the write() method.<\/p>\n<p>Note that analogWrite of PWM on pins associated with the timer are<br \/>\ndisabled when the first servo is attached.<br \/>\nTimers are seized as needed in groups of 12 servos &#8211; 24 servos use two<br \/>\ntimers, 48 servos will use four.<br \/>\nThe sequence used to seize timers is defined in timers.h<\/p>\n<p>The methods are:<\/p>\n<p>Servo &#8211; Class for manipulating servo motors connected to Arduino pins.<\/p>\n<p>attach(pin ) &#8211; Attaches a servo motor to an I\/O pin.<br \/>\nattach(pin, min, max ) &#8211; Attaches to a pin setting min and max values in microseconds<br \/>\ndefault min is 544, max is 2400<\/p>\n<p>write() &#8211; Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)<br \/>\nwriteMicroseconds() &#8211; Sets the servo pulse width in microseconds<br \/>\nread() &#8211; Gets the last written servo pulse width as an angle between 0 and 180.<br \/>\nreadMicroseconds() &#8211; Gets the last written servo pulse width in microseconds. (was read_us() in first release)<br \/>\nattached() &#8211; Returns true if there is a servo attached.<br \/>\ndetach() &#8211; Stops an attached servos from pulsing its I\/O pin.<br \/>\n*\/<\/p>\n<p>#ifndef Servo_h<br \/>\n#define Servo_h<\/p>\n<p>#include &lt;inttypes.h&gt;<\/p>\n<p>\/*<br \/>\n* Defines for 16 bit timers used with Servo library<br \/>\n*<br \/>\n* If _useTimerX is defined then TimerX is a 16 bit timer on the current board<br \/>\n* timer16_Sequence_t enumerates the sequence that the timers should be allocated<br \/>\n* _Nbr_16timers indicates how many 16 bit timers are available.<br \/>\n*\/<\/p>\n<p>\/\/ Architecture specific include<br \/>\n#if defined(ARDUINO_ARCH_AVR)<br \/>\n#include &#8220;avr\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_SAM)<br \/>\n#include &#8220;sam\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_SAMD)<br \/>\n#include &#8220;samd\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_STM32F4)<br \/>\n#include &#8220;stm32f4\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_NRF52)<br \/>\n#include &#8220;nrf52\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_MEGAAVR)<br \/>\n#include &#8220;megaavr\/ServoTimers.h&#8221;<br \/>\n#elif defined(ARDUINO_ARCH_MBED)<br \/>\n#include &#8220;mbed\/ServoTimers.h&#8221;<br \/>\n#else<br \/>\n#error &#8220;This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor.&#8221;<br \/>\n#endif<\/p>\n<p>#define Servo_VERSION 2 \/\/ software version of this library<\/p>\n<p>#define MIN_PULSE_WIDTH 544 \/\/ the shortest pulse sent to a servo<br \/>\n#define MAX_PULSE_WIDTH 2400 \/\/ the longest pulse sent to a servo<br \/>\n#define DEFAULT_PULSE_WIDTH 1500 \/\/ default pulse width when servo is attached<br \/>\n#define REFRESH_INTERVAL 20000 \/\/ minimum time to refresh servos in microseconds<\/p>\n<p>#define SERVOS_PER_TIMER 12 \/\/ the maximum number of servos controlled by one timer<br \/>\n#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)<\/p>\n<p>#define INVALID_SERVO 255 \/\/ flag indicating an invalid servo index<\/p>\n<p>#if !defined(ARDUINO_ARCH_STM32F4)<\/p>\n<p>typedef struct {<br \/>\nuint8_t nbr :6 ; \/\/ a pin number from 0 to 63<br \/>\nuint8_t isActive :1 ; \/\/ true if this channel is enabled, pin not pulsed if false<br \/>\n} ServoPin_t ;<\/p>\n<p>typedef struct {<br \/>\nServoPin_t Pin;<br \/>\nvolatile unsigned int ticks;<br \/>\n} servo_t;<\/p>\n<h4>class Servo<br \/>\n{<br \/>\npublic:<br \/>\nServo();<br \/>\nuint8_t attach(int pin); \/\/ attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure<br \/>\nuint8_t attach(int pin, int min, int max); \/\/ as above but also sets min and max values for writes.<br \/>\nvoid detach();<br \/>\nvoid write(int value); \/\/ if value is &lt; 200 its treated as an angle, otherwise as pulse width in microseconds<br \/>\nvoid writeMicroseconds(int value); \/\/ Write pulse width in microseconds<br \/>\nint read(); \/\/ returns current pulse width as an angle between 0 and 180 degrees<br \/>\nint readMicroseconds(); \/\/ returns current pulse width in microseconds for this servo (was read_us() in first release)<br \/>\nbool attached(); \/\/ return true if this servo is attached, otherwise false<\/h4>\n<h4>private:<br \/>\nuint8_t servoIndex; \/\/ index into the channel data for this servo<br \/>\nint8_t min; \/\/ minimum is this value times 4 added to MIN_PULSE_WIDTH<br \/>\nint8_t max; \/\/ maximum is this value times 4 added to MAX_PULSE_WIDTH<br \/>\n};<\/h4>\n<p>#endif<br \/>\n#endif <\/div><\/div>\n<p style=\"text-align: justify;\">Ushbu misoldan klassning <strong>public<\/strong> sohasida bibliotekaning barcha muhim metodlari e&#8217;lon qilinganiga guvoh bo&#8217;lishimiz mumkin (<strong><em>attach(&#8230;), detach(), write(&#8230;), writeMicroseconds(&#8230;), read(), readMicroseconds(), attached()<\/em><\/strong> metodlari). Metodlarning e&#8217;lon qilinishi <a href=\"https:\/\/yarat.uz\/?p=1122\">funksiyalar<\/a>ning e&#8217;lon qilinishi bilan bir xil ekanligini ham ko&#8217;rishimiz mumkin.<\/p>\n<p style=\"text-align: justify;\">klassning <strong>private<\/strong> sohasida e&#8217;lon qilingan\u00a0<em><strong>servoIndex, min, max<\/strong><\/em> o&#8217;zgaruvchilariga esa, sketchdan murojaat qilib bo&#8217;lmaydi. Ularga faqat klassning metodlari murojaat qilishi mumkin.<\/p>\n<p style=\"text-align: justify;\">Yuqoridagilardan tashqari, klassning <strong>public<\/strong> sohasida yana bir <strong>Servo()<\/strong> konstruktori ham ko&#8217;rsatilganini ko&#8217;rishimiz mumkin. U funksiya sifatida sketchda obyekt e&#8217;lon qilingan paytda chaqiriladi va uning nomi aynan klassning nomi bilan bir xil bo&#8217;lishi kerak. U o&#8217;zgaruvchilarni e&#8217;lon qilish, sozlamalarni uzatish va maqsadlarda qo&#8217;llanilishi mumkin.<\/p>\n<p style=\"text-align: center;\"><strong>Obyektni e&#8217;lon qilish<\/strong><\/p>\n<p style=\"text-align: justify;\">Obyektni e&#8217;lon qilish (yaratish) ham xuddi strukturani yaratgandagidek, klass nomi bo&#8217;yicha bajariladi:<\/p>\n<p><strong>&lt;klass_nomi&gt; &lt;obyekt_nomi&gt;;<\/strong> <em>\/\/ obyekt e&#8217;lon qilish<\/em><br \/>\nmasalan:<br \/>\n<strong>Servo servo1;<\/strong> \/\/ <em><strong>Servo<\/strong> klassining <strong>servo1<\/strong> nomli obyektini e&#8217;lon qilish<\/em><\/p>\n<p style=\"text-align: justify;\"><strong>&lt;klass_nomi&gt; &lt;obyekt_nomi&gt;&lt;[massiv_o&#8217;lchami]&gt;;<\/strong> \/\/ obyektlar massivini e&#8217;lon qilish<br \/>\nmasalan:<br \/>\n<strong>Servo servo2[5];<\/strong> \/\/ <em><strong>Servo<\/strong> klassining 5 ta elementdan iborat <strong>servo2<\/strong> obyektlar massivini yaratish<\/em><\/p>\n<p style=\"text-align: justify;\">Asosiy dasturdan klass a&#8217;zolariga (metodlarga) murojaat qilish ham xuddi <a href=\"https:\/\/yarat.uz\/?p=66#struktura\">struktura<\/a> bilan bir xil tartibda, &#8220;.&#8221; (nuqta) belgisi yordamida bajariladi. Masalan:<br \/>\n<strong>Servo.attach();<\/strong> <em>\/\/ sketchdan\u00a0<strong>Servo<\/strong> obyektining <strong>attach<\/strong> metodini chaqirish<\/em><\/p>\n<p style=\"text-align: justify;\"><strong>myClass[5].myMethod();<\/strong> <em>\/\/ sketchdan <strong>myClass<\/strong> obyektlar massividagi 5-indeksli obyekt uchun <strong>myMethod<\/strong> metodini chaqirish.<\/em><\/p>\n<p style=\"text-align: justify;\">Klass hamda obyektlarni, shuningdek ular asosida Arduino bibliotekalarini yaratish jarayonlari alohida darsda aniq misollar bilan batafsil ko&#8217;rib chiqiladi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ko&#8217;p hollarda, Arduino loyihalarini yaratishda asosiy sketchdan tashqari, unga qo&#8217;shib olinadigan yordamchi fayllardan keng foydalaniladi. Yirik hajmdagi va murakkab dasturlarni tushunishni osonlashtirish uchun ularni (yaxlit funksiyalarni) bir nechta qismlarga ham bo&#8217;lib yuborish mumkin. Bunday hollarda &#8220;Setup()&#8221; va &#8220;loop()&#8221; funksiyalarini o&#8217;z ichiga oluvchi asosiy sketchning boshlang&#8217;ich qismida (global o&#8217;zgaruvchilar sohasida) yordamchi sketchlar faylining nomi kod yordamida [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-arduino"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64"}],"version-history":[{"count":38,"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":5202,"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/64\/revisions\/5202"}],"wp:attachment":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}