Mundarija:

Super Raspberry Pi 433MHz uy avtomatizatsiyasi: 7 qadam
Super Raspberry Pi 433MHz uy avtomatizatsiyasi: 7 qadam

Video: Super Raspberry Pi 433MHz uy avtomatizatsiyasi: 7 qadam

Video: Super Raspberry Pi 433MHz uy avtomatizatsiyasi: 7 qadam
Video: Beepberry! Tiny Pi-based Blackberry cyberdeck #shorts 2024, Noyabr
Anonim
Super Raspberry Pi 433MHz uy avtomatizatsiyasi
Super Raspberry Pi 433MHz uy avtomatizatsiyasi

Bu qo'llanma uydagi simsiz qurilmalarni boshqarish uchun Raspberry Pi -dan foydalanish haqida gap ketganda, ko'pchilik orasida. Ko'pchilik singari, u 433 MGts tez -tez ishlatiladigan radiochastota diapazonida ishlaydigan qurilmalar bilan ishlash uchun Pi -ga ulangan arzon uzatuvchi/qabul qilgich juftini qanday ishlatishni ko'rsatib beradi. Bu sizga 433 MGts masofadan boshqariladigan rozetkalarga buyruqlarni uzatish orqali har qanday elektr qurilmasini Pi yordamida qanday yoqish yoki o'chirishni ko'rsatib beradi.

Agar ko'pchilik allaqachon mavjud bo'lsa, nega men bu darslikni yaratdim? Asosan, men ko'rgan boshqa barcha darsliklar, ayniqsa, dasturiy ta'minot sohasidagi narsalarni murakkablashtirganday tuyuldi. Men hamma ishni bajarish uchun ular uchinchi tomon kutubxonalariga, skriptlarga yoki kod parchalariga tayanishganini payqadim. Ko'pchilik asosiy kod nima qilayotganini tushuntirib ham bermaydilar - ular sizdan Pi -ga ikki yoki uchta dasturiy ta'minotni joylashtirishni va bir qancha buyruqlarni bajarishni so'rashardi, hech qanday savol berilmadi. Men haqiqatan ham 433 MGts masofadan boshqariladigan rozetkalar yordamida uyimda elektr qurilmalarini yoqish va o'chirish uchun Pi-ni ishlatishni xohlardim, lekin men o'zim tushunadigan tizimning o'z versiyasini yaratishni xohlardim, umid qilamanki, bu zarur emas. boshqa birovning kutubxonalari yoki skriptlaridan foydalaning.

Bu darslik aynan shu haqida. Bu tizimning dasturiy tomoni ikkita oddiy Python skriptidan iborat - biri signallarni qabul qilish va yozish uchun, ikkinchisi esa bu signallarni simsiz quvvat rozetkalariga qaytarish uchun. Signalni qabul qilish/uzatish faqat RPi. GPIO kutubxonasiga asoslanadi, bu men uchun hech bo'lmaganda Raspbian bilan oldindan o'rnatilgan. Ushbu kutubxonani Python -ga to'g'ridan -to'g'ri import qilish mumkin.

Ushbu loyiha uchun sizga kerak bo'ladi:

Malinali Pi. Har qanday model ishlashi kerak, men hamma narsani birlashtiradigan boshlang'ich to'plamini ishlatardim, lekin sizga faqat markaziy birlik kerak bo'ladi

433 MGts chastotali uzatuvchi/qabul qiluvchi. Bu turdagi loyihalarda eng ko'p qo'llaniladiganlari shularga o'xshaydi. Bog'langan paketga o'xshash beshta paketni sotib olish, sizda bir nechta ehtiyot qismlar bo'lishini ta'minlaydi

433 MGts masofadan boshqariladigan rozetkalar to'plami. Men juda tavsiya qiladigan narsalarni ishlatardim, lekin son -sanoqsiz modellar mavjud. Faqat ular ushbu chastotada ishlashiga ishonch hosil qiling

Ba'zi elektron qurilmalar. Men sxemani qurish jarayonini iloji boricha osonlashtirish uchun non paneli va bir nechta o'tish kabellarini ishlatishni tavsiya qilaman.

