Perpustakaan yang memungkinkan pengiriman & penerimaan sinyal infra-merah.
Tersedia sebagai perpustakaan Arduino "IRremote".
? Google Terjemahan
Protokol IR yang Didukung
Fitur
Fitur baru dengan versi 4.x
Fitur baru dengan versi 3.x
Mengonversi program 2.x Anda ke versi 4.x
Bagaimana mengkonversi kode data IR 32 bit pertama MSB yang lama ke kode data IR 32 bit pertama LSB yang baru
Kesalahan saat menggunakan versi 3.x untuk tutorial lama
Tetap di 2.x
Mengapa *.hpp bukannya *.cpp
Menggunakan file *.hpp baru
Tutorial
3 cara untuk menentukan kode IR
Pinout IRReceiver
Menerima kode IR
Penafian
Perpustakaan lain, yang mungkin mencakup protokol ini
Protokol=PULSE_DISTANCE
Protokol=TIDAK DIKETAHUI
Cara mengatasi protokol yang tidak didukung oleh IRremote
struktur IRData yang didekodekan
Protokol yang ambigu
Penggunaan RAM dari protokol yang berbedal
Menangani Protokol yang tidak diketahui
Mengirim kode IR
Daftar database kode IR publik
Mengirim kode IRDB IR
Kirim pin
Penerima dan pengirim NEC kecil
Protokol CEPAT
FAQ dan petunjuk
Menerima penghentian setelah analogWrite() atau tone() atau setelah menjalankan motor
Menerima set bendera luapan
Masalah dengan Neopiksel, FastLed, dll.
Tidak berfungsi/dikompilasi dengan perpustakaan lain
Beberapa penerima IR dan contoh pengirim
Meningkatkan kekuatan sinyal keluaran yang dikirim
Frekuensi jam CPU minimal
Protokol Bang & Olufsen
Contoh untuk perpustakaan ini
Contoh online WOKWI
Kontrol IR pada mobil robot
Masalah dan diskusi
Kompilasi opsi/makro untuk perpustakaan ini
Mengubah file include (*.h) dengan Arduino IDE
Memodifikasi opsi kompilasi dengan Sloeber IDE
Dewan yang Didukung
Penggunaan pengatur waktu dan pin
Ketidakcocokan dengan perpustakaan lain dan perintah Arduino seperti tone() dan analogWrite()
Pembuatan sinyal perangkat keras-PWM untuk pengiriman
Mengapa kami menggunakan siklus tugas 30% untuk pengiriman
Bagaimana kita memecahkan kode sinyal
Diagram pengkodean NEC
Perbandingan cepat dari 5 perpustakaan penerima Arduino IR
Sejarah
Tautan yang bermanfaat
Kontributor
Lisensi
Hak cipta
NEC / Onkyo / Apple
Denon / Sharp
Panasonic / Kaseikyo
JVC
LG
RC5
RC6
Samsung
Sony
Universal Pulse Distance
Universal Pulse Width
Universal Pulse Distance Width
Hash
Pronto
BoseWave
Bang & Olufsen
Lego
FAST
Whynter
MagiQuest
Protokol dapat dimatikan dan dihidupkan dengan mendefinisikan makro sebelum baris #include <IRremote.hpp>
seperti di sini:
#define DECODE_NEC//#define DECODE_DENON#sertakan <IRremote.hpp>
Banyak tutorial dan contoh.
Dipelihara secara aktif.
Memungkinkan penerimaan dan pengiriman data waktu mentah .
Karena 4.3 IrSender.begin(DISABLE_LED_FEEDBACK)
tidak lagi berfungsi , gunakan IrSender.begin(DISABLE_LED_FEEDBACK, 0)
sebagai gantinya.
Dekoder Jarak Pulsa / Lebar Pulsa / Lebar Jarak Pulsa universal baru ditambahkan, yang mencakup banyak protokol yang sebelumnya tidak diketahui.
Cetakan kode cara mengirim perintah yang diterima oleh IrReceiver.printIRSendUsage(&Serial)
.
Tipe RawData sekarang 64 bit untuk platform 32 bit dan oleh karena itu decodedIRData.decodedRawData
dapat berisi informasi bingkai lengkap untuk lebih banyak protokol dibandingkan dengan 32 bit seperti sebelumnya.
Panggilan balik setelah menerima perintah - Ini memanggil kode Anda segera setelah pesan diterima.
Peningkatan penanganan protokol PULSE_DISTANCE
+ PULSE_WIDTH
.
Protokol CEPAT baru.
Cetakan otomatis dari fungsi kirim yang sesuai dengan printIRSendUsage()
.
Anda harus mengganti #define DECODE_DISTANCE
dengan #define DECODE_DISTANCE_WIDTH
(hanya jika Anda mengaktifkan decoder ini secara eksplisit).
Parameter bool hasStopBit
tidak lagi diperlukan dan dihapus misalnya untuk fungsi sendPulseDistanceWidth()
.
Pin apa pun dapat digunakan untuk menerima dan jika SEND_PWM_BY_TIMER
tidak ditentukan juga untuk mengirim.
LED Umpan Balik dapat diaktifkan untuk mengirim/menerima.
Nilai perintah 8/16 bit ** serta alamat 16 bit dan nomor protokol disediakan untuk decoding (bukan nilai 32 bit yang lama).
Nilai protokol mematuhi standar protokol .
NEC, Panasonic, Sony, Samsung dan JVC mendekode & mengirim LSB terlebih dahulu.
Mendukung protokol Jarak Universal , yang mencakup banyak protokol yang sebelumnya tidak diketahui.
Kompatibel dengan perpustakaan tone() . Lihat contoh TerimaDemo.
Pengiriman dan penerimaan secara bersamaan. Lihat contoh SendAndReceive.
Mendukung lebih banyak platform .
Memungkinkan pembuatan sinyal non-PWM untuk hanya mensimulasikan sinyal penerima rendah yang aktif untuk koneksi langsung ke perangkat penerima yang ada tanpa menggunakan IR.
Konfigurasi protokol yang mudah, langsung di kode sumber Anda .
Mengurangi jejak memori dan mengurangi waktu decoding.
Berisi dekoder khusus NEC yang sangat kecil, yang tidak memerlukan sumber daya pengatur waktu apa pun .
-> Perbandingan fitur 5 perpustakaan Arduino IR.
Dimulai dengan versi 3.1, pembangkitan PWM untuk pengiriman dilakukan oleh perangkat lunak , sehingga menghemat pengatur waktu perangkat keras dan memungkinkan pin keluaran sewenang-wenang untuk pengiriman .
Jika Anda menggunakan inti Arduino (lama) yang tidak menggunakan flag -flto
untuk kompilasi, Anda dapat mengaktifkan baris #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
di IRRemote.h, jika Anda mendapatkan pesan kesalahan palsu mengenai start() selama kompilasi.
Objek IRreceiver dan IRsender telah ditambahkan dan dapat digunakan tanpa mendefinisikannya, seperti objek Arduino Serial yang terkenal.
Hapus saja baris IRrecv IrReceiver(IR_RECEIVE_PIN);
dan/atau IRsend IrSender;
di program Anda, dan ganti semua kemunculan IRrecv.
atau irrecv.
dengan IrReceiver
dan ganti semua IRsend
atau irsend
dengan IrSender
.
Karena nilai yang didekodekan sekarang ada di IrReceiver.decodedIRData
dan tidak lagi ada di results
, hapus baris decode_results results
atau yang serupa.
Seperti untuk objek Serial, panggil IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)
atau IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)
alih-alih IrReceiver.enableIRIn()
atau irrecv.enableIRIn()
di setup().
Untuk mengirim, hubungi IrSender.begin();
dalam pengaturan().
Jika IR_SEND_PIN tidak ditentukan (sebelum baris #include <IRremote.hpp>
) Anda harus menggunakan misalnya IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
Fungsi decode(decode_results *aResults)
lama digantikan oleh decode()
sederhana. Jadi jika Anda memiliki pernyataan if(irrecv.decode(&results))
ganti dengan if (IrReceiver.decode())
.
Hasil yang didekodekan sekarang ada di IrReceiver.decodedIRData
dan tidak ada lagi di results
, oleh karena itu ganti kemunculan results.value
dan results.decode_type
(dan serupa) dengan IrReceiver.decodedIRData.decodedRawData
dan IrReceiver.decodedIRData.protocol
.
Overflow, Repeat, dan flag lainnya kini ada di IrReceiver.receivedIRData.flags
.
Jarang digunakan: results.rawbuf
dan results.rawlen
harus diganti dengan IrReceiver.decodedIRData.rawDataPtr->rawbuf
dan IrReceiver.decodedIRData.rawDataPtr->rawlen
.
5 protokol NEC, Panasonic, Sony, Samsung dan JVC telah dikonversi ke LSB terlebih dahulu. Fungsi kirim untuk mengirim data MSB lama diubah namanya menjadi sendNECMSB
, sendSamsungMSB()
, sendSonyMSB()
dan sendJVCMSB()
. Fungsi MSB sendSAMSUNG()
dan sendSony()
yang lama masih tersedia. Fungsi sendPanasonic()
versi MSB yang lama telah dihapus, karena terdapat bug yang tidak dikenali oleh siapa pun dan oleh karena itu diasumsikan tidak pernah digunakan.
Untuk mengonversi kode MSB ke LSB lihat di bawah.
#termasuk <IRremote.h>#define RECV_PIN 2IRrecv irrecv(RECV_PIN); hasil decode_results; batalkan pengaturan() { ... Serial.begin(115200); // Membangun komunikasi serial irrecv.enableIRIn(); // Mulai penerima}void loop() { if (irrecv.decode(&results)) { Serial.println(hasil.nilai, HEX); ... irrecv.resume(); // Terima nilai selanjutnya } ... }
#termasuk <IRremote.hpp>#define IR_RECEIVE_PIN 2batalkan pengaturan() { ... Serial.begin(115200); // // Membangun komunikasi serial IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Mulai penerima}void loop() { if (IrReceiver.decode()) { Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // Cetak data mentah "lama". IrReceiver.printIRResultShort(&Serial); // Cetak data lengkap yang diterima dalam satu baris IrReceiver.printIRSendUsage(&Serial); // Cetak pernyataan yang diperlukan untuk mengirim data ini ... IrReceiver.resume(); // Aktifkan penerimaan nilai berikutnya } ... }
Untuk dekoder baru untuk NEC, Panasonic, Sony, Samsung dan JVC , hasilnya IrReceiver.decodedIRData.decodedRawData
kini menjadi LSB-first , seperti yang disarankan oleh definisi protokol ini!
Untuk mengkonversi satu ke yang lain, Anda harus membalikkan posisi byte/nibble dan kemudian membalikkan semua posisi bit setiap byte/nibble atau menulisnya sebagai satu string biner dan membalikkan/mencerminkannya.
Contoh: 0xCB 34 01 02
0x20 10 43 BC
setelah menggigit terbalik
0x40 80 2C D3
setelah sedikit kebalikan dari setiap gigitan
0->0 1->8 2->4 3->C 4->2 5->A 6->6 7->E 8->1 9->9 A->5 B->D C->3 D->B E->7 F->F
0xCB340102
adalah biner 1100 1011 0011 0100 0000 0001 0000 0010
.
0x40802CD3
adalah biner 0100 0000 1000 0000 0010 1100 1101 0011
.
Jika Anda membaca barisan biner pertama secara terbalik (kanan ke kiri), Anda mendapatkan barisan kedua. Anda dapat menggunakan bitreverseOneByte()
atau bitreverse32Bit()
untuk ini.
Mengirim kode MSB lama tanpa konversi dapat dilakukan dengan menggunakan sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
.
Jika Anda mengalami kesalahan dengan kode tutorial lama termasuk IRremote.h
alih-alih IRremote.hpp
, coba kembalikan ke Versi 2.4.0.
Kemungkinan besar kode Anda akan berjalan dan Anda tidak akan melewatkan fitur-fitur baru.
Pertimbangkan untuk menggunakan versi rilis 2.4 asli tahun 2017 atau versi 2.8 terakhir yang kompatibel untuk proyek Anda.
Ini mungkin cukup dan menangani kode IR 32 bit dengan sempurna.
Jika ini tidak sesuai dengan kasus Anda, yakinlah bahwa 4.x setidaknya mencoba untuk kompatibel, sehingga contoh lama Anda masih berfungsi dengan baik.
Hanya dekoder berikut yang tersedia:
NEC
Denon
Panasonic
JVC
LG
RC5
RC6
Samsung
Sony
Panggilan irrecv.decode(&results)
menggunakan dekoder pertama MSB lama seperti di 2.x dan menyetel kode 32 bit di results.value
.
Tidak ada decoding ke alamat 8/16 bit yang lebih bermakna (konstan) dan perintah 8 bit.
Setiap file *.cpp dikompilasi secara terpisah melalui panggilan kompiler khusus untuk file cpp ini. Panggilan ini dikelola oleh sistem IDE/make. Di Arduino IDE, panggilan dijalankan ketika Anda mengklik Verifikasi atau Unggah .
Dan sekarang masalah kita dengan Arduino adalah:
Bagaimana cara mengatur opsi kompilasi untuk semua file *.cpp, terutama untuk perpustakaan yang digunakan?
IDE seperti Sloeber atau PlatformIO mendukung hal ini dengan memungkinkan untuk menentukan serangkaian opsi per proyek. Mereka menambahkan opsi ini pada setiap panggilan kompiler misalnya -DTRACE
.
Namun Arduino tidak memiliki fitur ini. Jadi solusinya bukan dengan mengkompilasi semua sumber secara terpisah, namun menggabungkannya menjadi satu file sumber besar dengan memasukkannya ke dalam sumber Anda.
Hal ini dilakukan misalnya dengan #include "IRremote.hpp"
.
Tapi kenapa tidak #include "IRremote.cpp"
?
Cobalah dan Anda akan melihat banyak kesalahan, karena setiap fungsi file *.cpp sekarang dikompilasi dua kali, pertama dengan mengkompilasi file besar dan kedua dengan mengkompilasi file *.cpp secara terpisah, seperti dijelaskan di atas.
Jadi menggunakan ekstensi cpp tidak lagi memungkinkan, dan salah satu solusinya adalah menggunakan hpp sebagai ekstensi, untuk menunjukkan bahwa itu adalah file *.cpp yang disertakan.
Setiap ekstensi lain misalnya cinclude bisa digunakan, tetapi hpp tampaknya masuk akal.
Untuk mendukung opsi kompilasi dengan lebih mudah, Anda harus menggunakan pernyataan #include <IRremote.hpp>
daripada #include <IRremote.h>
di program utama Anda (alias file *.ino dengan setup() dan loop()).
Di semua file lain Anda harus menggunakan yang berikut ini, untuk mencegah kesalahan linker multiple definitions
:
#tentukan USE_IRREMOTE_HPP_AS_PLAIN_INCLUDE#sertakan <IRremote.hpp>
Pastikan semua makro di program utama Anda ditentukan sebelum #include <IRremote.hpp>
.
Makro berikut pasti akan ditimpa dengan nilai default jika tidak:
RAW_BUFFER_LENGTH
IR_SEND_PIN
SEND_PWM_BY_TIMER
Pengenalan yang sangat rinci tentang remote IR dan perpustakaan IRremote dari DroneBot Workshop.
Ada 3 cara berbeda untuk menentukan kode IR tertentu.
Waktu setiap tanda/denyut dan spasi/jarak_antara_pulsa ditentukan dalam daftar atau larik. Hal ini memungkinkan penentuan semua kode IR , namun memerlukan banyak memori dan tidak dapat dibaca sama sekali . Salah satu definisi formal dari susunan waktu tersebut, termasuk spesifikasi frekuensi dan pengulangan adalah format Pronto .
Memori dapat dihemat dengan menggunakan resolusi waktu yang lebih rendah. Untuk IRremote Anda dapat menggunakan resolusi 50 µs yang membagi dua kebutuhan memori dengan menggunakan nilai byte, bukan nilai int16. Untuk tujuan penerimaan, Anda dapat menggunakan hash waktu yang disediakan oleh decoder decodeHash()
.
Ada 3 skema pengkodean utama yang mengkodekan nilai bitstream/hex biner:
PULSE_DISTANCE
. Jarak antar pulsa menentukan nilai bit. Ini selalu membutuhkan sedikit perhentian! Contohnya adalah protokol NEC dan KASEIKYO. Lebar pulsa konstan untuk sebagian besar protokol.
PULSE_WIDTH
. Lebar pulsa menentukan nilai bit, jarak pulsa konstan. Ini tidak perlu berhenti sedikit pun! Satu-satunya contoh yang diketahui adalah protokol SONY.
Pengkodean Fase / Manchester. Waktu transisi pulsa/jeda (fase) relatif terhadap jam menentukan nilai bit. Contohnya adalah protokol RC5 dan RC6.
Pengkodean fase memiliki panjang bit yang konstan , PULSE_DISTANCE
dengan lebar pulsa konstan dan PULSE_WIDTH
tidak memiliki panjang bit yang konstan !
Contoh terkenal untuk PULSE_DISTANCE
dengan pengkodean lebar pulsa tidak konstan adalah pengkodean serial RS232 . Di sini lebar pulsa tidak konstan digunakan untuk mengaktifkan panjang bit yang konstan .
Kebanyakan sinyal IR memiliki header khusus untuk membantu mengatur penguatan otomatis rangkaian penerima. Header ini bukan bagian dari pengkodean, namun sering kali penting untuk protokol khusus dan oleh karena itu harus dapat direproduksi.
Ketahuilah bahwa ada kode yang menggunakan pengkodean PULSE_DISTANCE
yang mana lebih dari biner 0/1 dimasukkan ke dalam kombinasi pulsa/jeda. Ini memerlukan lebih dari 2 kombinasi pulsa atau panjang jeda yang berbeda. Protokol HobToHood menggunakan pengkodean seperti itu.
Penggunaan skema pengkodean mengurangi spesifikasi kode IR menjadi nilai bitstream/hex, yaitu LSB secara default dan pengaturan waktu pulsa/jeda header, 0, dan 1. Nilai hex cukup mudah dibaca . Skema ini tidak dapat memasukkan semantik apa pun seperti alamat, perintah, atau checksum pada bitstream ini.
Ada beberapa protokol umum yang diterapkan langsung di IRremote. Mereka menentukan frekuensi, waktu header, 0, dan 1 serta nilai-nilai lain seperti checksum, jarak pengulangan, pengkodean ulang, pengalih bit, dll. Semantik nilai hex juga ditentukan, memungkinkan penggunaan hanya 2 alamat parameter dan perintah untuk menentukan kode IR. Ini menghemat memori dan sangat mudah dibaca . Seringkali alamatnya juga konstan, yang selanjutnya mengurangi kebutuhan memori.
Tutorial Sensor IR Adafruit
Dalam program Anda, Anda memeriksa bingkai IR yang diterima sepenuhnya dengan:
if (IrReceiver.decode()) {}
Ini juga menerjemahkan data yang diterima.
Setelah decoding berhasil, data IR terdapat dalam struktur IRData, tersedia sebagai IrReceiver.decodedIRData
.
struct IRData { protokol decode_type_t; // TIDAK DIKETAHUI, NEC, SONY, RC5, PULSE_DISTANCE, ... alamat uint16_t; // perintah alamat uint16_t yang didekodekan; // Perintah yang diterjemahkan uint16_t ekstra; // Digunakan untuk ID vendor Kaseikyo yang tidak diketahui. Kutu yang digunakan untuk mendekode protokol Jarak. uint16_t jumlahBits; // Jumlah bit yang diterima untuk data (alamat + perintah + paritas) - untuk menentukan panjang protokol jika panjang berbeda dimungkinkan. bendera uint8_t; // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW dll. Lihat definisi IRDATA_FLAGS_* IRRawDataType didekodekanRawData; // Hingga 32 (64 bit untuk arsitektur CPU 32 bit) bit data mentah yang didekodekan, digunakan untuk fungsi sendRaw. uint32_t didekodekanRawDataArray[RAW_DATA_ARRAY_SIZE]; // Data mentah 32 bit yang didekodekan, untuk digunakan pada fungsi pengiriman. irparams_struct *rawDataPtr; // Penunjuk data waktu mentah yang akan didekodekan. Terutama buffer data diisi dengan menerima ISR.};
Ini adalah daftar bendera yang terdapat dalam bidang bendera.
Periksa dengan misalnya if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
.
Nama bendera | Keterangan |
---|---|
IRDATA_FLAGS_IS_REPEAT | Kesenjangan antara frame sebelumnya lebih kecil dari kesenjangan maksimum yang diharapkan untuk pengulangan. !!!Kami tidak memeriksa perubahan perintah atau alamat, karena hampir tidak mungkin untuk menekan 2 tombol berbeda pada remote dalam waktu sekitar 100 ms!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | Frame pengulangan saat ini adalah pengulangan, yang selalu dikirim setelah frame biasa dan tidak dapat dihindari. Hanya ditentukan untuk protokol DENON, dan LEGO. |
IRDATA_FLAGS_PARITY_FAILED | Bingkai saat ini (pengulangan otomatis) melanggar pemeriksaan paritas. |
IRDATA_FLAGS_TOGGLE_BIT | Disetel jika bit pengalih RC5 atau RC6 disetel. |
IRDATA_FLAGS_EXTRA_INFO | Ada info tambahan yang tidak terdapat dalam alamat dan data (misalnya ID vendor Kaseikyo tidak diketahui, atau dalam decodeRawDataArray). |
IRDATA_FLAGS_WAS_OVERFLOW | Terlalu banyak tanda dan spasi untuk RAW_BUFFER_LENGTH yang ditentukan. Untuk menghindari penandaan overflow yang tak ada habisnya, irparams.rawlen disetel ke 0 dalam kasus ini. |
IRDATA_FLAGS_IS_MSB_FIRST | Nilai ini terutama ditentukan oleh protokol (yang diketahui). |
otomatis myRawdata= IrReceiver.decodedIRData.decodedRawData;
Definisi untuk IrReceiver.decodedIRData.flags
dijelaskan di sini.
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, benar);`
Data mentah bergantung pada keadaan internal pengatur waktu Arduino sehubungan dengan sinyal yang diterima dan oleh karena itu mungkin sedikit berbeda setiap saat. (masalah resolusi). Nilai-nilai yang diterjemahkan adalah nilai-nilai yang ditafsirkan dan toleran terhadap perbedaan-perbedaan kecil!
IrReceiver.printIRSendUsage(&Serial);
Protokol NEC didefinisikan sebagai alamat 8 bit dan perintah 8 bit. Namun alamat fisik dan bidang data masing-masing lebarnya 16 bit. 8 bit tambahan digunakan untuk mengirim alamat terbalik atau perintah untuk pemeriksaan paritas.
Protokol NEC yang diperluas menggunakan 8 bit alamat paritas tambahan untuk alamat 16 bit, sehingga menonaktifkan pemeriksaan paritas untuk alamat.
Protokol ONKYO pada gilirannya menggunakan tambahan 8 bit alamat dan perintah paritas untuk alamat dan perintah 16 bit.
Decoder mengurangi nilai 16 bit menjadi 8 bit jika paritasnya benar. Jika paritasnya tidak benar, maka diasumsikan tidak ada kesalahan paritas, namun mengambil nilai sebagai nilai 16 bit tanpa paritas dengan asumsi protokol NEC yang diperluas atau protokol NEC yang diperluas.
Namun sekarang kita mempunyai masalah ketika ingin menerima misal alamat 16 bit 0x00FF atau 0x32CD! Decoder menafsirkan ini sebagai alamat NEC 8 bit 0x00/0x32 dengan paritas yang benar yaitu 0xFF/0xCD dan menguranginya menjadi 0x00/0x32.
Salah satu cara untuk mengatasinya adalah dengan memaksa perpustakaan untuk selalu menggunakan interpretasi protokol ONKYO dengan menggunakan #define DECODE_ONKYO
. Cara lain adalah dengan memeriksa apakah IrReceiver.decodedIRData.protocol
adalah NEC dan bukan ONKYO dan mengembalikan pengurangan paritas secara manual.
Saat ditekan lama, protokol NEC tidak mengulangi frame-nya, ia mengirimkan frame pengulangan pendek khusus. Hal ini memungkinkan perbedaan yang mudah antara penekanan lama dan penekanan berulang serta menghemat sedikit energi baterai. Perilaku ini cukup unik untuk NEC dan protokol turunannya seperti LG dan Samsung.
Namun tentu saja ada juga sistem kendali jarak jauh, yang menggunakan protokol NEC namun hanya mengulang frame pertama saat ditekan lama, bukan mengirimkan frame pengulangan pendek khusus. Kami menamakannya protokol NEC2 dan dikirim dengan sendNEC2()
.
Namun hati-hati, protokol NEC2 hanya dapat dideteksi oleh decoder perpustakaan NEC setelah frame pertama dan jika Anda menekan lama!
Saat ditekan lama, protokol SamsungLG tidak mengulangi frame-nya, melainkan mengirimkan frame pengulangan pendek khusus.
RAW_BUFFER_LENGTH
menentukan panjang buffer byte tempat data waktu IR yang diterima disimpan sebelum dekode.
100 cukup untuk protokol standar hingga 48 bit , dengan 1 bit terdiri dari satu tanda dan spasi. Kami selalu membutuhkan tambahan 4 byte, 1 byte untuk celah awal, 2 byte untuk header dan 1 byte untuk bit stop.
Protokol 48 bit adalah PANASONIC, KASEIKYO, SAMSUNG48, RC6.
Protokol 32 bit seperti NEC, SAMSUNG, WHYNTER, SONY(20), LG(28) memerlukan panjang buffer 68 .
Protokol 16 bit seperti BOSEWAVE, DENON, FAST, JVC, LEGO_PF, RC5, SONY(12 atau 15) memerlukan panjang buffer 36 .
MAGIQUEST membutuhkan panjang buffer 112 .
AC sering kali mengirimkan aliran data protokol yang lebih panjang hingga 750 bit .
Jika celah rekaman yang ditentukan oleh RECORD_GAP_MICROS
diubah dari default 8 ms menjadi lebih dari 20 ms, buffer tidak lagi berupa byte melainkan buffer uint16_t, yang memerlukan RAM dua kali lebih banyak.
Perpustakaan ini dirancang agar sesuai dengan MCU dengan tingkat sumber daya yang relatif rendah dan dimaksudkan untuk berfungsi sebagai perpustakaan bersama dengan aplikasi lain yang juga memerlukan beberapa sumber daya MCU untuk beroperasi.
Gunakan contoh AcceptDemo untuk mencetak semua informasi tentang protokol IR Anda.
Contoh AcceptDump memberi Anda lebih banyak informasi tetapi memiliki deteksi pengulangan yang buruk karena waktu yang diperlukan untuk mencetak informasi tersebut.
Jika protokol Anda tampaknya tidak didukung oleh perpustakaan ini, Anda dapat mencoba perpustakaan IRMP, yang khususnya mendukung protokol manchester dengan lebih baik.
Untuk AC , Anda dapat mencoba perpustakaan IRremoteESP8266, yang mendukung serangkaian protokol yang mengesankan dan banyak AC dan juga berfungsi pada ESP32.
Raw-IR-decoder-for-Arduino bukanlah perpustakaan, melainkan sketsa contoh Arduino, yang menyediakan banyak metode decoding terutama protokol AC . Pengiriman protokol ini dapat dilakukan oleh perpustakaan Arduino HeatpumpIR.
Jika Anda mendapatkan sesuatu seperti ini:
PULSE_DISTANCE: HeaderMarkMicros=8900 HeaderSpaceMicros=4450 MarkMicros=550 OneSpaceMicros=1700 ZeroSpaceMicros=600 NumberOfBits=56 0x43D8613C 0x3BC3BC
maka Anda memiliki kode yang terdiri dari 56 bit , yang mungkin berasal dari remote AC.
Anda dapat mengirimkannya dengan sendPulseDistanceWidth()
.
uint32_t tRawData[] = { 0xB02002, 0xA010 }; IrSender.sendPulseDistance(38, 3450, 1700, 450, 1250, 450, 400, &tRawData[0], 48, salah, 0, 0);
Anda dapat mengirimkannya dengan memanggil sendPulseDistanceWidthData()
dua kali, sekali untuk 32 bit pertama dan berikutnya untuk 24 bit sisanya.
Dekoder PULSE_DISTANCE
/ PULSE_WIDTH
hanya menerjemahkan aliran waktu ke aliran bit yang disimpan sebagai nilai hex. Dekoder ini tidak dapat memasukkan semantik apa pun seperti alamat, perintah, atau checksum pada bitstream ini. Tapi bitstream jauh lebih mudah dibaca, dibandingkan aliran waktu. Bitstream ini dibaca LSB terlebih dahulu secara default . Jika LSB kurang cocok untuk penelitian lebih lanjut, Anda dapat mengubahnya di sini.
Jika RAM tidak lebih dari 2k, dekoder hanya menerima durasi tanda atau spasi hingga 2500 mikrodetik untuk menghemat ruang RAM, jika tidak maka dekoder menerima durasi hingga 10 ms.
Jika Anda melihat sesuatu seperti Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
sebagai output misalnya contoh AcceptDemo, Anda mungkin mempunyai masalah dengan decoding suatu protokol, atau protokol yang tidak didukung.
Jika jumlah bit yang diterima ganjil , sirkuit receiver Anda mungkin bermasalah. Mungkin karena sinyal IR terlalu lemah.
Jika Anda melihat pengaturan waktu seperti + 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
maka satu ruang 450 µs dibagi menjadi dua ruang 150 dan 100 µs dengan sinyal lonjakan/kesalahan 200 µs di antaranya. Mungkin karena penerima yang rusak atau sinyal yang lemah terkait dengan sumber pemancar cahaya lain di dekatnya.
Jika Anda melihat pengaturan waktu seperti + 500,- 550 + 450,- 550 + 450,- 500 + 500,-1550
, maka tanda umumnya lebih pendek daripada spasi dan oleh karena itu MARK_EXCESS_MICROS
(ditentukan dalam file ino Anda) harus negatif untuk mengimbanginya di decoding.
Jika Anda melihat Protocol=UNKNOWN Hash=0x0 1 bits received
mungkin spasi setelah tanda awal lebih panjang dari RECORD_GAP_MICROS
. Hal ini diamati untuk beberapa protokol AC LG. Coba lagi dengan baris misalnya #define RECORD_GAP_MICROS 12000
sebelum baris #include <IRremote.hpp>
di file .ino Anda.
Untuk melihat info lebih lanjut yang mendukung Anda menemukan alasan protokol UNKNOWN Anda, Anda harus mengaktifkan baris //#define DEBUG
di IRremoteInt.h.
Jika Anda tidak mengetahui protokol mana yang digunakan pemancar IR Anda, Anda memiliki beberapa pilihan.
Cukup gunakan nilai hash untuk memutuskan perintah mana yang diterima. Lihat contoh SimpleReceiverForHashCodes.
Gunakan contoh IRreceiveDemo atau contoh IRreceiveDump untuk membuang waktu IR. Anda kemudian dapat mereproduksi/mengirim waktu ini dengan contoh SendRawDemo.
Contoh IRMP AllProtocol mencetak protokol dan data untuk salah satu dari 40 protokol yang didukung . Perpustakaan yang sama dapat digunakan untuk mengirim kode ini.
Jika Anda memiliki papan Arduino yang lebih besar (memori program> 100 kByte), Anda dapat mencoba contoh IRremoteDecode dari perpustakaan Arduino DecodeIR.
Gunakan IrScrutinizer. Secara otomatis dapat menghasilkan sketsa pengiriman untuk protokol Anda dengan mengekspor sebagai "Arduino Raw". Mendukung IRremote, IRLib lama dan Inframerah4Arduino.
Jika Anda memiliki perangkat yang dapat menghasilkan kode IR yang ingin Anda gunakan (alias remote IR), disarankan untuk menerima kode dengan contoh AcceptDemo, yang akan memberi tahu Anda pada output serial cara mengirimkannya.
Protocol=LG Address=0x2 Command=0x3434 Raw-Data=0x23434E 28 bits MSB first Send with: IrSender.sendLG(0x2, 0x3434, <numberOfRepeats>);
Anda akan menemukan bahwa alamatnya adalah sebuah konstanta dan perintah-perintahnya kadang-kadang dikelompokkan secara masuk akal.
Jika Anda tidak yakin mengenai jumlah pengulangan yang digunakan untuk pengiriman, 3 adalah titik awal yang baik. Jika ini berhasil, Anda dapat memeriksa nilai yang lebih rendah setelahnya.
Jika Anda telah mengaktifkan DECODE_DISTANCE_WIDTH
, kode yang dicetak oleh printIRSendUsage()
berbeda antara platform 8 dan 32 bit , jadi yang terbaik adalah menjalankan program penerima pada platform yang sama dengan program pengirim.
Semua fungsi pengiriman mendukung pengiriman pengulangan jika masuk akal. Bingkai berulang dikirim pada periode tetap yang ditentukan oleh protokol. misalnya 110 ms dari awal ke awal untuk NEC.
Perlu diingat, bahwa tidak ada penundaan setelah tanda terkirim terakhir . Jika Anda menangani sendiri pengiriman frame berulang, Anda harus memasukkan penundaan yang masuk akal sebelum frame berulang untuk mengaktifkan decoding yang benar.
Mengirim kode MSB lama tanpa konversi dapat dilakukan dengan menggunakan sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
.
Kode-kode yang terdapat pada database Flipper-IRDB cukup mudah untuk dikonversi, karena juga menggunakan skema alamat/perintah.
Pencocokan protokol adalah NECext -> NECext (atau Onkyo), Samsung32 -> Samsung, SIRC20 -> Sony dengan 20 bit dll.
Kode yang ditemukan dalam database irdb menentukan perangkat , subperangkat , dan fungsi . Seringkali, perangkat dan subperangkat dapat diambil sebagai byte atas dan bawah dari parameter alamat dan fungsi adalah parameter perintah untuk fungsi terstruktur baru dengan parameter alamat, perintah, dan penghitungan ulang seperti misalnya IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
.
Pemetaan yang tepat dapat ditemukan di file definisi IRP untuk protokol IR. "D" dan "S" menunjukkan perangkat dan subperangkat, dan "F" menunjukkan fungsinya.
Pin mana pun dapat dipilih sebagai pin kirim, karena sinyal PWM dihasilkan secara default dengan perangkat lunak bit banging, karena SEND_PWM_BY_TIMER
tidak aktif.
Pada saluran ledc ESP32 0 digunakan untuk menghasilkan IR PWM.
Jika IR_SEND_PIN
ditentukan (sebagai makro c), ini akan mengurangi ukuran program dan meningkatkan waktu pengiriman untuk AVR. Jika Anda ingin menggunakan variabel untuk menentukan pin pengiriman misalnya dengan setSendPin(uint8_t aSendPinNumber)
, Anda harus menonaktifkan makro IR_SEND_PIN
ini. Kemudian Anda dapat mengubah pin kirim kapan saja sebelum mengirim bingkai IR. Lihat juga Opsi kompilasi/makro untuk perpustakaan ini.
http://www.harctoolbox.org/IR-resources.html
Basis Data IRDB Flipper
Penguraian kode sirip | Penguraian kode jarak jauh |
---|---|
Samsung32 | Samsung |
NEC | NEC |
NECext | ONKYO |
<mulai bit><VendorID:16><VendorID paritas:4><Genre1:4><Genre2:4><Command:10><ID:2><Parity:8><stop bit> dan ID adalah MSB alamat. alamat: 8A 02 20 00 perintah: 56 03 00 00 -> IR jarak jauh: Alamat 0x6A8, sendPanasonic (untuk 02 20) dan Command 0x35 | <start bit><VendorID:16><VendorID parity:4><Address:12><Command:8><Parity parity VendorID, Alamat dan Perintah:8><stop bit> |
Untuk aplikasi yang hanya membutuhkan NEC, varian NEC atau FAST -lihat di bawah- protokol, terdapat penerima/pengirim khusus yang disertakan, yang memiliki ukuran kode sangat kecil yaitu 500 byte dan TIDAK memerlukan pengatur waktu apa pun .
Alih-alih mengambil sampel input setiap 50 µs seperti yang dilakukan IRremote, receiver TinyReceiver menggunakan interupsi perubahan pin untuk decoding sambil jalan yang membatasi pilihan protokol.
Pada setiap perubahan level, level dan waktu sejak perubahan terakhir digunakan untuk memecahkan kode protokol secara bertahap.
Dengan prinsip operasi ini, kita tidak bisa menunggu sampai batas waktu habis dan kemudian mendekode protokol seperti yang dilakukan IRremote.
Sebaliknya, kita perlu mengetahui bit terakhir (perubahan level) dari suatu protokol untuk melakukan decoding akhir dan panggilan fungsi panggilan balik opsional yang disediakan pengguna handleTinyReceivedIRData()
.
Artinya, kita perlu mengetahui jumlah bit dalam suatu protokol dan juga protokolnya (keluarganya).
Lihat contoh TinyReceiver dan IRDispatcherDemo.
Berhati-hatilah untuk menyertakan TinyIRReceiver.hpp
atau TinyIRSender.hpp
alih-alih IRremote.hpp
.
//#define USE_ONKYO_PROTOCOL // Seperti NEC, tetapi ambil alamat 16 bit dan perintahkan masing-masing sebagai satu nilai 16 bit dan bukan sebagai 8 bit normal dan 8 bit nilai terbalik.//#define USE_FAST_PROTOCOL // Gunakan protokol FAST alih-alih NEC / ONKYO#termasuk "TinyIRReceiver.hpp"void setup() { initPCIInterruptForTinyReceiver(); // Mengaktifkan pembangkitan interupsi pada perubahan sinyal input IR}void loop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // Tidak diperlukan resume() :-)}
#termasuk "TinyIRSender.hpp"void setup() { sendNEC(3, 0, 11, 2); // Kirim alamat 0 dan perintah 11 pada pin 3 dengan 2 kali pengulangan.}void loop() {}
Penerima dan pengirim kecil lainnya yang mendukung lebih banyak protokol dapat ditemukan di sini.
Protokol FAST adalah protokol JVC yang dimodifikasi tanpa alamat, dengan paritas dan dengan header yang lebih pendek . Hal ini dimaksudkan untuk mendapatkan respons cepat terhadap peristiwa yang mengirimkan bingkai protokol ke papan lain. FAST membutuhkan waktu 21 ms untuk pengiriman dan dikirim dalam periode 50 ms . Ini memiliki paritas 8 bit penuh untuk deteksi kesalahan.
Waktu bit seperti JVC
Headernya lebih pendek, 3156 µs vs. 12500 µs
Tanpa alamat dan data 16 bit, ditafsirkan sebagai perintah 8 bit dan perintah terbalik 8 bit, menghasilkan panjang protokol tetap (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 mikrodetik atau 29 ms.
Pengulangan dikirim sebagai frame lengkap tetapi dalam periode 50 ms / dengan jarak 21 ms.
#define IR_SEND_PIN 3#sertakan <IRremote.hpp>batalkan pengaturan() { sendFAST(11, 2); // Kirim perintah 11 pada pin 3 dengan 2 pengulangan.}void loop() {}
#define USE_FAST_PROTOCOL // Gunakan protokol FAST. Tidak ada alamat dan data 16 bit, diartikan sebagai perintah 8 bit dan perintah terbalik 8 bit#include "TinyIRSender.hpp"void setup() { sendFAST(3, 11, 2); // Kirim perintah 11 pada pin 3 dengan 2 pengulangan.}void loop() {}
Protokol FAST dapat diterima oleh IRremote dan TinyIRReceiver.
Interval sampel penerima 50 µs dihasilkan oleh pengatur waktu. Di banyak papan ini pasti timer perangkat keras. Di beberapa papan di mana timer perangkat lunak tersedia, timer perangkat lunak digunakan.
Ketahuilah bahwa timer perangkat keras yang digunakan untuk menerima tidak boleh digunakan untuk analogWrite()
.
Terutama kontrol motor sering menggunakan fungsi analogWrite()
dan karenanya akan menghentikan penerima jika digunakan pada pin yang ditunjukkan di sini.
Pada UNO dan papan AVR lainnya, timer penerima sama dengan timer nada. Dengan demikian menerima akan berhenti setelah perintah tone()
. Lihat Contoh ReceptEmo Cara menghadapinya, yaitu cara menggunakan IrReceiver.restartTimer()
.
Bendera IRDATA_FLAGS_WAS_OVERFLOW
diatur, jika RAW_BUFFER_LENGTH
terlalu kecil untuk semua tanda dan spasi protokol. Ini bisa terjadi pada bingkai protokol panjang seperti yang dari AC. Itu juga dapat terjadi, jika RECORD_GAP_MICROS
lebih kecil dari kesenjangan nyata antara bingkai dan bingkai pengulangan THR, sehingga menafsirkan keduanya sebagai satu bingkai berturut -turut. Terbaik adalah membuang waktunya, untuk melihat alasan mana yang berlaku.
Irremote tidak akan berfungsi tepat ketika Anda menggunakan neopixels (alias WS2811/WS2812/WS2812B) atau perpustakaan lain yang memblokir interupsi untuk waktu yang lebih lama (> 50 μs).
Apakah Anda menggunakan Lib Adafruit Neopixel, atau Fastled, interupsi dinonaktifkan pada banyak CPU ujung bawah seperti arduino dasar untuk lebih dari 50 μs. Pada gilirannya, ini menghentikan penangan interupsi IR dari berjalan saat perlu. Lihat juga video ini.
Salah satu solusi adalah menunggu penerima IR menganggur sebelum Anda mengirim data neopixel dengan if (IrReceiver.isIdle()) { strip.show();}
.
Ini mencegah setidaknya melanggar transmisi IR yang berjalan dan tergantung pada tingkat pembaruan Neopixel - dapat bekerja dengan cukup baik.
Ada beberapa solusi lain untuk ini pada prosesor yang lebih kuat, lihat halaman ini dari Marc Merlin
Perpustakaan lain hanya berfungsi/menyusun jika Anda menonaktifkan garis IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
.
Ini sering karena konflik sumber daya penghitung waktu dengan perpustakaan lainnya. Silakan lihat di bawah.
Perpustakaan ini hanya mendukung satu penerima IR dan satu objek pengirim IR (IRRECV dan Irsend) per CPU.
Namun karena pengiriman adalah tugas serial, Anda dapat menggunakan setSendPin()
untuk mengganti pin yang akan dikirim, sehingga meniru beberapa pengirim.
Penerima menggunakan fungsi pemicu timer khusus, yang membaca nilai sinyal IR digital dari satu pin setiap 50 μs.
Jadi beberapa penerima IR hanya dapat digunakan dengan menghubungkan pin output beberapa penerima IR bersama -sama. Modul penerima IR secara internal menggunakan transistor NPN sebagai perangkat output hanya dengan resistor 30K terhadap VCC. Ini pada dasarnya adalah "kolektor terbuka" dan memungkinkan beberapa pin output untuk dihubungkan ke satu pin input Arduino.
Namun, perlu diingat bahwa sinyal lemah / terganggu dari salah satu penerima juga akan mengganggu sinyal yang baik dari penerima lain.
Cara terbaik untuk meningkatkan daya IR secara gratis adalah dengan menggunakan 2 atau 3 dioda IR secara seri. Satu dioda membutuhkan 1,2 volt pada 20 mA atau 1,5 volt pada 100 mA sehingga Anda dapat memasok hingga 3 dioda dengan output 5 volt.
Untuk daya 2 dioda dengan 1,2 V dan 20 mA dan pasokan 5 V, atur resistor ke: (5 V - 2.4 V) -> 2.6 V / 20 Ma = 130 Ω .
Untuk 3 dioda itu membutuhkan 1,4 V / 20 mA = 70 Ω .
Arus aktual mungkin lebih rendah karena kehilangan pada pin AVR . Misalnya 0,3 V pada 20 mA.
Jika Anda tidak memerlukan lebih banyak arus dari 20 mA, tidak perlu menggunakan transistor eksternal (setidaknya untuk chip AVR).
Pada nano Arduino saya, saya selalu menggunakan resistor seri 100 Ω dan satu IR LED?
Untuk menerima, frekuensi clock CPU minimal adalah 4 MHz , karena penghitung waktu 50 μs ISR (interupsi layanan interupsi) membutuhkan sekitar 12 μs pada atmega 16 MHz.
Tinyreceiver, yang tidak memerlukan pemungutan suara, berjalan dengan 1 MHz.
Untuk pengiriman, perangkat lunak default yang dihasilkan PWM memiliki masalah pada AVR yang berjalan dengan 8 MHz . Frekuensi PWM sekitar 30 bukannya 38 kHz dan RC6 tidak dapat diandalkan. Anda dapat beralih ke generasi PWM timer dengan #define SEND_PWM_BY_TIMER
.
Decoder Protokol Bang & Olufsen tidak diaktifkan secara default, yaitu jika tidak ada protokol yang diaktifkan secara eksplisit oleh #define DECODE_<XYZ>
. Itu harus selalu diaktifkan secara eksplisit oleh #define DECODE_BEO
. Ini karena memiliki frekuensi transmisi IR 455 kHz dan karenanya membutuhkan perangkat keras penerima yang berbeda (TSOP7000).
Dan karena menghasilkan sinyal PWM 455 kHz saat ini hanya diimplementasikan untuk SEND_PWM_BY_TIMER
, pengiriman hanya berfungsi jika SEND_PWM_BY_TIMER
atau USE_NO_SEND_PWM
didefinisikan.
Untuk info lebih lanjut, lihat ir_bangolufsen.hpp.
Contohnya tersedia di file> Contoh> Contoh dari pustaka khusus / irremote.
Agar sesuai dengan contoh ke kilasan 8K attiny85 dan attiny88, Perpustakaan Arduino Attinyserialout diperlukan untuk CPU ini.
Lihat juga Dronebot Workshop Simplereceiver dan SimpleSender.
Contoh -contoh yang sederhana dan simpleSender adalah titik awal yang baik. Contoh sederhana dapat diuji secara online dengan Wokwi.
SimpleCeiverForHashCodes hanya menggunakan decoder hash. Ini mengubah semua bingkai IR lebih dari 6 menjadi kode hash 32 bit, sehingga memungkinkan penerimaan protokol yang tidak diketahui.
Lihat: http://www.righto.com/2010/01/using-arbitrary-remotes-with-arduino.html
Jika ukuran kode atau penggunaan timer penting, lihat contoh -contoh ini.
Contoh Tinyreceiver menggunakan Perpustakaan TinyirReceiver yang hanya dapat menerima protokol NEC, Extended NEC, Onkyo, dan cepat, tetapi tidak memerlukan timer apa pun . Mereka menggunakan Pin Change Interrupt untuk decoding fly, yang merupakan alasan untuk pilihan protokol terbatas.
Tinyreceiver dapat diuji secara online dengan Wokwi.
Contoh Tinysender menggunakan Perpustakaan Tinyirsender yang hanya dapat mengirim protokol NEC, Onkyo dan Fast .
Ini mengirimkan kode protokol NEC dalam format standar dengan alamat 8 bit dan perintah 8 bit seperti dalam contoh SimpleSender. Ini memiliki opsi untuk dikirim menggunakan Extended NEC, Onkyo dan Protokol Cepat. Menghemat memori program 780 byte dan 26 byte RAM dibandingkan dengan SimpleSender, yang melakukan hal yang sama, tetapi menggunakan perpustakaan yang tidak diterangi (dan karenanya jauh lebih fleksibel).
Jika protokol tidak penting dan ukuran kode penting, lihat contoh ini.
ReceptEmo menerima semua protokol dan menghasilkan bunyi bip dengan fungsi nada arduino () pada setiap paket yang diterima.
Tekan lama dari satu tombol IR (menerima beberapa pengulangan untuk satu perintah) terdeteksi.
AllProtocolsonLCD juga menampilkan hasil singkat pada 1602 LCD . LCD dapat dihubungkan paralel atau serial (I2C).
Dengan menghubungkan pin debug ke ground, Anda dapat memaksa pencetakan nilai mentah untuk setiap bingkai. Jumlah pin dari pin debug dicetak selama pengaturan, karena tergantung pada tipe papan dan koneksi LCD.
Contoh ini juga berfungsi sebagai contoh cara menggunakan irremote dan nada () bersama -sama .
Menerima semua protokol dan dump sinyal yang diterima dalam berbagai rasa termasuk format pronto. Karena pencetakan membutuhkan banyak waktu, sinyal berulang dapat dilewati atau ditafsirkan sebagai tidak diketahui.
Mengirimkan semua protokol yang tersedia setidaknya sekali.
Menunjukkan penerimaan saat mengirim .
Rekam dan Putar Kembali Terakhir Menerima Sinyal IR di Tekan Tekan. Bingkai IR protokol yang diketahui dikirim oleh enkoder protokol yang sesuai. Bingkai protokol UNKNOWN
disimpan sebagai data mentah dan dikirim dengan sendRaw()
.
Cobalah untuk memecahkan kode setiap bingkai IR dengan decoder DistanceWidth universal , simpan data dan kirimkan pada tombol tekan dengan sendPulseDistanceWidthFromArray()
.
Jika RAM tidak lebih dari 2k, decoder hanya menerima durasi tanda atau ruang hingga 2500 mikrodetik untuk menghemat ruang RAM, jika tidak ia menerima durasi hingga 10 ms.
Menyimpan data untuk protokol lebar jarak membutuhkan 17 byte. Contoh PREETEANDSEND membutuhkan 16 byte untuk data protokol yang diketahui dan 37 byte untuk data mentah protokol EGNEC.
Berfungsi sebagai expander makro jarak jauh IR. Menerima protokol SamSung32 dan saat menerima bingkai input yang ditentukan, ia mengirimkan beberapa frame Samsung32 dengan keterlambatan yang sesuai di antaranya. Ini berfungsi sebagai emulasi kunci netflix untuk TV Samsung H5273 lama saya.
Kerangka kerja untuk memanggil berbagai fungsi program Anda untuk kode IR yang berbeda.
Kontrol relai (terhubung ke pin output) dengan remote Anda.
Contoh untuk kelas yang ditentukan pengguna, yang dengan sendirinya menggunakan kelas irrecv dari irremote.
Contoh untuk mengirim kode IR AC LG yang dikendalikan oleh input serial.
Dengan hanya menggunakan fungsi bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
Anda dapat mengontrol pendingin udara dengan sumber perintah lainnya.
File ACLG.H berisi dokumentasi perintah dari protokol IR AC LG. Berdasarkan rekayasa terbalik dari LG AKB73315611 Remote.
IRECEIVERTIMINGANALYSIS dapat diuji secara online dengan wokwi klik pada penerima saat simulasi berjalan untuk menentukan kode IR individu.
Contoh untuk menerima dan mengirim protokol AEG / Elektrrolux Hob2hood.
Contoh ini menganalisis sinyal yang dikirimkan oleh modul penerima IR Anda. Nilai dapat digunakan untuk menentukan stabilitas sinyal yang diterima serta petunjuk untuk menentukan protokol.
Ini juga menghitung nilai MARK_EXCESS_MICROS
, yang merupakan ekstensi dari durasi tanda (pulsa) yang diperkenalkan oleh modul penerima IR.
Ini dapat diuji secara online dengan Wokwi. Klik pada penerima saat simulasi berjalan untuk menentukan kode IR NEC individu.
ReceptEmo + SendDemo dalam satu program. Menunjukkan penerimaan saat mengirim . Di sini Anda melihat keterlambatan output penerima (biru) dari input dioda IR (kuning).
Penerima sederhana
Sakelar sederhana oleh IR key 5
Tinyreceiver
Reciivertimingansysis
Penerima dengan output LCD dan pernyataan sakelar
Contoh perpustakaan Arduino Pwmmotorcontrol ini mengontrol fungsi -fungsi dasar mobil robot menggunakan perpustakaan irremote.
Ini mengontrol 2 saluran motor PWM, 2 motor di setiap saluran.
Di sini Anda dapat menemukan instruksi untuk perakitan dan kode mobil.
IR_ROBOTCAR dengan penerima IR TL1838 terhubung ke papan ekspansi.
Jangan membuka masalah tanpa terlebih dahulu menguji beberapa contoh!
Jika Anda memiliki masalah, silakan posting MCVE (contoh minimal lengkap yang dapat diverifikasi) yang menunjukkan masalah ini. Pengalaman saya adalah, bahwa sebagian besar waktu Anda akan menemukan masalah saat membuat MCV ini?
Gunakan blok kode; Ini membantu kami untuk membantu Anda ketika kami dapat membaca kode Anda!
Untuk menyesuaikan pustaka dengan persyaratan yang berbeda, ada beberapa opsi kompilasi / makro yang tersedia.
Makro ini harus didefinisikan dalam program Anda sebelum baris #include <IRremote.hpp>
berlaku.
Ubahnya dengan mengaktifkan / menonaktifkannya, atau ubah nilai jika berlaku.
Nama | Nilai bawaan | Keterangan |
---|---|---|
RAW_BUFFER_LENGTH | 200 | Ukuran buffer input mentah UINT16_T buffer. Pasti bahkan! Jika terlalu kecil, bendera overflow akan diatur. 100 cukup untuk protokol reguler hingga 48 bit, tetapi untuk sebagian besar protokol AC, diperlukan nilai hingga 750. Gunakan contoh yang diterima untuk menemukan nilai terkecil untuk kebutuhan Anda. Nilai 200 membutuhkan 200 byte RAM. |
EXCLUDE_UNIVERSAL_PROTOCOLS | dengan disabilitas | Tidak termasuk decoder universal untuk protokol lebar jarak pulsa dan decodehash (dekoder khusus untuk semua protokol) dari decode() . Menghemat hingga 1000 byte memori program. |
DECODE_<Protocol name> | semua | Pemilihan protokol individu untuk diterjemahkan. Anda dapat menentukan beberapa protokol. Lihat di sini |
DECODE_STRICT_CHECKS | dengan disabilitas | Periksa karakteristik tambahan waktu protokol yang diperlukan seperti panjang tanda untuk protokol tanda konstan, di mana panjang ruang menentukan nilai bit. Membutuhkan hingga 194 byte tambahan memori program. |
IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK | dengan disabilitas | Menghemat hingga 60 byte memori program dan 2 byte RAM. |
MARK_EXCESS_MICROS | 20 | Mark_excess_micros dikurangi dari semua tanda dan ditambahkan ke semua ruang sebelum decoding, untuk mengkompensasi pembentukan sinyal modul penerima IR yang berbeda. |
RECORD_GAP_MICROS | 5000 | Kesenjangan minimum antara transmisi IR, untuk mendeteksi akhir protokol. Harus lebih besar dari ruang protokol apa pun misalnya ruang header NEC 4500 μs. Harus lebih kecil dari kesenjangan antara perintah dan pengulangan; misalnya kesenjangan transmisi untuk Sony sekitar 24 ms. Perlu diingat, bahwa ini adalah penundaan antara akhir perintah yang diterima dan awal decoding. |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | 50 Jika RAM <= 2k, lain 200 | Nilai 200 memungkinkan untuk mendekode tanda atau durasi ruang hingga 10 ms. |
IR_INPUT_IS_ACTIVE_HIGH | dengan disabilitas | Aktifkan jika Anda menggunakan penerima RF, yang memiliki sinyal output tinggi aktif. |
IR_SEND_PIN | dengan disabilitas | Jika ditentukan, ini mengurangi ukuran program dan meningkatkan waktu mengirim untuk AVR. Jika Anda ingin menggunakan variabel untuk menentukan kirim pin mis dengan setSendPin(uint8_t aSendPinNumber) , Anda tidak boleh menggunakan / menonaktifkan makro ini di sumber Anda. |
SEND_PWM_BY_TIMER | dengan disabilitas | Menonaktifkan pembuatan PWM operator dalam perangkat lunak dan menggunakan perangkat keras PWM (berdasarkan timer). Memiliki keuntungan dari generasi PWM yang lebih tepat, terutama CYC tugas
Memperluas
Informasi Tambahan
Aplikasi Terkait
Direkomendasikan untuk Anda
Informasi Terkait
Semua
|