{"id":4277,"date":"2024-09-18T18:48:55","date_gmt":"2024-09-18T13:48:55","guid":{"rendered":"https:\/\/yarat.uz\/?p=4277"},"modified":"2025-03-19T15:27:03","modified_gmt":"2025-03-19T10:27:03","slug":"arduino-bibliotekasini-yaratish-18","status":"publish","type":"post","link":"https:\/\/yarat.uz\/?p=4277","title":{"rendered":"Arduino bibliotekasini yaratish [18+]"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"https:\/\/yarat.uz\/?p=64\">Ilgari<\/a> aytib o&#8217;tilganidek, aksariyat standart bibliotekalar qaysidir datchik, modul yoki bog&#8217;lanish interfeysidan foydalanishni osonlashtirish maqsadida yaratiladi. Biroq foydalanuvchi o&#8217;zi ko&#8217;p qo&#8217;llaydigan dasturiy bloklarni va funksiyalarini ham alohida tashqi faylga sodda biblioteka sifatida saqlab olishi mumkin. Natijada, har safar shu funksiyagadan foydalanish zarurati tug&#8217;ilganda, shunchaki kerakli sketchga uni biblioteka sifatida &#8220;<strong>#include<\/strong>&#8221; buyrug&#8217;i yordamida qo&#8217;shib olish yetarli bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\">Biz quyida foydalanuvchi bibliotekasini yaratishning <strong>sodda<\/strong> va nisbatan murakkab (<strong>standart biblioteka<\/strong>) bo&#8217;lgan 2 ta variantini alohida-alohida ko&#8217;rib chiqamiz. Shuningdek, har bir usulni 2 tadan misolning bir nechta versiyalari yordamida ko&#8217;ramiz.<\/p>\n<p style=\"text-align: center;\"><strong>Yangi biblioteka yaratish<\/strong><\/p>\n<p style=\"text-align: justify;\">Aksariyat hollarda qulaylik uchun, standart biblioteka asosan 2 ta fayldan tashkil topadi. Ulardan biri &#8220;sarlavha fayli&#8221; deb (bunday deyilishiga sabab, bu fayl bibliotekaning barcha boshqa fayllariga havolalarni o&#8217;z ichiga oladi), 2-si esa, &#8220;realizatsiya fayli&#8221; deb yuritiladi (bunday deyilishiga sabab, asosiy bajariladigan kod shu faylda saqlanadi). Biblioteka sarlavha va realizatsiya fayllari nomi bir xil bo&#8217;lishi shart. Sarlavha fayli &#8220;<strong>.h<\/strong>&#8221; (header), realizatsiya fayli esa &#8220;<strong>.cpp<\/strong>&#8221; (C++) kengaytmasiga ega bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\">Bundan tashqari, standart biblioteka tarkibida &#8220;<strong>keywords.txt<\/strong>&#8221; matnli fayli va &#8220;<strong>examples<\/strong>&#8221; ichki papkasi ham bo&#8217;lishi mumkin. &#8220;keywords.txt&#8221; faylining vazifasi faqat biblioteka ayrim elementlarini (klass, metodlarni) alohida ranglarda ajratib ko&#8217;rsatish hisoblanadi. &#8220;examples&#8221; papkasida, nomidan ko&#8217;rinib turibdiki, biblioteka funksiyalarini namoyish qilishga mo&#8217;ljallangan misollar (sketchlar) saqlanadi.<\/p>\n<p style=\"text-align: justify;\">Agar biblioteka kam sondagi vazifalarni bajarishga mo&#8217;ljallangan bo&#8217;lsa, sarlavha va realizatsiya fayllari kodini yagona faylga &#8211; sarlavha (<strong>.h<\/strong>) fayliga birlashtirish ham mumkin. Bunda, realizatsiya faylidagi kod asosiy faylga ko&#8217;chirib olib o&#8217;tilishi kerak. Shuning uchun o&#8217;rganish davomida bibliotekaning 1 ta faylli variantini ham ko&#8217;rib o&#8217;tamiz.<\/p>\n<p style=\"text-align: center;\"><strong>Sodda biblioteka<\/strong><\/p>\n<p style=\"text-align: justify;\">Sodda biblioteka yaratish uchun C++ dasturlash tiliga murojaat qilish talab etilmaydi. Jumladan,\u00a0<strong>.cpp<\/strong> kengaytmali faylimizda ham o&#8217;zimizga tanish bo&#8217;lgan Wiring tilidagi kodlarni qo&#8217;llash bilan cheklanamiz. Chunki, ilgari ham tilga olinganidek, Wiring ham C++ ning soddalashtirilgan ko&#8217;rinishlaridan biri xolos.<\/p>\n<p style=\"text-align: justify;\"><strong>1-misol.<\/strong> Ushbu usulni o&#8217;rganish uchun, &#8220;Blink&#8221; sketchi qanchalik sodda bo&#8217;lmasin, biz uni biblioteka yordamida boshqariladigan boshqacha ko&#8217;rinishga keltiramiz. Aynan sketchning soddaligi va hammaga tanishligi ham yangi biblioteka yaratish jarayonini osonlashtiradi. Bundan tashqari, bibliotekaga pirpirash davomiyligi, takrorlanishlar sonini ko&#8217;rsatish rejimlarini ham qo&#8217;shamiz.<\/p>\n<p style=\"text-align: justify;\">Ma&#8217;lumki, sketchning dastlabki ko&#8217;rinishi quyidagicha:<\/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>Original 'Blink' sketchi<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\nvoid setup(){<br \/>\npinMode(13, OUTPUT);<br \/>\n}<\/p>\n<p style=\"text-align: justify;\">void loop(){<br \/>\ndigitalWrite(13, HIGH);<br \/>\ndelay(1000);<br \/>\ndigitalWrite(13, LOW);<br \/>\ndelay(1000);<br \/>\n}<br \/>\n<\/div><\/div>\nAlohida faylga olib o&#8217;tishdan oldin sketchning bajarish (realizatsiya) qismini alohida funksiyaga aylantiramiz va skecthni ushbu ko&#8217;rinishida ifodalab olamiz. Bundan tashqari, sketch aksariyat mikrokontrollerda ishlashi uchun 13-pin o&#8217;rniga LED_BUILTIN yozuvini qo&#8217;llaymiz:<\/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>O'zgartirilgan 'Blink' sketchi<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>void setup(){<br \/>\n}<\/p>\n<p>void loop(){<br \/>\nmiltilla(LED_BUILTIN, 1000);<br \/>\n}<\/p>\n<p>void miltilla(int pin, int pauza){<br \/>\npinMode(pin, OUTPUT);<br \/>\ndigitalWrite(pin, HIGH);<br \/>\ndelay(pauza);<br \/>\ndigitalWrite(pin, LOW);<br \/>\ndelay(pauza);<br \/>\n}<\/p>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Sketchni mikrokontrollerga yuklasak, avvalgidek ishlayotganini kuzatishimiz mumkin. Asosiy kodni alohida funksiyaga ajratib olishimizdan maqsad shuki, uni bo&#8217;lajak bibliotekamizning realizatsiya (bajarish) qismi sifatida foydalanamiz.<\/p>\n<p style=\"text-align: justify;\">Shu yerda sketchimizni yanada takomillashtiramiz. Sketchdagi miltilla() funksiyasiga yangi\u00a0<strong>&#8220;hisobchi&#8221;<\/strong> argumentini qo&#8217;shamiz. Keyinchalik ham sketchning faqat shu variantini takomillashtirib boramiz. Oldingi &#8220;Blink&#8221; sketchidan farqlash uchun uni &#8220;<strong>miltillash<\/strong>&#8221; deb nomlaymiz. Demak, &#8220;miltillash.ino&#8221; sketchining kodi quyidagicha bo&#8217;ladi:<\/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>'miltillash' sketchi. 1-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\nint pin = LED_BUILTIN;<br \/>\nint pauza = 1000;<br \/>\nint hisobchi = 5;<br \/>\nvoid setup() {<br \/>\npinMode(pin, OUTPUT);<br \/>\nmiltillash(pin, pauza, hisobchi);<br \/>\n}<\/p>\n<p>void loop() {<\/p>\n<p>}<\/p>\n<p>void miltillash(int pin, int pauza, int hisobchi){<br \/>\nif (hisobchi&gt;0) {<br \/>\nfor (int i=0; i&lt;hisobchi; i++){<br \/>\ndigitalWrite(pin, HIGH);<br \/>\ndelay(pauza);<br \/>\ndigitalWrite(pin, LOW);<br \/>\ndelay(pauza);<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Bu yerdagi &#8220;hisobchi&#8221; o&#8217;zgaruvchisi qiymatini setup() funksiyasi sohasida o&#8217;zgartirish orqali takrorlanishlar sonini cheklash mumkin bo&#8217;ladi. loop() funksiyasida esa, takrorlanishlar sonini ko&#8217;ratishning ma&#8217;nosi yo&#8217;q.<\/p>\n<p style=\"text-align: justify;\">Endi standart bibliotekaning 1-varianti yaratishga kirishamiz. Bunday bibliotekada, shunchaki yuqoridagi misolda dasturning ichki funksiyasi sifatida qaralgan miltilla() funksiyasini va unga taalluqli o&#8217;zgaruvchilarni alohida fayllarga olib o&#8217;tamiz.<\/p>\n<p style=\"text-align: justify;\">Bunday fayllarni yaratish uchun, dastlab Arduino IDE dasturi sketchlari saqlanadigan papkadagi <strong>&#8220;libraries&#8221;<\/strong> papkasini topamiz va yangi <strong>&#8220;YangiBlinkLib&#8221;<\/strong> deb nomlangan yangi papka hosil qilamiz (sketchlar papkasiga <strong>&#8220;\u0421\u043a\u0435\u0442\u0447&#8221;<\/strong> menyusidagi <strong>&#8220;\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0441\u043a\u0435\u0442\u0447\u0430&#8221;<\/strong> elementi yoki <strong>&#8220;Ctrl+K&#8221;<\/strong> klavishalar kombinatsiyasi orqali o&#8217;tish mumkin). Uning ichida esa, ixtiyoriy matnli redaktor yordamida <strong>&#8220;YangiBlink.h&#8221;<\/strong> sarlavha fayli, <strong>&#8220;YangiBlink.cpp&#8221;<\/strong> nomli realizatsiya fayli va &#8220;keywords.txt&#8221; kalit-so&#8217;zlar faylini yaratib olamiz. Bundan tashqari &#8220;YangiBlinkLib&#8221; papkasi ichida &#8220;examples&#8221; papkasini ham yaratib qo&#8217;yamiz. Unga keyinchalik, yaratilgan bibliotekadan foydalanishga misol tariqasida o&#8217;zimiz yaratadigan sketch faylini nusxalab qo&#8217;yamiz.<\/p>\n<p style=\"text-align: justify;\">Biblioteka fayllarini Arduino IDE yordamida ham hosil qilishimiz mumkin. Buni 2 xil usulda amalga oshirsa bo&#8217;ladi:<\/p>\n<p style=\"text-align: justify;\">1-usulda fayllar sketch ko&#8217;rinishida yaratiladi va alohida papka ichida <strong>.ino<\/strong> kengaytmasi bilan saqlanadi. Shundan keyin, har bir fayl yaratilganidan keyin fayl menejeri orqali (masalan, Total Commanderda) uning kengaytmasini <strong>.h<\/strong>,<strong>\u00a0.cpp<\/strong> va <strong>txt<\/strong> ga o&#8217;zgartirilishi, sketchlarni o&#8217;z ichiga olgan papkalar o&#8217;chirib yuborilishi, &#8220;libraries&#8221; papkasi ichida &#8220;YangiBlinkLib&#8221; papkasini yaratib, sketchlarni unga ko&#8217;chirish kerak bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\">2-usulda Arduino IDE dasturida yangi sketch yaratib, dastur oynasidag sketch nomidan o&#8217;ng tomonda joylashgan menyudan &#8220;<strong>\u041d\u043e\u0432\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430<\/strong>&#8221; buyrug&#8217;i yoki &#8220;<strong>Ctrl+Shift+N<\/strong>&#8221; klavishalari kombinatsiyasi yordamida yangi oynalar yaratamiz, ularga biblioteka nomi bilan bir xil, lekin <strong>.h<\/strong> va <strong>.cpp<\/strong> kengaytmaga ega bo&#8217;lgam nomlar beramiz: &#8220;YangiBlink.h&#8221; va &#8220;YangiBlink.cpp&#8221; (Bunday usul bilan <strong>.txt<\/strong> kengaytmali fayl yaratib bo&#8217;lmaydi. Lekin &#8220;keywords.txt&#8221; faylini sketch ko&#8217;rinishida yaratib, keyin uning kengaytmasini <strong>.ino<\/strong> dan <strong>.txt<\/strong> ga o&#8217;zgartirib olish mumkin). Bu fayllar sketch bilan bitta papkaga saqlanadi. Ularni yuqorida ko&#8217;rsatilgan tartibda &#8220;libraries&#8221; papkasi ichida yangi &#8220;YangiBlinkLib&#8221; papkasini yaratib, shu papkaga ko&#8217;chirib olib o&#8217;tamiz.<\/p>\n<p style=\"text-align: justify;\">Biblioteka fayllarini quyidagi ko&#8217;rinishga keltiramiz:<\/p>\n<p><strong>&#8220;YangiBlink.h&#8221; fayli:<\/strong><\/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>'YangiBlink.h' - bibliotekaning sarlavha fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &#8220;Arduino.h&#8221;<br \/>\nvoid miltilla(int pin); \/\/ takrorlanish soni va pauza davomiyligi ko&#8217;rsatilmaydigan variant uchun<br \/>\nvoid miltillaint pin, int pauza); \/\/ takrorlanish soni ko&#8217;rsatilmaydigan variant uchun<br \/>\nvoid miltilla(int pin, int pauza, int hisobchi); \/\/ barcha argumentlar ko&#8217;rsatiladigan variant uchun<br \/>\n<\/div><\/div>\n<p><strong>&#8220;YangiBlink.cpp&#8221; fayli:<\/strong><br \/>\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>'YangiBlink.cpp' - realizatsiya fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#inclide &#8220;Arduino.h&#8221;<br \/>\n#include &#8220;YangiBlink.h&#8221;<\/p>\n<p>void miltilla(int pin){ \/\/ takrorlanish soni va davomiylik ko&#8217;rsatilmaydigan funksiya<br \/>\npinMode(pin, OUTPUT);<br \/>\ndigitalWrite(pin, HIGH);<br \/>\ndelay(1000);<br \/>\ndigitalWrite(pin, LOW);<br \/>\ndelay(1000);<br \/>\n}<br \/>\nvoid miltilla(int pin, int pauza){ \/\/ takrorlanish soni ko&#8217;rsatilmaydigan funksiya<br \/>\npinMode(pin, OUTPUT);<br \/>\ndigitalWrite(pin, HIGH);<br \/>\ndelay(pauza);<br \/>\ndigitalWrite(pin, LOW);<br \/>\ndelay(pauza);<br \/>\n}<br \/>\nvoid miltilla(int pin, int pauza, int hisobchi){ \/\/ barcha argumentlar ko&#8217;rsatiladigan funksiya<br \/>\npinMode(pin, OUTPUT);<br \/>\nfor (int i=0;i&lt;hisobchi; i++){<br \/>\ndigitalWrite(pin, HIGH);<br \/>\ndelay(pauza);<br \/>\ndigitalWrite(pin, LOW);<br \/>\ndelay(pauza);<br \/>\n}<br \/>\n}<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Ko&#8217;rinib turibdiki, realizatsiya faylida <strong>PinMode()<\/strong> funksiyasi ham kodga kiritilgan. Natijada, yaratilayotgan sketchda setup() funksiyasi tarkibida uni alohida ko&#8217;rsatib qo&#8217;yishga hojat qolmaydi. &#8220;keywords.txt&#8221; faylida quyidagi ma&#8217;lumotlar mavjud bo&#8217;lishi kerak:<\/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>'keywords.txt' - kalit-so'zlar fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\nYangiBlink KEYWORD1<br \/>\nmiltilla KEYWORD1<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Shu yo&#8217;l bilan, fayldagi KETWORD1 yozuvi yordamida &#8220;YangiBlink&#8221; va &#8220;miltilla&#8221; so&#8217;zlarini kalit-so&#8217;z sifatida alohida rangda ko&#8217;rsatilishi kerakligini belgilab qo&#8217;yilmoqda.<\/p>\n<p style=\"text-align: justify;\">Shundan keyin, Arduino IDE ni to&#8217;liq yopib, qayta ishga tushiramiz va yangi sketch yaratib, <strong>&#8220;\u0421\u043a\u0435\u0442\u0447\/\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443&#8221;<\/strong> menyusidan &#8220;<strong>YangiBlinkLib<\/strong>&#8221; (biz yaratgan biblioteka papkasining nomi) yozuvini topib tanlaymiz (Agar menyuda &#8220;<strong>YangiBlink<\/strong><strong>Lib<\/strong>&#8221; yozuvi mavjud bo&#8217;lmasa, bu biblioteka yaratilishi jarayonida xatolik yuz berganini bildiradi). Xatolik kuzatilmasa, sketchda <strong>#include &lt;YangiBlink.h&gt;<\/strong> yozuvi paydo bo&#8217;lishi kerak.<\/p>\n<p style=\"text-align: justify;\">Yangi sketchmizni\u00a0quyidagi holga keltiramiz va ishga tushiramiz:<\/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>'miltillash' sketchi. 2-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &lt;YangiBlink.h&gt;<br \/>\nvoid setup() {<br \/>\nmiltilla(LED_BUILTIN, 200, 10); \/\/ barcha argumentlar ko&#8217;rsatiladigan variant<br \/>\nmiltilla(LED_BUILTIN, 3000); \/\/ takrorlanish soni ko&#8217;rsatilmaydigan variant<br \/>\n}<\/p>\n<p>void loop() {<br \/>\nmiltilla(LED_BUILTIN); \/\/ takrorlanish soni va pauza davomiyligi (1000 ms) ko&#8217;rsatilmaydigan variant<br \/>\n}<\/p>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Sketchdagi pauza davomiyligi ko&#8217;rsatilmaydigan variantda uning davomiyligi 1000 ms (1 sekund) deb qabul qilinadi, chunki bibliotekadagi tegishli funksiyada delay() funksiyasi argumentida o&#8217;zgaruvchi o&#8217;rniga &#8220;1000&#8221; qiymati aniq belgilab qo&#8217;yilgan. Xuddi shuningdek, takrorlanishlar soni ko&#8217;rsatilmagan variantda takrorlanish qiymati 1 ga teng deb qabul qilinadi.<\/p>\n<p style=\"text-align: justify;\">Dasturni ishga tushirib, LED_BUILTIN raqamli piniga ulangan svetodiod dastlab 200 millisekundlik pauza bilan 10 marta, keyin 3000 millisekundlik pauza bilan 1 marta, undan keyin esa, uzluksiz 1000 millisekundlik pauza bilan miltillayotganini kuzatishimiz mumkin.<\/p>\n<p style=\"text-align: justify;\">Yuqorida aytib o&#8217;tilganidek, oxirgi sketchimizni biblioteka asosiy papkasi ichidagi &#8220;examples&#8221; papkasiga nusxalab qo&#8217;ysak, u biz yaratgan yangi biliotekadan foydalanishga misol sifatida Arduino IDE dasturi menyusining &#8220;<strong>\u0424\u0430\u0439\u043b\/\u041f\u0440\u0438\u043c\u0435\u0440\u044b\/YangiBlinkLib<\/strong>&#8221; bo&#8217;limida ham doim ko&#8217;rinadi. Ya&#8217;ni, bibliotekamiz asosidagi yangi sketchni har safar boshidan yaratib o&#8217;tirmasdan shu sketchga o&#8217;zgartirish kiritib, yangi nom bilan saqlab olish qulayroq bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\"><strong>2-misol.<\/strong> Ushbu misolda yuqoridagidek sodda sketch yaratish usuli bilan, matnli formatdagi o&#8217;zgaruvchi qiymatini sozlama sifatida EEPROM-xotiraga saqlash va undan o&#8217;qish bibliotekasini yaratamiz.<\/p>\n<p style=\"text-align: justify;\">Ma&#8217;lumki, EEPROM-xotiraga yozuvlar baytlar ko&#8217;rinishida saqlanadi va unga matnni to&#8217;g&#8217;ridan-to&#8217;g&#8217;ri saqlash uchun tayyor funksiya mavjud emas. Shuning uchun har safar sketchga shunday vazifani bajaruvchi alohida kod qo&#8217;sishga to&#8217;g&#8217;ri keladi. Agar matnni EEPROM-xotiraga saqlash va undan o&#8217;qish uchun maxsus biblioteka yaratilsa, sketchlarda undan oson foydalanish mumkin bo&#8217;ladi.<\/p>\n<p style=\"text-align: justify;\">Biz bunday bibliotekaning asosida, WiFi tarmog&#8217;i asosiy parametrlarini saqlash va aksincha ularni xotiradan o&#8217;qish sketchlarini yaratamiz, keyinchalik esa, ularni yagona sketchga birlashtiramiz. Ushbu misolni keltirishimizga sabab, keyinroq standart bibliotekani yaratish davomida ham shu misolga o&#8217;zgartirishlar kiritib, sodda biblioteka bilan standart bibliotekaning farqini tushunib olishimiz osonroq bo&#8217;ladi. Dastlab, <a href=\"https:\/\/yarat.uz\/?p=1196\">ilgari o&#8217;rganilgan material<\/a> asosida qiymat turlarini, jumladan matnli qatorni konvertatsiyalash buyruqlarini eslab olamiz.<\/p>\n<p style=\"text-align: justify;\">Ma&#8217;lumki, matnli qatorni EEPROM-xotiraga saqlashda unga massiv sifatida qarash eng oson usul hisoblanadi. Ixtiyoriy matnli qatorni, xususan WiFi tarmog&#8217;i nomi (SSID) va parolini\u00a0 EEPROM-xotiradan o&#8217;qishda ulardagi belgilar xotira kataklarining qaysi diapazonida (kataklar oralig&#8217;ida) saqlanganini bilish zarurati tug&#8217;iladi. Shuning uchun, har bir matnli qatorni saqlashdan oldin matnning uzunligi ko&#8217;rsatib qo&#8217;yilishi maqsadga muvofiq.<\/p>\n<p style=\"text-align: justify;\">Shulardan kelib chiqsak, matnli qatorni EEPROM-xotiraga saqlash (&#8216;MatnniSaqlash.ino&#8217;) sketchi quyidagi ko&#8217;rinishda bo&#8217;ladi:<\/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>WiFi sozlamalarini EEPROM-xotiraga saqlash sketchi. 1-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &lt;EEPROM.h&gt;<br \/>\nvoid setup() {<br \/>\nEEPROM.begin(1024);<br \/>\nSerial.begin(115200);<br \/>\ndelay(100);<br \/>\nSerial.println();<br \/>\nmatnSaqla(0, &#8220;Ofis&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nmatnSaqla(21, &#8220;12345678&#8221;); \/\/ Parolni 21-katakdan boshlab saqlash<br \/>\n}<\/p>\n<p>void matnSaqla(byte boshManzil, String matn){<br \/>\nbyte uzunlik = matn.length();<br \/>\nif (matn==&#8221;&#8221;) uzunlik=0;<br \/>\nEEPROM.put(boshManzil, uzunlik); \/\/ dastlabki katakka matn uzunligini saqlash<br \/>\nSerial.println(boshManzil);<br \/>\nif (uzunlik&gt;0) {<br \/>\nfor (int i=0; i&lt;uzunlik; i++) {<br \/>\nEEPROM.put(boshManzil+i+1, matn[i]); \/\/ keyingi katakdan boshlab matndagi belgilarni alohida baytlar sifatida saqlash<br \/>\nSerial.print(matn[i]);<br \/>\n}<br \/>\nSerial.println();<br \/>\n}<br \/>\nEEPROM.commit();<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Dasturni ishga tushirsak, dastlab ko&#8217;rsatilgan matnlarning uzunligi EEPROM-xotiraning ko&#8217;rsatilgan manzillariga (ushbu misolda WiFi nomi uzunligi 0-katakka, parol uzunligi esa, 21-katakka) saqlanadi. Keyingi (1- va 22-) katakdan boshlab esa, matn belgilari ketma-ket saqlab qo&#8217;yiladi.<\/p>\n<p>Matnli qatorni EEPROM-xotiradan o&#8217;qish (&#8216;MatnniUqish.ino&#8217; ) sketchi esa, quyidagi ko&#8217;rinishda bo&#8217;ladi:<\/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>WiFi sozlamalarini EEPROM-xotiradan o'qish sketchi. 1-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &lt;EEPROM.h&gt;<br \/>\nSerial.begin(115200);<br \/>\ndelay(100);<br \/>\nSerial.println();<br \/>\nString ssid=matnUqi(0); \/\/ SSIDni o&#8217;qish<br \/>\nSerial.println(&#8220;SSID: &#8221; + ssid);<br \/>\nString parol=matnUqi(21); \/\/ Parolni o&#8217;qish<br \/>\nSerial.println(&#8220;Parol: &#8221; + parol);<br \/>\n}<\/p>\n<p>String matnUqi(int boshManzil){<br \/>\nString matn = &#8220;&#8221;;<br \/>\nint uzunlik=EEPROM.read(boshManzil); \/\/ matn uzunligini xotiradan o&#8217;zlashtirish<br \/>\nSerial.println(uzunlik);<br \/>\nif (uzunlik&gt;0) { \/\/ matn uzunligi 0 dan farqli bo&#8217;lsa, ularni ketma-ket o&#8217;qish va matn sifatida birlashtirish<br \/>\nfor (int i=0;i&lt;uzunlik;i++){<br \/>\nmatn += (char)EEPROM.read(boshManzil+i+1);<br \/>\n}<br \/>\n}<br \/>\nreturn matn;<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Dasturni ishga tushirib, oldingi misol yordamida saqlangan SSID hamda parol uzunligi va ularning matnini port monitorida ko&#8217;rishimiz mumkin.<\/p>\n<p style=\"text-align: justify;\">Endi yuqoridagi standart bibliotekaning 1-varianti kabi, yangi &#8220;<strong>TextToEEPROM<\/strong>&#8221; nomli biblioteka yaratib olamiz (yuqorida keltirilgan tartibda &#8220;TextToEEPROMLib&#8221; biblioteka papkasini hosil qilib, uning ichida &#8220;<strong>TxtEEPROM.h<\/strong>&#8220;, &#8220;<strong>TxtEEPROM.cpp<\/strong>&#8221; matnli fayllarini yaratamiz). Sketchdagi funksiyalarni biblioteka fayllariga ko&#8217;chirilganligi sababli, biblioteka fayllari quyidagi ko&#8217;rinishga keladi:<\/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>'TxtEEPROM.h' sarlavha fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &#8220;Arduino.h&#8221;<br \/>\nvoid matnSaqla(byte boshManzil, String matn);<br \/>\nString matnUqi(int boshManzil);<br \/>\n<\/div><\/div>\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>'TxtEEPROM.cpp' realizatsiya fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &#8220;Arduino.h&#8221;<br \/>\n#include &#8220;EEPROM.h&#8221;<br \/>\n#include &#8220;TxtEEPROM.h&#8221;<\/p>\n<p>void matnSaqla(byte boshManzil, String matn){<br \/>\nbyte uzunlik = matn.length();<br \/>\nif (matn==&#8221;&#8221;) uzunlik=0;<br \/>\nEEPROM.put(boshManzil, uzunlik);<br \/>\nif (uzunlik&gt;0) {<br \/>\nfor (int i=0; i&lt;uzunlik; i++) {<br \/>\nEEPROM.put(boshManzil+i+1, matn[i]);<br \/>\n}<br \/>\n}<br \/>\nEEPROM.commit();<br \/>\n}<\/p>\n<p>String matnUqi(int boshManzil){<br \/>\nString matn = &#8220;&#8221;;<br \/>\nint uzunlik=EEPROM.read(boshManzil);<br \/>\nif (uzunlik&gt;0) {<br \/>\nfor (int i=0;i&lt;uzunlik;i++){<br \/>\nmatn += (char)EEPROM.read(boshManzil+i+1);<br \/>\n}<br \/>\n}<br \/>\nreturn matn;<br \/>\n}<br \/>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Arduino IDE menyusidagi bibliotekalari ro&#8217;yxatida esa, &#8220;TextToEEPROMLib&#8221; papkasi nomi ham ko&#8217;rinishi kerak. Yuqoridagi 2 ta sketchlar esa, tegishli o&#8217;zgarishlardan so&#8217;ng quyidagi ko&#8217;rinishlarga keladi:<\/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>WiFi sozlamalarini biblioteka yordamida EEPROM-xotiraga saqlash sketchi. 2-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &lt;EEPROM.h&gt;<br \/>\n#include &lt;txtEEPROM.h&gt;<br \/>\nvoid setup() {<br \/>\nEEPROM.begin(1024);<br \/>\nSerial.begin(115200);<br \/>\ndelay(100);<br \/>\nSerial.println();<br \/>\nmatnSaqla(0, &#8220;Ofis2&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nmatnSaqla(21, &#8220;1234567890&#8221;); \/\/ Parolni 21-katakdan boshlab saqlash<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<br \/>\n<\/div><\/div>\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>WiFi sozlamalarini biblioteka yordamida EEPROM-xotiradan o'qish sketchi. 2-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n#include &lt;EEPROM.h&gt;<br \/>\n#include &lt;txtEEPROM.h&gt;<br \/>\nvoid setup() {<br \/>\nEEPROM.begin(1024);<br \/>\nSerial.begin(115200);<br \/>\ndelay(100);<br \/>\nSerial.println();<br \/>\nString ssid=matnUqi(0); \/\/ SSIDni 0-katakdan boshlab o&#8217;qish<br \/>\nSerial.println(&#8220;SSID: &#8221; + ssid);<br \/>\nString parol=matnUqi(21); \/\/ Parolni 21-katakdan boshlab o&#8217;qish<br \/>\nSerial.println(&#8220;Parol: &#8221; + parol);<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<br \/>\n<\/div><\/div>\n<p>Har ikki dasturni navbat bilan ishga tushirib, matn xotiraga to&#8217;g&#8217;ri saqlanganiga ishonch hosil qilishimiz mumkin.<\/p>\n<p style=\"text-align: center;\"><strong>Standart bibliotekaning 2-varianti<\/strong><\/p>\n<p style=\"text-align: justify;\">Bibliotekaning bunday turini yaratish uchun, Wiring dasturlash tilidan tashqari, C++ imkoniyatlaridan ham foydalanishga to&#8217;g&#8217;ri keladi.<\/p>\n<p style=\"text-align: justify;\">Bibliotekaning bunday variantida ham, odatda biblioteka fayllari soni 2 ta va undan ortiq bo&#8217;ladi. Bundan tashqari, biblioteka asosiy papkasi ichida &#8220;<strong>src<\/strong>&#8220;, &#8220;<strong>examples<\/strong>&#8221; nomli va yana boshqa yordamchi papkalar yaratilishi ham mumkin. Asosiy biblioteka (&#8220;<strong>.h<\/strong>&#8220;, &#8220;<strong>.cpp<\/strong>&#8220;) fayllari &#8220;<strong>src<\/strong>&#8221; papkasi ichida joylashadi. Agar biblioteka ko&#8217;plab fayllardan tashkil topgan bo&#8217;lsa, ularning barcha fayllari aynan shu papkada joylashadi.<\/p>\n<p style=\"text-align: justify;\">Standart bibliotekani yaratish uchun avvalo boshqa darsda o&#8217;rganilgan, C++ ning <a href=\"https:\/\/yarat.uz\/?p=64\"><strong>klass<\/strong> va <strong>metod<\/strong> tushunchalari<\/a> bilan tanishib olishimiz kerak bo&#8217;ladi. Ushbu tushunchalar C++ dasturlash tilidan Arduino IDE da qo&#8217;llaniladigan Wiring dasturlash tiliga meros bo&#8217;lib o&#8217;tgan. Aslida, <strong>klass yaratildi degani &#8211; deyarli yangi biblioteka ham yaratildi degani bo&#8217;ladi.<\/strong> Chunki, klass yaratilganidan keyingi bosqichlar shunchaki bibliotekani rasmiylashtirish bosqichi hisoblanadi.<\/p>\n<p style=\"text-align: center;\"><strong>Klassni yaratish<\/strong><\/p>\n<p style=\"text-align: justify;\">Yuqorida aytilganidek, klass va uning elementlari bevosita asosiy dasturda yoki bibliotekaning sarlavha hamda realizatsiya fayllarida hosil qilinishi mumkin. Bevosita bibliotekada klassni yaratishga o&#8217;tishdan oldin, qulaylik uchun biz uni dastlab asosiy dasturning o&#8217;zida yaratib, uning ishlash prinsipi bilan yaqindan tanishib olamiz.<\/p>\n<p style=\"text-align: justify;\">Klassning e&#8217;lon qilinishi va qo&#8217;llanilishi, o&#8217;z xususiyatlariga ko&#8217;ra, strukturaga o&#8217;xshab ketadi. Lekin, aslida uning ichki imkoniyatlari juda keng va obyektga yo&#8217;naltirilgan dasturlash konsepsiyasining asoslaridan biri hisoblanadi.<\/p>\n<p style=\"text-align: justify;\">Klassning strukturadan eng muhim farqi &#8211; uning sohalarga ajratilishi hisoblanadi: <strong>public<\/strong> (ochiq) va <strong>private<\/strong> (yopiq) sohalariga. Bir soha boshqa soha boshlanadigan joygacha yoki klassdagi yopuvchi figurali qavsgacha amal qiladi.<\/p>\n<p style=\"text-align: justify;\"><strong>public<\/strong> sohasi a&#8217;zolari obyekt yaratilgan asosiy dasturdan (sketchdan) murojaat qilish uchun ochiq hisoblanadi. U klassning a&#8217;zolariga (o&#8217;zgaruvchi va kontantalariga) obyekt yaratiladigan asosiy dastur (sketch) dan murojaat qilish mumkin bo&#8217;lgan (global) soha hisoblanadi. Ushbu sohani sketchning global o&#8217;zgaruvchilar e&#8217;lon qilinadigan sohasiga qiyoslash mumkin.<\/p>\n<p style=\"text-align: justify;\"><strong>private<\/strong> sohasi a&#8217;zolari faqat klass ichida murojaat qilish uchun ochiq, asosiy dastur uchun esa yopiq hisoblanadi. Ushbu sohani sketchning ma&#8217;lum bir funksiyasi ichida amal qiladigan lokal o&#8217;zgaruvchilar sohasiga qiyoslash mumkin.<\/p>\n<p>Demak, sohalarini hisobga olgan holda, klassni quyidagicha e&#8217;lon qilish mumkin:<\/p>\n<p><strong>class &lt;KLASS_NOMI&gt;{<br \/>\npublic:<br \/>\n<\/strong>\/\/ dasturdan murojaat qilish uchun ochiq soha<strong><br \/>\n&lt;klass_1-a&#8217;zosi&gt;;<\/strong><br \/>\n<strong>\u00a0 &lt;klass_2-a&#8217;zosi&gt;;<br \/>\nprivate:<br \/>\n<\/strong>\/\/ faqat klass ichida murojaat qilish uchun ochiq soha<strong><br \/>\n&lt;klass_3-a&#8217;zosi&gt;;<br \/>\n&lt;klass_4-a&#8217;zosi&gt;;<br \/>\n<\/strong><strong>};<\/strong><\/p>\n<p>Klassda kamida 1 ta soha ko&#8217;rsatib ketilishi kerak. Masalan, faqat\u00a0<strong>public<\/strong> sohasi.<\/p>\n<p style=\"text-align: justify;\">Ba&#8217;zi bibliotekalarni yaratishda klassning <strong>public<\/strong> sohasida konstruktor ham qo&#8217;llanilishi mumkin. U obyektni yaratish paytida chaqiriladi va klass nomi bilan bir xil bo&#8217;lgan nomga ega bo&#8217;ladi. Konstruktor klassga murojaat qilishning bir nechta variantlarini yaratish imkonini beradi. Masalan:<\/p>\n<p><strong>class &lt;KLASS_NOMI&gt; {<br \/>\npublic:<\/strong><\/p>\n<p><strong>&lt;konstruktor_nomi&gt;(int a, String b){<br \/>\n_a=a;<\/strong><br \/>\n<strong>_b=b;<\/strong><br \/>\n<strong>}<\/strong><\/p>\n<p><strong>&lt;konstruktor_nomi&gt;(int a){<br \/>\n_a=a;<\/strong><br \/>\n<strong>_b=&#8221;matn&#8221;;<\/strong><br \/>\n<strong>}<\/strong><\/p>\n<p>\/\/ dasturdan murojaat qilish uchun ochiq soha<\/p>\n<p><strong>private:<br \/>\n<\/strong>\/\/ faqat klass ichida murojaat qilish uchun ochiq soha<br \/>\n<strong>};<\/strong><\/p>\n<p style=\"text-align: justify;\">Misolda ko&#8217;rinib turibdiki, asosiy dasturdan klass ekzemplyariga murojaat qilinganda, uni obyekt argumentlari sonidan kelib chiqib, 2 xil usul bilan amalga oshirish mumkin: 2 ta argument bilan yoki faqat 1-argument bilan. 2-variantdagi 2-argument o&#8217;rniga, klassda har doim o&#8217;zgarmaydigan qiymat qo&#8217;llaniladi.<\/p>\n<p style=\"text-align: center;\"><strong>Klass obyektini yaratish<\/strong><\/p>\n<p style=\"text-align: justify;\">Obyekt yaratish, yuqorida aytib o&#8217;tilganidek, asosiy dasturda bajariladi. Agar klass asosiy dasturda yaratilgan bo&#8217;lsa, obyekt undan keyingi navbatda yaratilishi kerak, aksincha xatolik yuz beradi. Obyektni yaratish xuddi strukturani yaratishdek &#8211; klass nomi bo&#8217;yicha bajariladi:<\/p>\n<p><strong>&lt;KLASS_NOMI&gt; &lt;obyekt_nomi&gt;;<\/strong> obyekt yaratish<strong><br \/>\n&lt;KLASS_NOMI&gt; &lt;obyekt_nomi&gt;[10];<\/strong> obyektlar massivini yaratish<\/p>\n<p style=\"text-align: justify;\">Klass a&#8217;zolariga murojaat qilish ham xuddi struktura a&#8217;zolariga murojaat qilgandek bajariladi. Ya&#8217;ni, klass nomi va metodi o&#8217;rtasida\u00a0<strong>&#8220;.&#8221;<\/strong> (nuqta) qo&#8217;llaniladi:<\/p>\n<p><strong>&lt;obyekt_nomi&gt;.&lt;metod_nomi&gt;();<\/strong> obyekt metodini chaqirish, yoki<br \/>\n<strong>&lt;obyekt_nomi[tartib_raqami]&gt;.&lt;metod_nomi&gt;();<\/strong> obyektlar massividan obyekt metodini chaqirish.<\/p>\n<p style=\"text-align: justify;\">Sodda hamda standart bibliotekalarning klass yordamida yaratiladigan 2-variantlarini misollar yordamida, aniqrog&#8217;i yuqoridagi misollarga o&#8217;zgartirish kiritish orqali ko&#8217;rib chiqamiz.\u00a0Bunda ham dastlab klassni bevosita asosiy dasturimiz kodida qo&#8217;llaymiz. Shundan keyin uni alohida biblioteka fayllariga olib o&#8217;tamiz.<\/p>\n<p style=\"text-align: justify;\"><strong>3-misol.<\/strong> Dastlab, yuqoridagi &#8220;<strong>miltillash<\/strong>&#8221; sketchini klass yordamida takomillashtirib, uning yangi versiyasini hosil qilamiz. Yuqoridagi bazaviy ma&#8217;lumotlarimiz asosida sketchning bibliotekalar va o&#8217;zgaruvchilarni e&#8217;lon qilish sohasida yangi klass yaratamiz. Uni &#8220;<strong>LED<\/strong>&#8221; deb nomlaymiz. Natijada sketchimiz quyidagi holatga keladi:<\/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>'miltillash' sketchi. 2-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>class LED {<br \/>\npublic:<br \/>\nLED(int pin, uint32_t pauza, int hisobchi){<br \/>\n_pin=pin;<br \/>\n_pauza=pauza;<br \/>\n_hisobchi=hisobchi;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nvoid miltilla(){<br \/>\nif (_hisobchi&gt;0) {<br \/>\nfor (int i=0; i&lt;_hisobchi; i++){<br \/>\ndigitalWrite(_pin, HIGH);<br \/>\ndelay(_pauza);<br \/>\ndigitalWrite(_pin, LOW);<br \/>\ndelay(_pauza);<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>private:<br \/>\nint _pin;<br \/>\nuint32_t _pauza;<br \/>\nint _hisobchi;<br \/>\n};<\/p>\n<p>LED led1(2, 200, 10); \/\/\u00a0 led1 obyektini e&#8217;lon qilish<br \/>\nLED led2(3, 500, 1); \/\/ led2 obyektini e&#8217;lon qilish<\/p>\n<p>void setup() {<br \/>\nled1.miltilla();<br \/>\n}<\/p>\n<p>void loop() {<br \/>\nled2.miltilla();<br \/>\n}<\/p>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Sketch ishga tushirilgach, dastlab 2-raqamli pinga ulangan svetodiod (led1 obyekti) 200 ms pauza bilan 10 marta va 3-raqamli pinga ulangan svetodiod (led2 obyekti) 500 ms pauza bilan uzliksiz miltillaganini kuzatish mumkin.<\/p>\n<p>Ushbu sketchning bir nechta konstruktorli varianti, masalan quyidagicha bo&#8217;lishi mumkin:<\/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>'miltillash' sketchi. 3-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>class LED {<br \/>\npublic:<br \/>\nLED(int pin, uint32_t pauza, int hisobchi){ \/\/ 1-konstruktor<br \/>\n_pin=pin; \/\/ pin raqami o&#8217;zgarishi mumkin<br \/>\n_pauza=pauza; \/\/ pauza qiymati o&#8217;zgarishi mumkin<br \/>\n_hisobchi=hisobchi; \/\/ takrorlanish qiymati o&#8217;zgarishi mumkin<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED(int pin, uint32_t pauza){ \/\/ 2-konstruktor<br \/>\n_pin=pin; \/\/ pin raqami o&#8217;zgarishi mumkin<br \/>\n_pauza=pauza; \/\/ pauza qiymati o&#8217;zgarishi mumkin<br \/>\n_hisobchi=1; \/\/ takrorlanish qiymati o&#8217;zgarmaydi<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED(int pin){ \/\/ 3-konstruktor<br \/>\n_pin=pin; \/\/ pin raqami o&#8217;zgarishi mumkin<br \/>\n_pauza=1000; \/\/ pauza qiymati o&#8217;zgarmaydi<br \/>\n_hisobchi=1; \/\/ takrorlanish qiymati o&#8217;zgarmaydi<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nvoid pauzaQiymati(uint32_t pauza){<br \/>\n_pauza=pauza;<br \/>\n}<br \/>\nvoid hisobchiQiymati(int hisobchi){<br \/>\n_hisobchi=hisobchi;<br \/>\n}<br \/>\nvoid miltilla(){<br \/>\nif (_hisobchi&gt;0) {<br \/>\nfor (int i=0; i&lt;_hisobchi; i++){<br \/>\ndigitalWrite(_pin, HIGH);<br \/>\ndelay(_pauza);<br \/>\ndigitalWrite(_pin, LOW);<br \/>\ndelay(_pauza);<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>private:<br \/>\nint _pin;<br \/>\nuint32_t _pauza;<br \/>\nint _hisobchi;<br \/>\n};<\/p>\n<p>LED led1(2, 200, 10); \/\/ 1-konstruktor asosidagi led1 obyekti<br \/>\nLED led2(3, 500); \/\/ 2-konstruktor asosidagi led2 obyekti<br \/>\nLED led3(4); \/\/ 3-konstruktor asosidagi led3 obyekti<\/p>\n<p>void setup() {<br \/>\nled1.miltilla();<br \/>\nled2.miltilla();<br \/>\nled2.pauzaQiymati(1000);<br \/>\nled2.hisobchiQiymati(5);<br \/>\nled2.miltilla();<br \/>\n}<\/p>\n<p>void loop() {<br \/>\nled3.miltilla();<br \/>\n}<\/p>\n<\/div><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Ushbu sketch ishga tushirilganda, dastlab 2-raqamli pinga ulangan svetodiod (led1 obyekti) 200 ms pauza bilan 10 marta, 3-raqamli pinga ulangan svetodiod (led2 obyekti) 500 ms pauza bilan 1 marta, keyin xuddi shu svetodiod 1000 ms pauza bilan 5 marta va 4-raqamli pinga ulangan svetodiod (led3 obyekti) 1000 ms pauza bilan uzliksiz miltillaganini kuzatish mumkin.<\/p>\n<p style=\"text-align: justify;\">Yuqoridagi &#8220;LED&#8221; klassini asosiy dasturdan alohida biblioteka fayliga olib o&#8217;tish orqali, undan boshqa dasturlarda ham imkoniyatini yaratishimiz mumkin. Yuqorida aytib o&#8217;tilganidek, bunday bibliotekani faqat 1 ta sarlavha fayli yordamida ham yaratishimiz mumkin. Chunki, biz yaratgan klass unchalik murakkab emas. Lekin, shunday bo&#8217;lsa-da, ushbu klass asosida 2 ta asosiy fayldan iborat standart biblioteka yaratish variantini ham ko&#8217;rib chiqamiz. Har ikki hol uchun alohida bibliotekalar yaratiladi va har ikki holda ham, sketchga deyarli o&#8217;zgartirish talab etilmaydi (faqat kerakli biblioteka fayli nomi ko&#8217;rsatilishi kerak xolos).<\/p>\n<p style=\"text-align: justify;\">Faqat 1 ta fayldan iborat bo&#8217;lgan &#8220;YangiBlink2&#8221; bibliotekasi kodi (&#8220;YangiBlink2.h&#8221; sarlavha faylidagi &#8220;<strong>#pragma once<\/strong>&#8221; operatori quyida sanab o&#8217;tiladigan bibliotekalar faqat 1 marta qo&#8217;llanilishi kerakligini qat&#8217;iy belgilab qo&#8217;yadi, murakkab biblioteka fayllarida ularning tasodifan qayta qo&#8217;llanilishining oldini oladi. Arduino IDE ning eski versiyalarida uning o&#8217;rniga &#8220;<strong>#ifndef\/#define\/#endif<\/strong>&#8221; operatorlari juftligi qo&#8217;llanilgan):<\/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>'YangiBlink2.h' fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#pragma once<br \/>\n#include &#8220;Arduino.h&#8221;<\/p>\n<p>class LED {<br \/>\npublic:<br \/>\nLED(int pin, uint32_t pauza, int hisobchi); \/\/ konstruktor<br \/>\nLED(int pin, uint32_t pauza); \/\/ konstruktor<br \/>\nLED(int pin); \/\/ konstruktor<br \/>\nvoid miltilla();<br \/>\nvoid pauzaUrnat(uint32_t pauza);<br \/>\nvoid hisobchiUrnat(int hisobchi);<br \/>\nuint32_t pauzaQiymati();<br \/>\nint hisobchiQiymati();<\/p>\n<p>private:<br \/>\nint _pin;<br \/>\nuint32_t _pauza;<br \/>\nint _hisobchi;<br \/>\n};<\/p>\n<p>LED::LED(int pin, uint32_t pauza, int hisobchi){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=pauza;<br \/>\n_hisobchi=hisobchi;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED::LED(int pin, uint32_t pauza){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=pauza;<br \/>\n_hisobchi=1;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED::LED(int pin){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=1000;<br \/>\n_hisobchi=1;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nvoid LED::miltilla(){ \/\/ metod<br \/>\nif (_hisobchi&gt;0) {<br \/>\nfor (int i=0; i&lt;_hisobchi; i++){<br \/>\ndigitalWrite(_pin, HIGH);<br \/>\ndelay(_pauza);<br \/>\ndigitalWrite(_pin, LOW);<br \/>\ndelay(_pauza);<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nvoid LED::pauzaUrnat(uint32_t pauza){<br \/>\n_pauza=pauza;<br \/>\n}<br \/>\nvoid LED::hisobchiUrnat(int hisobchi){<br \/>\n_hisobchi=hisobchi;<br \/>\n}<br \/>\nuint32_t LED::pauzaQiymati(){<br \/>\nreturn _pauza;<br \/>\n}<br \/>\nint LED::hisobchiQiymati(){<br \/>\nreturn _hisobchi;<br \/>\n}<\/p>\n<\/div><\/div>\n<p>Ushbu biblioteka imkoniyatlarini ko&#8217;rsatib beruvchi sketch kodi :<\/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>'miltillash' sketchi. 4-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &lt;YangiBlink2.h&gt;<\/p>\n<p>LED led1(2, 200, 10); \/\/ 1-konstruktor asosidagi led1 obyekti<br \/>\nLED led2(3, 500); \/\/ 2-konstruktor asosidagi led2 obyekti<br \/>\nLED led3(4); \/\/ 3-konstruktor asosidagi led3 obyekti<\/p>\n<p>void setup() {<br \/>\nSerial.begin(115200);<\/p>\n<p>led1.miltilla();<\/p>\n<p>led1.pauzaUrnat(1000);<br \/>\nled1.hisobchiUrnat(5);<br \/>\nled1.miltilla();<\/p>\n<p>led2.miltilla();<br \/>\nled2.pauzaUrnat(2000);<br \/>\nled2.miltilla();<br \/>\n}<\/p>\n<p>void loop() {<br \/>\nSerial.println(led1.pauzaQiymati());<br \/>\nSerial.println(led1.hisobchiQiymati());<\/p>\n<p>Serial.println(led2.pauzaQiymati());<br \/>\nSerial.println(led2.hisobchiQiymati());<\/p>\n<p>Serial.println(led3.pauzaQiymati());<br \/>\nSerial.println(led3.hisobchiQiymati());<\/p>\n<p>led3.miltilla();<br \/>\n}<\/p>\n<\/div><\/div>\n<p style=\"text-align: justify;\">Sketch ishga tushirilsa, dastlab 2-pinga ulangan svetodiod 200 ms pauza bilan 10 marta, keyin aynan shu svetodiod 1000 ms pauza bilan 5 marta (chunki pauza va takrorlanishlar soni mos holda &#8220;pauzaUrnat&#8221; va &#8220;hisobchiUrnat&#8221; metodlari yordamida o&#8217;zgartirildi), shundan keyin 3-pinga ulangan svetodiod (led2 obyekti) dastlab 500 ms pauza bilan 1 marta va 2000 ms pauza bilan yana 1 marta miltillaydi. Oxirida esa, 4-pinga ulangan svetodiod (led3 obyekti) 1000 ms pauza bilan uzluksiz miltillay boshlaydi. Bundan tashqari, 4-pindagi svetodiod bilan birga ketma-ket portda har bir svetodiodning miltillash parametrlari ko&#8217;rsatila boshlaydi.<\/p>\n<p style=\"text-align: justify;\">Yuqoridagi yagona biblioteka faylini standart biblioteka sifatida 2 ta alohida fayllarga ajratilib, oxirgi sketch qo&#8217;llanilsa ham oxirgi natijalarni kuzatish mumkin. Asosiysi, sketch boshida &#8220;YangiBlink2.h&#8221; fayli o&#8217;rniga &#8220;YangiBlink3.h&#8221; fayli ko&#8217;rsatilib qo&#8217;yilishi kerak:<\/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>'YangiBlink3.h' sarlavha fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#pragma once<br \/>\n#include &#8220;Arduino.h&#8221;<\/p>\n<p>class LED {<br \/>\npublic:<br \/>\nLED(int pin, uint32_t pauza, int hisobchi); \/\/ konstruktor<br \/>\nLED(int pin, uint32_t pauza); \/\/ konstruktor<br \/>\nLED(int pin); \/\/ konstruktor<\/p>\n<p>void miltilla(); \/\/ metodni e&#8217;lon qilish<br \/>\nvoid pauzaUrnat(uint32_t pauza); \/\/ metodni e&#8217;lon qilish<br \/>\nvoid hisobchiUrnat(int hisobchi); \/\/ metodni e&#8217;lon qilish<br \/>\nuint32_t pauzaQiymati(); \/\/ metodni e&#8217;lon qilish<br \/>\nint hisobchiQiymati(); \/\/ metodni e&#8217;lon qilish<\/p>\n<p>private:<br \/>\nint _pin;<br \/>\nuint32_t _pauza;<br \/>\nint _hisobchi;<br \/>\n};<\/p>\n<\/div><\/div>\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>'YangiBlink3.cpp' realizatsiya fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &#8220;Arduino.h&#8221;<br \/>\n#include &#8220;YangiBlink3.h&#8221;<\/p>\n<p>\/\/ metodlar realizatsiyasi:<\/p>\n<p>LED::LED(int pin, uint32_t pauza, int hisobchi){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=pauza;<br \/>\n_hisobchi=hisobchi;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED::LED(int pin, uint32_t pauza){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=pauza;<br \/>\n_hisobchi=1;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<br \/>\nLED::LED(int pin){ \/\/ klass ekzemplyari<br \/>\n_pin=pin;<br \/>\n_pauza=1000;<br \/>\n_hisobchi=1;<br \/>\npinMode(_pin, OUTPUT);<br \/>\n}<\/p>\n<p>void LED::miltilla(){<br \/>\nif (_hisobchi&gt;0) {<br \/>\nfor (int i=0; i&lt;_hisobchi; i++){<br \/>\ndigitalWrite(_pin, HIGH);<br \/>\ndelay(_pauza);<br \/>\ndigitalWrite(_pin, LOW);<br \/>\ndelay(_pauza);<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nvoid LED::pauzaUrnat(uint32_t pauza){<br \/>\n_pauza=pauza;<br \/>\n}<br \/>\nvoid LED::hisobchiUrnat(int hisobchi){<br \/>\n_hisobchi=hisobchi;<br \/>\n}<br \/>\nuint32_t LED::pauzaQiymati(){<br \/>\nreturn _pauza;<br \/>\n}<br \/>\nint LED::hisobchiQiymati(){<br \/>\nreturn _hisobchi;<br \/>\n}<\/p>\n<\/div><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><strong>4-misol. <\/strong>Xuddi yuqoridagidek, &#8220;<strong>MATN<\/strong>&#8221; nomli yangi klass yaratib, yuqoridagi 2-misolda ko&#8217;rsatilgan matnli qatorni EEPROM-xotiraga saqlash hamda undan o&#8217;qish sketchlari kodini va tegishli bibliotekalar kodlarini ham quyidagicha ifodalash mumkin:<\/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>WiFi sozlamalarini EEPROM-xotiraga saqlash va undan o'qish sketchi. Klassni asosiy kodda qo'llash. 1-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &lt;EEPROM.h&gt;<br \/>\nclass MATN {<br \/>\npublic:<br \/>\nMATN(int EEPROM_hajmi, byte matnUzunligi){<br \/>\n_EEPROM_hajmi=EEPROM_hajmi;<br \/>\n_matnUzunligi=matnUzunligi;<br \/>\nEEPROM.begin(_EEPROM_hajmi);<br \/>\n}<br \/>\nvoid saqla(int _boshManzil, String _matn){<br \/>\nbyte u = _matn.length();<br \/>\nif (u&gt;_matnUzunligi) u=_matnUzunligi;<br \/>\nif (_matn==&#8221;&#8221;) u=0;<br \/>\nEEPROM.put(_boshManzil, u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0; i&lt;u; i++) {<br \/>\nEEPROM.put(_boshManzil+i+1, _matn[i]);<br \/>\n}<br \/>\n}<br \/>\nEEPROM.commit();<br \/>\n}<br \/>\nString uqi(int _boshManzil){<br \/>\nString _matn = &#8220;&#8221;;<br \/>\nint u=EEPROM.read(_boshManzil);<br \/>\nSerial.println(u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0;i&lt;u;i++){<br \/>\n_matn += (char)EEPROM.read(_boshManzil+i+1);<br \/>\n}<br \/>\n}<br \/>\nreturn _matn;<br \/>\n}<\/p>\n<p>private:<br \/>\nint _EEPROM_hajmi;<br \/>\nbyte _matnUzunligi;<br \/>\nint _boshManzil;<br \/>\nString _matn;<br \/>\n};<\/p>\n<p>MATN matn1(1024, 20);<\/p>\n<p>void setup() {<br \/>\nSerial.begin(115200);<br \/>\nmatn1.saqla(0, &#8220;Ofis&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nmatn1.saqla(21, &#8220;12345678&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nSerial.println();<br \/>\ndelay(100);<br \/>\nString ssid=matn1.uqi(0); \/\/ SSIDni o&#8217;qish<br \/>\nSerial.println(&#8220;SSID: &#8221; + ssid);<br \/>\nString parol=matn1.uqi(21); \/\/ Parolni o&#8217;qish<br \/>\nSerial.println(&#8220;Parol: &#8221; + parol);<br \/>\n}<br \/>\nvoid loop() {<br \/>\n}<\/p>\n<\/div><\/div>\n<p>Klassni 1 ta fayldan iborat biblioteka fayli ko&#8217;chirilgan variant va unga mos sketch:<\/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>'TxtEEPROM2.h' sarlavha fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#pragma once<br \/>\n#include &#8220;Arduino.h&#8221;<br \/>\n#include &lt;EEPROM.h&gt;<br \/>\nclass MATN {<br \/>\npublic:<br \/>\nMATN(int EEPROM_hajmi, byte matnUzunligi); \/\/ 1-konstruktor<br \/>\nMATN(int EEPROM_hajmi); \/\/ 2-konstruktor<br \/>\nvoid saqla(int _boshManzil, String _matn);<br \/>\nString uqi(int _boshManzil);<\/p>\n<p>private:<br \/>\nint _EEPROM_hajmi;<br \/>\nbyte _matnUzunligi;<br \/>\nint _boshManzil;<br \/>\nString _matn;<br \/>\n};<\/p>\n<p>MATN::MATN(int EEPROM_hajmi, byte matnUzunligi){<br \/>\n_EEPROM_hajmi=EEPROM_hajmi;<br \/>\n_matnUzunligi=matnUzunligi;<br \/>\nEEPROM.begin(_EEPROM_hajmi);<br \/>\n}<br \/>\nMATN::MATN(int EEPROM_hajmi){<br \/>\n_EEPROM_hajmi=EEPROM_hajmi;<br \/>\n_matnUzunligi=20;<br \/>\nEEPROM.begin(_EEPROM_hajmi);<br \/>\n}<\/p>\n<p>void MATN::saqla(int _boshManzil, String _matn){<br \/>\nbyte u = _matn.length();<br \/>\nif (u&gt;_matnUzunligi) u=_matnUzunligi;<br \/>\nif (_matn==&#8221;&#8221;) u=0;<br \/>\nEEPROM.put(_boshManzil, u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0; i&lt;u; i++) {<br \/>\nEEPROM.put(_boshManzil+i+1, _matn[i]);<br \/>\n}<br \/>\n}<br \/>\nEEPROM.commit();<br \/>\n}<br \/>\nString MATN::uqi(int _boshManzil){<br \/>\nString _matn = &#8220;&#8221;;<br \/>\nint u=EEPROM.read(_boshManzil);<br \/>\nSerial.println(u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0;i&lt;u;i++){<br \/>\n_matn += (char)EEPROM.read(_boshManzil+i+1);<br \/>\n}<br \/>\n}<br \/>\nreturn _matn;<br \/>\n}<\/p>\n<\/div><\/div>\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>WiFi sozlamalarini EEPROM-xotiraga saqlash va undan o'qish sketchi. Klassni 1 ta biblioteka faylida qo'llash. 2-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &lt;TxtEEPROM2.h&gt;<br \/>\nMATN matn1(1024, 20);<br \/>\n\/\/ MATN matn1(512);<\/p>\n<p>void setup() {<br \/>\nSerial.begin(115200);<br \/>\nmatn1.saqla(0, &#8220;Ofis&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nmatn1.saqla(21, &#8220;12345678&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nSerial.println();<br \/>\ndelay(100);<br \/>\nString ssid=matn1.uqi(0); \/\/ SSIDni o&#8217;qish<br \/>\nSerial.println(&#8220;SSID: &#8221; + ssid);<br \/>\nString parol=matn1.uqi(21); \/\/ Parolni o&#8217;qish<br \/>\nSerial.println(&#8220;Parol: &#8221; + parol);<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<\/p>\n<\/div><\/div>\n<p>Klassni 2 ta standart biblioteka fayllariga ko&#8217;chirilgan variant va unga mos sketch:<\/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>'TxtEEPROM3.h' sarlavha fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#pragma once<br \/>\n#include &#8220;Arduino.h&#8221;<br \/>\n#include &lt;EEPROM.h&gt;<br \/>\nclass MATN {<br \/>\npublic:<br \/>\nMATN(int EEPROM_hajmi, byte matnUzunligi); \/\/ 1-konstruktor<br \/>\nMATN(int EEPROM_hajmi); \/\/ 2-konstruktor<br \/>\nvoid saqla(int _boshManzil, String _matn);<br \/>\nString uqi(int _boshManzil);<\/p>\n<p>private:<br \/>\nint _EEPROM_hajmi;<br \/>\nbyte _matnUzunligi;<br \/>\nint _boshManzil;<br \/>\nString _matn;<br \/>\n};<\/p>\n<\/div><\/div>\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>'TxtEEPROM3.cpp' realizatsiya fayli<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#pragma once<br \/>\n#include &#8220;Arduino.h&#8221;<br \/>\n#include &#8220;TxtEEPROM3.h&#8221;<br \/>\n#include &lt;EEPROM.h&gt;<\/p>\n<p>\/\/ Metodlar realizatsiyasi:<\/p>\n<p>MATN::MATN(int EEPROM_hajmi, byte matnUzunligi){<br \/>\n_EEPROM_hajmi=EEPROM_hajmi;<br \/>\n_matnUzunligi=matnUzunligi;<br \/>\nEEPROM.begin(_EEPROM_hajmi);<br \/>\n}<br \/>\nMATN::MATN(int EEPROM_hajmi){<br \/>\n_EEPROM_hajmi=EEPROM_hajmi;<br \/>\n_matnUzunligi=20;<br \/>\nEEPROM.begin(_EEPROM_hajmi);<br \/>\n}<br \/>\nvoid MATN::saqla(int _boshManzil, String _matn){<br \/>\nbyte u = _matn.length();<br \/>\nif (u&gt;_matnUzunligi) u=_matnUzunligi;<br \/>\nif (_matn==&#8221;&#8221;) u=0;<br \/>\nEEPROM.put(_boshManzil, u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0; i&lt;u; i++) {<br \/>\nEEPROM.put(_boshManzil+i+1, _matn[i]);<br \/>\n}<br \/>\n}<br \/>\nEEPROM.commit();<br \/>\n}<br \/>\nString MATN::uqi(int _boshManzil){<br \/>\nString _matn = &#8220;&#8221;;<br \/>\nint u=EEPROM.read(_boshManzil);<br \/>\nSerial.println(u);<br \/>\nif (u&gt;0) {<br \/>\nfor (int i=0;i&lt;u;i++){<br \/>\n_matn += (char)EEPROM.read(_boshManzil+i+1);<br \/>\n}<br \/>\n}<br \/>\nreturn _matn;<br \/>\n}<\/p>\n<\/div><\/div>\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>WiFi sozlamalarini EEPROM-xotiraga saqlash va undan o'qish sketchi. Klassni standart biblioteka fayllarida qo'llash. 3-versiya<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>#include &lt;TxtEEPROM3.h&gt;<br \/>\nMATN matn1(1024, 20); \/\/ EEPROM-xotira o&#8217;lchami va matn maksimal uzunligi<br \/>\n\/\/ MATN matn1(512); \/\/ EEPROM-xotira o&#8217;lchami (matn maksimal uzunligi 20 ga teng bo&#8217;ladi)<\/p>\n<p>void setup() {<br \/>\nSerial.begin(115200);<br \/>\nmatn1.saqla(0, &#8220;Ofis&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nmatn1.saqla(21, &#8220;12345678&#8221;); \/\/ SSIDni 0-katakdan boshlab saqlash<br \/>\nSerial.println();<br \/>\ndelay(100);<br \/>\nString ssid=matn1.uqi(0); \/\/ SSIDni o&#8217;qish<br \/>\nSerial.println(&#8220;SSID: &#8221; + ssid);<br \/>\nString parol=matn1.uqi(21); \/\/ Parolni o&#8217;qish<br \/>\nSerial.println(&#8220;Parol: &#8221; + parol);<br \/>\n}<\/p>\n<p>void loop() {<br \/>\n}<\/p>\n<\/div><\/div>\n<p style=\"text-align: justify;\">4-misolning yuqoridagi barcha variantlarida sketch ishga tushirilganda, dastlab WiFi tarmog&#8217;i parametrlari (SSID va paroli) EEPROM-xotiraga <strong>MATN<\/strong> klassining\u00a0<strong>matn1<\/strong>\u00a0obyekti hamda <strong>saqla <\/strong>metodi yordamida saqlanadi. <strong>uqi<\/strong>\u00a0metodi yordamida esa, matn xotiradan o&#8217;qiladi. Natijalar port monitoriga chiqarib boriladi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ilgari aytib o&#8217;tilganidek, aksariyat standart bibliotekalar qaysidir datchik, modul yoki bog&#8217;lanish interfeysidan foydalanishni osonlashtirish maqsadida yaratiladi. Biroq foydalanuvchi o&#8217;zi ko&#8217;p qo&#8217;llaydigan dasturiy bloklarni va funksiyalarini ham alohida tashqi faylga sodda biblioteka sifatida saqlab olishi mumkin. Natijada, har safar shu funksiyagadan foydalanish zarurati tug&#8217;ilganda, shunchaki kerakli sketchga uni biblioteka sifatida &#8220;#include&#8221; buyrug&#8217;i yordamida qo&#8217;shib olish yetarli [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-4277","post","type-post","status-publish","format-standard","hentry","category-qollanmalar"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/4277","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=4277"}],"version-history":[{"count":46,"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/4277\/revisions"}],"predecessor-version":[{"id":5204,"href":"https:\/\/yarat.uz\/index.php?rest_route=\/wp\/v2\/posts\/4277\/revisions\/5204"}],"wp:attachment":[{"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yarat.uz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}