※ 2019.8 後補「積木式免焊接 記憶型空調紅外線轉譯器」一文,可供快速製作成品。
紅外線接收程式測試
使用 Arduino IDE 內含之 IRremote程式庫 進行測試
IRremote 程式庫在本類別 01 篇中已安裝好,請執行桌面上的Arduino應用程式,點選視窗左上 檔案->開啟,讀取程式庫中的範例檔 IRrecvDumpV2.ino ( 範例檔案位置在「文件」下的Arduino\libraries\IRremote\examples\IRrecvDumpV2\IRrecvDumpV2.ino )
請將第9行改為 int recvPin = 2; (麵包板的紅外線接收器腳位 Out , 接在編號 2的腳位)
// Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
//
int recvPin = 2;
IRrecv irrecv(recvPin);
執行 "驗證/編譯" 本程式
下方黑色顯示視窗捲動時發現有警告訊息,使用記事本程式 (或建議使用 Notepad++ 程式) 修改有問題的 IRremote.cpp 檔案內容 (檔案位置在「文件」下的Arduino\libraries\IRremote 目錄),有相同的三段程式碼要修改,各在107、81、56 行,原始碼為
if (passed)
DBG_PRINTLN(F("?; passed"));
else
DBG_PRINTLN(F("?; FAILED"));
修改為
#if DEBUG
if (passed)
DBG_PRINTLN(F("?; passed"));
else
DBG_PRINTLN(F("?; FAILED"));
#endif
存檔後再重新編譯,無問題後執行 "上傳" ,將程式碼寫入 Arduino 開發板內。
打開 序列埠監控視窗,先拿一般電視遙控器對準紅外線接收器測試,有正確抓到編碼解碼,接收線路及接收程式測試正常
使用冷氣機遙控器測試時出現了 紅外線編碼太長 的問題,需要修正檔案
使用記事本程式修改有問題的 IRremoteInt.h 檔案內容 (檔案位置在「文件」下的Arduino\libraries\IRremote 目錄),修改43、52 行,加大能接收的訊號長度,程式碼修正如下
#define RAWBUF 400 //加大紅外線編碼取樣個數
int rawlen; //編碼取樣個數的計數超過255,型態改為 int 整數,可計數至 32767
//------------------------------------------------------------------------------
// Information for the Interrupt Service Routine
//
#define RAWBUF 400 // Maximum length of raw duration buffer 修正為 400
typedef
struct {
// The fields are ordered to reduce memory over caused by struct-padding
uint8_t rcvstate; // State Machine state
uint8_t recvpin; // Pin connected to IR data from detector
uint8_t blinkpin;
uint8_t blinkflag; // true -> enable blinking of pin on IR processing
int rawlen; // counter of entries in rawbuf 修改型態為 int
unsigned int timer; // State timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; // raw data
uint8_t overflow; // Raw buffer overflow occurred
}
irparams_t;
存檔後再重新 編譯、上傳,將程式碼寫入 Arduino 開發板內。
我家中的冷氣遙控器紅外線編碼取樣個數為 291個,使用手機上的 遙控精靈APP 選擇日立空調機型,取樣個數為 371 個,比程式庫預設的長度 RAWBUF 101 個多出不少,也超過一個 Byte 能計數的大小 255個,而如日立冷氣的紅外線編碼資料大小就要 371 X 32 bits(unsigned int) / 8 = 1484 Bytes,Arduino開發板內建的記憶體空間才 2048 Bytes,這樣會不太夠用吧...
實驗到這裏,覺得這是否就是小米萬能遙控器不能成功完整複製冷氣機紅外線編碼的類似原因...
接下來測試發射錄製到的紅外線信號是否可正常動作,複製視窗中最下方的一行陣列參數 ( unsigned int rawData[ ... ) ,拿來測試紅外信號線發射。
接下來進行紅外線發射程式測試...