EEPROM-xotira bilan ishlash
PROGMEM-xotira bilan ishlash
Progmem-xotira bilan ishlash bo’yicha ma’lumotlar nazariy darsda keltirilgan. Shuning uchun to’g’ridan-to’g’ri amaliy misollarga o’tamiz.
Progmem-xotiradan oddiy sonlarni o’qish:
Natija:

Bir o’lchovli massivni o’qishga misol:
Natija:

Ikki o’lchovli massivni o’qishga misol:
Natija:
Bir nechta turli o’chamli massivlarni bir massiv, ya’ni massivlarning massivi (havolalar jadvali) ko’rinishida ham saqlash va o’qish mumkin. Ikki o’lchovli massivdan farqli jihati – massivlarning massividagi har bir massiv mustaqil o’lchamga ega bo’lishi mumkin! Misol:
Natija:

PROGMEM da saqlash samarali bo’lgan yana bir qiymat turi – qator (char* – matn yoki belgilar massivi sifatida) hisoblanadi (agar dastur davomida o’zgartirlmaydigan qator bo’lsa). Uning oddiy massiv sifatida ifodalanishi quyidagicha:
PROGMEM matnni, xuddi yuqoridagidek, belgilar massivi sifatida saqlash imkonini beradi. Lekin, u bilan ishlash oddiy matn va belgilar massivi bilan ishlashdan farq qiladi, chunki dastur uchun const char* ko’rinishidagi qator sifatida qaraladi. Shuning uchun biz ham, qulaylik uchun PROGMEM ga saqlanadigan belgili qatorni PGM-qator deb yuritamiz.
PGM-qatorni oddiy belgili qatordan farqlash uchun maxsus sun’iy “qiymat turi” qo’llaniladi, u PGM_P (batafsil: bu yerda tanishing) kabi ifodalanadi va makros sifatida const char* ifodasi o’rniga ishlatiladi. Ya’ni, sketchda const char* ko’rsatilishi oddiy o’zgaruvchi tezkor xotiraga saqlanishini, PGM_P esa o’zgaruvchi qiymati PROGMEM ga saqlanishini bildiradi.
PGM-qator faqat global e’lon qilinadi. Quyida PGM-qatorni e’lon qilish va uni o’qishga misol keltirilgan:
Natija: 
Xuddi yuqoridagi massivlar massividek, PGM-qarotlar massivini ham hosil qilish muhim ahamiyatga ega. Buning uchun dastlab PGM-qatorni, so’ngra ularga ko’rsatkich sifatida ularning massivini yaratiladi.
PGM-qator matnini dastur davomida o’zgartirish yoki undan bironta funksiyaning argumenti sifatida foydalanishga to’g’ri kelsa, undan tezkor xotiraga nusxa olish mumkin.
PGM-qatorlar massivi bo’yicha umumiy misol:
Natija:
Eslatma. Bibliotekalardagi ayrim funksiyalar (masalan, ESP8266 bibliotekasi) PGM-qatorlar bilan ishlay oladi. Bu imkoniyatdan ham dasturlash paytida foydalanish mumkin.
ESP mikrokontrollerlari SPIFFS fayl tizimi bilan ishlash
SPIFFS fayl tizimi haqida nazariy darsda dastlabki ma’lumotlar keltirilgan. Quyiroqda ushbu fayl tizimi yordamida mikrokontroller flesh-xotirasining (misollar davomida ushbu xotira sohasini shunchaki “xotira” deb yuritamiz) tizim uchun ajratilgan qismidan foydalanish bo’yicha misollar bilan tanishamiz.
1-misol. Ushbu misolda mikrokontroller xotirasining fayl tizimi uchun ajratilgan qismida fayllar ustidagi asosiy operatsiyalarni bajarilish, natijalarni port monitorida ko’rsatib borish sketchini ko’rib chiqamiz. Xususan, quyidagi operatsiyalar bajariladi va natijasi portga chiqariladi:
– fayl tizimini formatlash (faqat 1 marta, dastur ishga tushgan paytda – zarurat bo’lsa);
– fayl tizimi haqida asosiy ma’lumotlarni ko’rsatish;
– bosh papkadagi fayllar haqida ma’lumot beriladi;
– yangi matnli fayl yaratish;
– fayl nomini o’zgartirish;
– faylni o’chirish (zarurat bo’lsa).
Sketch:
Natija:
Fayl tizimini formatlash jarayoni taxminan 50 sekund davom etganini ko’rish mumkin.

