Remote IR dengan Arduino (HX1838): Decode Butang, LED & Relay

Cartoon of a large matte-black IR remote with blank white keys and a blue arrow pad sending teal infrared arcs to a small black receiver module with a silver shield can, beside a red LED, a green LED and a red relay board

Projek remote IR ialah tiga wayar dan satu library. Pin isyarat penerima HX1838 masuk ke mana-mana pin digital Arduino, library IRremote memulangkan satu nombor untuk setiap tekanan butang, dan sketch anda hanyalah satu switch pada nombor itu. Hampir setiap aduan “code remote IR Arduino saya tak jalan” akhirnya menjadi masalah versi library: Library Manager memasang 4.x hari ini, sedangkan sketch yang ditulis untuk 2.x menggunakan API yang sudah digantikan.

Apa komponen yang diperlukan untuk projek remote IR Arduino?

Set remote IR HX1838 ialah keseluruhan bahagian penerima dalam satu bungkusan: sebuah remote hitam matte 17 kekunci, modul penerima di atas PCB hitam kecilnya, satu wayar dupont empat teras, dan sebiji LED pemancar IR jernih-air untuk kegunaan kemudian. Selebihnya cuma muatan β€” dua LED untuk membuktikan decoding berjaya, dan satu relay untuk membuktikan ia boleh menghidupkan sesuatu.

Pilihan β€” kalau anda bermula dari kosong

ItemPriceQty
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

Kit permulaan elektrik ini sudah mengandungi breadboard, wayar jumper dupont, pelbagai LED dan satu himpunan perintang, jadi pembaca yang sedang menyiapkan meja kerja pertamanya boleh ambil kotak ini menggantikan baris breadboard, jumper, LED dan perintang di atas.

Jantina penyambung menentukan sama ada komponen boleh dicantum terus. Wayar dalam kit itu ada soket female pada kedua-dua hujungnya, jadi ia memadankan pin penerima kepada board berheader pin seperti Raspberry Pi, tetapi tiada apa-apa untuk dicengkamnya pada Uno yang headernya pun female. Tiga pin modul penerima itu male 2.54 mm, jadi ia sebaliknya dicucuk terus ke dalam breadboard 400 lubang; dari situ ke soket female Uno setiap wayar ialah male-to-male, dan pek yang sama juga sampai ke modul relay, yang terminal skrunya mengapit pin male telanjang. Satu pek M-M meliputi keseluruhan binaan ini. Uno diprogram melalui soket USB-B bersaiz penuh dan dihantar tanpa wayar, jadi tambah kabel A-to-B.

Setiap LED perlukan perintang siri, dan nilainya ialah kira-kira matematik, bukan cakap orang. Pin output Arduino berada pada kira-kira 5 V dan LED merah 5 mm menjatuhkan lebih kurang 2.0 V, jadi 220 Ξ© melalukan (5 βˆ’ 2.0) / 220 β‰ˆ 14 mA β€” terang, dan jauh di bawah 40 mA yang diberikan datasheet ATmega328P sebagai had mutlak bagi satu pin I/O. LED hijau ialah kiraan yang sama dalam warna kedua. Mana-mana perintang 220 Ξ© dari laci pun boleh pakai; pek perintang dan kit permulaan itu kedua-duanya membawanya.

Library remote IR Arduino yang mana perlu dipasang?

Library IRremote β€” karya asal Ken Shirriff, diselenggara sejak itu oleh Armin Joachimsmeyer β€” itulah yang digunakan panduan ini. Pasang ia dari dalam IDE: Sketch β†’ Include Library β†’ Manage Libraries, taip IRremote, dan tekan Install pada entri itu. Ambil dari Library Manager dan bukan dari fail ZIP yang dipautkan dalam satu post forum, kerana ZIP itu beku pada versi yang terkini pada hari halaman itu ditulis β€” dan itulah caranya orang berakhir menjalankan code 2.x melawan dokumentasi 4.x. Mencari perkataan itu juga akan memaparkan IRremoteESP8266, iaitu library berlainan dengan API berlainan yang ditulis untuk board ESP, jadi pastikan entri yang anda pasang ialah IRremote biasa.

