Mündəricat:

Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırması: 7 addım
Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırması: 7 addım

Video: Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırması: 7 addım

Video: Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırması: 7 addım
Video: Ağıllı ev avtomatlaşdırılması üçün simsiz zigbee düyməsi - yığcam və büdcə 2024, Noyabr
Anonim
Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırılması
Super Sadə Raspberry Pi 433MHz Ev Avtomatlaşdırılması

Bu təlimat, evin ətrafındakı simsiz cihazları idarə etmək üçün bir Raspberry Pi istifadə etməyə gəldikdə bir çoxlarından biridir. Bir çoxları kimi, tez -tez istifadə olunan 433MHz radio tezlik diapazonunda işləyən qurğularla qarşılıqlı əlaqə qurmaq üçün Pi -yə bağlı ucuz bir ötürücü/alıcı cütünü necə istifadə edəcəyinizi göstərəcək. Xüsusi olaraq 433MHz uzaqdan idarə olunan elektrik prizlərinə əmrlər ötürərək Pi-dən istifadə edərək hər hansı bir elektrik cihazının necə açılacağını və ya söndürüləcəyini göstərəcək.

Bir çoxları varsa, niyə bu dərsliyi yaratdım? Əsasən rastlaşdığım bütün digər dərsliklər, xüsusən də proqram tərəfindəki işləri çox çətinləşdirmiş kimi görünürdü. Gördüm ki, bütün işləri görmək üçün üçüncü tərəf kitabxanalarına, skriptlərə və ya kod parçalarına çox güvənirlər. Bir çoxları əsas kodun nə etdiyini belə izah etməzlər - sadəcə olaraq Pi -yə iki və ya üç proqram yükləməyinizi və bir dəstə əmr icra etməyinizi xahiş edərdilər, heç bir sual verilmədi. Həqiqətən, 433MHz uzaqdan idarə olunan prizlərdən istifadə edərək elektrik cihazlarını evimin ətrafında açmaq və söndürmək üçün Pi-dən istifadə etmək istədim, amma başa düşə biləcəyim öz sistem versiyamı yaratmaq istəyirdim, inşallah ehtiyacım yox idi. başqasının kitabxanalarından və ya skriptlərindən istifadə edin.

Bu dərslik bununla bağlıdır. Bu sistemin proqram tərəfi iki çox sadə Python skriptindən ibarətdir - biri siqnalları qəbul etmək və qeyd etmək üçün, digəri isə bu siqnalları yenidən simsiz elektrik prizlərinə ötürmək üçün. Siqnalın həqiqi qəbulu/ötürülməsi yalnız ən azından mənim üçün Raspbian ilə əvvəlcədən quraşdırılmış RPi. GPIO kitabxanasına əsaslanır. Bu kitabxana birbaşa Python -a da idxal edilə bilər.

Bu layihə üçün sizə lazım olacaq:

Bir Moruq Pi. Hər hansı bir model işləməlidir, hamısı bir arada bir başlanğıc dəsti istifadə etdim, amma bəlkə də yalnız mərkəzi qurğuya ehtiyacınız var

433MHz ötürücü/qəbuledici cütü. Bu tip layihələrdə ən çox istifadə edilənlər bunlar kimi görünür. Əlaqələndirildiyi kimi beşlik bir paket almaq bir neçə ehtiyat hissənizin olmasını təmin edir

433MHz uzaqdan idarə olunan elektrik prizləri. Çox tövsiyə edəcəyim bunları istifadə etdim, amma saysız -hesabsız modellər var. Sadəcə bu tezlikdə işlədiklərindən əmin olun

Bəzi dövrə qurma aksesuarları. Dövrə qurma prosesini mümkün qədər asanlaşdırmaq üçün çörək taxtası və bəzi tullanan kabellərdən istifadə etməyi məsləhət görürəm.

[Bu məhsullardan hər hansı birini almaq qərarına gəlsəniz, yuxarıdakı bağlantılardan istifadə edərək siyahılara daxil olsanız çox məmnun olaram - bu yolla mənfəətdən kiçik bir payı sizə heç bir əlavə xərc ödəmədən əldə edərəm!]

Addım 1: Alıcı qurğusunun qurulması