2-misol. Ushbu misolda mikrokontrollerning SPIFFS fayl tizimi bilan ishlash uchun sketch yordamida FTP-server hosil qilamiz hamda ayrim FTP-mijoz ilovalaridan foydalanganib unga bog’lanish jarayonini ko’rib chiqamiz. Buning uchun “ESP8266FtpServer.h” bibliotekasi yordamida yaratilgan “FTPServerSample” namunaviy sketchini ochib, o’zimizga moslashtiramiz (ushbu sketch ESP8266 va ESP32 platalariga moslashtirilgan).
“FTPServerSample” namunaviy sketchi:
Natija:
Dastur ishga tushgach, port monitorida yaratilgan FTP-serverning IP-manzili, login va parol eslatib o’tiladi. Shundan so’ng, ixtiyoriy FTP-mijoz dasturi yordamida unga bog’lanib, fayllar bilan ishlashni boshlashimiz mumkin.

FTP-mijoz dasturida imkon qadar flesh-xotira sig’imidan oshib ketadigan fayllar yozilganda yoki almashinuv tezligi yuqori bo’lganda xatoliklar yuzaga kelishi mumkin! Agar fayllar bilan ishlash jarayonida server ishlamay qolsa, mikrokontrollerni qayta ishga tushirish zarur.
Kompyuterda Windows uchun “Total Commander” dasturini ishga tushirib, “FTP” menyusi “Соединиться с FTP-сервером…” buyrug’ini tanlaymiz va yangi bog’lanish parametrlarini (server IP-manzili, foydalanuvchi logini va parolini) quyidagi rasmdagi kabi kiritamiz. Asosiy parametrlar (bog’lanish nomidan tashqari) sketchda ko’rsatilganlari bilan bir xil bo’lishi kerak.

Bog’lanish bajarilgach, faol panelda FTP-server (mikrokontroller xotirasi) asosiy papkasidagi fayllar ro’yxati (1-marta ishga tushganda bo’sh bo’ladi) ko’rinadi.

Smartfonda esa, “Total Commander” mobil ilovasi ishga tushirilgach asosiy papkada “FTP (Передача файлов)”, keyin “Создать соединение…” buyruqlari yordamida yangi FTP-bog’lanish parametrlarini (ixtiyoriy sarlavha, IP-manzil, login, parol, passiv rejim) o’rnatamiz.

Shundan so’ng, yaratilgan bog’lanishni tanlab, faollashtiramiz va fayllar ustidagi amallarni bajarishimiz mumkin.

SD/MicroSD kartalari bilan ishlash

1-misol. Ushbu misolda, “SD.h” bibliotekasidan foydalanib, matnli faylni yaratish, uni ochish va unga biron matnni saqlab qo’yish sketchini yaratamiz. Bunda, Arduino IDE ning “ReadWrite” (“Файл/Примеры/SD/ReadWrite”) namunaviy sketchidan foydalanamiz.
Kerakli materiallar:
1) Wemos D1 mini platasi, USB-kabel, o’tkazgichlar;
2) SD-modul;
3) SD/MicroSD-karta;
Ulanish sxemasi:

“ReadWrite” sketchi (qisqartirilgan):
Skrinshot:

2-misol. “Файл/Примеры/SD” menyusidagi “listfiles” sketchi yordamida SD-kartada mavjud bo’lgan elementlar (papka va fayllar) ro’yxatini port monitoriga chiqarish mumkin. Ushbu misolda shu sketchni ko’rib chiqamiz. Kerakli komponentlar va bog’lanish sxemasi o’zgarmaydi.
Sketch:
Skrinshot:

3-misol. Navbatdagi namunaviy sketch ham oldingisidan katta farq qilmaydi. “Datalogger” namunaviy sketchi asosida yaratilgan ushbu sketch yordamida A0 analog piniga ulangan termistor ko’rsatkichlarini ma’lum davriylikda SD-kartadagi “datalog.txt” matnli fayliga yozishni ko’rib chiqamiz.
Wemos D1 mini platasida analog pin soni faqat 1 ta bo’lgani sababli, qulaylik uchun faqat shu pindan foydalanish bilan cheklanamiz. Lekin sketchga tegishli o’zgartirishlar kiritish orqali va raqamli pinlardan foydalanib, turli raqamli datchiklar ko’rsatkichlarini ham SD-kartadagi matnli faylga yozishni tashkil qilish mumkin.
Kerakli materiallar:
1) Wemos D1 mini platasi, USB-kabel, o’tkazgichlar;
2) SD-modul;
3) SD/MicroSD-karta;
4) Termistor (R1) va rezistor (R2, 10 kOm) juftligi.
Ulanish sxemasi:

