2013/05/07

Arduino練習:紅外線傳送與接收

這篇的主角是紅外線(infrared、IR),俗稱紅外光,其波長在770nm(奈米)至1mm(毫米)之間,而人眼可感知的電磁波波長一般在400到700nm之間,所以紅外線屬於不可見光,在通訊、探測、醫療、軍事等方面有廣泛的用途。

請看看底下電磁波頻譜示意圖,可得知紅外線介於可見光(visible)與微波(microwave)之間。(圖片來源:維基百科




 
這篇的重點是紅外線遠端遙控,家裡電視機、音響、錄影機、DVD播放器
的遙控器,便是利用紅外線傳輸,從遙控器端(紅外線發射器)透過紅外線通訊技術發出特定編碼,然後由電視機的紅外線接收器接收,進行解碼並執行相關功能,譬如開啟電視機的電源、加大或減少音量、切換頻道、等等。

我用的是Arduino Uno R3板子、Arduino軟體開發環境為1.0.4版。

所需電子零件:

  • 紅外線接收器(Infrared Receiver),38kHz,例如TSOP38238、TSOP2438、TSOP4438、PNA4602、FM-6038TH2、FM-8038TM2-5DN。
  • 紅外線發射器(Transmitter、Emitter或稱 IR LED),發射波長為940nm。
  • 100 ohm電阻。
為什麼是38kHz?這叫做載波頻率,因為生活周遭的物品都會散發出不定程度的紅外線,為了避免干擾,設計紅外線接收器時便讓它只對特定載波頻率有反應。不同廠牌的遙控器可能會使用不同的載波頻率,但38kHz最普遍。請注意,本篇使用38kHz的紅外線接收器,不一定可正確接收你家遙控器發出的紅外線訊號,需查詢該遙控器的規格,購買正確的紅外線接收器。

為什麼是940nm呢?我查詢了紅外線接收器的資料規格表後,其中註明了其最高峰波長為940nm,也就是最敏感的地方,所以我買了能發射波長940nm的紅外線發射器。其他常見的波長還有850nm,你也可以多買一個試試看。

底下是我買的零件,大約幾十元便可搞定。


紅外線接收器的腳位非常簡單,從腳位Vout讀取紅外線訊號,腳位GND接地,以腳位Vcc提供5V電源。注意:有些紅外線接收器的GND和Vcc腳位相反,還請查詢資料規格表(datasheet)以免接錯。


底下是接線圖,非常簡單。

紅外線接收器的Vout接Arduino的數位腳位2。

紅外線接收器的GND接Arduino的GND。

紅外線接收器的Vcc接Arduino的5V。


我使用Ken Shirriff開發撰寫的IRRemote這套Arduino程式庫,下載後解壓縮,將目錄改名為IRremote,然後整個放進sketchbook/libraries裡,重開Arduino軟體開發環境後,便可在Sketch-Import Library...裡看到它的蹤影。

每家廠商都有其一套專屬的紅外線通訊協定(protocol),知名的有NEC、SONY、Philips的RC5與RC6、Toshiba、Sharp、等等,這也就是為什麼這一家的遙控器不能控制那一家的電視機。還好IRRemote已經幫我們準備好了,一般常見的紅外線協定都有支援。

程式碼如下,也非常簡單,收到紅外線訊號後便輸出到序列埠。

#include <IRremote.h>

int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構

void setup()
{
  Serial.begin(115200);
  irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
  irrecv.enableIRIn(); // 啟動接收
}

void loop() {
  if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value, HEX);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    irrecv.resume(); // 準備接收下一個訊號
  }
}

然後,請拿著紅外線遙控器,對著紅外線接收器隨便按一些按鈕。

我將使用Apple Remote遙控器,這是一支非常簡單的遙控器,只有六個按鈕,分別是「選單」、「播放/停止」、「音量增大」、「音量減小」、「上一個/倒退」、「下一個/快進」,可控制Mac電腦的系統音量、iTunes的音樂播放、iPhone觀賞照片幻燈片、等等。


當然了,你也可以拿其他紅外線控制器來實驗,譬如一般電視機或DVD播放機的遙控器。


應會看到類似底下的輸出:

results value is 77E11050, bits is 32, decode_type is 1

其中77E11050便是紅外線訊號的編碼,32代表它有32個位元(也就是4 bytes),而1代表它屬於哪個協定,從底下列表可知1為NEC,這些是IRRemote支援的協定。

#define NEC 1
#define SONY 2
#define RC5 3
#define RC6 4
#define DISH 5
#define SHARP 6
#define PANASONIC 7
#define JVC 8
#define SANYO 9
#define MITSUBISHI 10
#define UNKNOWN -1

我將Apple Remote遙控器六個鈕都按過之後,便能知道每個按鍵的紅外線編碼:
「選單」77E14050 、
「播放/停止」77E12050 、
「音量增大」77E1D050 、
「音量減小」77E1B050 、
「上一個/倒退」77E11050、
「下一個/快進」77E1E050。

以上是紅外線接收器的部份,接下來我要使用紅外線發射器,模擬Apple Remote遙控器的功能。

底下是接線圖,非常簡單。

Arduino的數位腳位3接100 ohm電阻後接紅外線發射器(IR LED)的長腳。

紅外線發射器的短腳接地。

注意,IRRemote限定使用數位腳位3作為紅外線訊號輸出端。若想改用其他腳位,請參考Cooper Maa的2.1 發射紅外線訊號 part 2著手修改。


程式碼如下,透過序列埠監控視窗命令紅外線發射器發出訊號:

#include <IRremote.h>

IRsend irsend; // IRRemote限定使用數位腳位3

void setup()
{
  Serial.begin(115200);
}

void loop() {
  int d;
  if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
      case '1':
        v = 0x77E14050;
      break;
      case '2':
        v = 0x77E12050;
      break;
      case '3':
        v = 0x77E1D050;
      break;
      case '4':
        v = 0x77E1B050;
      break;
      case '5':
        v = 0x77E1E050;
      break;
      case '6':
        v = 0x77E11050;
      break;
    }
   
    if(v != 0x0){
      Serial.print("read ");
      Serial.print(d);
      Serial.print(", IR send ");
      Serial.println(v, HEX);
      irsend.sendNEC(v, 32); // 輸出紅外線訊號
    }
  }
}

