Suis Tepuk Arduino dengan Sensor Bunyi KY-037

Cartoon of two hands clapping beside a red KY-037 sound sensor board with a silver microphone capsule and blue trimmer, teal sound waves travelling from the clap into the microphone, with a red relay module with a blue relay cube and a lit table lamp with a cream shade to the right

Suis tepuk yang benar-benar kekal berfungsi membaca pin analog KY-037, bukan pin digitalnya: ambil sampel A0 selaju yang ADC benarkan, ukur sejauh mana isyarat berayun di dalam satu tetingkap 20 ms, dan kira dua ayunan yang berselang 120–800 ms sebagai satu toggle. Binaan trimmer-dan-D0 yang ditunjukkan oleh setiap panduan memang menjadi di atas meja dan hanyut menjelang malam; yang ini kekal.

Apa yang anda perlukan untuk membina suis tepuk Arduino?

Sensor bunyi KY-037 ialah board merah kecil dengan kapsul electret perak di atas dua kaki bengkok, satu trimmer biru, sebuah LM393 dan empat pin male yang lurus. Pin-pin itulah yang menentukan pendawaian: ia duduk terus ke dalam breadboard, dan jumper male-to-male pula sampai ke header female Uno.

Pilihan β€” kabel USB dan LED penunjuk panel

ItemPriceQty
Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-B (1.0M)Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-B (1.0M)ATBC100RM4.90
Round Head LED 3mm / 5mm / 8mm - Red/Yellow/Blue/Green/White - 5mm LED (GREEN)Round Head LED 3mm / 5mm / 8mm - Red/Yellow/Blue/Green/White - 5mm LED (GREEN)5GRELEDRM0.10
Electronic Component Set Beginner Electrical Learning Kit For Arduino Beginner Learning - ELECTRICAL STARTER KITElectronic Component Set Beginner Electrical Learning Kit For Arduino Beginner Learning - ELECTRICAL STARTER KITELECTRKRM39.95

Soket pada Uno menerima plug USB-B bersaiz penuh (jenis printer) β€” tambah satu kalau penyambung segi empat itu belum ada dalam laci anda. Peringkat pertama binaan ini hanya mengelipkan LED pin-13 milik Uno sendiri dan tidak perlukan apa-apa tambahan; LED hijau 5 mm itu untuk penunjuk panel, dan ia perlukan satu perintang siri bersamanya β€” 220 Ξ© pilihan biasa, dan jalur perintang dalam starter kit itulah tempat mencarinya.

Modul relay ini versi 5 V kerana gegelung Songle SRD-05VDC-SL-C padanya berjalan terus daripada rel Uno sendiri; modul 12 V pula board merah yang sama dengan gegelung 12 V, dan tempatnya dalam sistem yang sudah pun ada 12 V. Jumper male-to-female melangkau breadboard terus; Uno FT232 pula sesuai untuk PC yang bergelut dengan driver CH340.

Bagaimana KY-037 menukar satu tepukan menjadi isyarat?

Kapsul electret KY-037 dibias melalui satu perintang daripada pin +, dan bunyi ialah ayunan tekanan, jadi nod itu membawa isyarat berselang-seli di atas satu aras DC yang tetap. Satu tepukan mengayunkannya ke atas dan ke bawah aras rehat itu selama beberapa milisaat, kemudian pantulan dalam bilik membuatkannya berdering reda selama berpuluh milisaat lagi. A0 ialah nod itu.

LM393 pada KY-037 membandingkan nod itu dengan satu rujukan yang ditetapkan oleh trimmer biru β€” bertanda 104, iaitu sepuluh diikuti empat sifar, jadi 100 kΞ© β€” lalu memacu D0 daripada hasilnya. Output itu jenis open-collector: sebuah transistor yang boleh menarik pin ke ground dan tiada apa pun yang boleh menolaknya naik, jadi board itu memasang pull-up dan LED penunjuknya sendiri. D0 menjawab satu soalan yang sudah dipateri dalam hardware; A0 pula ialah keseluruhan isyarat.

Pin (susunan silkscreen) Sambung ke Apa yang dibawanya
A0 Uno A0 Nod mikrofon itu sendiri β€” ayunan AC di atas bias DC
G Rel βˆ’ (GND) Ground. Perhatikan ia duduk kedua, bukan di hujung
+ Rel + (5 V) Bekalan untuk bias mikrofon dan LM393
D0 Biarkan tidak bersambung Output comparator. Sketch ini tidak menggunakannya
Rajah isyarat kartun menunjukkan bentuk gelombang audio navy dengan dua letusan kuat, satu garis ambang tetap oren berputus-putus yang dilintasi berkali-kali setiap letusan dengan titik oren pada setiap lintasan, dan satu jalur aras bunyi latar adaptif teal pucat dengan satu anak panah dua hujung teal yang mengukur ketinggian puncak-ke-puncak setiap letusan
Satu tepukan, enam lintasan ambang. Garis oren itulah yang ditetapkan oleh trimmer; jalur teal ialah aras bunyi latar yang diukur oleh code, dan anak panah teal itu ialah satu-satunya nombor yang diambilnya daripada setiap letusan.

Bagaimana cara mendawai KY-037 dan modul relay ke Uno?

Uno hanya ada satu soket 5 V sedangkan dua modul memerlukannya, jadi bekalkan rel breadboard daripada soket itu dahulu dan ambil kedua-dua bekalan daripada rel. Dudukkan KY-037 mengikut silkscreennya: ground berada di kedudukan kedua dalam barisan itu, jadi modul yang tersasar satu lubang akan menghantar 5 V masuk ke dalam input analog. Relay pula ada terminal skru tiga laluan di setiap tepi β€” NO/COM/NC untuk kontak, IN/DCβˆ’/DC+ untuk kawalan β€” jadi apitkan hujung pin jumper di bawah setiap skru.

Dari Ke Kenapa
Uno 5V, GND Rel + dan βˆ’ Dua jumper male-to-male. Satu soket menjadi rel yang boleh dikongsi kedua-dua modul
KY-037 +, G Rel + dan βˆ’ Bias mikrofon dan bekalan comparator
KY-037 A0 Uno A0 Isyarat yang diukur oleh sketch
Relay DC+, DCβˆ’ Rel + dan βˆ’ Menghidupkan board dan gegelung β€” kira-kira 71 mA semasa relay masuk
Relay IN Uno D8 Memacu LED optocoupler sahaja, beberapa miliampere
Lampu Relay COM dan NO Mati setiap kali relay mati atau board tiada kuasa
LED pilihan Uno D13 β†’ 220 Ξ© β†’ kaki panjang LED, kaki pendek ke rel βˆ’ Penunjuk panel selari dengan LED onboard yang memang sudah dipacu sketch. Perintang itu bukan pilihan

Kenapa suis tepuk trimmer-dan-D0 tidak pernah kekal tertala?

Trimmer pada KY-037 menetapkan tepat satu nombor sahaja β€” voltan yang nod mikrofon mesti lintasi sebelum D0 bertukar β€” dan satu ambang tetap itu menimbulkan tiga masalah. Lampu malam LDR kami membuat hujah yang sama tentang cahaya.

Ambangnya tetap, biliknya tidak. Kipas, hujan menimpa bumbung besi atau kompresor aircond yang masuk semuanya menaikkan aras bunyi latar sebanyak berpuluh milivolt, jadi tetapan yang ditala pukul 11 malam sama ada terlepas tepukan waktu tengah hari atau tercetus pada trafik yang lalu. Trimmer itu langsung tidak tahu apa-apa tentang bilik yang didudukinya.

Satu tepukan ialah banyak tepi. Bentuk gelombangnya melintasi ambang semasa naik, melintas lagi semasa turun, dan melintas sekali lagi pada setiap pantulan yang masih cukup kuat, jadi satu tepukan menghasilkan satu letusan yang berkecamuk. Code yang toggle pada setiap tepi akan toggle beberapa kali β€” itulah sebabnya suis tepuk yang naif berkelip dan bukannya menyuis.

Berhampiran titik setnya, ia menggigil. Bunyi yang terapung betul-betul pada ambang melintasinya berulang kali β€” dan trimmer itu jenis multi-turn, jadi skrunya perlu banyak pusingan untuk merentasi julatnya lalu tergelincir dengan bunyi klik di setiap hujung. “Pusing sampai jadi” selalunya berakhir dengan skru itu tersangkut di hujung julatnya:

D0 bukannya tidak berguna, tetapi ia tidak akan memacu relay ini mengikut arah yang paling jelas. LM393 menyerap (sink) arus dengan kuat dan hanya membekal (source) melalui pull-upnya β€” sepersekian miliampere sedangkan LED optocoupler mahukan beberapa miliampere β€” jadi jumper terpaksa dialihkan ke L, di mana relay masuk setiap kali D0 berada LOW. Pada KY-037, LOW itulah keadaan rehatnya dan tepukan pula HIGH β€” LED penunjuk D0 pada board itu sendiri bertukar keadaan bersamanya, jadi anda boleh perhatikan pin itu menjawab tepukan sebelum menyambung apa-apa kepadanya. Maka lampu menyala sepanjang waktu senyap dan terputus selagi bunyi berlanjutan; alihkan ia ke NC dan bukan NO, maka bunyi menghidupkan lampu semula, dengan kos hilangnya sifat fail-safe, kerana lampu pada NC juga menyala setiap kali board kehilangan kuasa. Apa pun caranya, ia bersifat sekejap sahaja. Toggle memerlukan ingatan, dan ingatan memerlukan code.

Bagaimana code suis tepuk mengesan tepukan pada A0?

Ukur ayunannya, bukan arasnya. Sketch ini mengambil sampel pin A0 KY-037 selaju yang termampu selama 20 ms dan menyimpan hanya bacaan tertinggi dan terendah; bezanya ialah ayunan puncak-ke-puncak. Dua puluh milisaat cukup panjang untuk memastikan beberapa milisaat paling kuat dalam satu tepukan sentiasa mendarat di dalam satu tetingkap, dan cukup pendek supaya pemasaan dua tepukan yang menyusul masih halus butirannya. Menolak satu sampel daripada satu sampel lain membatalkan bias DC, jadi aras rehat tidak perlu diketahui langsung, dan tidak menjadi soal sama ada isyarat itu bergerak naik atau turun dahulu.

ADC Uno berjalan daripada jam 125 kHz β€” 16 MHz dibahagi prescaler lalai Arduino core iaitu 128 β€” dan setiap penukaran mengambil 13 kitaran, jadi analogRead() memulangkan lebih kurang 9,600 sampel sesaat, kira-kira 190 setiap tetingkap. Jauh terlalu perlahan untuk membina semula audio β€” dan ia memang tidak perlu: kandungan di atas separuh kadar sampel terlipat balik ke bawah dan bukannya hilang, lalu tetap mendarat sebagai sampel yang besar. Kita mengukur sekuat mana isyarat itu bergerak, bukan apa yang dikatakannya.

Ambangnya kemudian ialah aras bunyi latar bilik itu sendiri campur satu margin. Sketch ini mempuratakan ayunan tetingkap-tetingkap yang senyap, menolaknya 3% setiap tetingkap β€” 20 ms satu langkah, jadi kira-kira tiga puluh tetingkap, dua pertiga saat, untuk mengikut perubahan dalam bilik β€” dan melangkau mana-mana tetingkap yang mengandungi tepukan, supaya satu tepukan tidak sekali-kali boleh menaikkan palang yang baru sahaja dilepasinya. Margin 80 kiraan bersamaan 80 Γ— 4.9 mV β‰ˆ 0.39 V ayunan tambahan β€” jauh melebihi julat rayauan bilik yang senyap, dan satu nombor permulaan yang munasabah untuk tepukan sejauh hulur tangan. A0 ialah nod mikrofon itu sendiri tanpa amplifier di belakangnya, jadi ayunan itu mengecil dengan cepat apabila anda berundur: baris Serial mencetak berapa sebenarnya ukuran tepukan anda, dan margin itu ikut nombor tersebut.

Rajah pemasaan kartun menunjukkan satu pancang tepukan navy diikuti blok tempoh pekak kelabu dan satu tetingkap penerimaan teal yang lebar mengandungi pancang kedua yang menghidupkan lampu meja krim dan navy, dengan kes satu tepukan yang ditolak di bawahnya berakhir dengan simbol larangan oren dan lampu yang tidak menyala
Satu tepukan, satu tempoh pekak yang menelan gemanya sendiri, kemudian satu tetingkap di mana tepukan kedua dikira. Satu tepukan bersendirian sampai ke hujung tetingkap dan tidak mengubah apa-apa.

Bagaimana dua tepukan menjadi tepat satu toggle?

Ayunan pertama yang diterima memulakan satu jam, dan selama 120 ms sketch ini sengaja dibuat pekak: bunyi langsung sesuatu tepukan hanya beberapa milisaat tetapi pantulannya menahan aras itu jauh lebih lama, dan tiada siapa bertepuk dua kali dalam masa sepersepuluh saat β€” jadi apa sahaja dalam tempoh itu ialah tepukan yang sama juga. Dari 120 ms hingga 800 ms, satu ayunan kedua akan toggle lampu. Selepas 800 ms mesin itu berputus asa, jadi pintu yang berdentum sendirian tidak mengubah apa-apa, dan begitu juga satu ketawa yang kuat.

Kedua-dua angka itu pemalar, bukan fizik: lebarkan GAP_MAX kalau tepukan kedua anda tiba lewat, panjangkan REFRACTORY kalau output Serial mengira satu tepukan sebagai dua di dalam bilik berdinding keras dan berjubin.

/*
  Suis tepuk - sensor bunyi KY-037 -> Arduino Uno -> modul relay 5 V.
  Tiada library diperlukan.

  KY-037  +  -> rel + breadboard (5 V)     G  -> rel - breadboard (GND)
  KY-037  A0 -> Uno A0                     D0 -> tidak diguna sketch ini
  Relay   DC+ -> rel +     DC- -> rel -    IN -> Uno D8
  Jumper relay kekal pada H (high-level trigger) macam ia dihantar.

  Sketch ini mengukur sejauh mana isyarat mikrofon BERAYUN dalam satu tetingkap
  pendek, bukan pada aras mana ia duduk, jadi bias DC dan trimmer kedua-duanya
  tidak relevan. Dua ayunan di dalam tetingkap masa akan toggle lampu.
*/

const uint8_t PIN_MIC   = A0;
const uint8_t PIN_RELAY = 8;
const uint8_t PIN_LED   = 13;   // LED milik Uno sendiri - peringkat satu tak perlu relay

const uint16_t WINDOW_MS   = 20;    // panjang satu tetingkap pengukuran
const int      CLAP_MARGIN = 80;    // kiraan ADC yang tepukan mesti atasi berbanding bilik
const uint16_t REFRACTORY  = 120;   // ms tempoh pekak selepas tepukan (gemanya sendiri)
const uint16_t GAP_MAX     = 800;   // ms: selewat-lewatnya tepukan kedua boleh tiba

// Jumper relay pada H (macam dihantar) = HIGH menghidupkan. Set false kalau dialih ke L.
const bool RELAY_ACTIVE_HIGH = true;

float    ambient     = 0;   // aras bunyi latar berjalan, dalam kiraan ayunan setiap tetingkap
bool     lampOn      = false;
uint8_t  state       = 0;   // 0 = menunggu tepukan pertama, 1 = menunggu tepukan kedua
uint32_t lastClapAt  = 0;
uint32_t firstClapAt = 0;

// Ambil sampel selaju analogRead() benarkan selama WINDOW_MS dan pulangkan julat
// puncak-ke-puncak. Menolak min daripada max membatalkan bias DC.
int measureWindow() {
  uint16_t lo = 1023, hi = 0;
  uint32_t start = millis();
  while (millis() - start < WINDOW_MS) {
    uint16_t s = analogRead(PIN_MIC);
    if (s < lo) lo = s;
    if (s > hi) hi = s;
  }
  return (int)(hi - lo);
}

void setLamp(bool on) {
  lampOn = on;
  digitalWrite(PIN_LED, on ? HIGH : LOW);
  digitalWrite(PIN_RELAY, (on == RELAY_ACTIVE_HIGH) ? HIGH : LOW);
}

void setup() {
  pinMode(PIN_RELAY, OUTPUT);
  pinMode(PIN_LED, OUTPUT);
  setLamp(false);                 // pacu relay ke mati sebelum apa-apa lagi
  Serial.begin(115200);

  // Kenali bilik: 50 tetingkap lebih kurang satu saat. Senyap sepanjang tempoh itu.
  long sum = 0;
  for (uint8_t i = 0; i < 50; i++) sum += measureWindow();
  ambient = sum / 50.0;

  Serial.print(F("noise floor "));
  Serial.print(ambient, 1);
  Serial.print(F(" counts, clap needs "));
  Serial.println(ambient + CLAP_MARGIN, 1);
}

void loop() {
  int      amp  = measureWindow();
  uint32_t now  = millis();
  bool     loud = amp > (int)(ambient + CLAP_MARGIN);

  // Hanya tetingkap senyap menggerakkan aras bunyi latar: 3% setiap tetingkap 20 ms
  // mengikut bilik dalam lebih kurang dua pertiga saat, dan tepukan 20 ms tak mengusiknya.
  if (!loud) ambient += 0.03f * (amp - ambient);

  bool clap = loud && (now - lastClapAt >= REFRACTORY);
  if (clap) {
    lastClapAt = now;
    Serial.print(F("clap, swing "));
    Serial.println(amp);
  }

  if (state == 0) {
    if (clap) { firstClapAt = now; state = 1; }
  } else {
    if (clap) {
      setLamp(!lampOn);
      Serial.println(lampOn ? F("lamp ON") : F("lamp OFF"));
      state = 0;
    } else if (now - firstClapAt > GAP_MAX) {
      state = 0;                  // satu tepukan sahaja tidak mengubah apa-apa
    }
  }
}

Pada Uno, ini dikompil menjadi 4,418 bait flash β€” 13% daripada 32 KB β€” dan 214 bait RAM. Jalankannya tanpa relay dahulu: sketch yang sama memacu LED pin-13 milik Uno sendiri, jadi anda boleh pastikan tepukan mendarat dengan konsisten sebelum ada apa-apa yang berbunyi klik. Serial Monitor pada 115200 mencetak aras bunyi latar yang diukur dan ayunan setiap tepukan, jadi tepukan yang terlepas terus memberitahu anda berapa jauh ia tersasar.

Bagaimana peringkat relay menghidupkan lampu?

Gegelung SRD-05VDC-SL-C pada modul relay ini ialah 70 Ξ©, jadi menariknya masuk mengambil 5 V Γ· 70 Ξ© β‰ˆ 71 mA. Dengan 45 mA lebih kurang milik Uno sendiri dan beberapa mA daripada sensor, binaan ini duduk sekitar 120 mA β€” di dalam had 500 mA yang dibenarkan polyfuse USB Uno, sebab itulah tiada apa di sini yang perlukan bekalan kedua. Pin Uno tidak pernah membawa 71 mA itu: IN hanya memacu LED optocoupler pada beberapa miliampere, dan DC+ yang menyuap gegelung. Kedua-dua belah optocoupler itu berkongsi DCβˆ’ di sini, jadi ia menampan (buffer) dan bukannya mengasingkan: pengasingan yang benar-benar penting berada di dalam relay itu sendiri, yang kontaknya ialah kepingan logam berasingan secara mekanikal daripada gegelung.

Blok jumper hitam itu dihantar dengan penutupnya pada H, iaitu high-level trigger β€” board itu mencetak L di sebelah satu hujung header kecil itu dan H di sebelah satu lagi, jadi satu pandangan sudah cukup untuk mengesahkannya sebelum anda hidupkan kuasa β€” dan tetapan lalai itu memang yang betul: pin Arduino ialah input berimpedans tinggi dari saat kuasa masuk sehinggalah setup() berjalan, jadi IN yang terapung atau LOW membiarkan lampu mati sepanjang boot. Ia juga punca paling biasa aduan “relay saya jalan terbalik”, kerana sketch yang disalin daripada board low-trigger menulis LOW untuk menghidupkan. Alihkan penutup itu ke L dan anda mesti set RELAY_ACTIVE_HIGH kepada false.

Pandangan atas kartun modul relay satu-channel merah dengan kiub relay biru, satu terminal skru tiga laluan biru di setiap tepi, titik penunjuk merah dan hijau, dan satu bulatan oren menyerlahkan blok jumper tiga pin dengan penutupnya duduk pada dua pin sebelah kanan
Modul relay 5 V dari atas: kontak yang disuiskan pada satu terminal skru, kawalan pada satu lagi, dan penutup jumper kecil yang dibulatkan oren itu yang menentukan sama ada HIGH atau LOW menghidupkan lampu.