Kenapa code remote IR Arduino saya tidak berfungsi lagi?

Library IRremote menulis semula API penerimaannya pada versi 3 dan mengekalkan bentuk itu sepanjang 4.x, jadi sketch yang disalin dari blog era 2.x dan muat turun Library Manager hari ini ialah dua perbendaharaan kata yang berbeza. Dalam 2.x anda mencipta objek penerima anda sendiri dan menghantar satu struct hasil ke dalam decode(). Dari 3.x ke atas hanya ada satu IrReceiver global, decode() tidak mengambil argumen, dan frame itu mendarat dalam IrReceiver.decodedIRData.

Apa yang sketch buat IRremote 2.x IRremote 4.x
Fail header #include <IRremote.h> #include <IRremote.hpp>
Cipta objek penerima IRrecv irrecv(2); Tiada β€” IrReceiver sudah sedia wujud
Simpan hasilnya decode_results results; Tiada β€” guna IrReceiver.decodedIRData
Mula menerima irrecv.enableIRIn(); IrReceiver.begin(2, ENABLE_LED_FEEDBACK);
Uji sama ada ada frame if (irrecv.decode(&results)) if (IrReceiver.decode())
Baca butangnya results.value (32 bit, MSB dahulu) IrReceiver.decodedIRData.command
Kesan butang yang ditahan results.value == 0xFFFFFFFF flags & IRDATA_FLAGS_IS_REPEAT
Tunggu frame seterusnya irrecv.resume(); IrReceiver.resume();

Apa yang anda nampak bergantung pada header mana yang dikekalkan oleh sketch lama itu, dan kedua-dua simptomnya tidak mengaku bahawa ia masalah versi. Biarkan #include <IRremote.h> di tempatnya dan 4.x tetap compile, kerana library itu membawa satu stub keserasian ke belakang untuk kes ini juga. Stub itu mengeluarkan tujuh amaran compiler dan mengisi hanya tiga medan β€” value, bits dan decode_type. Ia juga mencetak notis naik taraf lapan belas baris terus ke dalam Serial Monitor anda, di tempat anda menjangkakan satu code hex, dan ia berbuat begitu pada panggilan pertama kepada decode(), sebelum anda sempat menekan sebarang butang. Tukar pula include itu kepada #include <IRremote.hpp> sambil membiarkan code 2.x tidak disentuh, dan compiler akan berpuas hati tetapi linker tidak: undefined reference to 'IRrecv::decode(decode_results*)', kerana decode() yang mengambil argumen itu tiada badan fungsi di luar stub tersebut.

Dua penyelesaian yang jujur. Migrasikan sketch itu menggunakan jadual di atas β€” satu-satunya jalan yang turut memberi anda nama protokol, alamat dan flag ulangan. Atau kekalkan library lama itu dengan sengaja: dalam Library Manager pilih IRremote, buka dropdown versi dan pasang 2.6.0, iaitu versi yang ditunjuk oleh mesejnya sendiri. Itu sesuai untuk projek yang anda lebih rela tidak diusik, tetapi ia pilihan lalai yang lemah, kerana segala yang anda baca selepas ini ditulis untuk 4.x. Kalau anda lebih suka menonton proses tulis semula itu daripada membacanya, walkthrough ini memigrasikan sketch 2.x baris demi baris β€” perubahan yang sama yang masih dijangka oleh 4.x:

Bagaimana hendak cari code butang remote anda sendiri?

Penerima HX1838 menyelesaikan bahagian susahnya sebelum sketch anda nampak apa-apa. Pemancar pada remote mengerdipkan pembawa 38 kHz; modul berperisai itu menguatkan frekuensi itu sahaja, membuang pembawanya, dan meletakkan aras logik yang bersih pada pin S β€” rendah selagi pembawa itu hadir. Penapisan sempit itulah yang menghalang cahaya siang daripada didaftarkan sebagai tekanan butang.