[Agar siz ushbu mahsulotlardan birortasini sotib olishga qaror qilsangiz, yuqoridagi havolalar yordamida ro'yxatga kirsangiz, men bundan juda xursand bo'laman - shu yo'l bilan men sizga hech qanday qo'shimcha xarajatlarsiz daromadning ozgina qismini olaman!]

1 -qadam: Qabul qiluvchilarni o'rnatish

Qabul qiluvchilarni o'rnatish
Qabul qiluvchilarni o'rnatish

Masofadan boshqariladigan rozetkalarga buyruq yuborish uchun Pi-ni ishlatishdan oldin, ular qanday aniq signallarga javob berishini bilishingiz kerak. Uzoqdan boshqariladigan rozetkalarning ko'pchiligi ma'lum qurilmalarni yoqish yoki o'chirish uchun ishlatilishi mumkin bo'lgan telefonga ega. Men sotib olganlar bo'lsa, telefonda to'rt qatorli ON/OFF tugmachalari bor, ularning har biri ma'lum bir rozetkaga ON yoki OFF signalini yuboradi.

Bu savol tug'diradi - qaysi tugmalar qaysi rozetkaga mos kelishini qanday bilamiz? Bu aslida sizda mavjud bo'lgan modelga bog'liq. Men rozetkaning o'ziga xos uslubini tanlaganimning asosiy sabablaridan biri (kirish qismida ko'rsatilgan), bu birliklarni telefonni yoqish/o'chirish tugmalarining ma'lum to'plamiga javob berish uchun jismoniy kalit bilan sozlash mumkin. Bu shuni anglatadiki, siz uydagi rozetkalarni uzishingiz va ko'chirishingiz mumkin, chunki har bir birlik har doim bir xil ON/OFF signallariga javob beradi.

Telefon rozetkalari telefon bilan qanday aloqada ekanligini aniqlagandan so'ng, siz telefon orqali yuboriladigan kodlarni "hidlash" uchun 433 MGtsli qabul qilish moslamasini (yuqoridagi rasmda) ishlatishingiz kerak bo'ladi. Ushbu kodlarning to'lqin shakllarini yozib olganingizdan so'ng, siz ularni Python yordamida takrorlashingiz va uzatuvchi blok yordamida yuborishingiz mumkin.

Bu erda qilish kerak bo'lgan birinchi narsa - qabul qilgichdagi pinlarni Pi -dagi to'g'ri GPIO pinlariga ulash. Qabul qilgichda to'rtta pin bor, lekin ulardan faqat uchtasi kerak. O'ylaymanki, ikkala markaziy pin ham bir xil natijani beradi, shuning uchun siz ulardan faqat biriga ulanishingiz kerak (qabul qilingan signallarni ikkita alohida GPIO piniga uzatishni xohlamasangiz).

Yuqoridagi rasmda simlarning ulanishi deyarli ko'rsatilgan. Qabul qilgichdagi har bir pinni to'g'ridan -to'g'ri Pi -dagi mos keladigan pinga ulash mumkin. Jarayonni yanada oqlangan qilish uchun men taxta va o'tish kabellaridan foydalanaman. E'tibor bering, markaziy qabul qilgich pinlaridan biriga ulanish uchun har qanday GPIO ma'lumot pinini tanlashingiz mumkin. Men Pi sarlavhasida "23" deb belgilangan pinni ishlatardim.

MUHIM: Agar siz yuqoridagi rasmda '3v3' deb belgilangan pimni Pi -dagi yuqori kuchlanishli pinga (masalan, 5v) ulasangiz, ehtimol siz Pi -ga zarar etkazasiz, chunki GPIO pinlari 3v3 dan yuqori kuchlanishlarga toqat qila olmaydi. Shu bilan bir qatorda, siz uni 5V bilan quvvatlantirishingiz va DATA piniga xavfsiz kuchlanishni yuborish uchun kuchlanish bo'luvchi o'rnatishingiz mumkin.

Qabul qiluvchining diapazoni bu kuchlanishda juda katta bo'lmaydi, ayniqsa antenna ulanmagan bo'lsa. Biroq, bu erda sizga uzoq masofa kerak emas - modomiki, qabul qilgich signallarni bir -birining yonida ushlab turganda, telefondan olishi mumkin, bu bizga kerak.

2 -qadam: Telefon kodlarini hidlash

Telefon kodlarini hidlash
Telefon kodlarini hidlash

Endi sizning qabul qilgichingiz Pi -ga ulangan bo'lsa, siz ushbu loyihaning birinchi qiziqarli bosqichini - hidlashni boshlashingiz mumkin. Bu har bir tugma bosilganda, telefon orqali uzatiladigan signalni yozib olish uchun biriktirilgan Python skriptidan foydalanishni o'z ichiga oladi. Skript juda oddiy va men uni ishga tushirishdan oldin ko'rib chiqishingizni tavsiya qilaman - axir bu loyihaning mohiyati shundaki, siz boshqa birovning kodini ko'r -ko'rona ishlatmaysiz!

Bu jarayonni boshlashdan oldin, sniffer skriptini ishga tushirish uchun Python kutubxonalariga ega ekanligingizga ishonch hosil qilishingiz kerak. Ular skriptning yuqori qismida keltirilgan:

datetime dan datetime import qilinadi

matplotlib.pyplotni pyplot sifatida import qilish RPi. GPIO -ni GPIO sifatida import qilish

RPi. GPIO va datetime kutubxonalari mening Raspbian tarqatishimga kiritilgan, lekin men matplotlib kutubxonasini quyidagicha o'rnatishim kerak edi:

sudo apt-get install python-matplotlib

Bu kutubxona, bu loyiha tashqarisida ham juda foydali bo'lgan, odatda, grafik chizish kutubxonasi, shuning uchun uni o'rnatish, albatta, zarar etkazmaydi! Kutubxonalaringiz yangilanganidan so'ng siz ma'lumotlarni yozishni boshlashga tayyormiz. Bu erda skript qanday ishlaydi:

U ishga tushirilganda ("python ReceiveRF.py" buyrug'i yordamida), belgilangan GPIO pinini ma'lumot kiritish sifatida sozlaydi (sukut bo'yicha 23 -pin). Keyin u doimiy ravishda pinni namuna oladi va raqamli 1 yoki 0 qabul qiladimi -yo'qligini qayd qiladi. Bu belgilangan vaqt davom etadi (sukut bo'yicha 5 soniya). Bu vaqtga yetganda, skript ma'lumotlarni yozishni to'xtatadi va GPIO kirishini yopadi. Keyin u biroz qayta ishlashni amalga oshiradi va qabul qilingan kirish qiymatini vaqtga qarab chizadi. Shunga qaramay, agar sizda ssenariy nima qilayotgani haqida savollaringiz bo'lsa, qanday ishlashini ko'rib, ularga o'zingiz javob berishingiz mumkin. Kodni iloji boricha o'qilishi mumkin va sodda qilishga harakat qildim.

Siz qilishingiz kerak bo'lgan narsa, skriptda ** yozishni boshlagan ** ekanligini ko'rsatganda. Bu xabar paydo bo'lgandan so'ng, siz telefon tugmalaridan birini bir soniya bosib turishingiz kerak. Qabul qilgichga yaqin tutganingizga ishonch hosil qiling. Skript yozishni tugatgandan so'ng, u matplotlib yordamida yozish oralig'ida olingan signalning to'lqin shaklini chizadi. E'tibor bering, agar siz Pi -ga PuTTY kabi SSH mijozi yordamida ulangan bo'lsangiz, to'lqin shaklini ko'rsatish uchun X11 ilovasini ham ochishingiz kerak bo'ladi. Men buning uchun xMing-dan foydalanaman (va boshqa narsalar uchun, masalan, mening Pi-ga masofadan turib ish stoli). Chiziqni ko'rsatishga ruxsat berish uchun, skriptni ishga tushirishdan oldin xMing -ni ishga tushiring va natijalar paydo bo'lishini kuting.

Matplotlib oynasi paydo bo'lgandan so'ng, uchastkaning qiziqish doirasi juda aniq bo'lishi kerak. Siz tugmachani bosib turganingizda, telefon orqali uzatiladigan signalning yuqori va pastini aniqlay olmaguningizcha, kattalashtirish uchun oynaning pastki qismidagi boshqaruv elementlaridan foydalanishingiz mumkin. To'liq kod namunasi uchun yuqoridagi rasmga qarang. Signal, ehtimol, signal qabul qilinmagan vaqt oralig'ida ajratilgan juda qisqa pulslardan iborat bo'lishi mumkin. Qisqa pulslar blokidan keyin hech narsa olinmaydigan uzoqroq vaqt ketishi mumkin, shundan keyin naqsh takrorlanadi. Kodning bitta nusxasiga tegishli naqsh aniqlangandan so'ng, sahifaning yuqori qismidagi ekran tasvirini oling va uni izohlash uchun keyingi bosqichga o'ting.

3 -qadam: natijali signalni transkripsiya qilish

Natijada signalni transkripsiya qilish
Natijada signalni transkripsiya qilish

Endi siz ma'lum bir tugmachaning signaliga mos keladigan davriy yuqori va pastlik blokini aniqlagan bo'lsangiz, uni saqlash va talqin qilish usuli kerak bo'ladi. Yuqoridagi signal misolida siz butun signal blokini tashkil etuvchi faqat ikkita noyob naqsh borligini sezasiz. Ba'zan siz qisqa balandlikdan keyin uzun pastlikni ko'rasiz, ba'zida esa aksincha - uzun balandlikdan keyin past pastlik. Men signallarimni yozayotganda, men quyidagi nomlash qoidasini ishlatishga qaror qildim:

1 = qisqa_on + uzoq_off0 = uzoq_on + qisqartirish

Belgilangan to'lqin shakliga yana qarang va siz nimani nazarda tutayotganimni tushunasiz. Signalingizda ekvivalent naqshlarni aniqlagandan so'ng, ketma -ketlikni yaratish uchun 1 va 0 raqamlarini hisoblash kifoya. Transkripsiya qilinganida yuqoridagi signal quyidagicha yozilishi mumkin:

1111111111111010101011101

Endi siz telefoningizdagi boshqa tugmalarga mos keladigan signallarni yozib olish va transkripsiya qilish uchun ushbu jarayonni takrorlashingiz kerak va siz jarayonning birinchi qismini bajargansiz!

Transmitter yordamida signallarni qayta yuborishdan oldin, yana bir oz ish qilish kerak. 1 yoki 0 ga mos keladigan yuqori va pastlik o'rtasidagi vaqt juda muhim va siz "qisqa_on" yoki "uzoq_uzilish" qancha davom etishini bilishingizga ishonch hosil qilishingiz kerak. Mening kodlarim uchun signallarni takrorlash uchun vaqtni ajratish kerak bo'lgan uchta ma'lumot bor edi:

  • "Qisqa" intervalning davomiyligi, ya'ni 1ning boshi yoki 0ning oxiri.
  • "Uzoq" intervalning davomiyligi, ya'ni 1ning oxiri yoki 0ning boshi.
  • "Uzaytirilgan" intervalning davomiyligi. Men telefon tugmachasini bosib turganimda, signal blokining har bir takrorlangan misoli o'rtasida "uzaytirilgan o'chirish" davri borligini payqadim. Bu kechikish sinxronizatsiya uchun ishlatiladi va belgilangan muddatga ega.

Vaqtning ushbu qiymatlarini aniqlash uchun siz matplotlib oynasidagi masshtablash funktsiyasidan foydalanib, oxirigacha yaqinlashtirishingiz va kursorni signalning tegishli qismlari ustiga qo'yishingiz mumkin. Oynaning pastki qismidagi kursor joylashuvi o'qilishi signalning har bir qismi uzun, qisqa yoki kengaytirilgan intervalga to'g'ri kelishini aniqlash imkonini beradi. E'tibor bering, x o'qi chizig'i vaqtni ifodalaydi va kursor o'qilishining x komponenti soniya birligida. Men uchun kengliklar quyidagicha edi (soniyalarda):

  • qisqa_delay = 0.00045
  • long_delay = 0.00090 ("qisqa" dan ikki baravar ko'p)
  • Extended_delay = 0.0096

4 -qadam: Transmitter blokini sozlash

Transmitter birligini sozlash
Transmitter birligini sozlash

O'zingizning kodlaringizni va vaqt ma'lumotlarini to'plaganingizdan so'ng, siz qabul qilgichni uzib qo'yishingiz mumkin, chunki sizga endi kerak bo'lmaydi. Keyin uzatgichni yuqoridagi rasmda ko'rsatilgandek, tegishli Pi GPIO pinlariga ulashingiz mumkin. Men aniqladimki, uzatuvchi qurilmalardagi pinlar etiketlangan, bu jarayonni osonlashtiradi.

Bunday holda, qurilmani Pi -dan 5v quvvat manbai yordamida quvvatlantirish to'g'ri bo'ladi, chunki DATA pin Pi signallarini yubormaydi, faqat ularni qabul qiladi. Bundan tashqari, 5v quvvat manbai 3v3 ta'minotidan ko'ra ko'proq uzatish diapazonini ta'minlaydi. Shunga qaramay, siz DATA pinini Pi -dagi istalgan moslamaga ulashingiz mumkin. Men 23 -pinni ishlatardim (qabul qilgich bilan bir xil).

Men tavsiya qiladigan yana bir narsa - transmitterning o'ng yuqori qismidagi kichik teshikka antenna qo'shish. Men 17 sm uzunlikdagi tekis simdan foydalanardim. Ba'zi manbalar shunga o'xshash uzunlikdagi o'ralgan simni tavsiya qiladi. Qaysi biri yaxshiroq ekanligiga ishonchim komil emas, lekin to'g'ri sim menga kichkina kvartiramning istalgan joyidan rozetkalarni yoqish/o'chirish uchun etarli masofani beradi. Antennani lehimlash yaxshidir, lekin men faqat plastmassaning bir qismini simdan olib tashladim va misni teshikdan o'rab oldim.

Transmitter simga ulangandan so'ng, uskunani sozlash tugallandi! Endi uydagi rozetkalarni o'rnatish va transmitter dasturiga qarashgina qoladi.

5 -qadam: Pi yordamida signallarni uzatish

Bu erda ikkinchi Python ssenariysi keladi. U birinchisidek sodda qilib tuzilgan. Yana, iltimos, uni yuklab oling va kodni ko'rib chiqing. 3 -qadamda yozilgan ma'lumotlarga muvofiq to'g'ri signallarni uzatish uchun siz skriptni tahrir qilishingiz kerak bo'ladi, shuning uchun hozir tez ko'rib chiqish uchun yaxshi vaqt.

Ushbu skriptni ishga tushirish uchun kerak bo'lgan kutubxonalar mening Pi-da oldindan o'rnatilgan, shuning uchun boshqa o'rnatishga hojat yo'q edi. Ular skriptning yuqori qismida keltirilgan:

import vaqti

import sys import RPi. GPIO GPIO sifatida

Kutubxona importi ostida siz tahrir qilishingiz kerak bo'lgan ma'lumotlar mavjud. Bu sukut bo'yicha qanday ko'rinishga ega (bu 3 -qadam yordamida aniqlangan rozetkalarga tegishli ma'lumotlar):

a_on = '1111111111111010101011101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0,0096

Bu erda bizda sakkizta kodli satr bor (mening telefonimdagi yoqish/o'chirish tugmalarining har bir jufti uchun ikkitasi - sizda ko'p yoki kamroq kodlar bo'lishi mumkin), so'ngra 3 -bosqichda aniqlangan vaqt ma'lumotlari. bu ma'lumotni to'g'ri kiritdi.

Skriptga kiritilgan kodlar/kechikishlar sizni xursand qilgandan so'ng (agar xohlasangiz, kod satrining o'zgaruvchilarini qayta nomlashingiz mumkin), siz tizimni sinab ko'rishga tayyormiz! Buni amalga oshirishdan oldin skriptdagi transmit_code () funktsiyasini ko'rib chiqing. Bu erda transmitter bilan haqiqiy o'zaro ta'sir sodir bo'ladi. Bu funksiya kod satrlaridan birini argument sifatida yuborilishini kutadi. Keyin u belgilangan pinni GPIO chiqishi sifatida ochadi va kod satridagi har bir belgidan o'tib ketadi. Keyin kod satriga mos keladigan to'lqin shaklini yaratish uchun siz kiritgan vaqt ma'lumotlariga ko'ra transmitterni yoqadi yoki o'chiradi. U har bir kodni o'tkazib yuborish ehtimolini kamaytirish uchun bir necha marta yuboradi (sukut bo'yicha 10) va har bir kod bloki o'rtasida, xuddi telefon kabi.

Skriptni ishga tushirish uchun siz quyidagi buyruq sintaksisidan foydalanishingiz mumkin:

python TransmitRF.py kod_1 kod_2…

Bitta skript bilan bir nechta kod satrlarini uzatishingiz mumkin. Masalan, (a) va (b) rozetkalarini yoqish va (c) soketini o'chirish uchun skriptni quyidagi buyruq bilan ishga tushiring:

python TransmitRF.py a_on b_on c_off

6 -qadam: Vaqt aniqligi haqida eslatma

Yuqorida aytib o'tilganidek, uzatiladigan yoqish/o'chirish pulslari orasidagi vaqt juda muhim. TransmitRF.py skripti to'lqin shakllarini to'g'ri puls intervallari bilan qurish uchun python's time.sleep () funktsiyasidan foydalanadi, lekin shuni ta'kidlash kerakki, bu funksiya to'liq aniq emas. Keyingi operatsiyani bajarishdan oldin skriptni kutish vaqti protsessor yuklanishiga bog'liq bo'lishi mumkin. TransmitRF.py har bir kodni bir necha marta yuborishining yana bir sababi - faqat time.sleep () funktsiyasi kodning namunasini to'g'ri tuza olmasa.

Kodlarni yuborish haqida hech qachon time.sleep () bilan bog'liq muammolar bo'lmagan. Men bilamanki, mening time.sleep () da taxminan 0.1ms xato bo'ladi. Men buni biriktirilgan SleepTest.py skriptidan foydalanib aniqladim, bu sizning Pi.ning time.sleep () funktsiyasi qanchalik to'g'ri ekanligini baholash uchun ishlatilishi mumkin. Mening alohida masofadan boshqariladigan rozetkalarim uchun men amalga oshirishim kerak bo'lgan eng qisqa kechikish 0,45 ms edi. Aytganimdek, men javob bermaydigan rozetkalar bilan bog'liq muammolarga duch kelmadim, shuning uchun 0,45 ± 0,1 ms etarli darajada yaxshi ko'rinadi.

Kechiktirish aniqroq bo'lishini ta'minlashning boshqa usullari mavjud; Masalan, siz kodlarni ishlab chiqarish uchun maxsus PIC chipidan foydalanishingiz mumkin, lekin shunga o'xshash narsalar bu darslik doirasidan tashqarida.

7 -qadam: Xulosa

Xulosa
Xulosa

Ushbu loyiha Raspberry Pi va 433 MGts masofadan boshqariladigan rozetkalar yordamida har qanday elektr jihozlarini boshqarish usulini taqdim etdi, bunda soddaligi va oshkoraligiga e'tibor qaratildi. Bu men ishlatgan eng hayajonli va moslashuvchan loyiha va buning uchun cheksiz ilovalar mavjud. Mana, endi Pi yordamida ba'zi narsalarni qila olaman:

  • Signalim o'chmasidan yarim soat oldin karavotim yonidagi elektr isitgichni yoqing.
  • Men uxlagandan bir soat o'tgach, isitgichni o'chiring.
  • Uyqudan qaytmasligim uchun budilnik o'chganda, karavot chiroqimni yoqing.
  • va yana ko'p narsalar …

Ushbu vazifalarning aksariyati uchun men Linuxda crontab funktsiyasidan foydalanaman. Bu sizga TransmitRF.py skriptini ma'lum vaqtlarda ishga tushirish uchun avtomatik rejalashtirilgan vazifalarni sozlash imkonini beradi. Siz Linux buyrug'idan bir martalik vazifalarni bajarish uchun ham foydalanishingiz mumkin (men uchun "sudo apt-get install at" yordamida alohida o'rnatilishi kerak edi). Masalan, ertasi kuni ertalabki signalim o'chmasidan yarim soat oldin isitgichni yoqish uchun men faqat quyidagilarni yozishim kerak:

soat 05:30 da

python TransmitRF.py c_on

Bundan tashqari, siz ushbu loyihani Internetdagi asboblarni boshqarish uchun Dropbox uy monitoring tizimi bilan birgalikda ishlatishingiz mumkin! O'qiganingiz uchun tashakkur, agar biror narsani aniqlamoqchi bo'lsangiz yoki o'z fikringizni bildirmoqchi bo'lsangiz, iltimos, sharh qoldiring!

Tavsiya: