EEPROM-xotira bilan ishlash
Ma’lumki, Arduinoda foydalanuvchi qurilmaga doir sozlamalarni saqlashda EEPROM-xotiradan foydalanishi mumkin. Buning uchun avvalo foydalanuvchi qo’llanilayotgan aniq bir mikrokontrollerning xotirasi hajmini aniqlab olishi zarur. Odatda u AVR oilasi (UNO, Nano, Mega va hokazo) mikrokontrollerlarida 0,5…1 kBayt oralig’ida, ESP mikrokontrollerlarida esa, 1-4 kBayt oralig’ida bo’ladi. EEPROM-xotiradan foydalanish uchun asosan Arduinoning “EEPROM” ichki bibliotekasi qo’llaniladi. Lekin kamroq hollarda bo’lsa-da, ayrim foydalanuvchilar “avr/eeprom.h” (faqat AVR oilasi uchun) va “EEManager.h” bibliotekalaridan ham foydalanishadi. Qulaylik uchun, biz ham “EEPROM” bibliotekasidan foydalanamiz.
Ilgari ma’lum qilinganidek, EEPROM-xotiraga ma’lumotlar manzili bo’yicha saqlanadi. Har bir xotira katagiga 1 baytlik yozuv saqlanishi mumkin. Saqlanayotgan qiymat turidan kelib chiqib, qiymat uchun xotiradan kerak bo’ladigan hajmi turlicha bo’lishi mumkin va ular baytlarda quyidagicha o’chanadi:
“byte” qiymat turi uchun – 1 bayt;
“int” qiymat turi uchun – 2 bayt (ESP8266/ESP32 da 4 bayt);
“float” qiymat turi uchun – 4 bayt;
“String” qiymat turi uchun – har bir belgi uchun 1 baytdan;
“EEPROM” bibliotekasi sketchga qo’shib olinganidan keyin (“#include <EEPROM.h>”) quyidagi buyruq-funksiyalardan foydalanish mumkin bo’ladi:
- EEPROM.read(xotira_manzili) – ko’rsatilgan xotira manzilidagi yozuvni (yoki shu manzildan boshlangan yozuvlar massivini) o’qish. Yozuvlar massivini o’qish uchun qiymat turi ko’rsatilgan holda, massiv o’zgaruvchisi oldindan e’lon qilingan bo’lishi kerak. Xotira manzili 0 dan boshlab ko’rsatiladi;
- EEPROM.get(xotira_manzili, o’zgaruvchi_nomi) – ko’rsatilgan xotira manzilidagi yozuvni (yoki shu manzildan boshlangan yozuvlar massivini) o’qish va bir yo’la ko’rsatilgan o’zgaruvchi nomiga o’zlashtirish. O’zgaruvchi oldindan e’lon qilingan bo’lishi kerak;
- EEPROM.put(xotira_manzili, qiymat) – ko’rsatilgan xotira manziliga ko’rsatilgan qiymatni (yoki shu manzildan boshlab yozuvlar massivini) saqlash (ESP8266/ESP32 da EEPROM.commit() buyrug’idan keyin kuchga kiradi). Qiymat sifatida har qanday qiymat turidagi ma’lumotlar ko’rsatilishi mumkin, biroq ularning hajmi turlicha bo’lishi, o’z navbatida xotiradan shuncha hajmdagi joy talab qilishi mumkin. Qiymat egallaydigan xotira hajmini kompilyator avtomatik ravishda aniqlaydi va unga shuncha bayt joy ajratadi. Lekin, keyingi yoziladigan yozuv manzilini ko’rsatishda shuncha sondagi katak tashlab ko’rsatilishi kerak bo’ladi;
- EEPROM.write(xotira_manzili, qiymat) – ko’rsatilgan xotira manziliga ko’rsatilgan 1 bayt qiymatni saqlash. EEPROM.put() dan farqi shuki, EEPROM.write() faqat 1 bayt ma’lumotni (0…255 oraliqdagi ASCII jadvali bo’yicha belgi kodini) saqlaydi, agar belgilar soni 1 tadan ortiq bo’lsa, faqat oxirgisining kodi saqlanadi;
- EEPROM.update(xotira_manzili, qiymat) – ko’rsatilgan xotira manzilidagi qiymatni ko’rsatilgan qiymat bilan yangilash (agar o’zgargan bo’lsa). Bu buyruq ESP8266 va ESP32 da qo’llanmaydi.
PROGMEM-xotira
Progmem (program memory) – mikrokontroller (ichki yoki tashqi) flesh-xotirasining dastur tomonidan qiymatlari o’zgarmaydigan o’zgaruvchilarni saqlab qo’yish mumkin bo’lgan qismi.
Progmem-xotira (bundan keyin PROGMEM deb yuritamiz) ham bajaradigan vazifasiga ko’ra tezkor (SRAM) xotiraga o’xshab ketadi. Chunki, unga ma’lumotni saqlash va undan o’qish xuddi o’zgaruvchilar bilan ishlagandek va bevosita dasturning o’zidan bajariladi. Vaholanki, yuqorida aytilganidek, PROGMEM – flesh-xotiraning bir qismi xolos.
Ma’lumki, sketchni flesh-xotiraga yozish (proshivka qilish) vazifasini programmator bajaradi. PROGMEMga ma’lumot yozish uchun esa, bunday vosita talab etilmaydi. Bu – PROGMEMning asosiy qulayligi ham. Lekin uning yana bir muhim jihati – katta hajmli ma’lumotlarni PROGMEMga o’tkazish orqali tezkor xotira joyini tejash hisoblanadi (shuning uchun ham massivlar yoki xotiradan ko’p joy talab qiluvchi boshqa qiymat turlari uchun PROGMEM dan foydalanish ko’proq samara beradi). Ayniqsa, AVR mikrokontrollerlarining tezkor xotirasi (SRAM) 2 kB hajmga, flesh-xotirasi esa 32 kB hajmga egaligini hisobga olinsa, PROGMEM ularning imkoniyatlarini keskin oshirishga xizmat qiladi.
PROGMEM bilan ishlash uchun Arduino IDE ning “avr/pgmspace.h“ ichki bibliotekasidan foydalaniladi. Uni o’rnatish va sketchga qo’shib olish talab etilmaydi, u sketchga avtomatik ravishda o’zi qo’shiladi. Aslida ushbu biblioteka AVR mikrokontrollerlari uchun ishlab chiqilgan bo’lsa-da, ESP8266/ESP32 mikrokontrollerlari ham unga muvofiqlashtirilgan. Ya’ni ishlatilishda hech qanday farq yo’q.
Sketchda PROGMEMga murojaat qilish quyidagicha amalga oshiriladi:
const <qiymat_turi> massiv[] PROGMEM = {}; yoki
const PROGMEM <qiymat_turi> massiv[] = {};
const <qiymat_turi> const massiv[] PROGMEM = {}; (Ikki o’lchovli massiv uchun)
Ya’ni PROGMEM o’zgaruvchi modifikatori qiymat turi va o’zgaruvchi (yoki massiv) nomidan oldin yoki keyin e’lon qilinishi mumkin. PROGMEM modifikatorini faqat global yoki statik (“static” modifikatorli) o’zgaruvchilarga nisbatan qo’llash mumkin.
PROGMEMdagi ma’lumotni o’qish uchun, o’qiladigan qiymat turiga qarab quyidagi 4 ta funksiyalardan biridan foydalaniladi (funksiya argumentida xotira manzili yoki ko’rsatkich, ya’ni o’zgaruvchining 1-bayti manzili keltiriladi):
- pgm_read_byte(manzil) – 1 ta bayt uchun (char, byte, int8_t, uint8_t qiymat turlari uchun);
- pgm_read_word(manzil) – 2 ta bayt uchun (int, word, unsigned int, int16_t, uint16_t qiymat turlari uchun);
- pgm_read_dword(manzil) – 4 ta bayt uchun (long, unsigned long, int32_t, uint32_t qiymat turlari uchun);
- pgm_read_float(manzil) – float qiymat turi uchun.
Eslatma. O’zgaruvchi manfiy qiymatga ega bo’lishi mumkin bo’lgan hollarda, sketchda o’zgaruvchi nomidan oldin har doim qiymat turi ko’rsatilishi shart, chunki PROGMEM sonlarning ishorasini hisobga olmaydi!
PROGMEM dan foydalanish bo’yicha misollar bilan amaliy mashg’ulotlarda batafsil tanishamiz.
SD/MicroSD xotira modullari
Arduino qurilmalarini yaratishda mikrokontrollerning ichki flesh-xotirasi hajmi cheklangani, shuningdek, unga uga fayl tizimi va sketchdan boshqa ma’lumotlarni saqlab bo’lmaganligi sababli, ayniqsa ko’p joy talab qiladigan matnli, rasmli, tovushli yoki boshqa katta hajmli fayllarni saqlash uchun tashqi xotira qurilmalaridan foydalanishga ehtiyoj tug’iladi. SD-kartani o’qish moduli yoki MicroSD-kartani o’qish moduli (qulaylik uchun bundan keyin materialda ularni umumiy qilib SD-modul deb ataymiz) shunday xotira qurilmalaridan hisoblanadi.
Arduinoda SD-modullar bilan ishlashda quyidagi muhim qoidalarga e’tibor berish zarur:
- yangi kartani FAT16, FAT32 yoki exFAT formatida, standart usulda (tez emas!) formatlab olish zarur;
- kartadagi fayllar nomi va kengaytmasi “8.3” formatida saqlangan bo’lishi kerak;
- Arduino sketchidan bir vaqtning o’zida 1 tadan ortiq faylni ochib bo’lmaydi, yangisini ochishdan oldin eskisini yopish kerak.
Arduino qurilmalarini yaratishda SD-moduldan, masalan, turli datchiklar ko’rsatkichlarini vaqti-vaqti bilan SD-kartaga kartaga saqlab borish va uni o’qish uchun yoki “wav” formatidagi tovushli fayllarni eshitish uchun foydalanish mumkin (Datchik ko’rsatkichlari asosida keyinchalik kompyuterda diagrammalarni ham tuzish mumkin bo’ladi).
Amaliy mashg’ulotlarda biz SD-kartada matnli fayllar yaratish hamda ularga analog va raqamli datchiklar ko’rsatkichlarini saqlash, ularni o’qish, fayllar ro’yxatini ko’rish, ularni o’chirish kabi asosiy operatsiyalarni bajarishni ko’rib chiqamiz. Shuningdek, 4-misolda MP3 formatidagi musiqani WAV formatiga o’tkazish va undan Arduinoda foydalanish tartibini ham ko’rib o’tamiz.
Mikrokontrollerlarning ischi chastotalari MP3 formatidagi audiofayllar yoki video fayllarni o’qish imkonini bermaydi. Biroq, aksariyat MP3-modullari o’z ichiga SD-kartani o’qish blokini oladi va undan to’g’ridan-tog’ri MP3 formatdagi fayllarni o’qish (eshitish) imkoniyati ham mavjud. Mashg’ulotlarda Arduino yordamida MP3-modulni boshqarish, jumladan, undagi SD-kartaga yozilgan MP3 formatidagi musiqa fayllarini eshitish jarayonlarini ham ko’rib chiqamiz.

RFID-xotira bilan ishlash
Aslida, RFID (Radiofrequency identification – radiochastotali identifikatsiyalash) texnologiyasini to’laqonli xotira bilan ishlash texnologiyasi sifatida qarab bo’lmaydi. Chunki, xotira qurilmasi vazifasini faqat RFID-kalit bajarsa-da, unga foydalanuvchi o’zi xohlagan ma’lumotni saqlay olmaydi, xotira hajmi ham bir necha kilobaytdan oshmaydi. Ba’zi RFID-kalitlarga esa, umuman yangi ma’lumot yozib ham bo’lmaydi, ya’ni ular faqat o’qish uchun mo’ljallangan bo’ladi.


Bundan tashqari, ularni o’qish uchun mo’ljallangan modul bilan RFID-kalit o’rtasidagi ma’lumot almashinishi faqat radioaloqa yo’li bilan amalga oshiriladi. Bu jihatdan ushbu texnologiyani radioboshqaruv texnologiyasiga ham o’xshatish mumkin. Biroq radioaloqa masofasi atigi bir necha santimetrni (uzog’i 6 sm gacha) tashkil etganligi uchun uni to’laqonli masofadan boshqarish texnologiyasi sifatida ham qaralmaydi (ayniqsa, Buyumlar Interneti qurilmalarini yaratishda undan foydalanish juda qiyin).
Shu bilan birga, RFID ning qismlariga (kalit va qabul qilgich) shunchaki raqamli datchik sifatida ham qarash to’g’ri bo’lmaydi.
Shuning uchun biz Arduino darslarida ushbu texnologiyani shartli ravishda (masofadan boshqariladigan) xotira texnologiyasi sifatida ko’rib chiqamiz.
Amaliyotda ushbu texnologiyadan uy-joy binolari, qo’riqlanadigan obyektlar yoki ruxsatnoma asosida kirish talab etiladigan boshqa binolarga kirish-chiqishni nazorat qilish va tartibga solish maqsadlarida foydalaniladi. Bunda, har bir kalit egasi qo’riqlanadigan obyektga kirishi uchun kalitni qabul qilgichga 3-4 santimetrga yaqinlashtirishi talab etiladi.
Kalit ma’lumotlari qabul qilgich orqali mikrokontrollerga uzatiladi va unda tahlil qilinib, ruxsat etilgan kalitlar ro’yxatida mavjudligi aniqlanadi. Demak, buning uchun dastlab, barcha kalitlar qabul qilgichda ro’yxatdan o’tkazilgan bo’lishi zarur. Kalitlar kodini o’zgartirish ham mumkin, lekin har doim ham emas. Buning uchun kalit qayta yoziladigan turga mansub bo’lishi va ishlab chiqaruvchi unga yozishga ruxsat etgan bo’lishi kerak.
RFID-kalitlar bilan ishlashning o’ziga xosliklari batafsil xotira qurilmalari bilan ishlashga bag’ishlangan amaliy mashg’ulotda ko’rib chiqiladi.
Mikrokontrollerdan flesh-xotira sifatida foydalanish
ESP8266/ESP32 mikrokontrollerlarining flesh-xotirasi o’lchami nisbatan katta ekanligidan foydalanib, uning bir qismini turli formatdagi kichik o’lchamli fayllar uchun flesh-disk sifatida ham foydalanish mumkin (ba’zi modullarning flesh-xotirasi o’lchamini Arduino IDE dasturi “Инструменты” menyusidagi “Flash Size” bo’limidan ko’rish va tanlash ham mumkin). Buning uchun maxsus SPIFFS fayl tizimi (bundan keyin, “tizim” deb yuritamiz) bilan ishlashga mo’ljallangan “FS.h” bibliotekasi ham taqdim etilgan. Bunday xotira bilan ishlash uchun bibliotekaning maxsus funksiyalaridan foydalaniladi.

Asosiy buyruq va funksiyalar:
SPIFFS.begin() – tizimni faollashtirish ();
SPIFFS.format() – tizimga tegishli flesh-xotira sohasini formatlash;
SPIFFS.info(fs_info) – tizim haqida ma’lumot olish. fs_info – FSInfo obyekti klassi. Klass metodlari: totalBytes – tizim xotirasi sig’imi, usedBytes – band bo’lgan xotira, maxOpenFiles – bir vaqtda ochish mumkin bo’lgan fayllar maksimal soni, maxPathLength – fayl nomi maksimal uzunligi (32 ga teng, “\0” belgisi bilan birga);
SPIFFS.openDir(“/papka_nomi”) – kerakli (joriy) papkani tanlash, Dir obyekti o’zgaruvchisining qiymati sifatida o’zlashtiriladi;
SPIFFS.open(fayl_nomi, “w”) – ko’rsatilgan faylni ochish. File boyektining o’zgaruvchisi qiymati. Argumentda ochish rejimi ko’rsatiladi. “w” – o’qish va yozish uchun ochish, “r” – faqat o’qish uchun, “a” – fayl oxiriga yozuv qo’shish uchun;
SPIFFS.rename(filename, filename2) – fayl nomini o’zgartirish;
SPIFFS.remove(filename) – faylni o’chirish.
Shu hamda boshqa funksiyalar, klasslar va metodlar haqida batafsil bu yerdan yoki bu yerdan ma’lumot olish mumkin. Yuqoridagi funksiyalar bo’yicha misollar bilan esa, amaliy mashg’ulot paytida tanishish mumkin.
Cheklovlar:
– Fayl nomining uzunligi 32 ta (“\0” baytidan dan tashqari 31 ta) belgidan oshmasligi kerak;
– Faqat fayllar ustida ayrim asosiy operatsiyalarni (fayllarni nusxalash, saqlash, o’chirish, matnli fayl yaratish) amalga oshirish mumkin. Unda papkalar bilan tog’ridan-to’g’ri ishlashning imkoni yo’q. Lekin, mavjud papkalar bilan ishlashda ularning nomlarini boshida “/” belgisi bilan ajratish orqali fayl nomining bir qismi sifatida qo’llash mumkin (masalan, “DIR” papkasidagi “file1.txt” faylini “DIR/file1.txt” fayli sifatida ko’rsatiliadi, “/” belgisi fayl nomidagi belgi sifatida qabul qilinadi). Bunda ham fayl nomi uzunligiga oid cheklovga amal qilish zarur. Bundan tashqari, agar fayl papka ichida joylashgan bo’lsa, papka bilan ishlash imkoni yo’qligini hisobga olinsa, uning nomi jami uzunligi 31 ta belgidan oshmasligi kerak. Demak, papka va fayl nomlarini imkon qadar qisqa bo’lishiga harakat qilish zarur.
Kompilyator yuqoridagi cheklovlarni xatolik deb qaramaydi. Shuning uchun fayl tizimi bilan bog’liq xatoliklarni ustaqil ravishda aniqlashga to’g’ri keladi.
Yuqoridagilardan tashqari, kompyuter yoki smartfon yordamida ham mikrokontroller flesh xotirasidan foydalanish mumkin. Buning uchun mikrokontrollerda sketch yordamida FTP-server hosil qilish yoki Arduino IDE dasturiga qo’shish uchun dasturchi tomonidan yaratilgan add-on (plagin) dan foydalanish mumkin (mazkur plagin Arduino IDE oxirgi versiyalari stabil ishlamasligi sababli, darslar davomida unga to’xtalmaymiz).
FTP-server
Kompyuterdagi yoki smartfondagi fayllarni FTP-mijoz ilovalari yordamida FTP-server rolidagi mikrokontrollerga yuborish yoki undagi fayllarni boshqarish (nusxalash, o’chirish, nomini o’zgatirish va hokazo) mumkin.
Cheklovlar:
– SPIFFS fayl tizimi barcha cheklovlari;
– Xotira hajmini ortiqcha band qilish proshivka uchun joy yetarli bo’lmay qolishiga olib kelishi mumkin. Xotiradan kichik fayllar, veb-sahifalar fayllarini saqlashda foydalanish maqsadga muvofiq.
FTP-server hosil qilish uchun qo’shimcha ravishda o’rnatiladigan “ESP8266FtpServer.h” biblioteka faylidan foydalanamiz. FTP-mijoz sifatida esa, kompyuter Windows operatsion tizimi uchun “WinSCP” yoki Total Commander (“FTP” menyusi) ilovalaridan, smartfonda ham ixtiyoriy ftp-mijoz dasturidan yoki Total Commander mobil ilovasi hamda maxsus ftp-mijoz plagini juftligidan foydalanish mumkin.
Batafsil xotira qurilmalari bilan ishlashga bag’ishlangan amaliy mashg’ulotda ko’rib chiqiladi.