中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

技術熱線: 4007-888-234
設計開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享

技術支持

從全面的產(chǎn)品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)

Arduino編程:使用紅外遙控器控制繼電器開關

更新時間: 2019-11-16
閱讀量:8443

在本文中,英銳恩單片機開發(fā)工程師分享了一個使用紅外遙控器控制繼電器開關的案例。紅外(IR)通信技術早在WiFi和藍牙之前就已經(jīng)存在,它仍然是實現(xiàn)典型家庭自動化系統(tǒng)主要組件的關鍵組件。例如,IR技術仍用于無線耳機,家庭安全系統(tǒng)中的入侵檢測以及手持遙控器中,用于控制家庭娛樂系統(tǒng)(電視,DVD,音箱等),空調(diào)裝置和其他家用電器。由于紅外技術需要在發(fā)射器和接收器單元之間形成視線,因此它只能用于連接短距離的設備,例如在同一房間。

QQ截圖20191116114651.png

在這里,將展示如何制作基于Arduino的IR接收器,以解碼來自TV/DVD遙控器的IR信號。根據(jù)與遙控器上特定按鈕對應的解碼值,我們將對Arduino進行編程以控制多個繼電器開關。

電路設置

遙控器發(fā)送的紅外信號很容易受到附近其他紅外源(例如加熱器和白熾燈)的干擾。因此,為了使接收器區(qū)分IR信號和所有其他紅外噪聲源,已發(fā)射的IR信號被調(diào)制。對于調(diào)制,需要穩(wěn)定的載波頻率(通常為30–60 kHz),其中38Khz是最常用的載波頻率。盡管有幾種數(shù)字調(diào)制技術,但大多數(shù)現(xiàn)代消費類電子產(chǎn)品都使用幅移鍵控(ASK)來設計IR遙控器。在ASK中,載波的幅度根據(jù)數(shù)字輸入信號而變化。邏輯1由一定幅度的載波信號表示,而邏輯0通過將載波幅度更改為零(或將其關閉)表示。

在此方案中,我們將使用來自電視遙控器的IR信號來控制多個繼電器開關。為此,我們需要一個IR接收器電路,該電路將解調(diào)電視遙控器發(fā)送的IR信號。解調(diào)后的數(shù)字輸出可以由Arduino直接解釋。

TSOP1740紅外接收器內(nèi)置了該方案的接收電路。TSOP17XX系列是小型接收器,具有集成在一個封裝中的光電探測器和前置放大器,可以用于紅外遙控系統(tǒng)。內(nèi)部還使用了帶通濾波器,積分器級和自動增益控制來抑制有害噪聲。名稱的后兩位(XX)代表帶通的中心頻率。因此,TSOP1740適用于40 KHz的調(diào)制IR信號。

TSOP.png

下面顯示的是該方案所需的完整電路設置。TSOP17340的解調(diào)后輸出將輸出到Arduino引腳D11。在此演示中使用了一個雙繼電器控制板。兩個繼電器的控制引腳(IN1和IN2)由Arduino的D6和D7 I/O引腳驅動。整個電路在5V下工作。

circuit.png

此方案中使用的繼電器板具有光耦合器,用于在輸入控制引腳和輸出繼電器驅動器電路之間進行電氣隔離。這兩個繼電器單元的板載驅動器電路可在低電平有效輸入下工作。這意味著必須將IN引腳拉低以激活繼電器。以下電路描述了繼電器控制邏輯的工作方式。同樣的電路也適用于第二繼電器單元。跳線JP1允許你為輸出側(繼電器及其晶體管驅動器)選擇單獨的電源(在板上標記為JD-VCC)。如果要為整個電路使用相同的5V電源,則需要在VCC和JD-VCC引腳之間放置一個并聯(lián)跳線。從電路圖中可以很容易地看出,輸入端的邏輯0接通了光耦合器,然后激活了繼電器。

relayboard.jpg

硬件設置完成后,我們現(xiàn)在將對Arduino Nano進行編程,以接收TSOP1738解調(diào)后的輸出并解釋遙控器上各個按鈕按下的代碼。不同制造商設計了許多不同的紅外協(xié)議標準或數(shù)據(jù)格式,供消費類電子產(chǎn)品使用。最常用的協(xié)議是Philips的RC-5和RC-6,Sony的SIRC,NEC,JVC。這些協(xié)議中的每一種都有自己的發(fā)送數(shù)據(jù)格式,該格式由一些地址位和一些命令位組成。

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void dump(decode_results *results) {
 int count = results->rawlen;
 if (results->decode_type == UNKNOWN) {
 Serial.println("Could not decode message");
 } 
 else {
 Serial.println("Signal received.");
 if (results->decode_type == NEC) {
 Serial.print("Decoded NEC, ");
 } 
 else if (results->decode_type == SONY) {
 Serial.print("Decoded SONY, ");
 } 
 else if (results->decode_type == RC5) {
 Serial.print("Decoded RC5, ");
 } 
 else if (results->decode_type == RC6) {
 Serial.print("Decoded RC6, ");
 }
 Serial.print("Value= ");
 Serial.print(results->value, DEC);
 Serial.print(" (");
 Serial.print(results->bits, DEC);
 Serial.println(" bits)");
 }
 
}
void setup()
{
 Serial.begin(9600);
 Serial.println("IR decoder");
 irrecv.enableIRIn(); // Start the receiver
}
int on = 0;
unsigned long last = millis();
void loop() {
 if (irrecv.decode(&results)) {
 // Wait for 0.5sec before decoding another code
 if (millis() - last > 500) {
 
 dump(&results);
 }
 last = millis(); 
 irrecv.resume(); // Receive the next value
 }
}


