Arduino-IRremote memisahkan representasi yang dipakai ketika menerima frame infrared dari representasi yang dikonsumsi oleh sendRaw(). Receiver mencatat durasi hasil sampling, menyimpan gap sebelum frame secara terpisah, dan dapat mengompensasi distorsi timing dari modul IR receiver yang melakukan demodulasi. Transmitter sebaliknya menerima array yang dimulai dari mark pertama lalu bergantian antara durasi mark dan space.
Batas ini penting pada remote AC karena frame-nya dapat panjang dan sering direplay sebagai RAW ketika encoder khusus protokol belum tersedia.
printIRResultRawFormatted() adalah output diagnostik
Loop receiver sering berisi:
if (IrReceiver.decode()) {
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);
IrReceiver.resume();
}Argumen kedua pada printIRResultRawFormatted() meminta nilai dalam mikrodetik. Fungsi ini berguna untuk memeriksa waveform hasil capture, tetapi keluarannya adalah dump terformat yang mudah dibaca manusia. API tersebut bukan fungsi yang secara khusus menghasilkan C array untuk replay melalui copy-paste.
Untuk kebutuhan itu, Arduino-IRremote saat ini menyediakan:
IrReceiver.printIRResultAsCArray(&Serial, true);Dengan true, nilai yang dihasilkan menggunakan mikrodetik. Array tersebut dapat disimpan sebagai uint16_t lalu dikirim melalui overload sendRaw() yang menerima mikrodetik.
Sketch capture dapat mencetak kedua bentuk:
if (IrReceiver.decode()) {
IrReceiver.printIRResultShort(&Serial);
Serial.println("Formatted timing:");
IrReceiver.printIRResultRawFormatted(&Serial, true);
Serial.println("C array for replay:");
IrReceiver.printIRResultAsCArray(&Serial, true);
IrReceiver.resume();
}Pemisahan ini mencegah kesalahan copy-paste yang umum: menganggap teks diagnostik sudah merupakan array transmitter.
Buffer receive menyimpan timing dalam tick
Arduino-IRremote melakukan sampling input receiver secara periodik. Pada konfigurasi default, MICROS_PER_TICK bernilai 50 mikrodetik. Buffer internal receive menyimpan jumlah tick tersebut, bukan setiap interval langsung sebagai nilai mikrodetik uint16_t.
Secara konseptual:
output IR receiver
|
v
sampling 50 us
|
v
rawbuf[] berisi hitungan tickNilai 11 di raw buffer berarti kira-kira:
11 * 50 us = 550 usArduino-IRremote versi saat ini biasanya memakai timing buffer 8-bit kecuali USE_16_BIT_TIMING_BUFFER diaktifkan. Dengan tick 50 mikrodetik, satu entry 8-bit dapat mewakili sampai 12,75 ms sebelum terpotong.
Karena itu, rawbuf adalah struktur sisi receive, bukan array mikrodetik yang siap langsung dikirim.
Initial receive gap bukan mark pertama untuk transmit
Receiver membutuhkan idle gap sebelum frame untuk menentukan batas awal frame. Arduino-IRremote menyimpan nilai tersebut sebagai initialGapTicks. Sejak versi 4.4, gap disimpan terpisah dan tidak lagi menjadi timing pertama di rawbuf.
Struktur raw receive juga membiarkan entry buffer pertama kosong untuk kompatibilitas lama. API transmit mempunyai kontrak berbeda: raw data harus dimulai dari mark dan tidak memiliki leading receive gap.
Overload 16-bit berbentuk:
IrSender.sendRaw(rawData, rawLength, frequencyKHz);dengan interpretasi:
rawData[0] mark pertama
rawData[1] space pertama
rawData[2] mark berikutnya
rawData[3] space berikutnya
...Melewatkan internal receive buffer tanpa mengonversi indeks dan unit dapat menghasilkan waveform dengan batas yang salah walaupun sketch berhasil dikompilasi.
sendRaw() memakai tipe array C++ sebagai bagian dari kontrak
Arduino-IRremote menyediakan overload raw yang berbeda.
Array uint16_t berisi mikrodetik:
const uint16_t rawData[] = {
9000, 4500, 560, 560, 560, 1690
};
IrSender.sendRaw(
rawData,
sizeof(rawData) / sizeof(rawData[0]),
38
);Array 8-bit berisi hitungan tick:
const uint8_t rawTicks[] = {
180, 90, 11, 11, 11, 34
};
IrSender.sendRaw(
rawTicks,
sizeof(rawTicks) / sizeof(rawTicks[0]),
38
);Dengan tick default 50 mikrodetik, kedua contoh tersebut menggambarkan interval yang kira-kira sama. Nilai 180 berarti 180 mikrodetik pada overload pertama, tetapi berarti 180 tick atau sekitar 9000 mikrodetik pada overload kedua.
Frekuensi carrier terpisah dari kedua array. Pada contoh tersebut, argumen terakhir 38 berarti 38 kHz.
Capture dan replay di memori sebaiknya memakai helper konversi
Contoh resmi ReceiveAndSend Arduino-IRremote menangani data unknown atau generic pulse-width/pulse-distance dengan menyalin capture melalui:
IrReceiver.compensateAndStoreIRResultInArray(rawCode);Tujuannya adalah array tick 8-bit yang kemudian dikirim melalui overload sendRaw() 8-bit.
Bentuk minimalnya:
#include <Arduino.h>
#include <IRremote.hpp>
const uint8_t IR_RECEIVE_PIN = 4;
const uint8_t IR_SEND_PIN = 5;
uint8_t rawCode[RAW_BUFFER_LENGTH];
uint16_t rawCodeLength;
void setup() {
Serial.begin(115200);
IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);
IrSender.begin(IR_SEND_PIN, DISABLE_LED_FEEDBACK);
}
void loop() {
if (!IrReceiver.decode()) {
return;
}
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_WAS_OVERFLOW) {
Serial.println("RAW buffer overflow");
IrReceiver.resume();
return;
}
rawCodeLength = IrReceiver.decodedIRData.rawlen - 1;
IrReceiver.compensateAndStoreIRResultInArray(rawCode);
IrReceiver.resume();
IrSender.sendRaw(rawCode, rawCodeLength, 38);
}Cara ini lebih aman daripada menyalin irparams.rawbuf secara langsung. Helper menghilangkan offset sisi receive dan menerapkan kompensasi mark/space milik library sebelum menyimpan data replay.
Kompensasi diperlukan karena modul IR receiver yang melakukan demodulasi dapat menggeser tepi mark dan space. Arduino-IRremote memakai MARK_EXCESS_MICROS untuk koreksi ini; default saat ini adalah 20 mikrodetik kecuali dikonfigurasi berbeda.
Frame AC yang panjang harus diperiksa terhadap overflow
Remote AC dapat memakai timing jauh lebih banyak dibanding protokol TV biasa. Arduino-IRremote menetapkan:
IRDATA_FLAGS_WAS_OVERFLOWketika frame hasil capture tidak muat di RAW_BUFFER_LENGTH.
Capture yang overflow tidak lengkap dan tidak boleh direplay seolah-olah merupakan command utuh. Library memilih ukuran buffer default berbeda berdasarkan RAM yang tersedia, dan sketch dapat mendefinisikan RAW_BUFFER_LENGTH yang lebih besar sebelum meng-include IRremote.hpp jika diperlukan.
RECORD_GAP_MICROS juga menentukan batas frame. Nilainya harus lebih panjang daripada space valid di dalam protokol, tetapi lebih pendek daripada gap pemisah antar-transmisi. Nilai yang terlalu kecil dapat membelah transmisi AC panjang menjadi beberapa capture.
RAW replay membutuhkan timing, batas frame, dan carrier yang konsisten
Capture yang dapat direplay mempunyai tiga properti terpisah:
representasi timing
+
batas frame yang benar
+
frekuensi carrierUntuk alur copy-paste, printIRResultAsCArray(&Serial, true) menghasilkan representasi yang sesuai untuk array mikrodetik uint16_t. Untuk capture dan replay di firmware yang sama, compensateAndStoreIRResultInArray() lalu overload sendRaw() 8-bit mempertahankan jalur konversi yang disediakan library.
Perbedaannya kecil pada permukaan API tetapi menentukan waveform fisik: IR LED dapat terlihat berkedip sementara AC tetap mengabaikan command jika array memakai unit yang salah, dimulai dari entry yang salah, terpotong, atau dikirim dengan frekuensi carrier yang tidak sesuai.