“Datalogger” sketchi (takomillashtirilgan):
1-skrinshot (Port monitoriga chiqarilgan datchik ko’rsatkichlari nusxasi):

2-skrinshot (“datalog.txt” fayliga saqlangan datchik ko’rsatkichlari):

Yuqoridagilardan tashqari, “Файл/Примеры/SD” menyusidagi “Files” sketchi yordamida SD-kartada yangi fayl yaratish va uni o’chirib tashlash mumkin. Bundan tashqari, fayldagi yozuvni o’qish va undagi raqamlarga mos ravishda tashqi qurilmalar (relelar) holatini matnli fayldagi shablon asosida boshqarish ham mumkin. Biz ular haqida to’xtalib o’tirmaymiz, ya’ni ularni mustaqil o’rganish uchun qoldiramiz.
4-misol. Navbatdagi bosqichda Arduino UNO platasi yordamida SD-kartada joylashgan “WAV” formatidagi musiqa faylini plataga ulangan spiker (dinamik) orqali eshittirish jarayonini ko’rib chiqamiz. Buning uchun yuqoridagi bibliotekalardan tashqari, “wav” formatli tovush fayllari bilan ishlovchi “TMRpcm.h” bibliotekasidan foydalanamiz (bibliotekadan faqat AVR arxitekturali mikrokontrollerlarda foydalanish mumkin. Boshqa mikrokontrollerlar uchun tegishli bibliotekalardan foydalanishga to’g’ri keladi. Masalan, ESP32-S3 platalari uchun maxsus biblioteka yordamida MP3-pleyer yoki Internet-radio loyihalarini ham yaratish mumkin. Biroq, bunday loyihalar bilan ishlashni o’quvchilarning ixtiyoriga qoldiramiz).
Tovush spikeri to’g’ridan-tog’ri UNO platasiga ulangan taqdirda tovush balandligi juda past bo’lishi mumkin. Uning balandligini oshirish uchun maxsus tovush kuchaytirish moduli yoki oddiy tranzistorli kuchaytirgich sxemasidan foydalanish mumkin.
Arduino (AVR) platasi takt chastotasining pastligi va tezkor xotirasi kamligi sababli, u yuqori sifatli tovush fayllarini o’qish imkoniyatiga emas, lekin u yordamida quyidagi talablarga javob beradigan “wav” formatidagi tovush faylini eshitish mumkin (“wav” formatiga o’tkazishda SD formatter utilitasidan yoki onlayn konverterdan ham foydalanish mumkin):
- sekundiga sempllar soni (diskretizatsiya chastotasi) – 16000 gerts;
- kanallar soni – 1 ta (mono);
- sempldagi bitlar soni – 8.
Tovushni eshittirish funksiyasi formati: <obyekt_nomi>.play(fayl_nomi, vaqt). Masalan:
player.play(“wav/sound.wav”,30); // “wav” papkasidagi “sound.wav” tovush faylini 30-sekunddan boshlab eshittirish
Kerakli materiallar:
1) Arduino UNO platasi, USB-kabel, o’tkazgichlar;
2) SD-modul va SD/MicroSD-karta;
3) Audio spiker (dinamik).
Ulanish sxemasi (SD-modul/UNO: CS/4, MOSI/11, MISO/12, CLK/13, GND/GND, 5V/5V):

Sketch:
Video (Spikerni UNO ga 1 ta KT315 tranzistorli oddiy kuchaytirgich sxemasi orqali ulangan):
5-misol. Endigi misolda “DFPlayer mini” nomli MP3/WMA/WAV audiopleyer moduli yordamida turli xil formatlardagi tovush fayllarini eshittirish uchun mo’ljallangan namunaviy “GetStarted” sketchini ko’rib chiqamiz. Sketch “DFPlayer mini” ga o’rnatilgan MicroSD-kartadagi barcha audiofayllarning har birini navbat bilan 10 sekunddan eshittirishga mo’ljallangan. Ro’yxat tugagach, yana boshidan boshlanadi.