IRRemote函式庫支援很多種常見的紅外線協定,請使用適當的輸出函式:
void sendNEC(unsigned long data, int nbits);
void sendSony(unsigned long data, int nbits);
//  void sendSanyo(unsigned long data, int nbits); // 尚未實作
//  void sendMitsubishi(unsigned long data, int nbits); // 尚未實作
void sendRaw(unsigned int buf[], int len, int hz);
void sendRC5(unsigned long data, int nbits);
void sendRC6(unsigned long data, int nbits);
void sendDISH(unsigned long data, int nbits);
void sendSharp(unsigned long data, int nbits);
void sendPanasonic(unsigned int address, unsigned long data);
void sendJVC(unsigned long data, int nbits, int repeat);

將紅外線發射器對準我Mac電腦的紅外線接收端,啊哈,成功囉,我能透過Arduino控制音樂播放囉(雖然滿無聊的)。您可以試試家裡的遙控器,試試電源開關、頻道切換、音量增減等等按鍵。

可惜的是,因為IRRemote的限制,我們無法在一塊Arduino板子上同時加裝紅外線接收器與發射器。除非自己手動打造紅外線編解碼的功能,請參考底下的參考資料。


參考資料:

134 comments:

  1. Anonymous21/8/13 22:22

    江兄您好!

    常來您這挖寶,謝謝您提供這麼優質的資訊與譯著!

    想請教您兩個問題,

    Q1:在下文中使用的是 TSOP38238 (吃3.3V)
    (http://learn.adafruit.com/using-an-ir-remote-with-a-raspberry-pi-media-center/hardware)
    而我在光華源達買到的是6038LM(吃5V),
    我剛剛把它接上去(也是吃3.3V)可以收到遙控器的訊號,
    請問這樣會傷害到RPi嗎?

    Q2:另外不知您有沒在 Mac Mountain Lion (OSX 10.8.4) 玩 baking Pi?
    (http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads.html)
    他需要下載 yagarto-4.7.2 (由dmg解開之後是一個 app) ,
    他說雙擊之後會得到一個目錄。只是無論我麼點都無法得到該目錄。
    不知為何不做成 rar 或 zip 檔供人下載?

    謝謝您!

    ReplyDelete
    Replies
    1. Q1: 你買的6038LM,有完整的型號嗎?接腳呈直線還是90度彎曲?
      根據我手上的6038LM的規格表,其電源接腳可接受2.7V~5.5V,所以吃5V是可以動的,但是這麼一來,其輸出的電壓大概會是4.5V,這不是rpi的GPIO針腳可容忍的值,最好不要。你接3.3V應該也是能運作正常才是。

      Q2: 玩過一部分。
      你是在mac os x裡雙擊.dmg檔嗎?dmg是mac os x內建的映像檔,雙擊後就會變成一個磁碟,就好像掛載一個光碟映像檔一樣,雙擊後裡頭有
      Readme me first!!
      Version information
      yagarto-4.7.2.app
      YAGARTO.webloc
      這些檔案。

      mac os x習慣使用dmg。沒有為什麼。

      Delete
    2. Anonymous21/8/13 23:06

      他是說再雙擊 yagarto-4.7.2.app 會產生一個目錄,但是我怎麼點都無效。
      我後來是安裝windows7版,只是要切來切去很麻煩。

      謝謝您的回覆!

      Delete
    3. Anonymous21/8/13 23:12

      BTW,
      Q1 ref: http://www.mobile01.com/newsdetail.php?id=2438

      Delete
    4. yagarto-4.7.2.app是mac的應用軟體,本身就是一個目錄。

      如果是這個網址裡的6038LM,用3.3V就能動了。

      哪裡,不客氣。

      Delete
  2. Anonymous22/8/13 06:21

    我最後在這裡發現跟我安裝時比較雷同的情節:
    https://github.com/synthetos/g2/wiki/Development-Environments
    ===> [Yagarto on the Mac for Xcode]
    :
    :
    :
    Open and install yagarto. Unpack the yagarto .dmg. You should see the yagarto-4.7.2.app (or similar) in a new finder window. Move this to your home directory (~). Run the app.
    If you can't run it by double clicking, right click it and hit "Open". You should see a yagarto-4.7.2 directory in your home dir when it's done.
    In Mountain Lion the yagarto-4.7.2 dir may not show up in the Finder window. You should be able to see it from the command line in a terminal window. (cd ~ ls) In this case enter open yagarto-4.7.2 from the command line. It should show up in the Finder.

    ==== 這是我 ===========
    MacPro:~ myhome$ mkdir yagarto
    MacPro:~ myhome$ mv yagarto-4.7.2.app/ yagarto
    MacPro:~ myhome$ cd yagarto/
    MacPro:yagarto myhome$ du .
    136 ./yagarto-4.7.2.app/Contents/MacOS
    352 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/MacOS
    48 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/MainMenu.nib
    32 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/Msgbox.nib
    32 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/SecureInputbox.nib
    448 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources
    816 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents
    816 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app
    64 ./yagarto-4.7.2.app/Contents/Resources/en.lproj/MainMenu.nib
    72 ./yagarto-4.7.2.app/Contents/Resources/en.lproj
    76296 ./yagarto-4.7.2.app/Contents/Resources
    76448 ./yagarto-4.7.2.app/Contents
    76448 ./yagarto-4.7.2.app
    76448 .
    MacPro:yagarto myhome$ open yagarto-4.7.2.app
    MacPro:yagarto myhome$ ls
    yagarto-4.7.2.app
    MacPro:yagarto myhome$

    -----------> 沒產生 toolchain /yagarto/yagarto-4.7.2

    更遑論要設定 .bash_profile 了 (因為看不到 bin & tools目錄呀)

    export PATH="$PATH:$HOME/yagarto/yagarto-4.7.2/bin"
    export PATH="$PATH:$HOME/yagarto/yagarto-4.7.2/tools"

    對ML10.8.4我還是新手,因此我放棄了。
    只是不想烘個派還要動用到三台機器罷了。
    我想有空再去找一下人家已成功展開後再壓縮成rar檔的比較實際些。

    謝謝您,不好意思耽擱您寶貴的研發譯時間!

    ReplyDelete
    Replies
    1. 你多了一個yagarto子目錄,但原文是把yagarto-4.7.2.app放在home directory之下,說不定有什麼差異。

      我沒有在os x下試過baking pi裡的範例,只有在windows下;但有在os x下編譯過pi的linux kernel。

      Delete
    2. Anonymous22/8/13 09:47

      兩個都試過了,都一樣沒反應,得不到 bin & tools 。
      我也曾把它拉進應用程式目錄中,也是無言的結局。

      就讓從這棵樹跳到另一棵樹的喜悅,留給松鼠吧!
      Let it be!

      謝謝囉~

      Delete
  3. Hello ~~~
    我完全是新手,剛剛入 Arduino 的門。我想請問一下:
    我想製做一對 (兩個) 紅外線收發模組,實驗互傳資料,也就是說單個的 Arduino Unor 板子上要接上一個 IR emitting diode 以及一個 IR receiver,我想請問單個板上是要分別用一個發射器與接受器好,還是去買兩個類似 CYN 70 的紅外線反射式模組來用,分別接在兩個 Uno 板子上就可以了?
    Thanks a lot.

    ReplyDelete
    Replies
    1. 我那個時候試驗的結果,若使用IRremote這套程式庫,無法在一塊Arduino板子上同時使用IR emitter與IR receiver。好像有人有辦法,但非常進階,我沒有試過。

      所以你的需求「兩塊板子,每塊板子都有IR emitter與IR receiver,可互傳資料」,
      我沒做過,目前也不知道怎麼自行製作。

      我沒用過CYN 70,網路上查詢到的資料,都是用來作為偵測用,譬如讓車子維持走在黑色軌道上,我不知道它可不可以發出一般的紅外線訊號。

      Delete
  4. 不好意思 我是arduino新手 我使用你的紅外線接收的程式碼之後沒有問題 可是使用紅外線發射的程式碼 卻出現case2:3: error: 'IRsend' does not name a type
    case2.ino: In function 'void loop()':
    case2:40: error: 'irsend' was not declared in this scope
    這三個錯誤 我找不出來請問是哪裡有問題?

    ReplyDelete
    Replies
    1. 看起來是沒有#include IRremote.h了,所以編譯器找不到IRsend這個東西。

      Delete
    2. 可是 我也把檔案解壓縮之後 放到 指定的路徑了 怎還會找不到IRsend

      Delete
    3. 嘛,說的也是,你能夠接收紅外線,也就是說IRrecv沒問題,那麼IRsend應該也沒問題才對。
      不過看到錯誤訊息case2:3: error: 'IRsend' does not name a type,理由應該就是我說的那樣。


      Delete
    4. This comment has been removed by the author.

      Delete
    5. 可以用有限狀態機(finite state machine)的程式撰寫技巧,一個LED的狀態會有:1熄滅、2熄滅(可根據亂數判斷要不要點亮)、3亮,三種狀態,
      一開始是1,經過一段時間後,進入2,然後程式就可以呼叫亂數函式,看看要不要點亮,若否,等待下一次機會,若是則點亮進入3,直到被使用者按掉,回到1。

      Delete
  5. 您好 我剛接觸arduino 我現在打地鼠用紅外線接收來控制 我的問題卡在燈隨機亮 但搖控按下去沒有滅 可是在Serial monitor上 我紅外線是有收到的 是怎麼回事???

    ReplyDelete
    Replies
    1. 抱歉,完全看不懂你的問題。

      Delete
  6. 你好 我接收 都可以 數值也都對 可是 發射出去 (紅外線有亮) 電視卻沒有動作 大概是哪裡的問題呢?

    ReplyDelete
    Replies
    1. 可能原因之一:你的紅外線發射器跟電視的紅外線接收器不相容。
      可能原因之二:你發出去的數值不正確,不符合電視機的紅外線協定。

      Delete
  7. 版主你好,我想做紅外線發射接收的燈 我的接收器接收的到遙控器等東西.但我的發射器卻毫無訊號出現
    by the way我的發射器沒那麼複雜,只是單純的一個button,按一下開燈按一下關燈
    請問該怎麼改發送端的程式碼?
    還有不好意思可以加FB嘛 我的是luna427018@gmail.com
    我還有一些想請教您!
    謝謝><

    ReplyDelete
  8. > 但我的發射器卻毫無訊號出現
    不知道是哪裡出問題,可以按照我這篇說的,用紅外線發射器模仿其他遙控器、控制相對應的電器嗎?你的紅外線發射器壞了?
    另外,似乎不能在一塊Arduino板子上同時使用紅外線接收器與發射器。

    抱歉,我不想加FB。有問題的話還請留言。
    這只是個人部落格,若有人留言,我會盡量回答。
    如果你需要的話,也可以到各大Arduino相關論壇發問。

    ReplyDelete
  9. 版主您好

    我發現一件奇怪的事情

    將這個紅外線接收器,與dallas 測溫,以及一個relay 的整合在一起

    本來是希望做到:溫度超過一個數值就啟動relay ,但也可以用遙控啟動relay

    結果這兩個東西竟然嚴重干擾,dallas 測溫會讓紅外線接收幾乎失靈,勉強偶爾可運作,而且紅外線接收會持續接收到莫名其妙的訊號

    不知是我哪裡弄錯

    該不會dallas 測溫的內部元件其實跟紅外線有啥關係

    這種現象是常態?元件在同一個arduino 內不一定能共存的現象?

    ReplyDelete
    Replies
    1. 我真的屢試不爽 XD

      只要對dallas 發出一次 sensors.requestTemperatures();

      那麼IR Receiver 就會收到一個莫名其妙的紅外線訊號,而且造成遙控按出來的被漏接

      現在解法就是讓測溫的每三十秒一次

      應該不太可能是我接線有問題 @@

      Delete
    2. 會有干擾,這是常態,電子元件與線路,無時無刻都有干擾,差別在大小而已。
      您的線路是?

      我記得sensors.requestTemperatures()發出後,dallas測溫晶片可能要花上0.5秒左右的時間,如果程式沒寫好,可能就會阻礙IR Receiver的部份。

      Delete
    3. IR 用pin3 ,溫度用pin 9 。但兩個元件可能是靠太近了

      我比較疑惑的是,玩arduino 一個多月我怎麼看都覺得他並非多工

      我在loop 內,先利用millis() 偵測時間差,每兩秒 getTemp 取得溫度,但 decodeIR 則是一定隨時都在做 (進入loop 就做)

      都沒有任何delay

      我以為這種在loop() 內先後順序呼叫,應該不會互相影響才對

      要不就是我以前寫軟體寫太多,可能硬體在loop 內的呼叫並不是我想的那樣?

      兩個呼叫有可能是多工作業背景處理?

      Delete
    4. Arduino微控制器沒有作業系統、沒有多工。

      雖然你沒有用delay,但sensors.requestTemperatures()執行時需要的時間較長,也算是delay了。

      requestTemperatures會要求全部感測器,較費時間。

      DallasTemperature程式庫裡還有waitForConversion與checkForConversion等旗標,設定後,不會等待溫度讀數轉換完成就會回傳,非常快,但必須自己檢查讀數是否有效。

      Delete
  10. This comment has been removed by the author.

    ReplyDelete
  11. 你好,請問如果紅外線序列是Unknown怎麼辦呢?

    ReplyDelete
    Replies
    1. 咳咳,沒碰過,您的遙控器這麼稀少啊?

      Unknown代表IRRemote不支援,但呼叫.decode是否能得到一些資訊呢?
      若有的話,或許還是可以用的。

      Delete
  12. 請問如果我自己做一個簡單的紅外線遙控器來控制紅外線的喇叭,那該從哪裡開始?

    ReplyDelete
    Replies
    1. 紅外線的喇叭?抱歉,我沒有這種東西耶。

      如果是用紅外線遙控器操縱喇叭的電源、音量、等,那應該跟一般遙控器差不多,要先找出原本紅外線遙控器屬於哪家規格(sony、panasonic、...)、每個按鍵的紅外線指令碼是什麼,然後自己以Arduino控制IR發射器發出相同的指令碼,如此即可。

      如果是以紅外線傳輸音訊,那我就不知道了。

      Delete
  13. 請問一下 我的會出現這個 這是什麼意思?
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope
    int RECV_PIN = TKD2; // the pin the IR receiver is connected to

    ReplyDelete
    Replies
    1. TKD2應該是Arduino Robot才有的定義,在Arduino 1.5.7的hardware\arduino\avr\variants\robot_control\pins_arduino.h裡,摘錄如下:

      #define D0 TKD0
      #define D1 TKD1
      #define D2 TKD2
      #define D3 TKD3
      #define D4 TKD4
      #define D5 TKD5

      而IRremoteTools.cpp裡使用的TKD2,

      會出現這樣的錯誤訊息,代表你選的板子的腳位定義裡沒有TKD2。

      Delete
    2. 請問 我該怎麼辦?

      Delete
    3. 呃,IRremoteTools.cpp屬於RobotIRremote的一員,而RobotIRremote是Arduino Robot(http://arduino.cc/en/Main/Robot)這塊板子才能使用的程式庫,如果你的板子不是Arduino Robot,自然不能使用。

      Delete
    4. 如果你的板子不是Arduino Robot的話,那就不要用RobotIRremote。
      RobotIRremote是從IRremote修改而來,所以請自己下載安裝IRremote。

      Delete
    5. 不好意思,你好
      我是安裝 IRremote 但也出現相同的問題
      請問我該怎麼做?

      Delete
    6. 拿掉arduino-1.5.7\libraries\RobotIRremote整個目錄,試試看。

      Delete
    7. 請參考這篇http://yehnan.blogspot.tw/2014/09/arduinoerror-tkd2-was-not-declared.html

      Delete
  14. Anonymous21/9/14 18:38

    您好 我最近一支新的冷氣遙控器遇到困難,他永遠顯示FFFFFFFF (0 bits),每個按鍵都一樣,請問會不會是頻率或波長不匹配的問題呢?

    ReplyDelete
    Replies
    1. 冷氣遙控器通常都比電視遙控器複雜,有其特別的作法。
      所以很難自己做出相容於冷氣機的遙控器(或接收器)。

      Delete
  15. 不好意思 請問一下 我做紅外線發送 會出現這樣的錯誤 我該怎麼辦?
    'IRsend' does not name a type

    ReplyDelete
    Replies
    1. 若你用1.0.x版,那原因應該是IRRemote程式庫沒有成功安裝。

      若你用Arduino 1.5.x版,那應該是跟Arduino IDE內建的程式庫起衝突,
      假設你的板子不是Arduino Robot,那麼就乾脆拿掉libraries/目錄下的子目錄RobotIRremote,
      應該就可解決。

      Delete
  16. 不好意思 請問一下 .. 我們用接收器收到9,廠牌是SANYO的
    但是打在Arduino程式上卻沒有像NEC一樣顯示橘色的字
    EX: irsend.sendSANYO(v, 32);
    SANYO沒有變橘字
    我們試過各種大小寫,也查過網路爬過文
    都沒有看到類似的問題,
    懇請大大幫忙解答 謝謝

    ReplyDelete
    Replies
    1. 顯示橘色的字?SANYO沒有變橘字?

      喔,因為IRRemote的IRsend尚未支援Sanyo。

      Delete
  17. 你好,依序照您的此篇文章實作,直到紅外線發射部分有點問題,想請教一下,以下紅外線的程式碼:

    #include

    IRsend irsend; // IRRemote限定使用數位腳位3

    void setup()
    {
    Serial.begin(115200);
    }

    void loop() {
    int d;
    if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
    case '1':
    v = 0x2FD48B7;
    break;
    case '2':
    v = 0x2FD58A7;
    break;
    case '3':
    v = 0x2FD7887;
    break;
    case '4':
    v = 0x2FDD827;
    break;
    case '5':
    v = 0x2FDF807;
    break;
    case '6':
    v = 0x2FDF00F;
    break;
    }

    if(v != 0x0){
    Serial.print("read ");
    Serial.print(d);
    Serial.print(", IR send ");
    Serial.println(v, HEX);
    irsend.sendNEC(v, 32); // 輸出紅外線訊號
    }
    }
    }

    上傳完成之後,點入Serial Monitor輸入數字1則得:
    read 49, IR send 2FD48B7

    輸入數字2則得:
    read 50, IR send 2FD58A7

    但電視依然沒有起反應,已確認過遙控器編碼與此程式編碼相同,IR LED正負極沒接反,接線都正常,想請問問題可能是出在哪裡嗎?謝謝!

    ReplyDelete
    Replies
    1. 看不出問題耶。

      1. 你確定協定是NEC嗎?
      2. 去別家電子材料行再買一顆IR LED試試看。
      3. 如果有兩塊Arduino板子的話,一方接IR接收器,一方接IR LED,試試能不能收到。

      Delete
    2. 好的 我在試試謝謝您

      Delete
  18. 你好 我參考了你的遮斷型的紅外線範例程式
    我的實驗結果他會LED一直閃爍 代表他有東西遮住
    但我中間甚麼都沒有遮 監控端也一直顯示1
    我是哪邊有出問題嗎 (確定沒有接線的錯誤)

    ReplyDelete
  19. 遮斷型?請問是哪個範例?
    電路圖?程式碼?

    ReplyDelete
  20. 版主你好,不好意思請教你一個問題。我是Arduino新手,因為校內科展的關係我開始接觸它,先前照著您的做法實驗了幾次,可是當我上傳完程式後按serial monitor 結果沒有任何回應(有嘗試其他的遙控器可是還是沒有任何回應) 拿著器材到學校詢問老師,檢查後發現沒有任何問題(ex:電路、程式等),可是還是無法遙控它,紅外線接收器甚至跟老闆換新的了,還是運作不了,請問是因為甚麼其他問題嗎? 謝謝幫忙,感激不盡。

    ReplyDelete
    Replies
    1. 還是要看遙控器的頻率嗎?

      Delete
    2. 遙控器跟紅外線接收器的載波頻率,一樣嗎?Sony的遙控器應該是40kHz,Philips是36kHz,其他大部分是38kHz。不一樣,自然收不到。
      有先試過最簡單的程式碼了嗎?本文中第一份程式碼。先確定兩者能通,再往下做。

      Delete
    3. 呃,連最簡單的程式碼都沒過,那不就還沒開始嗎。

      1. 檢查遙控器跟紅外線接收器的載波頻率,換別的遙控器試試看
      2. 確認紅外線接收器每個腳位的功能為何,有些紅外線接收器的GND和Vcc腳位相反,必須查詢datasheet才能得知
      3. 去買成對的紅外線接收器與紅外線發射器,使用兩塊Arduino板子,一個發、一個收,試試看

      Delete
  21. This comment has been removed by the author.

    ReplyDelete
  22. 請問一下
    我利用紅外線發射器 和 接收器做實驗
    我設定發射器發射32位元的訊號 紅外線接收器同樣也顯示32位元的資料
    但是發射以下訊號時
    0x77E14050
    0x77E12050
    0x77E1D050
    0x77E1B050
    0x77E1E050
    0x77E11050
    接受器顯示的卻是:
    1RU2G2G
    1RU282G
    1RU3K2G
    1RU3C2G
    1RU3O2G
    1RU242G
    也不是傳輸中出現錯誤 ˇ為每次都匯出現這樣的結果
    為什麼他不會顯示與發射器相同的編碼呢?
    謝謝

    ReplyDelete
    Replies
    1. 裝在兩個不同的ardiuno上

      Delete
    2. #include // 引用 IRRemote 函式庫
      IRsend irsend;
      void setup()
      {
      Serial.begin(9600); // 19200 bps
      }

      void loop() {
      irsend.sendNEC(0x1F2F1196,32);
      delay(1000);
      Serial.println("1");
      irsend.sendNEC(0x77E14050,32);
      delay(1000);
      Serial.println("2");
      irsend.sendNEC(0x77E12050,32);
      delay(1000);
      Serial.println("3");
      irsend.sendNEC(0x77E1D050,32);
      delay(1000);
      Serial.println("4");
      irsend.sendNEC(0x77E1B050,32);
      delay(1000);
      Serial.println("5");
      irsend.sendNEC(0x77E1E050,32);
      delay(1000);
      Serial.println("6");
      irsend.sendNEC(0x77E11050,32);
      delay(1000);
      Serial.println("7");
      }

      #include
      int RECV_PIN = 11;
      IRrecv irrecv(RECV_PIN);
      decode_results results;




      void setup() {
      Serial.begin(9600);
      irrecv.enableIRIn();


      }

      void loop() {
      if(irrecv.decode(&results)) {
      Serial.println(results.value,32);


      irrecv.resume();
      }

      }

      Delete
    3. This comment has been removed by the author.

      Delete

    4. Serial.println(results.value,32);
      改成
      Serial.println(results.value, HEX);
      即可

      Delete
    5. 可是發射時不是32為位元嗎? 為何接收變HEX格式?

      Delete
    6. void sendNEC(unsigned long data, int nbits);
      Print::println(unsigned char b, int base)

      這兩個函式,第二個參數代表的含意不同。
      println第二個參數若是32,代表以32進制輸出。

      Delete
  23. 請問第二個參數代表的含意分別代表甚麼意思呢?

    ReplyDelete
    Replies
    1. sendNEC第二個參數代表要送出幾個bit。
      rint::println若第一個參數是個整數,那麼第二個參數可以是BIN、OCT、DEC、HEX,代表以何種進位制輸出。請查詢http://www.arduino.cc/en/Serial/Print

      Delete
  24. 大大你好 使用你提供的程式或者IR範例檔想發送紅外線訊號 ,都會出現下面的錯誤
    sketch_may11a.ino: In function 'void loop()':
    sketch_may11a.ino:43:14: error: 'class IRsend' has no member named 'sendNEC'

    文章內有看到有類似的問題有人發問,可是不知道她最後怎麼解決的
    接收紅外線沒有問題很正常,只差在發送這個部分,能替我解惑一下嗎

    ReplyDelete
    Replies
    1. 根據你的錯誤訊息,代表IRsend這個類別裡沒有你想呼叫的成員函式sendNEC。
      應該是程式庫沒安裝好的緣故。

      你用的Arduino IDE版本是多少?
      1.5.x之後的版本,有內建的紅外線程式庫,但沒有IRSend。

      Delete
  25. 我的版本是1.5.8 內建的那個紅外線程式庫 RobotIRremote 我有將這個程式庫刪掉
    換成大大提供的網址那一個紅外線程式庫來使用 結果有這個錯誤
    才覺得怪怪 不知道哪邊 出了差錯!

    ReplyDelete
    Replies
    1. 因為新版的IRremote改架構了,但是好像還沒改好,

      根據IRremote的說明頁面,可到https://github.com/shirriff/Arduino-IRremote/releases下載穩定版,應該就可以了。

      Delete
  26. 剛剛有去抓了新的版本 還是有一樣的錯誤 請問葉大是不是也會有這樣的錯誤訊息?
    如果是的話 可以請葉大提供能運行的舊版本,讓我先可以動作嗎?
    不是的話 我再找找看哪邊的問題。

    ReplyDelete
    Replies
    1. 我沒有錯誤。


      https://github.com/yehnan/arduino_book_yehnan
      子目錄libraries_source裡的Arduino-IRremote-master.zip

      Delete
    2. 感謝 葉大 程式可以正常動作。
      再請教一個問題 我今天要使用Arduino接收某個儀器輸出的電流2~40mA
      我需要額外的東西才能讀取嗎?還是直接接上板子他就會讀到了?

      Delete
    3. 需要額外的零件。
      搜尋「Arduino 測量 電流」,有幾篇分享文。

      Delete
    4. 想請教版主大大,對於TSOP38238相關系列的接收端的疑問
      1.) 該元件本身就會具備解碼的功能嗎?
      2.) 沿上、解碼格式會是怎樣的型態與數值呢?

      受教了

      Delete
    5. 1. 沒有。
      2. 要看傳送方發出什麼格式的形態與數值。

      Delete
    6. 要如何把紅外線接收器收到的資料儲存並且記錄下來?

      Delete
    7. 不懂。就儲存啊。
      儲存到SD卡?開檔、寫入檔案、等等。

      Delete
  27. 您好 !
    我在製作發射器時有些問題請問一下
    目前接收到到的數值為
    results value is 404050AF, bits is 32, decode_type is 3
    decode_type 是 3 所以應該是RC5這個協定
    發射器的程式部分也在最後輸出的部分
    改為 irsend.sendRC5(v, 32); // 輸出紅外線訊號
    線路部分應該是沒有問題
    想請問是否有哪邊沒有注意到要做更改呢 ?
    麻煩您了 感謝

    --這邊附上我發射器部分的程式碼
    #include
    #include
    IRsend irsend; // IRRemote限定使用數位腳位3
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    int d;
    if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
    case '1':a
    v = 0x404050AF;
    break;
    case '2':
    v = 0x4040708F;
    break;
    }

    if(v != 0x0){
    Serial.print("read ");
    Serial.print(d);
    Serial.print(", IR send ");
    Serial.println(v, HEX);
    irsend.sendRC5(v, 32); // 輸出紅外線訊號
    }
    }
    }

    ReplyDelete
    Replies
    1. 上面#include 是沒有複製好 在程式裡是正常的!

      Delete
    2. 你的問題是?

      Delete
    3. 我們發射的紅外線無法開啟電視

      但是我們剛剛 試成功了
      奇怪點的是接收的結果是 decode_type is 3意思不是 協定是RC5
      所以這必分要更改irsend.sendRC5(v, 32);

      但是我們剛剛蝦矇把協定改回NEC就成功了 ?
      不知道怎麼一回事@@

      Delete
    4. decode_type is xx,什麼數字代表哪種協定,這要看你使用的IRRemote程式庫而定,作者有改,請查詢IRremote.h。

      我寫這篇文章時,3代表的是RC5,但是新版IRRemote的3似乎改成NEC了。

      Delete
    5. 哦哦 那應該就是這樣了
      問題已經解決
      非常感謝你的分享!!!!!

      Delete
  28. This comment has been removed by the author.

    ReplyDelete
  29. 請問老師 , 如何能達成像影片中這樣 ,利用 twitter 控制 arduino ? https://www.youtube.com/watch?v=59pHXHXJqAw

    ReplyDelete
    Replies
    1. 首先連上網路,使用ethernet或wifi擴充板,

      然後使用HttpClient之類的程式庫,從Twitter網站抓取推文,
      解析推文內容,找出代表顏色值的部份,然後修改RGB的顏色。

      影片範例應該是每10秒去抓一次顏色值。

      Delete
  30. 老師您好:
    我想自製一個紅外線測距 (想做陣列型的,市面找不到有賣)
    如果用上面的透明紅外線sensor
    http://www.icshop.com.tw/product_info.php/products_id/4128
    能夠做到光強度感應嗎?
    還是一定要用到您另外一篇的http://yehnan.blogspot.tw/2013/12/arduinotsl2561.html 明度感應器才行?

    ReplyDelete
    Replies
    1. 紅外線測距?你說的是這種嗎http://aroboto.com/shop/goods.php?id=189 ?

      光強度感應,當然要用別的感測器才做得到吧。

      Delete
  31. 你好,我最近作了一個很傻的事情,不知是否會壞掉?
    我把火焰感測器拿來燒(是直接放入火裡),但是只燒了大概一秒鐘,很快就拿起來了。

    ReplyDelete
    Replies
    1. 屬不正常用法,誰知道呢。

      Delete
  32. Anonymous18/3/16 21:32

    您好:
    家裡的電視遙控器壞了,也不見了(目前看電視都是用手按...).最近興起一個想要自己做遙控器的念頭(電視是奇美的),但我不知奇美的遙控器的紅外線通訊協定是用那一種,想請問可否用IRremote配Arduino得知是那種通訊協定?
    若答案是否定的,那有什麼方式是值得我去試的?
    謝謝!

    ReplyDelete
    Replies
    1. 最簡單的作法是去大賣場買一支。

      奇美電視使用哪一套紅外線協定,我上網搜尋,沒找到。

      如果奇美沒有自創新協定、而是使用既有的協定,那麼就能用這篇介紹的作法查出來。

      Delete
    2. 您好:
      小弟不才,看了您上述提供的程式碼後,覺得您應該是讀取現有遙控器的按鍵碼後再製作出和該遙控器相同功能的發射電路.但我的狀況是遙控器不見了,我無法取得遙控器紅外線訊號的編碼資料,我的對象只有電視機(紅外線接收)而已,我有想過幾個方法:
      1.想辦法借到一個也是奇美的遙控器,用大大提供的方法做出遙控器...
      2.使用常見的紅外線通訊協定,利用IRremote函式庫,一個一個試試看,碰碰運氣看那個可以用...(可是我上網找不到各種常見協定的按鍵編碼資料,或許可以打電話到奇美的技術部門問問看...)
      3.更聰明的方法......(但我想不到)

      Delete
    3. > 您應該是讀取現有遙控器的按鍵碼後
      > 再製作出和該遙控器相同功能的發射電路
      yes

      > 1.想辦法借到一個也是奇美的遙控器
      yes

      > 2.使用常見的紅外線通訊協定...一個一個試試看...
      嗯,很麻煩。
      > 找不到各種常見協定的按鍵編碼資料
      我也不清楚。

      > 打電話到奇美的技術部門問問看
      我沒試過。

      > 3.更聰明的方法
      嗯,上網找找,看看有沒有別人嘗試過你想做的事情。
      但我找不到。

      Delete
    4. Anonymous20/3/16 21:50

      謝謝您...

      Delete
  33. 您好
    我想請問您一個問題
    我用Arduino+Ethernet寫了一個紅外線學習的程式
    可以學習4個編碼並且發射學習過的碼
    而現在碰到的問題是
    我們有牌子的編碼(如NEC)
    都可以儲存4個並且發射相對應的碼
    而在Unknown碼的部分
    我們前面儲存的編碼都會被後面儲存的紅外線碼所覆蓋
    請問有沒有什麼方法可以解決這個問題??

    ReplyDelete
    Replies
    1. > 前面儲存的編碼都會被後面儲存的紅外線碼所覆蓋
      不懂為何如此,請詳述。

      Delete
    2. 假設我們現在儲存了4個編碼
      儲存完之後,發射出去的編碼
      都是第4個紅外線碼
      在協定為UNKNOWN的時候才會出現這個問題
      其他有協定的紅外線碼都不會

      Delete
    3. 不懂為何如此,請詳述。

      程式沒寫對吧。

      Delete
  34. 你好
    我想請問一下
    如果我接收的紅外線編碼他是33bits
    怎麼辦?
    email:s9910721@gmail.com

    ReplyDelete
    Replies
    1. 有聽聞過33 bits,但沒實際碰過。

      Delete
    2. 我是接收冷氣的紅外線碼

      Delete
    3. 冷氣機的遙控器,通常比電視的更為複雜,而且有記憶功能。

      Good Luck.

      Delete
    4. 我還有用一個機上盒(台灣大寬頻)的遙控器
      錄出來的編碼也很特別
      results value is 514AEB, bits is 25, decode_type is 11
      results value is FFFFFFFF, bits is 0, decode_type is 11
      results value is D14FC0AC, bits is 32, decode_type is -1
      results value is BB56C1F5, bits is 32, decode_type is -1
      results value is FFFFFFFF, bits is 0, decode_type is 11
      results value is FFFFFFFF, bits is 0, decode_type is 11
      這樣

      Delete
    5. 紅外線傳輸並無標準可言。

      你給的結果是按一次按鍵的結果嗎?若是,的確很特別,我也曾遇過。

      IR發射器與接收器必須匹配,譬如載波頻率與紅外線波長,否則也會發生各種奇異現象。

      Delete
  35. 請問一下紅外線發射器的led燈需要買多少瓦的燈泡,會因為訊號太弱冷氣接收不到嗎
    有推薦的瓦數嗎?

    ReplyDelete
    Replies
    1. 瓦?燈泡? 沒聽說過耶
      紅外線自有其距離限制 大概就是三公尺左右吧

      冷氣 冷氣機的紅外線 通常很特別 我沒玩過

      Delete
  36. 可以請問用燈泡顯示紅外線心跳感應的二進制"計數"程式要如何去找或寫嗎?拜託求解謝謝

    ReplyDelete
    Replies
    1. 接收紅外線心跳感應的訊號,記錄次數在int變數裡,
      使用bitRead()讀取每個位元的值,1或0,輸出亮滅狀態控制LED。

      Delete
  37. 您好
    想問電阻接100ohm的理由是?
    最近在考慮發射功率的問題
    調查一陣子發現Arduino的digital output pin電流只有50mA
    我用想電晶體放大電流但不太知道詳細的計算是怎樣
    目前我是先不管電晶體的DC gain,直接用(9V-1.5V(IR LED壓降))/100mA計算限流電阻68ohm
    但實際接上去量只有約60mA左右,請問大概可能是哪邊出問題?

    ReplyDelete
    Replies
    1. > 電阻接100ohm的理由是?
      限制通過IR LED的電流。(5-1.2)/0.1 = 38,有人會選33 ohm,有人保守一點選100。

      > 實際接上去量只有約60mA左右
      不知道。

      電路圖?


      Delete
  38. This comment has been removed by the author.

    ReplyDelete
  39. 請問接收到紅外線的訊號之後有辦法比較那個紅外線訊號嗎?
    這是我的Code:
    if (irrecv.decode(&results)) {
    value = results.value;
    if (value=="FF30CF") {
    Serial.print("Test");
    }
    }
    沒有任何錯誤,可是我朝他發射訊號的時候卻沒有任何反應,該如何比較呢?

    ReplyDelete
    Replies
    1. if (irrecv.decode(&results)) {
      value = results.value;
      if (value=="FF30CF") {
      Serial.print("Test");
      }
      irrecv.resume();
      }

      Delete
  40. 不好意思請問我這個要怎麼處理
    D:\microsoft\Downloads\sketch_nov26a1\sketch_nov26a1.ino:2:19: fatal error: Timer.h: No such file or directory

    #include "Timer.h"

    ^

    compilation terminated.

    exit status 1
    板子Arduino/Genuino Uno編譯錯誤

    ReplyDelete
    Replies
    1. 少了Timer這個程式庫,
      到https://github.com/JChristensen/Timer下載,
      有1.x版與2.x版。

      Delete
  41. 不好意思請問一下 我接收使用廣華買的HS0038B
    http://shop.cpu.com.tw/product/46882/info/

    程式碼都和你一樣,上傳時也沒出錯,但拿了很多遙控器來試都沒反應,這是接收器的問題嗎?

    ReplyDelete
    Replies
    1. 都沒反應,滿奇怪的。

      接收器的線路檢查一下,OUT、GND、Vcc。

      再買個接收器,試試囉。

      Delete
  42. 不好意思
    請問一下 我在制作一个多個的红外接收端,通常的红外接收器僅需要一个红外接收頭即可,但因為我的项目特殊,需要定義5個红外接收頭 請問有辦法嗎
    #include
    #define motorIn1 8 //L298N IN1 D8
    #define motorIn2 7 //L298N IN2 D7
    #define motorIn3 6 //L298N IN3 D6
    #define motorIn4 5 //L298N IN4 D5
    int a;

    const int RECV_PIN1 = 4;// 使用數位腳位4接收紅外線訊號
    const int RECV_PIN2 = 9;
    const byte RECV_LED = 13;
    IRrecv irrecv(RECV_PIN1); // 初始化紅外線訊號輸入
    IRrecv irrecv2(RECV_PIN2);
    //IRsend irsend;
    decode_results results; // 儲存訊號的結構
    void setup()
    {
    pinMode(motorIn1, OUTPUT);
    pinMode(motorIn2, OUTPUT);
    pinMode(motorIn3, OUTPUT);
    pinMode(motorIn4, OUTPUT);
    pinMode(RECV_LED, OUTPUT);
    Serial.begin(9600);
    irrecv.enableIRIn(); // 啟動接收
    }
    void loop()
    {

    if(irrecv.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    if (results.value == 0xC1C7C03F) //左轉
    {
    Serial.println("on");
    digitalWrite(motorIn1, HIGH);
    digitalWrite(motorIn2, LOW);
    digitalWrite(motorIn3, LOW);
    digitalWrite(motorIn4, LOW);
    digitalWrite(RECV_LED, HIGH);
    delay(1500);
    }
    }
    if(irrecv2.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    if (results.value == 0xC1C7C03F) //右轉
    {
    Serial.println("of");
    digitalWrite(motorIn1, LOW);
    digitalWrite(motorIn2, LOW);
    digitalWrite(motorIn3, HIGH);
    digitalWrite(motorIn4, LOW);
    digitalWrite(RECV_LED, HIGH);
    delay(1500);
    }
    }
    irrecv.resume(); // 準備接收下一個訊號
    }
    這是我的程式碼,但是設置第二個紅外線接收器後,紅外線接收器就收不到訊號了

    ReplyDelete
    Replies
    1. 特別修改後的IRRemote程式庫,才支援多個紅外線接收器,
      https://github.com/z3t0/Arduino-IRremote/tree/dev
      試試吧,我只聽說別人用過。

      Delete
    2. 那請問一下,這個程式庫有說明嗎,因為我下載下來放進去,要驗證時就會出現這個Arduino:1.6.12 (Windows 7), 板子:"Arduino/Genuino Uno"

      C:\Users\AnAn\AppData\Local\Temp\ccQBDauf.ltrans0.ltrans.o: In function `IRrecv::decode(decode_results*) [clone .constprop.3]':

      ccQBDauf.ltrans0.o:(.text+0x552): undefined reference to `IRrecv::decodeNEC(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x560): undefined reference to `IRrecv::decodeSony(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x56e): undefined reference to `IRrecv::decodeSanyo(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x57c): undefined reference to `IRrecv::decodeMitsubishi(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x58a): undefined reference to `IRrecv::decodeRC5(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x598): undefined reference to `IRrecv::decodeRC6(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5a6): undefined reference to `IRrecv::decodePanasonic(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5b4): undefined reference to `IRrecv::decodeLG(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5c2): undefined reference to `IRrecv::decodeJVC(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5d0): undefined reference to `IRrecv::decodeSAMSUNG(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5de): undefined reference to `IRrecv::decodeWhynter(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5ec): undefined reference to `IRrecv::decodeAiwaRCT501(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5fa): undefined reference to `IRrecv::decodeDenon(decode_results*)'

      collect2.exe: error: ld returned 1 exit status

      exit status 1
      板子Arduino/Genuino Uno編譯錯誤

      This report would have more information with
      "Show verbose output during compilation"
      option enabled in File -> Preferences.

      Delete
    3. > 放進去
      放哪裡?

      我自己下載並編譯,無問題。

      Delete
    4. 就是把你給我的網站,我把她下載下來,解壓縮,然後放進libraries資料夾理,再進行修改成IRremote,可是我範例那理也找不到紅外線的東西(我有重開arduino)麻煩大大幫我解惑,謝謝。

      Delete
    5. 我做的動作,就是你說的,不知何處出錯。

      要注意目錄結構,
      libraries裡要放IRremote目錄,而IRremote目錄裡,應有IRremote.cpp、IRremote.h等原始檔。

      Delete
    6. 不好意思再請問一下,大大給我的這個程式庫是可以在arduino上裝設多個紅外線接收器的嗎

      Delete
    7. 特別修改後的IRRemote程式庫,才支援多個紅外線接收器,
      https://github.com/z3t0/Arduino-IRremote/tree/dev
      試試吧,我只聽說別人用過。

      Delete
    8. 那請問怎樣算是有成功放進去

      Delete
    9. 放什麼?
      程式庫?
      有成功的話,使用該程式庫的sketch,就可成功編譯並連結。

      Delete
    10. 恩恩 可是我從草稿碼要匯入程式庫就會出現這個
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      請問是什麼問題

      Delete
    11. 不知道。

      完整的錯誤訊息?

      Delete