本篇博文是創(chuàng)客開發(fā):手撕代碼篇的最后一節(jié),項目在之前使用Mind+編程中講到過:和12歲小同志搞創(chuàng)客開發(fā):如何驅(qū)動紅外遙控器葫盼?
這次將通過代碼的方式進一步理解紅外遙控器的使用残腌。
我們知道家里的那些遙控器,不管是電視還是空調(diào)都是通過紅外來控制的贫导,我們這次也通過紅外來做個遙控燈抛猫。
在開始之前,先來個預熱實驗孩灯,通過串口來了解下如何使用紅外接收管和遙控器闺金。
項目連線效果如下所示:
驅(qū)動程序如下所示:
#include <IRremote.h>
int RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
? Serial.begin(9600);
? irrecv.enableIRIn(); // Start the receiver
}
void loop() {
? if (irrecv.decode(&results)) {
? ? Serial.println(results.value, HEX);
? ? irrecv.resume(); // Receive the next value
? }
}
下載完成后,打開Arduino IDE的串口監(jiān)視器(Serial Monitor)峰档,設置波特率baud為:9600败匹,與代碼中Serial.begin(9600)相匹配。
設置完后讥巡,用Mini遙控器的按鈕對著紅外接收管的方向掀亩,任意按個按鈕,都能在串口監(jiān)視器上看到相對應的代碼欢顷。如下圖所示槽棍,按數(shù)字“0”,接收到對應16進制的代碼是FD30CF抬驴。每個按鈕都有一個特定的16進制的代碼刹泄。
如果按住常按一個鍵不放就是出現(xiàn)“FFFFFFFF”。
在串口中怎爵,正確接收的話特石,應該收到以FD開頭的六位數(shù)。如果遙控器沒有對準紅外接收管的話鳖链,可能會接收到錯誤的代碼姆蘸。如下圖所示:
預熱完之后墩莫,我們言歸正傳,開始制作遙控燈逞敷。硬件設備其實就是在原有的基礎上狂秦,加了個LED燈,效果如下圖所示:
實現(xiàn)代碼如下所示:
#include <IRremote.h>? ? ? ? ? //調(diào)用IRremote.h庫
int RECV_PIN = 10;? ? ? ? ? ? ? //定義RECV_PIN變量為10? ?
int ledPin = 3;? ? ? ? ? ? ? ? // LED – digital 3
boolean ledState = LOW;? ? ? ? // ledstate用來存儲LED的狀態(tài)
IRrecv irrecv(RECV_PIN);? ? ? ? //設置RECV_PIN(也就是11引腳)為紅外接收端
decode_results results;? ? ? ? //定義results變量為紅外結(jié)果存放位置
void setup(){
? Serial.begin(9600);? ? ? ? ? //串口波特率設為9600
? irrecv.enableIRIn();? ? ? ? ? //啟動紅外解碼
? pinMode(ledPin,OUTPUT);? ? ? // 設置LED為輸出狀態(tài)
}
void loop() {
? //是否接收到解碼數(shù)據(jù),把接收到的數(shù)據(jù)存儲在變量results中
? if (irrecv.decode(&results)) {?
? ? ? //接收到的數(shù)據(jù)以16進制的方式在串口輸出?
? ? ? Serial.println(results.value, HEX);
? ? ? //一旦接收到電源鍵的代碼, LED翻轉(zhuǎn)狀態(tài)推捐,HIGH變LOW裂问,或者LOW變HIGH
? ? ? if(results.value == 0xFD00FF){
? ? ? ? ? ? ? ledState = !ledState;? ? ? ? ? ? //取反? ? ?
? ? ? ? ? ? ? digitalWrite(ledPin,ledState);? ? //改變LED相應狀態(tài)? ? ? ?
? ? ? ? ? }? ?
? irrecv.resume();? // 繼續(xù)等待接收下一組信號
? }
}
在這里,我們多定義了一個變量ledState牛柒,通過名字應該就可以看出來含義了堪簿,用來存儲LED的狀態(tài)的,由于LED狀態(tài)就兩種(1或者0)皮壁,所以我們使用boolean變量類型椭更。
setup()函數(shù)中,對使用串口蛾魄,啟動紅外解碼虑瀑,數(shù)字引腳模式進行設置。
到了主函數(shù)loop()滴须,一開始還是先判斷是否接收到紅外碼舌狗,并把接收到的數(shù)據(jù)存儲在變量results中。
if (irrecv.decode(&results))
一旦接收到數(shù)據(jù)后扔水,程序就要做兩件事把夸。第一件事,判斷是否接收到了電源鍵的紅外碼铭污。
if(results.value == 0xFD00FF)
第二件事恋日,就是讓LED改變狀態(tài)。
ledState = !ledState;? ? ? ? ? ? //取反? ? ? digitalWrite(ledPin,ledState);? ? //改變LED相應狀態(tài)
最后嘹狞,繼續(xù)等待下一組信號岂膳。
irrecv.resume();? // 繼續(xù)等待接收下一組信號