一、概述
1. ESP8266紅外功能及庫
ESP8266 支持通過紅外接收器和紅外LED進行紅外收發(fā)功能。
ESP8266的紅外收發(fā)功能需要借助外部庫,常用的庫有IRremoteESP8266、IRremote、IRLib2等。
IRremoteESP8266庫是專門為ESP8266芯片設(shè)計的紅外收發(fā)庫,它支持多種協(xié)議,包括NEC、Sony、RC5、RC6等,還支持學(xué)習(xí)和發(fā)送紅外信號。
另外IRremote庫和IRLib2庫也是常用的紅外收發(fā)庫,但這兩個庫不是專門為ESP8266設(shè)計的,需要進行相應(yīng)的適配。
2. 紅外收發(fā)常見步驟
使用這些庫進行紅外收發(fā)時,一般需要進行以下步驟:
- 初始化紅外收發(fā)器和紅外LED引腳,一般使用IRrecv和IRsend對象進行操作。
- 在循環(huán)中檢測是否有紅外信號接收到,使用IRrecv對象的decode方法對信號進行解碼。
- 根據(jù)解碼后的數(shù)據(jù)判斷紅外信號的類型和命令,進行相應(yīng)的操作。
- 使用IRsend對象的send*方法發(fā)送紅外信號。
二、發(fā)送端
1. 電路接線
下面將紅外發(fā)射管接在GPIO4(D2)引腳,為防止燒管,可以在紅外發(fā)射管和地之間串聯(lián)一個1K電阻。
下面的程序?qū)崿F(xiàn)了從串口讀入4個字節(jié),然后通過紅外發(fā)射出去。
2. 源代碼
#include
int IR_S = 4; //接arduino 8號引腳
IRsend irsend(IR_S);
void setup()
{
pinMode(IR_S, OUTPUT);
Serial.begin(9600); // 9600 波特率
}
void loop()
{
uint8_t buffer[4];
if ( Serial.available()>=4) {
Serial.readBytes(buffer, 4);
uint32_t data = buffer[0] << 24 | buffer[1] << 16 | buffer[2] <<8 | buffer[3];
Serial.println(data, HEX);
irsend.sendSony(data, 32);
}
delay(1000);
}
3. sendSony介紹
這里重點是使用sendSony方法,函數(shù)定義:irsend.sendSony(data, nbits)
- data 要發(fā)送的數(shù)據(jù)
- nbits 紅外碼的位數(shù)
如果要發(fā)送0x0a9,那么使用Sony紅外協(xié)議發(fā)送,可以使用下面的代碼:
irsend.sendSony(0x0A9, 12);
假設(shè)現(xiàn)在要發(fā)送 0x9AB32AFC,轉(zhuǎn)換為二進制數(shù)
10011010101100110010101011111100,
然后,我們按照 Sony 協(xié)議的格式構(gòu)造數(shù)據(jù),即:
起始位(4位) 設(shè)備地址(7位) 命令數(shù)據(jù)(8位)
0101 0000001 00110101
其中,起始位是固定的 0101,設(shè)備地址可以是 0 到 127 之間的任意一個值,這里我們假設(shè)設(shè)備地址為 1,所以設(shè)備地址的二進制表示為 0000001。
接下來是命令數(shù)據(jù),我們將 0x9AB32AFC 轉(zhuǎn)換為二進制后,從左到右依次填入,不足 8 位則在高位補零。因此,命令數(shù)據(jù)的二進制表示為 10011010 10110011 00101010 11111100,這里我們將這 4 個字節(jié)從左到右依次排列,即
10011010101100110010101011111100。
最后,在命令數(shù)據(jù)的右邊再添加一位結(jié)束位,固定為 0。因此,最終的數(shù)據(jù)為 0101 0000001 10011010 10110011 00101010 11111100 0。
將這個二進制數(shù)轉(zhuǎn)換為十進制數(shù),即 1413266032。因此,對于發(fā)送 0x9AB32AFC 的情況,irsend.sendSony(0x9AB32AFC, 32) 中的第二個參數(shù)應(yīng)為 32。
二、接收
下面把帶解碼功能的紅外接收管(型號1838B)接在了D5引腳。接收直接調(diào)用IRremote.h庫。
1. 源代碼
#include
int RECV_PIN = D5;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //初始化紅外遙控
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
// 接收下一個值
irrecv.resume();
}
delay(150);
}
-
led
+關(guān)注
關(guān)注
242文章
23252瀏覽量
660559 -
信號
+關(guān)注
關(guān)注
11文章
2789瀏覽量
76730 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421 -
紅外接收器
+關(guān)注
關(guān)注
2文章
42瀏覽量
19076 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
44959
發(fā)布評論請先 登錄
相關(guān)推薦
評論