Arduino UNO紅外接收與發送

測試環境:

Mac OS

Arduino UNO

Arudino 1.8.9

實現功能

IoT End-to-end system 的大作業,項目是其中一個部分,爲了實現通過Rpi發送指令的一個紅外的遙控器。

UNO與RPi用串口通信,UNO從Raspberry Pi 串口讀取指令,然後編碼發送與接收的一個簡單Demo。

這裏Rpi的代碼尚未放出來,Rpi會發送“XY”的編碼。指的就是X-設備,Y-指令。

說明

  • 爲了避免紅外無法正確定向,發送了三次信號。(這裏發送間隔delay時間太長了)
  • 紅外的編碼沒有科學依據,只是爲了測試定的數據。
  • Case 2到Case 5都沒有定義,預留的位置。
  • <IRremote.h>,在Arudino - tools - manage library
    搜索安裝。
/*
  IRsend Test of IoT demo
  Date:2019/12/28

  Receive command from Rpi and test the IRremote demo.
  PIN3 is defined in head file.
  IRsend PIN can only be defined in head file.
  Decode message,example:recData="XY",device = X, command = Y.
*/
#include <IRremote.h> 

IRsend irsend; //Create IRsent objects
int device;
int command;
String recData = "";


void setup()
{
  Serial.begin(9600);
}
void loop()
{
        
     while (Serial.available() > 0)  
    {
        recData += char(Serial.read());
        delay(2);
    }
    //Serial.println(recData);
    
    if (recData.length() > 0)
    {
        int temp = recData.toInt();
        command = temp % 10;
        device = (temp - command) / 10;

        //Switch command case
        if(device == 1 )
        {
        switch (command) {
      case 0:
        //Send command three times to make sure it can be received
        irsend.sendNEC(0xFF6897, 32);
        delay(100);
        break;

        irsend.sendNEC(0xFF6897, 32);
        delay(100);
        break;

        irsend.sendNEC(0xFF6897, 32);
        delay(100);
        break;
        
      case 1:
        irsend.sendNEC(0xFF02FD, 32);
        delay(100);
        break;

        irsend.sendNEC(0xFF02FD, 32);
        delay(100);
        break;

        irsend.sendNEC(0xFF02FD, 32);
        delay(100);
        break;
        
      case 2:
        digitalWrite(3, HIGH);
        break;
      case 3:
        digitalWrite(4, HIGH);
        break;
      case 4:
        digitalWrite(5, HIGH);
        break;
      case 5:
        digitalWrite(6, HIGH);
        break;
          }
        }
        
        //Reset received data
        recData = "";
    }
}
/*
  IRreceive Test of IoT demo
  Date:2019/12/28

  Receive signal from IRsend to turn on or turn off the light.
*/
#include <IRremote.h>
IRrecv irrecv(6); //Create IRreceive objects and choose the IRreceive pin
decode_results results; //Create the object of decode result
int LED_PIN=4;

void setup()
{
        irrecv.enableIRIn(); //Star reveiving
        Serial.begin(9600);
        pinMode(LED_PIN,OUTPUT);
}
void loop()
{
        if (irrecv.decode(&results))
        {
               Serial.println(results.value, HEX); //Output the received signal value in hexadecimal
               Serial.println();
               //Decode

               if(results.value == 0xFF6897)
               {
                digitalWrite(LED_PIN,LOW);//LED turn off
               }

               if(results.value == 0xFF02FD)
               {
                digitalWrite(LED_PIN,HIGH);//LED turn on
               }
               
               irrecv.resume(); //Receive next signal
        }
}

參考:https://blog.csdn.net/qq_39591322/article/details/88838454

發佈了12 篇原創文章 · 獲贊 3 · 訪問量 5536
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章