家電遙控器的提升了生活的便利性,目前家電使用的遙控器大多採用紅外線通訊模式,<早期有利用光束、聲頻等參考維基百科>,一般家中的紅外線遙控器大致上有
電視遙控器
冷氣遙控器
音響遙控器
有線電視遙控器
如何辨別是否為紅外線遙控器,觀察是否有紅外線LED(發射端),鏡頭下的紅外線遙控器https://youtube.com/shorts/1jeRtimEF2E?feature=share ,須注意鏡頭是否會濾除紅外線。
參考網站:
葉難:http://yehnan.blogspot.com/2013/05/arduino.html
紅外線(infrared、IR),俗稱紅外光,其波長在770nm(奈米)至1mm(毫米)之間,而人眼可感知的電磁波波長一般在400到700nm之間,所以紅外線屬於不可見光,在通訊、探測、醫療、軍事等方面有廣泛的用途。
紅外線遙控接收器
一般紅外線遙控接收器(Infrared Receiver),38kHz,接收波長為940nm
VS1838B 紅外接收頭 TL1838 VS1838B 38Khz規格如下:
工作電壓: 2.7 ~ 5.5 V
工作電流: 1.4 mA
工作頻率: 38 KHZ
可接收角度: 45 degree
紅外線遙控訊號接收(抄碼)序列監控窗_<檔案位置>
/* 2022.05.16 ESP32
port 設備
36 >> PB0
39 >> PB1
34 >> 紅外線接收器
17 >> BUZZER
*/
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=34; //宣告34腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
}
//主程式
void loop() {
if (irrecv.decode(&results)) { //若接收到資料,則解碼
Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
irrecv.resume(); //進入待命狀態
}
}
紅外線遙控器的使用範例_序列視窗顯示遙控器對應碼 (if 與 switch case)
/* 2022.12.05 ESP32 方向鍵在下方的遙控器瑪
port 設備
36 >> PB0
39 >> PB1
04 >> 紅外線接收器
17 >> BUZZER
*/
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=04; //宣告A1腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
}
//主程式
void loop() {
int x;
if (irrecv.decode(&results)) { //若接收到資料,則解碼
// Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
x=results.value;
switch (x){
case 0xFF9867 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 0 ");
break;
case 0xFFA25D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 1 ");
break;
case 0xFF629D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 2 ");
break;
case 0xFFE21D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 3 ");
break;
case 0xFF22DD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 4 ");
break;
case 0xFF02FD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 5 ");
break;
case 0xFFC23D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 6 ");
break;
case 0xFFE01F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 7 ");
break;
case 0xFFA857 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 8 ");
break;
case 0xFF906F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 9 ");
break;
case 0xFF6897 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" * ");
break;
case 0xFFB04F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" # ");
break;
case 0xFF18E7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" up ");
break;
case 0xFF4AB5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" down ");
break;
case 0xFF5AA5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" right ");
break;
case 0xFF10EF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" left ");
break;
case 0xFF38C7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" ok ");
break;
default :
//Serial.println(" == sorry I don't know!");
break;
}//
irrecv.resume(); //進入待命狀態
}
}
/* 2022.05.16 ESP32
port 設備
36 >> PB0
39 >> PB1
34 >> 紅外線接收器
17 >> BUZZER
0X 代表 16進制值
*/
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=34; //宣告A1腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
}
//主程式
void loop() {
int x;
if (irrecv.decode(&results)) { //若接收到資料,則解碼
Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
x=results.value;
switch (x){
case 0xFF4AB5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 0 ");
break;
case 0xFF6897 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 1 ");
break;
case 0xFF9867 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 2 ");
break;
case 0xFFB04F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 3 ");
break;
case 0xFF30CF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 4 ");
break;
case 0xFF18E7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 5 ");
break;
case 0xFF7A85 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 6 ");
break;
case 0xFF10EF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 7 ");
break;
case 0xFF38C7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 8 ");
break;
case 0xFF5AA5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 9 ");
break;
case 0xFF42BD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" * ");
break;
case 0xFF52AD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" # ");
break;
case 0xFF629D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" up ");
break;
case 0xFFA857 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" down ");
break;
case 0xFFC23D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" right ");
break;
case 0xFF22DD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" left ");
break;
case 0xFF02FD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" ok ");
break;
default :
Serial.print(results.value, HEX);
Serial.println(" == sorry I don't know!");
break;
}
irrecv.resume(); //進入待命狀態
}
}
/*
if (irrecv.decode(&results)) { //若接收到資料,則解碼
if (results.value==keyOff) { //若遙控器按#鍵
SW=OFF;
}
else if (results.value==keyOn) { //若遙控器按*鍵
SW=ON;
}
irrecv.resume(); //進入待命狀態
}
*/
紅外線遙控器的使用範例_顯示到七段顯示器
/* 2022.12.12 ESP32
port 設備
36 >> PB0
39 >> PB1
04 >> 紅外線接收器
17 >> BUZZER
*/
//(七段顯示器 0~9,A,B,C,D,E,F,H,L)
// 0 = LED on, 1 = LED off, in this order:
// Arduino uno pin: 2,3,4,5,6,7,8 (Mapping a,b,c,d,e,f,g,dp of Seven-Segment LED)
// Esp32s pin:25,26,27,12,13,33,32,27 (Mapping a,b,c,d,e,f,g,dp of Seven-Segment LED)
// p, g, f, e, d, c, b, a
char segpin[]={27,32,33,13,12,14,26,25};
// p,g,f,e,d,c,b,a 共陽極
byte seven_seg_digits[][8] = { { 1,1,0,0,0,0,0,0 }, // = 0
{ 1,1,1,1,1,0,0,1 }, // = 1
{ 1,0,1,0,0,1,0,0 }, // = 2
{ 1,0,1,1,0,0,0,0 }, // = 3
{ 1,0,0,1,1,0,0,1 }, // = 4
{ 1,0,0,1,0,0,1,0 }, // = 5
{ 1,0,0,0,0,0,1,0 }, // = 6 未避免與b 相同
{ 1,1,1,1,1,0,0,0 }, // = 7
{ 1,0,0,0,0,0,0,0 }, // = 8
{ 1,0,0,1,0,0,0,0 }, // = 9
{ 1,0,0,0,1,0,0,0 }, // = A
{ 1,0,0,0,0,0,1,1 }, // = B
{ 1,1,0,0,0,1,1,0 }, // = C
{ 1,0,1,0,0,0,0,1 }, // = D
{ 1,0,0,0,0,1,1,0 }, // = E
{ 1,0,0,0,1,1,1,0 }, // = F
{ 1,0,0,0,1,0,0,1 }, // = H
{ 1,1,0,0,0,1,1,1 } // = L
};
// 在七段顯示器上顯示指定的一個數字
void sevenSegWrite(byte digit) {
for (byte seg = 0; seg <8; ++seg)
digitalWrite(segpin[seg], seven_seg_digits[digit][seg]);// 共陽極 // digitalWrite(segpin[seg], !seven_seg_digits[digit][seg]);// 共陰極
}
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=04; //宣告A1腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
for(int i=0;i<8;i++){
pinMode(segpin[i], OUTPUT);
digitalWrite(segpin[i], 0);
}
delay(2000);
for(int i=0;i<3;i++){
for(int j=0;j<8;j++)
digitalWrite(segpin[j], 0);
delay(500);
for(int j=0;j<8;j++)
digitalWrite(segpin[j], 1);
delay(500);
}
}
//主程式
void loop() {
int x;
if (irrecv.decode(&results)) { //若接收到資料,則解碼
// Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
x=results.value;
switch (x){
case 0xFF9867 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 0 ");
sevenSegWrite(0);
break;
case 0xFFA25D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 1 ");
sevenSegWrite(1);
break;
case 0xFF629D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 2 ");
sevenSegWrite(2);
break;
case 0xFFE21D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 3 ");
sevenSegWrite(3);
break;
case 0xFF22DD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 4 ");
sevenSegWrite(4);
break;
case 0xFF02FD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 5 ");
sevenSegWrite(5);
break;
case 0xFFC23D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 6 ");
sevenSegWrite(6);
break;
case 0xFFE01F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 7 ");
sevenSegWrite(7);
break;
case 0xFFA857 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 8 ");
sevenSegWrite(8);
break;
case 0xFF906F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 9 ");
sevenSegWrite(9);
break;
case 0xFF6897 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" * ");
sevenSegWrite(10);
break;
case 0xFFB04F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" # ");
sevenSegWrite(11);
break;
case 0xFF18E7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" up ");
sevenSegWrite(12);
break;
case 0xFF4AB5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" down ");
sevenSegWrite(13);
break;
case 0xFF5AA5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" right ");
sevenSegWrite(14);
break;
case 0xFF10EF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" left ");
sevenSegWrite(15);
break;
case 0xFF38C7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" ok ");
sevenSegWrite(16);
break;
default :
//Serial.println(" == sorry I don't know!");
break;
}//
irrecv.resume(); //進入待命狀態
}
}
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=34; //宣告A1腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
}
//主程式
void loop() {
int x;
if (irrecv.decode(&results)) { //若接收到資料,則解碼
//Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
x=results.value;
switch (x){
case 0xFF9867 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 0 ");
break;
case 0xFFA25D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 1 ");
break;
case 0xFF629D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 2 ");
break;
case 0xFFE21D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 3 ");
break;
case 0xFF22DD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 4 ");
break;
case 0xFF02FD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 5 ");
break;
case 0xFFC23D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 6 ");
break;
case 0xFFE01F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 7 ");
break;
case 0xFFA857 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 8 ");
break;
case 0xFF906F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 9 ");
break;
case 0xFF6897 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" * ");
break;
case 0xFFB04F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" # ");
break;
case 0xFF18E7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" up ");
break;
case 0xFF4AB5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" down ");
break;
case 0xFF5AA5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" right ");
break;
case 0xFF10EF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" left ");
break;
case 0xFF38C7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" ok ");
break;
default :
//Serial.println(" == sorry I don't know!");
break;
}
irrecv.resume(); //進入待命狀態
}
}
紅外線遙控器的使用範例_0~9顯示在七段顯示器上 (if 與 switch case)
// ===== 遙控器編碼測試=====
#include <IRremote.h> //掛載IRremote函數庫
const int IRR=34; //宣告A1腳連接IRR信號
IRrecv irrecv(IRR); //建構接收物件
decode_results results; //建構解碼結果物件
// p, g, f, e, d, c, b, a 七段顯示函數
char segpin[]={27,32,33,13,12,14,26,25};
// p,g,f,e,d,c,b,a 共陽極
byte seven_seg_digits[][8] = { { 1,1,0,0,0,0,0,0 }, // = 0
{ 1,1,1,1,1,0,0,1 }, // = 1
{ 1,0,1,0,0,1,0,0 }, // = 2
{ 1,0,1,1,0,0,0,0 }, // = 3
{ 1,0,0,1,1,0,0,1 }, // = 4
{ 1,0,0,1,0,0,1,0 }, // = 5
{ 1,0,0,0,0,0,1,1 }, // = 6
{ 1,1,1,1,1,0,0,0 }, // = 7
{ 1,0,0,0,0,0,0,0 }, // = 8
{ 1,0,0,1,1,0,0,0 } // = 9
};
// 在七段顯示器上顯示指定的一個數字
void sevenSegWrite(byte digit) {
for (byte seg = 0; seg <8; ++seg)
digitalWrite(segpin[seg], seven_seg_digits[digit][seg]);// 共陽極 // digitalWrite(segpin[seg], !seven_seg_digits[digit][seg]);// 共陰極
}
//初始設定
void setup() {
Serial.begin(9600); //啟用序列埠監控視窗
irrecv.enableIRIn(); //啟用接收功能
for(int i=0;i<8;i++){
pinMode(segpin[i], OUTPUT);
digitalWrite(segpin[i], 0);
}
}
//主程式
void loop() {
int x;
if (irrecv.decode(&results)) { //若接收到資料,則解碼
//Serial.println(results.value, HEX); //在序列埠監控視窗裡以16進位碼顯示
x=results.value;
switch (x){
case 0xFF9867 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 0 ");
sevenSegWrite(0);
break;
case 0xFFA25D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 1 ");
sevenSegWrite(1);
break;
case 0xFF629D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 2 ");
sevenSegWrite(2);
break;
case 0xFFE21D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 3 ");
break;
case 0xFF22DD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 4 ");
break;
case 0xFF02FD :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 5 ");
break;
case 0xFFC23D :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 6 ");
break;
case 0xFFE01F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 7 ");
break;
case 0xFFA857 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 8 ");
break;
case 0xFF906F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" 9 ");
break;
case 0xFF6897 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" * ");
break;
case 0xFFB04F :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" # ");
break;
case 0xFF18E7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" up ");
break;
case 0xFF4AB5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" down ");
break;
case 0xFF5AA5 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" right ");
break;
case 0xFF10EF :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" left ");
break;
case 0xFF38C7 :
Serial.print(results.value, HEX);
Serial.print(" == ");
Serial.println(" ok ");
break;
default :
//Serial.println(" == sorry I don't know!");
break;
}
irrecv.resume(); //進入待命狀態
}
}