測試環境:
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