“DFPlayer mini” audiopleyeri


Modul pinlari joylashuvi va nomlanishi
Ushbu modul Arduino bilan birgalikda yoki mustaqil qurilma sifatida sifatida ham foydalanishga mo’ljallangan. Mustaqil qurilma sifatida foydalanishning ham 2 xil rejimi bor. Soddalashtirilgan (“IO mode”) va kengaytirilgan (“ADKEY mode”) rejimlar. Ushbu rejimlarda ishlash uchun modulning pinlari vazifalarini bilish zarur bo’ladi:
| Pin | Vazifasi | Izohlar |
|---|---|---|
| VCC | Kiruvchi kuchlanish | Kiruvchi kuchlanish ‘+’ kontakti. DC3.2~5.0V; DC4.2V |
| RX | UART kirish | RX kirish |
| TX | UART chiqish | TX chiqish |
| DAC_R | O’ng audio chiqish | Dinamik yoki naushnikka o’ng audio chiqish |
| DAC_L | Chap audio chiqish | Dinamik yoki naushnikka chap audio chiqish |
| SPK2 | Dinamikka ‘-‘ chiqishi | Dinamikka kuchaytirgichdan ‘-‘ chiqish kontakti |
| GND | Kiruvchi kuchlanish ‘-‘ | Kiruvchi kuchlanish ‘-‘ kontakti |
| SPK1 | Dinamikka ‘+’ chiqishi | Dinamikka 3W kuchaytirgichdan ‘+’ chiqish kontakti |
| IO1 | 1-trigger (Soddalashtirilgan boshqaruv 1-pini) | Qisqa bosish – oldingi trekni eshittirish, uzun bosish – tovushni pasaytirish (IO rejimida qo’llaniladi) |
| GND | GND | Kiruvchi kuchlanish ‘-‘ kontakti |
| IO2 | 2-trigger (Soddalashtirilgan boshqaruv 2-pini) | Qisqa bosish – keyingi trekni eshittirish, uzun bosish – tovushni balandlatish (IO rejimida qo’llaniladi) |
| ADKEY1 | Kengaytirilgan boshqaruv 1-pini | Turli qiymatli rezistorlar va tugmalar juftligi asosida boshqaruv 1-pini (ADKEY rejimida qo’llaniladi) |
| ADKEY2 | Kengaytirilgan boshqaruv 2-pini | Turli qiymatli rezistorlar va tugmalar juftligi asosida boshqaruv 2-pini (ADKEY rejimida qo’llaniladi) |
| USB+ | USB+ DP | USB port kirish/chiqish “DP” kontakti |
| USB- | USB- DM | USB port kirish/chiqish “DM” kontakti |
| BUSY | Pleyer bandligi (holati) | Low – ulangan, High – uzilgan |

ADDKEY rejimida boshqaruv (segment – trekni anglatadi)

IO rejimida boshqaruv (IO1, IO2 tugmalari vazifasi yuqoridagi jadvalda keltirilgan).
Arduino yordamida boshqaruvda RX va TX pinlaridan foydalaniladi. Ushbu rejimda modulning barcha imkoniyatlaridan to’liq foydalanish imkoniyati mavjud va ular dastur yordamida yanada kengaytirilishi mumkin. Moduli bilan ishlash uchun ko’plab bibliotekalar mavjud, biz “DFRobotDFPlayerMini.h” bibliotekasidan foydalanamiz. Biblioteka o’rnatilganidan keyin, uni qo’llashga mo’ljallangan namunaviy sketchlar “Файл/Примеры/DFRobotDFPlayerMini” menyisida ko’rinadi.
Kerakli materiallar:
1) Arduino UNO platasi, USB-kabel, o’tkazgichlar;
2) “DFPlayer mini” moduli va MicroSD-karta (32 GB gacha);
3) Audio spiker (dinamik);
4) Rezistor 1 kOm (2 ta).
Bog’lanish sxemasi:

“GetStarted” sketchi (soddalashtirilgan ko’rinishi):
Video:
Yuqorida aytilganidek, DFPlayer mini bilan ishlashda bir nechta boshqa bibliotekalardan ham foydalanish mumkin. Dragon Knight muallifligidagi “DFPlayer.h” bibliotekasidan foydalanish bo’yicha ma’lumotlarni ushbu havola (biblioteka fayllari manzili) orqali olish, uning imkoniyatlarini yuqoridagi bibliotekaniki bilan solishtirish mumkin.
RFID-xotira bilan ishlash
Arduinoda RFID qurilmalari bilan ishlashda SPI interfeysidan foydalaniladi.

RFID-kalit va RFID-qabul qilgich moduli
RFID-qabul qilgich moduli (bundan keyin qulaylik uchun RFID-modul deb ataymiz) – RFID-kalit xotirasini o’qish va olingan ma’lumotni qayta ishlash qurilmasiga yuboruvchi yoki RFID-kalitga yangi ma’lumotlarni yozuvchi qurilma. Biz Arduino loyihalarini yaratishda MFRC522 chipi asosidagi “RFID-RC522” deb nomlangan RFID-modulidan foydalanamiz.
RFID-kalit, RFID-karta (“RFID-метка”, “метка”, bundan keyin RFID-kalit deyilganda ularning har ikkisi ham tushunililishi mumkin) – kuchsiz radiouzatkich bilan ta’minlangan va kichik hajmdagi xotiraga ega bo’lgan, undan foydalanuvchi shaxsni identifikatsiyalash uchun foydalaniladigan elektron qurilma. Ularndan foydalanish uchun uni shunchaki RFID-qabul qilgich moduliga yaqinlashtirish kifoya.
RFID-kalit, agar u qayta yozish imkoniyatiga ega bo’lsa, bir vaqtning o’zida uzatkich va qabul qilish rejimlarida ishlashi mumkin. Bir rejimdan boshqasiga o’tkazish RFID-qabul qilgich moduli tomonidan bajariladi. Unutmaslik kerakki, har qanday RFID-kalitga ham yangi ma’lumotni (kodni) yozishning imkoni bo’lmaydi. Buning uchun kalit qayta yozishga mo’ljallangan bo’lishi kerak.
RFID-kalit elektr ta’minoti uning elektromagnit maydon elementi yordamida hosil qilingan kuchsiz elektr energiyasi hisobidan amalga oshiriladi, bunday energiya hosil bo’lishi uchun esa, kalitni RFID-modulga yaqinlashtirish yetarli. Demak, RFID-kalit hech qanday tashqi elektr manbaiga ulanmaydi!
MIFARE protokolidagi “MIFARE Classic 1K” kaliti xotirasi quyidagi strukturaga ega bo’ladi:

MFRC522 modulini turli Arduino platalariga to’g’ri ulash bo’yicha ma’lumotlar:
| MFRC522 | Arduino Uno | Arduino Mega | Arduino Nano v3 | Arduino Leonardo/Micro | Arduino Pro Micro |
| RST | 9 | 5 | D9 | RESET/ICSP-5 | RST |
| SDA(SS) | 10 | 53 | D10 | 10 | 10 |
| MOSI | 11 (ICSP-4) | 51 | D11 | ICSP-4 | 16 |
| MISO | 12 (ICSP-1) | 50 | D12 | ICSP-1 | 14 |
| SCK | 13 (ICSP-3) | 52 | D13 | ICSP-3 | 15 |
| 3.3V | 3.3V | 3.3V | 3,3V | 3,3V | 3,3V |
| GND | GND | GND | GND | GND | GND |
Umuman olganda, Arduino yordamida MFRC522 chipi asosidagi RFID-qabul qilgich (RFID kalitni o’qish moduli) orqali RFID-kalitlarni o’qish va ularning UID kodlarini aniqlash, ularga asoslanib kalitlar yordamida yuklamani boshqarish, shuningdek, qayta yozish ruxsat etilgan kalitga yangi UID kodi va boshqa ma’lumotlarni yozish yoki kalitlarni nusxalash kabi amallarni bajarish mumkin.
Biroq, unga ma’lumot yozish uchun RFID-kalitning strukturasi, “Xavfsizlik bloki” (“Sector trailer”) va uning “A” hamda “B” kalitlari, “Ruxsat etish bitlari” (“Access bits”) kabi bir qator tushunchalar bilan yaqindan tanishib chiqish talab etiladi. Shundan so’ng, RFID-kalitlarga ma’lumot yozish, ularni nusxalash kabi murakkab vazifalarni bajarish uchun “ReadAndWrite”, “rfid_write_personal_data”, “RFID-Cloner” kabi namunaviy sketchlaridan foydalanish mumkin.
Biz esa, amaliy mashg’ulotlarda faqat RFID-kalitning UID kodini aniqlash va uning asosida Arduino platasiga ulangan svetodiodni boshqarish, shuningdek, UID kodni o’zgartirish, kalitga foydalanuvchi ma’lumotini saqlab qo’yish va uni o’qish jarayonlarini ko’rib chiqish bilan cheklanamiz.
Misollarda Arduino IDE ichki bibliotekalari ro’yxatidagi (Miguel Balboa muallifligidagi) MFRC522 bibliotekasidan foydalanamiz.
1-misol. Dastlab RFID-kalitni va undagi ma’lumotlarni o’qish uchun bibliotekaning “Dumpinfo” namunaviy sketchidan foydalanamiz. Keyinchalik Arduino yuklamasini RFID yordamida boshqarish uchun ko’p hollarda kalitning UID kodini aniqlashning o’zi yetarli bo’ladi. Bunday kod kalitni modulga yaqinlashtirgan zahoti ko’rsatiladi. RFID-kalitdagi batafsil ma’lumotlarni olish uchun esa, kalitni oxirgi ma’lumot ko’rsatilgunga qadar moduldan uzoqlashtirmasdan ushlab turilishi kerak, aksincha xatolik yuz bergani haqidagi “Timeout in communication” yozuvi ko’rsatiladi.
Kerakli materiallar:
1) Arduino UNO, maket platasi, USB-kabel, o’tkazgichlar;
2) RC522 RFID-moduli va RFID-kalitlar.
Bog’lanish sxemasi:

“Dumpinfo” sketchi:
Natija (RFID-kalitni modul yaqinida barcha ma’lumotlar o’qilguncha ushlab turish kerak):

2-misol. Endi yuqoridagi sketch yordamida aniqlangan RFID-kalit kodlaridan foydalanib, raqamli 2-pinga ulangan svetodiodini boshqarish jarayonini ko’rib chiqamiz. Buning uchun, yuqoridagi sketchga kichik o’zgartirishlar kiritamiz.
Kerakli materiallar:
1) Arduino UNO, maket platasi, USB-kabel, o’tkazgichlar;
2) RC522 RFID-moduli va RFID-kalitlar.
Bog’lanish sxemasi:
“Dumpinfo” sketchi o’zgartirilgan varianti:
Natija:
3-misol. Endi “ChangeUID” namunaviy sketchi yordamida RFID-kalit UID kodini o’zgartirishga harakat qilib ko’ramiz. O’zgartirish muvaffaqiyatli bo’lishi kalit himoyalanmagan bo’lishi kerak!
Kerakli materiallar va bog’lanish sxemasi yuqoridagi 1-misoldagi bilan bir xil.
“ChangeUID” sketchi:
Natija (kalit UID kodini o’zgartirishdan himoyalanganligi sababli, o’zgartirilmadi):
4-misol. Ushbu misolda “ReadAndWrite” namunaviy sketchini qisman o’zgartirib va qisqartirib, RFID-kalitning 1-sektori 4-blokiga foydalanuvchi ma’lumotini saqlab qo’yish va uni o’qish jarayolarini ko’rib chiqamiz. Original sketchda foydalanuvchi ma’lumoti 16 lik (HEX) formatidagi kodlar ko’rinishda keltirilgan. Biz qulaylik uchun, tushunarli bo’lgan matn ko’rinishida belgilab olamiz. Sketch kodi faqat qisman izohlanadi.
Kerakli materiallar va bog’lanish sxemasi yuqoridagi 1-misoldagi bilan bir xil.
“ReadAndWrite” sketchi tahrirlangan varianti:
Natija:
Topshiriq.
Yuqoridagi 5-sketchni takomillashtirib, MP3-pleyer yarating. Ya’ni, uni “DFPlayer mini” moduliga o’rnatilgan MicroSD-kartadagi audiofayllarni tugmalar yordamida eshittirish, ularni tanlash, tovush balandligini regulirovka qilishga moslashtiring. Sxema taxminan quyidagi ko’rinishda bo’lishi kerak:

Video:
Videoda tugmalar o’rniga o’tkazgich kontaktlaridan foydalanilgan.