Yang menumpang di atas pembawa itu ialah protokol NEC, yang digunakan oleh hampir setiap remote kit jenis ini. Satu tekanan bermula dengan denyutan 9 ms dan jeda 4.5 ms, kemudian menghantar 32 bit, setiap satunya denyutan 560 Β΅s diikuti jeda 560 Β΅s untuk sifar atau 1690 Β΅s untuk satu. Ke-32 bit itu ialah empat bait: satu alamat, alamat itu disongsangkan, arahan, dan arahan itu disongsangkan. Salinan songsang itu ialah bait semakan protokol itu sendiri, sebab itulah frame yang berjaya didecode sama ada betul atau tiada langsung, bukannya salah secara senyap. IRremote menggunakan semakan itu untuk membezakan variannya sekali: apabila satu arahan dan songsangannya tidak sepadan, ia melaporkan frame itu sebagai Onkyo dengan arahan 16-bit, jadi nama protokol selain NEC bukanlah satu kerosakan.

Rajah masa kartun membandingkan satu frame tekanan inframerah penuh yang bermula dengan denyutan header panjang diikuti deretan bit data yang halus, dengan satu frame ulangan yang jauh lebih pendek yang hanya membawa header dan satu mark tunggal, dengan remote hitam di satu hujung dan modul penerima hitam bertutup perisai perak di hujung satu lagi
Satu tekanan (atas): header panjang, kemudian bit datanya, setiap satu dikodkan oleh lebar jeda selepasnya. Butang yang ditahan (bawah): header yang sama, jeda lebih pendek, satu mark, tiada data β€” diulang pada selang tetap.

Jadual hex yang disalin dari halaman lain tidak akan sepadan dengan remote anda, dan mungkin tidak sepadan dengan cetakan anda sendiri yang terdahulu juga. Dua perkara berbeza. Model remote membawa alamat dan arahan yang berlainan. Tetapi tekanan yang sama juga tercetak berlainan antara versi library, kerana 2.x melaporkan keseluruhan perkataan 32-bit itu MSB dahulu sebagai satu nombor manakala 4.x melaporkan alamat dan arahan secara berasingan, LSB dahulu. Ambil nilai 2.x 0x00FFA25D: baitnya ialah 0x00, 0xFF, 0xA2, 0x5D β€” alamat, alamat songsang, arahan 0xA2, arahan songsang 0x5D. Songsangkan bit 0xA2 (1010 0010) dan anda dapat 0100 0101, iaitu 0x45 β€” tepat seperti yang dicetak 4.x untuk tekanan yang sama. Satu butang, tiga nombor beredar. Cetak jadual anda sendiri.

Menahan butang tidak menghantar semula frame penuh. Remote itu menghantar satu ulangan pendek sebaliknya β€” denyutan 9 ms yang sama, jeda lebih pendek 2.25 ms, satu mark penutup 560 Β΅s, tiada data β€” setiap 110 ms sehingga anda lepaskan. Versi 2.x memaparkan itu sebagai nilai sentinel 0xFFFFFFFF, iaitu asal usul setiap baris if (results.value == 0xFFFFFFFF) yang pernah anda lihat. Versi 4.x pula menetapkan IRDATA_FLAGS_IS_REPEAT dalam decodedIRData.flags dan menyalin masuk alamat serta arahan sebelumnya, jadi arahan itu kekal boleh dibaca dan pilihan terletak pada anda: abaikan ulangan untuk satu toggle, atau bertindak atasnya untuk tahan-untuk-malapkan.

Medan dalam decodedIRData Apa yang disimpannya Apa yang anda buat dengannya
protocol NEC, SONY, RC5… atau UNKNOWN UNKNOWN biasanya bermakna isyarat lemah atau terhalang sebahagian
address Remote mana yang menghantarnya Tetap untuk setiap butang pada satu remote β€” abaikan sahaja, atau gunakannya untuk menolak remote TV jiran
command Butang mana yang ditekan Inilah nombor yang dibandingkan oleh switch anda
flags Medan bit, termasuk IRDATA_FLAGS_IS_REPEAT Uji ia untuk membezakan satu tekanan daripada butang yang ditahan

Bagaimana cara wayar penerima IR, LED dan relay?

Modul penerima HX1838 membawa nama pinnya dalam silkscreen putih: S pada satu tepi, βˆ’ pada tepi bertentangan, dan VCC yang tidak bertanda di antaranya. Susunannya S, VCC, GND, jadi bekalan duduk di tengah β€” modul yang dicucuk terbalik akan meletakkan 5 V di tempat sepatutnya ground.

Bahagian kawalan modul 1WRELAY bukan header pin; ia satu terminal skru biru tiga hala bertanda IN, DCβˆ’ dan DC+. Satu optocoupler berdiri antara terminal itu dengan gegelung, dan itu mengubah apa yang sebenarnya dibuat oleh pin Arduino anda: ia tidak memacu gegelung relay. Ia menyalakan sebiji LED kecil di dalam cip optocoupler hitam itu, satu fototransistor yang mengadap LED tersebut menghidupkan satu transistor, dan transistor itu pula membenarkan rel 5 V menolak arus melalui gegelung. Gegelung Songle SRD-05VDC-SL-C dispesifikasikan pada kira-kira 70 Ξ©, jadi 5 V menolak lebih kurang 70 mA menerusinya β€” beberapa kali ganda daripada apa yang anda mahu keluar dari satu pin GPIO, dan itulah sebabnya DC+ mesti disambung ke 5 V dan bukan dibiarkan kosong.

Apa yang dipisahkan oleh optocoupler ialah pin itu daripada arus gegelung, bukan satu bekalan daripada satu bekalan lain: DC+ di sini ialah 5 V Uno itu sendiri. Itu tetap ada gunanya, kerana satu relay bersama dua LED yang menyala menjumlah lebih kurang 100 mA, dan kuasa USB menanggungnya tanpa merungut β€” board relay berbilang saluran, dengan beberapa gegelung menarik serentak, barulah bekalan 5 V berasingan mula penting. Kalau projek anda sudah pun menjalankan rel 12 V, keluarga board yang sama ada versi gegelung 12 V.

Keratan rentas kartun modul relay merah menunjukkan gelung input teal menyalakan LED oren di dalam cip optocoupler hitam, cahayanya merentasi satu ruang udara ke fototransistor yang menghidupkan gelung navy berasingan yang membekalkan kuasa kepada gegelung relay biru, dengan cap jumper kuning pada header tiga pin
Pin Arduino menyalakan sebiji LED kecil di dalam optocoupler. Arus gegelung pula datang dari rel 5 V di sebelah sana ruang udara itu.

Header tiga pin berhampiran tepi bawah board, dengan cap shunt yang merentasi dua daripada tiga pin itu, memilih polariti pencetus, dan ia berbuat begitu dengan mengalihkan satu hujung LED optocoupler yang sama tadi. Pada H, hujung jauh LED itu diikat ke DCβˆ’, jadi pin anda melengkapkan gelung dengan menjadi HIGH dan membekalkan beberapa miliampere ke dalamnya. Pada L pula, hujung jauh itu diikat ke DC+, jadi LED yang sama menyala apabila pin anda menjadi LOW dan menyedut arus itu. Gegelung dan kontaknya langsung tidak berubah β€” hanya aras pin mana yang menutup litar, dan itulah sebabnya relay yang berkelakuan terbalik ialah kedudukan jumper dan bukan pepijat dalam sketch anda. Sketch di bawah menganggap H.

Di sebelah sana board pula, kontaknya ialah suis mekanikal telanjang: COM dan NO tidak membawa kuasa sendiri, jadi beban mesti membawa bekalannya sendiri masuk ke dalam gelung β€” positif bekalan ke COM, NO keluar ke beban, beban pulang semula ke negatif bekalan itu. NC ialah suis yang sama tetapi songsang, tertutup sehingga relay menarik masuk. Kekalkan gelung itu pada DC voltan rendah di sini, dan panduan keselamatan modul relay kami menerangkan apa yang berubah apabila kuasa mains terlibat.

Mulakan pemasangan dengan relnya dahulu, bukan dengan komponennya. Uno menawarkan satu soket 5 V dan tiga soket GND, sedangkan binaan ini mahukan 5 V di dua tempat (penerima dan DC+ relay) dan laluan pulang ground di empat tempat (penerima, kedua-dua katod LED, dan DCβˆ’). Jadi jalankan satu jumper male-to-male dari 5V Uno ke jalur merah di tepi breadboard dan satu lagi dari GND ke jalur biru, kemudian suap semuanya dari dua rel itu. Setiap lubang di sepanjang satu rel ialah nod yang sama, jadi rel itu menjadi simpang yang tidak mampu disediakan oleh header Uno.

Dari Ke Kenapa
Uno 5V Breadboard rel merah Satu soket 5 V pada Uno, dua benda perlu disuap daripadanya
Uno GND Breadboard rel biru Tiga soket GND pada Uno, empat laluan pulang perlu dibawa balik
Penerima S Uno D2 Isyarat yang sudah didemodulat β€” mana-mana pin digital boleh
Pin tengah penerima Breadboard rel merah Bekalan. Ia duduk antara S dan βˆ’, jadi baca silkscreen dahulu
Penerima βˆ’ Breadboard rel biru Rujukan ground
Uno D4 β†’ 220 Ξ© β†’ kaki panjang LED merah Kaki pendek LED β†’ rel biru Kaki panjang ialah anod; β‰ˆ14 mA melalui perintang
Uno D5 β†’ 220 Ξ© β†’ kaki panjang LED hijau Kaki pendek LED β†’ rel biru Susunan yang sama, warna kedua
Uno D7 Terminal skru IN relay Memacu LED optocoupler sahaja
Breadboard rel merah Terminal skru DC+ relay Membekalkan arus gegelung ~70 mA
Breadboard rel biru Terminal skru DCβˆ’ relay Laluan pulang untuk gegelung
Bekalan beban sendiri β†’ COM, beban β†’ NO DC voltan rendah sahaja Terbuka sehingga relay menarik masuk; kontaknya sendiri tidak membawa kuasa

Macam mana rupa code remote IR Arduino yang lengkap?

Sketch remote IR Arduino ini membuat kedua-dua kerja sekali gus, jadi tiada upload pertama yang terbuang: setiap frame yang didecode mencetak protokol, alamat dan arahannya, dan tiga arahan disambungkan kepada tindakan. Upload, buka Serial Monitor pada 9600 baud, tekan butang anda, salin nilai yang tercetak ke dalam tiga pemalar di bahagian atas, kemudian upload sekali lagi.

// Kawalan remote IR dengan Arduino: decode butang anda sendiri, kemudian gunakannya.
// Penerima HX1838 + remote 17 kekunci, dua LED dan satu modul relay 1-saluran.
// Ditulis untuk IRremote 4.x (IrReceiver / decodedIRData). Sketch 2.x yang lama
// menggunakan IRrecv + decode_results dan TIDAK akan berkelakuan sama - lihat di atas.

#include <IRremote.hpp>   // perhatikan .hpp - inilah header 4.x

// ---- Pin ----
// Mana-mana pin digital boleh untuk penerima: pada Uno, library mengambil sampel
// pin itu dari interrupt Timer2, bukan dari pin external-interrupt.
const uint8_t IR_RECEIVE_PIN = 2;
const uint8_t LED_RED_PIN    = 4;
const uint8_t LED_GREEN_PIN  = 5;
const uint8_t RELAY_IN_PIN   = 7;   // jumper relay pada H = HIGH menghidupkannya

// ---- Nombor remote ANDA ----
// Jalankan sketch ini sekali, perhatikan Serial Monitor, tekan tiga butang yang
// anda mahu, dan salin nilai "Command" yang tercetak untuknya ke tiga baris ini.
// Nilai di bawah cuma placeholder - jangan andaikan ia sepadan dengan kit anda.
const uint16_t CMD_RED   = 0x45;
const uint16_t CMD_GREEN = 0x46;
const uint16_t CMD_RELAY = 0x40;

bool relayOn = false;

void setup() {
  pinMode(LED_RED_PIN, OUTPUT);
  pinMode(LED_GREEN_PIN, OUTPUT);
  pinMode(RELAY_IN_PIN, OUTPUT);
  digitalWrite(RELAY_IN_PIN, LOW);      // mulakan dengan relay dilepaskan

  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  Serial.println(F("Ready. Point the remote at the receiver and press a button."));
}

void loop() {
  // decode() adalah false sehingga satu frame penuh tiba dan berjaya difahami.
  if (!IrReceiver.decode()) {
    return;
  }

  // Semua yang dibawa oleh frame itu tersimpan dalam satu struct ini sahaja.
  const uint16_t command  = IrReceiver.decodedIRData.command;
  const uint16_t address  = IrReceiver.decodedIRData.address;
  const uint8_t  flags    = IrReceiver.decodedIRData.flags;
  const bool     isRepeat = (flags & IRDATA_FLAGS_IS_REPEAT) != 0;

  // Serahkan penerima kembali serta-merta supaya frame seterusnya tidak terlepas
  // sementara kita masih sibuk mencetak.
  IrReceiver.resume();

  if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
    // Bukan protokol yang dikenali build ini: biasanya isyarat lemah, cahaya
    // matahari, atau remote yang guna protokol yang telah dimatikan.
    Serial.println(F("Unknown frame - move closer and try again."));
    return;
  }

  // Inilah jadual butang anda. Catat apa yang dicetak oleh setiap butang.
  Serial.print(F("Protocol: "));
  Serial.print(IrReceiver.getProtocolString());
  Serial.print(F("  Address: 0x"));
  Serial.print(address, HEX);
  Serial.print(F("  Command: 0x"));
  Serial.print(command, HEX);
  if (isRepeat) {
    Serial.print(F("  (repeat - button still held)"));
  }
  Serial.println();

  // Butang yang ditahan menghantar frame ulangan pendek lebih kurang setiap 110 ms.
  // Mengabaikan ulangan menukar "ditahan" jadi satu tekanan - itu yang toggle mahu.
  if (isRepeat) {
    return;
  }

  switch (command) {
    case CMD_RED:
      digitalWrite(LED_RED_PIN, !digitalRead(LED_RED_PIN));
      break;
    case CMD_GREEN:
      digitalWrite(LED_GREEN_PIN, !digitalRead(LED_GREEN_PIN));
      break;
    case CMD_RELAY:
      relayOn = !relayOn;
      digitalWrite(RELAY_IN_PIN, relayOn ? HIGH : LOW);
      Serial.println(relayOn ? F("Relay ON") : F("Relay OFF"));
      break;
    default:
      // Mana-mana butang lain: didecode dan dicetak, tetapi belum diwayarkan ke apa-apa.
      break;
  }
}

Seperti yang tertulis, ia compile kepada 9,408 bait, iaitu 29% daripada flash Uno, kerana IRremote menghidupkan setiap decoder protokol yang dimilikinya. Sebaik Serial Monitor mengesahkan protokolnya NEC, tambah #define DECODE_NEC di atas include itu dan sketch yang sama jatuh kepada 4,614 bait, iaitu 14% β€” hampir 5 kB kembali hanya kerana satu baris.

Kartun breadboard putih memegang modul penerima inframerah hitam bertutup perisai perak, satu LED merah yang menyala dan satu LED hijau yang padam bersama perintang biru, diwayarkan dengan jumper teal ke papan relay merah dan ke bucu papan Arduino biru gelap yang terpotong, dengan remote hitam matte terletak di hadapan
Binaan siap di atas meja: penerima dan kedua-dua LED di atas breadboard, relay diwayarkan ke terminal skru, remote di tangan.

Kesilapan biasa yang kami lihat daripada pelanggan sebenar