Alıcı vahidinin qurulması
Alıcı vahidinin qurulması

Uzaqdan idarə olunan yuvalara əmr göndərmək üçün Pi-dən istifadə etməzdən əvvəl hansı xüsusi siqnallara cavab verdiklərini bilməlisiniz. Əksər uzaqdan idarə olunan prizlər, müəyyən cihazları açmaq və ya söndürmək üçün istifadə edilə bilən bir telefonla təchiz olunur. Aldığım vəziyyətlərdə, telefonda dörd sıra qoşulmuş ON/OFF düymələri var və hər biri müəyyən bir yuvaya ON və ya OFF siqnalı göndərir.

Bu bir sual doğurur - hansı düymələrin hansı yuvaya uyğun olduğunu necə bilirik? Bu əslində sahib olduğunuz modeldən asılıdır. Xüsusi yuva tərzimi seçməyimin əsas səbəblərindən biri (girişdə əlaqələndirilmişdir), cihazların müəyyən bir yuvanın telefonun müəyyən bir ON/OFF düyməsinə cavab verməsi üçün fiziki açarla konfiqurasiya edilə bilməsidir. Bu, hər bir cihazın həmişə eyni ON/OFF siqnallarına cavab verəcəyini bilə -bilə evdəki elektrik prizlərini çıxarıb hərəkət etdirə biləcəyiniz deməkdir.

Prizlərin telefonla necə qarşılıqlı əlaqədə olduğunu anladıqdan sonra, telefonun göndərdiyi kodları 'iyləmək' üçün 433MHz qəbuledici qurğunuzdan (yuxarıda) istifadə etməlisiniz. Bu kodların dalğa formalarını qeyd etdikdən sonra Python istifadə edərək onları təkrarlaya və ötürücü qurğudan istifadə edərək göndərə bilərsiniz.

Burada ediləcək ilk şey, alıcınızdakı pinləri Pi üzərindəki düzgün GPIO pinlərinə bağlamaqdır. Alıcı bölmədə dörd sancaq var, ancaq bunlardan yalnız üçünə ehtiyac var. Düşünürəm ki, hər iki mərkəzi sancaq eyni çıxış verir, buna görə də yalnız birinə qoşulmaq lazımdır (alınan siqnalları iki ayrı GPIO sancağına ötürmək istəmirsinizsə).

Yuxarıdakı şəkil naqilləri ümumiləşdirir. Alıcıdakı hər bir pin birbaşa Pi üzərindəki müvafiq pinə bağlana bilər. Prosesi bir az daha zərif etmək üçün çörək taxtası və tullanan kabellərdən istifadə edirəm. Diqqət yetirin ki, mərkəzi alıcı pinlərindən birinə qoşulmaq üçün hər hansı bir GPIO məlumat pinini seçə bilərsiniz. Pi başlığımda '23' olaraq işarələnmiş sancağı istifadə etdim.

ƏHƏMİYYƏTLİ: Yuxarıdakı şəkildəki '3v3' işarələnmiş pimi Pi üzərindəki daha yüksək bir gərginlik pininə (məsələn, 5v) bağlasanız, GPIO pinləri 3v3 -dən yuxarı olan gərginliyə dözə bilmədiyi üçün Pi -yə zərər verərsiniz. Alternativ olaraq, onu 5v ilə gücləndirə və DATA pininə təhlükəsiz bir gərginlik göndərmək üçün bir gərginlik bölücü qura bilərsiniz.

Alıcının diapazonu bu gərginlikdə çox böyük olmayacaq, xüsusən anten bağlanmadıqda. Ancaq burada uzun bir məsafəyə ehtiyacınız yoxdur - qəbuledici telefonun siqnallarını bir -birinin yanında tutduqları müddətcə ala biləcəyi müddətcə ehtiyacımız olan budur.

Addım 2: Telefon kodlarını iyləmək

Telefon kodlarını iyləmək
Telefon kodlarını iyləmək

Alıcınız Pi -yə qoşulduqdan sonra, bu layihənin ilk maraqlı mərhələsinə - qoxuya başlaya bilərsiniz. Bu, hər düyməyə basıldığında telefonun ötürdüyü siqnalı qeyd etmək üçün əlavə edilmiş Python skriptindən istifadə etməyi nəzərdə tutur. Ssenari çox sadədir və onu işə salmadan əvvəl nəzərdən keçirməyinizi şiddətlə tövsiyə edərdim - axı bu layihənin mahiyyəti başqasının kodunu kor -koranə işləməyinizdir!

Bu işə başlamazdan əvvəl, sniffer skriptini işə salmaq üçün lazım olan Python kitabxanalarına malik olduğunuzdan əmin olmalısınız. Ssenarinin yuxarı hissəsində sadalanırlar:

datetime tarixdən idetime

matplotlib.pyplot -u pyplot olaraq idxal edin, GPIO olaraq RPi. GPIO -nu idxal edin

RPi. GPIO və datetime kitabxanaları Raspbian paylamama daxil edildi, lakin matplotlib kitabxanasını aşağıdakı kimi qurmalı oldum:

sudo apt-get python-matplotlib quraşdırın

Bu kitabxana, bu layihədən kənarda da çox faydalı olan çox istifadə edilən bir qrafik qurma kitabxanasıdır, buna görə onu quraşdırmaq mütləq zərər verə bilməz! Kitabxanalarınız güncəlləşdikdən sonra məlumatların qeydinə başlamağa hazırsınız. Ssenari necə işləyir:

Çalıştırıldığında ('python ReceiveRF.py' əmrindən istifadə edərək), müəyyən edilmiş GPIO pinini məlumat girişi olaraq konfiqurasiya edəcək (standart olaraq pin 23). Daha sonra davamlı olaraq pindən nümunə götürəcək və rəqəmsal 1 və ya 0 aldığını qeyd edəcək. Bu, müəyyən bir müddətə (standart olaraq 5 saniyə) davam edir. Bu müddətə çatdıqda, skript məlumatların qeydini dayandıracaq və GPIO girişini bağlayacaq. Daha sonra bir az sonrakı emal həyata keçirir və alınan giriş dəyərini zamana qarşı qurur. Yenə də, ssenarinin nə ilə bağlı suallarınız varsa, necə işlədiyinə baxdıqdan sonra yəqin ki, özünüz cavab verə bilərsiniz. Kodu mümkün qədər sadə və oxunaqlı etməyə çalışdım.

Etməyiniz lazım olan şey, skriptin ** qeydə başladığını ** göstərdiyini görün. Bu mesaj göründükdə, telefonun düymələrindən birini təxminən bir saniyə basıb saxlayın. Alıcıya yaxın tutduğunuzdan əmin olun. Ssenari yazmağı bitirdikdən sonra, qeyd intervalında aldığı siqnalın qrafik dalğa formasını qurmaq üçün matplotlib istifadə edəcək. Diqqət yetirin, PuTTY kimi bir SSH müştəri istifadə edərək Pi -yə qoşulursunuzsa, dalğa formasının göstərilməsinə icazə vermək üçün X11 tətbiqini də açmalısınız. Bunun üçün xMing-dən istifadə edirəm (və Pi-yə uzaqdan masa üstü kimi digər şeylər üçün). Süjetin göstərilməsinə icazə vermək üçün, skripti işə salmadan əvvəl xMingə başlayın və nəticələrin görünməsini gözləyin.

Matplotlib pəncərəniz göründükdən sonra, sahədəki maraq sahəsi olduqca aydın olmalıdır. Pəncərənin altındakı düymələrdən istifadə edərək düyməni basılı tutarkən telefonun ötürdüyü siqnalın yüksək və aşağı hissələrini seçə bilməyincə böyütə bilərsiniz. Tam bir kod nümunəsi üçün yuxarıdakı şəklə baxın. Siqnal, ehtimal ki, heç bir siqnalın alınmadığı oxşar müddətlərlə ayrılmış çox qısa impulslardan ibarət olacaq. Bu qısa impulslar bloku, ehtimal ki, heç bir şeyin alınmadığı daha uzun bir dövrlə izləniləcək və bundan sonra model təkrarlanacaq. Kodun tək bir nümunəsinə aid olan nümunəni müəyyən etdikdən sonra, bu səhifənin yuxarısında belə bir ekran görüntüsü çəkin və onu şərh etmək üçün növbəti addıma davam edin.

