2015年5月17日 星期日

arduino-紅外線接收/控制燈

硬體

  • arduino版
  • 麵包版
  • 紅外線接收器KEYES Infrared receiver module for arduino
  • LED
  • 遙控器
  • 按照圖示連,三個接腳為GND/3.3v(5v不行)/S
程式-讀取數值
#include <IRremote.h>     //記得下載IRremote.h並解壓移到libraries

int RECEIVE_PIN= 3;     //接腳改成自己keyes-S的腳,要選有pwn的
IRrecv irreceiver(RECEIVE_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irreceiver.enableIRIn();      // Start the receiver
}

void loop() {
  if (irreceiver.decode(&results)) {
    Serial.println(results.value, HEX);     //點開右上序列阜視窗,以十六進位(HEX)顯示頻率。建議去掉HEX!另,此程式若常按按鈕只會顯示一次數值,其他為FFFFFFFF(4294967295),一個按鈕可能出現不同數值,多試幾次就可
    irreceiver.resume();

程式-按鈕控制LED,按數字幾便閃幾次
直觀式
  • 迴圈for
  • switch case


#include <IRremote.h>

int RECEIVE_PIN= 3;
IRrecv irreceiver(RECEIVE_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irreceiver.enableIRIn();     //以上相同
  pinMode(2,OUTPUT);     //接LED的腳
}

void loop() {
  if (irreceiver.decode(&results)) {
    Serial.println(results.value);
    irreceiver.resume();
    switch(results.value){     //以results.value的值做判斷
    case 16738455:     //當值為16728455(按鈕1)時。值可在序列埠視窗按各按鈕查看。若顯示十六進位則須轉成十進位((所以才說不要HEX嘛> <
      Serial.println('1');     //在序列埠視窗顯示1
      digitalWrite(2,HIGH);
      delay(100);
      digitalWrite(2,LOW);     //亮一次後暗
      break;     //必須加!!case的跑法是從哪裡開始往下跑,而不是單跑一個case,不加的話會繼續跑面下面其他case
    case 16750695:     //按鈕二
    Serial.println('2');
      for(int i=0; i<2; i++){     //設定i=0,當i<2時則跑下面程式,每跑一次i就+1
        digitalWrite(2,HIGH);
        delay(100);
        digitalWrite(2,LOW);
        delay(100);
        }     //亮後熄滅跑兩次->亮滅二次
        break;
    case 16756815:
      Serial.println('3');
      for(int i=0; i<3; i++){
        digitalWrite(2,HIGH);
        delay(100);
        digitalWrite(2,LOW);
        delay(100);
        }
        break;     //亮滅三次
    }
  }
}

變數式
  • 設變數
  • 把for拉出來

#include <IRremote.h>

int RECEIVE_PIN= 3;
IRrecv irreceiver(RECEIVE_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irreceiver.enableIRIn(); // Start the receiver
  pinMode(2,OUTPUT);
}

void loop() {
  if (irreceiver.decode(&results)) {
    Serial.println(results.value);
    irreceiver.resume();
    int times = 0;
    switch(results.value){
    case 16738455:
      Serial.println('1');
      times = 1;
      break;
    case 16750695:
      Serial.println('2');
        times = 2;
        break;
    case 16756815:
      Serial.println('3');
        times = 3;
        break;
    case 16724175:
      Serial.println('4');
        times = 4;
        break;
    case 16718055:
      Serial.println('5');
        times = 5;
        break;
    case 16743045:
      Serial.println('6');
        times = 6;
        break;
    case 16716015:
      Serial.println('7');
        times = 7;
        break;
    case 16726215:
      Serial.println('8');
        times = 8;
        break;
    case 16734885:
      Serial.println('9');
        times = 9;
        break;
    }
    for (int i =0; i<times; i++){     //設變數times,以times數值為迴圈重複次數
      digitalWrite(2,HIGH);
      delay(100);
      digitalWrite(2,LOW);
      delay(200);
    }
  }
}

函數式
#include <IRremote.h>

int RECEIVE_PIN= 3;
IRrecv irreceiver(RECEIVE_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irreceiver.enableIRIn(); // Start the receiver
  pinMode(2,OUTPUT);
}

void times(int x){
for (int i = 0;i<x;i++){
  digitalWrite(2,HIGH);
  delay(100);
  digitalWrite(2,LOW);
  delay(200);
    }
}

void loop() {
  if (irreceiver.decode(&results)) {
    Serial.println(results.value);
    irreceiver.resume();
    switch(results.value){
    case 16738455:
      Serial.println('1');
      times(1);
      break;
    case 16750695:
      Serial.println('2');
      times(2);
      break;
    case 16756815:
      Serial.println('3');
      times(3);
      break;
    case 16724175:
      Serial.println('4');
      times(4);
      break;
    case 16718055:
      Serial.println('5');
      times(5);
      break;
    case 16743045:
      Serial.println('6');
      times(6);
      break;
    case 16716015:
      Serial.println('7');
      times(7);
      break;
    case 16726215:
      Serial.println('8');
      times(8);
      break;
    case 16734885:
      Serial.println('9');
      times(9);
      break;
    }
  }
}

判斷遙控器種類等(引用自參考網站最後一個)

#include <IRremote.h>                    // 引用 IRRemote 函式庫
const int irReceiverPin = 3;            
IRrecv irrecv(irReceiverPin);            // 定義 IRrecv 物件來接收紅外線訊號
decode_results results;                  // 解碼結果將放在 decode_results 結構的 result 變數裏
void setup()
{
  Serial.begin(9600);                     // 開啟 Serial port, 通訊速率為 9600 bps
  irrecv.enableIRIn();                   // 啟動紅外線解碼
}
// 顯示紅外線協定種類
void showIRProtocol(decode_results *results)
{
  Serial.print("Protocol: ");
 
  // 判斷紅外線協定種類
  switch(results->decode_type) {     //從results裡取出decode_type的值
   case NEC:
     Serial.print("NEC");
     break;
   case SONY:
     Serial.print("SONY");
     break;
   case RC5:
     Serial.print("RC5");
     break;
   case RC6:
     Serial.print("RC6");
     break;
   default:
     Serial.print("Unknown encoding");
  }

  // 把紅外線編碼印到 Serial port
  Serial.print(", irCode: ");          
  Serial.print(results->value, HEX);    // 紅外線編碼
  Serial.print(",  bits: ");        
  Serial.println(results->bits);        // 紅外線編碼位元數  
}

void loop()
{
  if (irrecv.decode(&results)) {         // 解碼成功,收到一組紅外線訊號
    showIRProtocol(&results);            // 顯示紅外線協定種類
    irrecv.resume();                     // 繼續收下一組紅外線訊號      
  }
}

參考網站
http://coopermaa2nd.blogspot.tw/2011/02/arduino-serial-led.html     switch case用法
http://ming-shian.blogspot.tw/2013/09/arduino.html
http://www.arduino.cc/en/Reference/FunctionDeclaration     函數設置
http://coopermaa2nd.blogspot.tw/2011/03/12.html     判斷遙控器的編碼來源

沒有留言:

張貼留言