Serial Monitor dipenuhi perenggan bahasa Inggeris, bukan satu code. Sketch dan wiring tiada masalah; itu stub keserasian 2.x memperkenalkan dirinya pada kali pertama sketch memanggil decode(), yang berlaku sebelum anda menekan apa-apa. Tukar headernya.

Langsung tiada apa-apa berlaku, dari mana-mana butang. Tarik dulang bateri keluar dahulu: remote dihantar dengan sekeping plastik jernih yang mengasingkan selnya semasa penghantaran, dan benda itu memang kena dicabut. Kemudian biar board itu membelah masalahnya untuk anda. ENABLE_LED_FEEDBACK dalam IrReceiver.begin() membuatkan library mengerdipkan LED terbina pin-13 pada Uno setiap kali ada isyarat inframerah masuk. Jadi kalau LED itu berkerdip semasa anda menekan, bermakna remote, penerima dan wiring semuanya berfungsi dan masalahnya terletak di hilir β€” pada decoding atau pada switch anda; kalau ia kekal gelap, tiada apa-apa yang sampai ke pin itu langsung β€” periksa pin tengah penerima benar-benar berada pada 5 V dan kanta kubahnya mengadap anda, bukan mengadap breadboard.

IR berjalan elok, kemudian terhenti selepas saya tambah buzzer atau motor. Pada Uno, penerima IRremote mengambil sampel pinnya dari Timer2 β€” timer yang sama diambil alih oleh tone(), dan timer yang sama juga di sebalik PWM pada pin 3 dan 11. Jadi tone() membunuh penerimaan secara senyap sehingga IrReceiver.restartTimer() dipanggil selepasnya, dan analogWrite() pada pin 3 atau 11 berbuat perkara yang sama. Alihkan beban PWM ke pin 5, 6, 9 atau 10.

Butang didaftarkan dua kali, atau satu menu melompat dua langkah. Frame ulangan sedang dibaca sebagai tekanan baharu. Butang yang ditahan walaupun cuma satu per lima saat sudah menghantar satu frame ditambah satu dua ulangan di belakangnya, berselang 110 ms, jadi uji IRDATA_FLAGS_IS_REPEAT dan keluar awal, seperti yang dibuat oleh sketch di atas. Menampalnya dengan delay(200) nampak macam menjadi, kemudian mula kehilangan tekanan yang tulen: library itu hanya memegang satu frame pada satu masa, jadi delay itu membiarkan ulangan basi mengambil slot tersebut sementara tekanan kedua yang sebenar tiba di belakangnya tanpa tempat untuk mendarat.

FAQ

Versi library IRremote yang mana patut saya pasang?

Pasang 4.x semasa dan tulislah code 4.x. Pilih 2.6.0 hanya untuk mengekalkan projek lama supaya terus hidup β€” mesej library itu sendiri menyebut versi tersebut, dan dropdown versi dalam Library Manager akan memasangnya.

Kenapa sketch saya keluar “undefined reference to IRrecv::decode(decode_results*)”?

Anda ada code 2.x yang meng-include header 4.x. IRremote.hpp tiada decode() yang mengambil argumen; ia wujud hanya dalam stub IRremote.h yang lama. Migrasi kepada IrReceiver dan decodedIRData, atau pasang 2.6.0.

Kenapa code hex yang saya jumpa di internet tidak sepadan dengan remote saya?

Dua sebab bertindan. Model remote memang berbeza, dan versi library mencetak tekanan yang sama secara berbeza β€” 2.x menunjukkan perkataan 32-bit penuh MSB dahulu, 4.x menunjukkan arahan 8-bit LSB dahulu. Cetak jadual anda sendiri.

Boleh ke kit HX1838 ini menghantar isyarat IR juga?

Boleh. LED 5 mm jernih-air dalam bungkusan itu ialah pemancar, dan library yang sama menghantar dengan IrSender.sendNEC(). Pacu ia melalui satu perintang dan anda boleh mainkan semula code yang telah didecode β€” asas kepada sebuah remote universal, dan sepupu kepada pensuisan suara dan Bluetooth.

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 *