Addım 3: Nəticə Siqnalının Transkripsiyası

Nəticə Siqnalının Transkripsiyası
Nəticə Siqnalının Transkripsiyası

Müəyyən bir düymənin siqnalına uyğun olaraq dövri yüksəklik və enmə blokunu təyin etdiyiniz üçün onu saxlamaq və şərh etmək üsuluna ehtiyacınız olacaq. Yuxarıdakı siqnal nümunəsində, bütün siqnal blokunu təşkil edən yalnız iki bənzərsiz nümunənin olduğunu görəcəksiniz. Bəzən qısa bir yüksəkliyin ardınca uzun bir alçaqlıq görürsən, bəzən isə əksinə - uzun bir yüksəkdən sonra qısa bir alçaq. Siqnallarımı transkripsiya edərkən aşağıdakı adlandırma quruluşundan istifadə etmək qərarına gəldim:

1 = qısamüddətli + uzun_ötürmə0 = uzun_on + qısamüddətli

Yenidən etiketli dalğa formasına baxın və nə demək istədiyimi anlayacaqsınız. Siqnalınızdakı ekvivalent nümunələri müəyyən etdikdən sonra, ardıcıllığı qurmaq üçün 1 və 0 -u saymaq kifayətdir. Transkripsiya edildikdə yuxarıdakı siqnal aşağıdakı kimi yazıla bilər:

1111111111111010101011101

İndi telefonunuzdakı digər düymələrə uyğun gələn siqnalları qeyd etmək və köçürmək üçün bu prosesi təkrar etməlisiniz və prosesin birinci hissəsini tamamlamısınız!

Siqnalları ötürücüdən istifadə edərək yenidən göndərməzdən əvvəl bir az daha iş görülməlidir. 1 və ya 0 -a uyğun gələn enişlər və enişlər arasındakı vaxt çox vacibdir və bir 'qısa_on' və ya 'uzun -uzanmanın' nə qədər davam etdiyini bildiyinizə əmin olmalısınız. Kodlarım üçün siqnalları təkrarlamaq üçün çıxarmaq üçün lazım olan üç zaman məlumatı var idi:

  • 'Qısa' intervalın müddəti, yəni 1 -in başlanğıcı və ya 0 -ın sonu.
  • 'Uzun' intervalın müddəti, yəni 1 -in sonu və ya 0 -ın başlanğıcı.
  • 'Uzadılmış' intervalın müddəti. Telefonun düyməsini basıb saxladığımda, siqnal blokunun hər təkrarlanan nümunəsi arasında 'uzadılma müddəti' olduğunu gördüm. Bu gecikmə sinxronizasiya üçün istifadə olunur və sabit bir müddətə malikdir.

Bu zamanlama dəyərlərini təyin etmək üçün matplotlib pəncərəsindəki böyütmə funksiyasından istifadə edərək hər tərəfə yaxınlaşdıra və kursoru siqnalın müvafiq hissələrinin üzərinə yerləşdirə bilərsiniz. Pəncərənin altındakı imlecin yerini oxumaq, siqnalın hər bir hissəsinin uzun, qısa və ya uzadılmış aralığa nə qədər uyğun olduğunu müəyyən etməyə imkan verməlidir. Diqqət yetirin ki, süjetin x oxu vaxtı təmsil edir və kursorun oxunmasının x komponenti saniyə vahidindədir. Mənim üçün genişliklər aşağıdakı kimi idi (saniyələrdə):

  • qısamüddətli = 0.00045
  • long_delay = 0.00090 ("qısa" dan iki dəfə çox)
  • Extended_delay = 0.0096

Addım 4: Verici qurğusunun qurulması

Transmitter Birliyinin Qurulması
Transmitter Birliyinin Qurulması

Kodlarınızı və vaxt məlumatlarınızı topladıqdan sonra, artıq ehtiyacınız olmayacağı üçün qəbuledici qurğunuzu ayıra bilərsiniz. Daha sonra yuxarıdakı şəkildə göstərildiyi kimi ötürücünü birbaşa müvafiq Pi GPIO pinlərinə bağlaya bilərsiniz. Tapdım ki, ötürücü qurğulardakı sancaqlar etiketlidir və bu da prosesi asanlaşdırır.

Bu vəziyyətdə, VATA pin Pi -yə siqnal göndərməyəcək, yalnız onları qəbul edəcək, çünki Pi -dən 5v təchizatı istifadə edərək qurğunu işə salmaq düzgündür. Ayrıca, 5v enerji təchizatı 3v3 təchizatından daha çox ötürmə diapazonu təmin edəcək. Yenə də, DATA pinini Pi üzərindəki hər hansı bir uyğun pinə bağlaya bilərsiniz. 23 pin istifadə etdim (alıcı üçün olduğu kimi).

Etməyinizi tövsiyə etdiyim başqa bir şey, vericinin sağ üst hissəsindəki kiçik çuxura anten əlavə etməkdir. 17 sm uzunluğunda düz tel istifadə etdim. Bəzi mənbələr oxşar uzunluqda əyilmiş bir tel tövsiyə edir. Hansının daha yaxşı olduğuna əmin deyiləm, amma düz tel, kiçik dairəmdəki hər hansı bir yerdən prizləri açmaq/söndürmək üçün kifayət qədər məsafə təmin edir. Antenə lehim etmək ən yaxşısıdır, ancaq bir az plastikdən teldən çıxarıb misdən çuxurdan bükdüm.

Transmitterin telləri bağlandıqdan sonra bütün qurğuların quraşdırılması başa çatdı! İndi etməyiniz lazım olan tək şey, prizlərinizi evin ətrafına qoymaq və verici proqramına baxmaqdır.

Addım 5: Pi istifadə edərək siqnalların ötürülməsi

Bura ikinci Python skriptinin gəldiyi yerdir. Birincisi qədər sadə olsa da daha çox deyil. Yenə də yükləyin və kodu nəzərdən keçirin. 3 -cü addımda qeyd etdiyiniz məlumatlara görə düzgün siqnalları ötürmək üçün skripti redaktə etməli olacaqsınız, buna görə də tez bir zamanda nəzər salmağın yaxşı vaxtıdır.

Bu skriptin işləməsi üçün lazım olan kitabxanaların hamısı Pi-də əvvəlcədən quraşdırılmışdı, buna görə əlavə quraşdırmaya ehtiyac yox idi. Ssenarinin yuxarı hissəsində sadalanırlar:

idxal vaxtı

idxal sys GPP olaraq RPi. GPIO idxal edin

Kitabxana idxalının altında redaktə etməli olduğunuz məlumatlar var. Varsayılan olaraq necə göründüyü budur (bu, 3 -cü addımdan istifadə edərək müəyyən edildiyi kimi prizlərimə uyğun olan məlumatdır):

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

Burada səkkiz kod simimiz var (telefonumdakı hər açma/söndürmə düyməsi üçün ikisi - daha çox və ya daha az kodunuz ola bilər) və ardınca 3 -cü addımda təyin olunan üç vaxt məlumatı da var. bu məlumatı düzgün daxil etdi.

Skriptə daxil etdiyiniz kodlardan/gecikmələrdən məmnun olduqdan sonra (istəsəniz kod simli dəyişənlərinin adını dəyişə bilərsiniz), sistemi sınamağa hazırsınız! Bunu etməzdən əvvəl skriptdəki transmit_code () funksiyasına nəzər salın. Verici ilə faktiki qarşılıqlı əlaqə burada baş verir. Bu funksiya kod simlərindən birinin arqument olaraq göndərilməsini gözləyir. Sonra müəyyən bir pin GPIO çıxışı olaraq açılır və kod simindəki hər bir xarakterdən keçir. Daha sonra kod siminə uyğun bir dalğa forması qurmaq üçün daxil etdiyiniz vaxt məlumatlarına görə vericini açar və ya söndürər. Qaçırılma ehtimalını azaltmaq üçün hər kodu bir neçə dəfə göndərir (standart olaraq 10) və telefon kimi hər kod bloku arasında uzadılmış bir gecikmə buraxır.

Skriptin işə salınması üçün aşağıdakı əmr sintaksisindən istifadə edə bilərsiniz:

python TransmitRF.py kodu_1 kodu_2…