Dawaikan lampu melalui COM dan NO supaya ia gelap setiap kali relay mati atau tiada kuasa. Dua skru itu ialah suis mekanikal, bukan output: lampu mengekalkan bekalannya sendiri β€” potong wayar positif bekalan itu dan apitkan satu hujungnya ke dalam COM, satu lagi ke dalam NO, supaya tiada apa daripada rel Uno pernah sampai ke lampu. Casing relay mencetak apa yang boleh dibawa oleh kontaknya: 10 A pada 250 V AC, 10 A pada 30 V DC, beban rintangan. Semua yang ada di sini kekal DC voltan rendah β€” jalur LED 12 V atau lampu DC kecil dengan bekalannya sendiri. Lampu 240 V membawa peraturannya sendiri tentang enclosure, jarak bebas, rating kabel dan terminal yang boleh disentuh: baca panduan keselamatan modul relay kami dahulu. Satu tepukan ialah kawalan suara dengan perbendaharaan kata sebanyak satu perkataan, jadi modul kawalan suara ialah langkah naik yang paling semula jadi dari sini; kalau yang anda mahu pula ialah lampu yang mengikut pergerakan dan bukan bunyi, sensor PIR ialah sensor yang lebih tepat.

Kesilapan biasa yang kami nampak daripada pelanggan sebenar

Mengharapkan ia berfungsi menembusi muzik yang kuat. Hanya tetingkap yang senyap menggerakkan aras bunyi latar β€” itulah tepat-tepat yang menghalang satu tepukan daripada menaikkan palang yang baru dilepasinya β€” jadi bunyi kuat yang berterusan menjadi palang yang tidak mungkin dicapai oleh aras itu, dan sketch membacanya sebagai tepukan demi tepukan demi tepukan. Naikkan CLAP_MARGIN, jauhkan sensor daripada speaker, atau terimalah bahawa suis tepuk memang mendengar bunyi mendadak di atas bilik yang agak senyap, bukan di dalam bilik yang bising.

Toggle pada setiap tepi D0. Satu tepukan yang menghasilkan enam lintasan akan toggle enam kali, jadi keadaan akhir lampu itu tinggal soal nasib. Mengira tepi bukan penyelesaiannya; mengabaikan segalanya selama 120 ms selepas tepi pertama itulah penyelesaiannya.

Memusing trimmer untuk membaiki binaan analog. Trimmer menetapkan rujukan LM393, dan rujukan itu hanya sampai ke D0 β€” ia langsung tidak boleh menyentuh isyarat A0 yang dibaca oleh sketch ini.

FAQ

Kenapa suis tepuk saya hidup dan mati sendiri?

Ada sesuatu yang melepasi ambang dua kali di dalam tetingkap masa itu. Naikkan CLAP_MARGIN, dan jauhkan sensor daripada bunyi klik relay.

Boleh tak saya guna pin D0 KY-037 dan bukan A0?

Untuk relay yang tercetus bunyi secara sekejap, boleh, asalkan anda ambil kira D0 yang rehat pada LOW dan naik HIGH bila ada bunyi. Untuk toggle dua tepukan, tidak boleh β€” satu ambang tetap, beberapa tepi setiap tepukan.

Kenapa relay saya menyuis secara terbalik?

Penutup jumper dihantar pada H, jadi HIGH menghidupkan gegelung sedangkan sketch low-trigger menulis LOW. Alihkan penutup itu, atau set RELAY_ACTIVE_HIGH kepada false.

Boleh tak pin 5 V Arduino menghidupkan modul relay?

Boleh, untuk modul 5 V: 71 mA gegelung berbanding bajet USB 500 mA. Gegelung 12 V pula tidak akan masuk pada 5 V.

Sejauh mana saya boleh bertepuk?

Sejauh mana ayunannya masih mengatasi aras bunyi latar sebanyak CLAP_MARGIN. Tekanan bunyi susut dengan jarak sedangkan aras latar tidak β€” turunkan margin atau alihkan sensor.

Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.

Leave a Reply

Your email address will not be published. Required fields are marked *