我們將分兩個步驟為該方案開發(fā)Arduino固件。首先,我們將編寫一個簡單的程序來找出遙控器上特定按鈕的數(shù)字代碼(或十進制值)。它將讀取IR接收器的輸出,對消息進行解碼,并在串行監(jiān)視器窗口上打印出所用協(xié)議的類型以及所傳輸代碼的十進制值。這樣做的程序在下面發(fā)布(代碼改編自Ken Shirriff編寫的IRrelay示例)。

此測試程序的硬件設置與上面描述的相同?,F(xiàn)在,將遙控器對準面包板上的TSOP1740模塊,然后按一個按鈕,你將在串行監(jiān)視器窗口上看到該按鈕的解碼十進制值。確保串行監(jiān)視器的波特率選擇為9600。如果你的遙控器使用IRremote庫的受支持協(xié)議列表中未提供的其他數(shù)據(jù)編碼方案,則它將無法解碼該代碼。這里用兩個不同的遙控器進行了測試:一個遙控器是Sony Blueray播放器,另一個是HP多合一電腦,它能夠同時解碼。在串行監(jiān)視器窗口中,可以看到HP遙控器使用Philips RC-6協(xié)議,而Sony使用其自己的SIRC協(xié)議。在Sony遙控器上為VOL+和VOL-。

testserialmonitor.png

現(xiàn)在我們知道特定按鈕按下會發(fā)送什么代碼,我們可以修改代碼以實現(xiàn)用于切換繼電器電路的附加邏輯。我們將對Arduino進行編程以執(zhí)行以下邏輯。

按下VOL +時,繼電器1打開。
按下VOL-時,繼電器1將關閉。
按下CH +時,繼電器2打開。
按下CH-時,繼電器2將關閉。
按下暫停按鈕時,兩個繼電器都將關閉。
按下PLAY按鈕時,兩個繼電器都打開。

以下為執(zhí)行此任務的代碼:

#include <IRremote.h>
#define SW1 6 // Relay control pins are 6 and 7
#define SW2 7
int RECV_PIN = 11; // IR receive pin is 11
IRrecv irrecv(RECV_PIN);
long int decodedCode; 
decode_results rcv;
void controlRelays(){
 if(decodedCode == 1168) digitalWrite(SW1, LOW); 
 if(decodedCode == 3216) digitalWrite(SW1, HIGH); 
 if(decodedCode == 144) digitalWrite(SW2, LOW); 
 if(decodedCode == 2192) digitalWrite(SW2, HIGH); 
 if(decodedCode == 625479){
 digitalWrite(SW1, HIGH); // All off 
 digitalWrite(SW2, HIGH); 
 }
 if(decodedCode == 363335){
 digitalWrite(SW1, LOW); // All on 
 digitalWrite(SW2, LOW);
 }
 delay(300);
}
void setup(){
 pinMode(SW1, OUTPUT);
 pinMode(SW2, OUTPUT);
 digitalWrite(SW1, HIGH); // Relay is active low, so HIGH will turn it off at startup
 digitalWrite(SW2, HIGH); 
 Serial.begin(9600);
 Serial.println("IR relay controller");
 irrecv.enableIRIn(); 
}
void loop(){
 if (irrecv.decode(&rcv)) {
 Serial.print("Signal received, Value= ");
 decodedCode = rcv.value;
 Serial.println(decodedCode, DEC);
 controlRelays();
 irrecv.resume(); 
 }
}


將程序上傳到Arduino之后,享受通過遙控器打開和關閉繼電器的樂趣。就可以輕松地將更多的繼電器添加到Arduino的其他免費I/O引腳,并添加更多的if語句,以類似的方式控制它們。

以上就是英銳恩單片機開發(fā)工程師分享的使用紅外遙控器控制繼電器開關的方法。英銳恩專注單片機應用方案設計與開發(fā),提供8位單片機、16位單片機、32位單片機

军事| 日喀则市| 堆龙德庆县| 漾濞| 阜康市| 红原县| 锡林浩特市| 三明市| 古交市| 惠安县| 凤凰县| 威海市| 尉犁县| 五常市| 饶阳县| 福海县| 藁城市| 溆浦县| 富宁县| 南溪县| 鄢陵县| 福海县| 卓资县| 社会| 安塞县| 宜良县| 寿光市| 鹤山市| 盐亭县| 常山县| 柯坪县| 寿宁县| 文安县| 休宁县| 广宁县| 夏河县| 绍兴县| 五常市| 墨竹工卡县| 孙吴县| 连山|