Skriptin bir axını ilə birdən çox kod sətrini ötürə bilərsiniz. Məsələn, (a) və (b) yuvalarını açmaq və (c) yuvasını söndürmək üçün skripti aşağıdakı əmrlə işlədin:

python TransmitRF.py a_on b_on c_off

Addım 6: Zamanlama Dəqiqliyinə Bir Qeyd

Qeyd edildiyi kimi, ötürülən açma/söndürmə pulsları arasındakı vaxt olduqca vacibdir. TransmitRF.py skripti, dalğa formalarını düzgün nəbz aralıqları ilə qurmaq üçün python's time.sleep () funksiyasından istifadə edir, lakin bu funksiyanın tam dəqiq olmadığını qeyd etmək lazımdır. Növbəti əməliyyatı icra etməzdən əvvəl skriptin gözləməsinə səbəb olan uzunluq, verilən andakı prosessor yükündən asılı ola bilər. TransmitRF.py -nin hər kodu bir neçə dəfə göndərməsinin başqa bir səbəbi budur ki, time.sleep () funksiyası kodun müəyyən bir nümunəsini düzgün qura bilmir.

Kodların göndərilməsinə gəldikdə şəxsən time.sleep () ilə bağlı heç bir problemim olmayıb. Ancaq bilirəm ki, mənim time.sleep () təxminən 0.1 ms xətaya meyllidir. Bunu Pi -nin time.sleep () funksiyasının nə qədər dəqiq olduğunu təxmin etmək üçün istifadə edilə bilən əlavə edilmiş SleepTest.py skriptindən istifadə edərək təyin etdim. Xüsusi uzaqdan idarə olunan prizlərim üçün tətbiq etməli olduğum ən qısa gecikmə 0,45 ms idi. Dediyim kimi, cavab verməyən yuvalarla bağlı problemim olmadı, buna görə də 0.45 ± 0.1 ms kifayət qədər yaxşı görünür.

Gecikmənin daha dəqiq olmasını təmin etmək üçün başqa üsullar var; Məsələn, kodları yaratmaq üçün xüsusi bir PIC çipindən istifadə edə bilərsiniz, ancaq buna bənzər şeylər bu təlimatın çərçivəsindən kənardır.

Addım 7: Nəticə

Nəticə
Nəticə

Bu layihə, sadəlik və şəffaflığa diqqət yetirməklə, Raspberry Pi və 433MHz uzaqdan idarə olunan prizlərdən istifadə edərək hər hansı bir elektrik cihazını idarə etmək üçün bir üsul təqdim etdi. Pi -ni istifadə etdiyim ən həyəcanlı və çevik layihədir və bunun üçün sonsuz tətbiqlər var. Pi sayəsində indi edə biləcəyim bəzi şeylər:

  • Siqnalım sönməzdən yarım saat əvvəl yatağımın yanındakı elektrik qızdırıcısını yandırın.
  • Yatandan bir saat sonra qızdırıcını söndürün.
  • Yuxuya getməmək üçün həyəcan siqnalı sönəndə yatağımın işığını yandır.
  • və daha çox…

Bu vəzifələrin çoxu üçün Linuxda crontab funksiyasından istifadə edirəm. Bu, müəyyən vaxtlarda TransmitRF.py skriptini işə salmaq üçün avtomatik planlaşdırılmış tapşırıqlar qurmağa imkan verir. Birdəfəlik vəzifələri yerinə yetirmək üçün Linux əmrindən də istifadə edə bilərsiniz (mənim üçün 'sudo apt-get install at' istifadə edərək ayrıca quraşdırılmalı idi). Məsələn, qızdırıcımı ertəsi səhər həyəcan siqnalı sönməzdən yarım saat əvvəl açmaq üçün etməli olduğum şey:

saat 05:30

python TransmitRF.py c_on

Bu layihəni internet üzərindəki cihazları idarə etmək üçün Dropbox ev izləmə sistemimlə birlikdə istifadə edə bilərsiniz! Oxuduğunuz üçün təşəkkürlər və bir şeyi aydınlaşdırmaq və ya fikirlərinizi bölüşmək istəyirsinizsə, bir şərh yazın!

Tövsiyə: