您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>無線通信>

如何使用Arduino構(gòu)建一個無線門鈴

2022年08月19日 15:57 circuitdigest 作者:Manoj Kumar 用戶評論(0

  我們都知道有線門鈴系統(tǒng)需要電線和合適的插座才能令人滿意地工作。由于有線門鈴系統(tǒng)需要復(fù)雜的布線,需要有經(jīng)驗的人才能完成工作,無論是工作還是外觀都不好。它的另一個問題是,如果您想為現(xiàn)有房屋安裝有線門鈴系統(tǒng),則安裝需要更多的精力和時間。由于溫度和濕度以及其他環(huán)境因素,電線會損壞并導(dǎo)致短路。這就是無線門鈴系統(tǒng)發(fā)揮作用的地方。盡管無線門鈴系統(tǒng)的成本更高,但與有線門鈴系統(tǒng)相比,無線門鈴系統(tǒng)的定期維護(hù)比有線門鈴系統(tǒng)低,這需要有經(jīng)驗的人進(jìn)行維護(hù)。在安裝方面,無線門鈴系統(tǒng)的安裝非常簡單,無需經(jīng)驗人員即可安裝。除此之外,無線門鈴系統(tǒng)還具有攝像頭、錄像機(jī)等附加功能,外觀時尚,完全無線,可以輕松安裝在房子的任何地方。

  在這個項目中,我們將使用 Arduino 構(gòu)建一個無線門鈴。我們將有一個按鈕,按下該按鈕將無線播放我們選擇的旋律,以指示有人在門口。對于無線連接,我們將使用 433 MHz 射頻模塊。一般來說,RF 模塊必須始終伴隨著解碼器和編碼器模塊,但我們也可以使用本教程中使用的 Arduino 等微控制器來代替解碼器和編碼器模塊。

  所需硬件

  射頻模塊

  阿杜諾

  蜂鳴器

  按鈕

  面包板

  連接線

  433 MHz 射頻模塊:

  對于我們基于 Arduino 的無線門鈴,我們將使用 433 MHz 無線射頻模塊。RF模塊,即射頻模塊,由兩個模塊組成,一個接收數(shù)據(jù)的模塊稱為接收器,一個傳輸數(shù)據(jù)的模塊稱為發(fā)射器。

poYBAGL_QiCAVTboAAPQXnCbIfM984.png

  射頻發(fā)射器:

  發(fā)射器由一個調(diào)諧到 433MHz 頻率的 SAW 諧振器、一個開關(guān)電路和一些無源元件組成。

poYBAGL_QhyACkSuAAB9cr2WROA944.png

  當(dāng)數(shù)據(jù)引腳的輸入為高電平時,開關(guān)將起到短路作用,振蕩器運行,在一段時間內(nèi)產(chǎn)生固定幅度的載波和固定頻率。當(dāng)數(shù)據(jù)引腳的輸入為低電平時,開關(guān)作為開路,輸出為零。這也稱為幅移鍵控 (ASK)。我們將在本文后面討論更多

  接收電路:

  射頻接收器是一個簡單的電路,由射頻調(diào)諧電路、放大器電路和鎖相環(huán)電路組成。

poYBAGL_QhiAemAZAABWZEoH5gY968.png

  RF調(diào)諧器用于將電路調(diào)諧到特定頻率,該頻率需要滿足發(fā)射頻率。放大器電路用于從所有其他信號放大特定頻率并增加特定頻率的靈敏度。

  鎖相環(huán)電路:

  鎖相環(huán)電路 (PLL) 是一種用于我們希望從低頻參考信號中獲得高度穩(wěn)定頻率的設(shè)備類型的電路。PLL 是一個負(fù)反饋系統(tǒng),由一個壓控振蕩器和一個相位比較器組成,其連接方式使振蕩器頻率始終與輸入信號匹配,如下所示。

poYBAGL_QhSAE3ELAACiU5d9nSo895.png

  在 PLL 電路中,兩個信號,即來自參考信號和來自壓控振蕩器 (VCO) 的信號,作為相位檢測器的輸入,相位檢測器的輸出是兩個輸入之間的差異,這個輸出是兩個信號的相位差。該輸出包含頻率分量,它們是信號的和和差。所以,這個輸出作為低通濾波器的輸入,它只允許低頻,不允許高頻信號通過。低通濾波器的輸出被饋送到壓控振蕩器 (VCO),這個輸入充當(dāng) VOC 的一個值,必須改變它以減小兩個信號之間的相位差。VCO 發(fā)生變化,直到相位差最小,或者相位檢測器的輸出具有恒定的誤差輸出。這會導(dǎo)致循環(huán)鎖定情況。

  通過所有這些組件,接收器接收來自天線的信號,然后通過射頻調(diào)諧電路進(jìn)行調(diào)諧,并使用 OP-Amp 放大這個微弱的信號,并將這個放大的信號進(jìn)一步用作 PLL 的輸入,從而使解碼器鎖定到輸入的數(shù)字位上,這會產(chǎn)生噪聲較小的輸出。

  調(diào)制:

  調(diào)制是將數(shù)據(jù)轉(zhuǎn)換為電信號的過程,這些調(diào)制后的信號用于傳輸。我們調(diào)制信號,以便我們可以將必要的信號與其他信號分開。如果沒有調(diào)制,所有具有相同頻率的信號將混合在一起,這將導(dǎo)致錯誤。調(diào)制方式有很多種,流行的有模擬調(diào)制、數(shù)字調(diào)制、脈沖調(diào)制和擴(kuò)頻。

  其中,無線傳輸中最常用的一種是數(shù)字調(diào)制。流行的數(shù)字調(diào)制技術(shù)是幅移鍵控、頻移鍵控、相移鍵控、正交幅度調(diào)制。

  幅移鍵控 (ASK) 調(diào)制:

  在幅移鍵調(diào)制中,正弦載波會不斷產(chǎn)生連續(xù)的高頻載波,被調(diào)制的信號是二進(jìn)制序列,這些信號使輸入到開關(guān)電路的信號為高電平或低電平。

poYBAGL_Qg-ARLI8AABdccqLSNo070.png

  如上圖所示,當(dāng)輸入為低電平時,開關(guān)將作為開路,輸出為零。當(dāng)開關(guān)的輸入為高電平時,輸出將是載波信號。

  Arduino射頻發(fā)射器電路圖

  我們的無線門鈴項目需要一個發(fā)射器和接收器電路,每個電路都有自己的 Arduino 板。門鈴發(fā)射器的電路圖如下所示

pYYBAGL_QguALHqdAAI4dJbf1NQ649.png

  Arduino管腳5接門鈴開關(guān)的一端,開關(guān)的另一端接電源電壓。一個10kohm的下拉電阻連接到引腳5,如圖所示。引腳 11 連接到發(fā)射器模塊的數(shù)據(jù)引腳。Vcc 連接到電源電壓,發(fā)射器模塊的接地引腳接地。

pYYBAGL_QgeANtcRAAf-iBKusVc337.png

  在這里,我使用面包板連接模塊,按鈕用作門鈴開關(guān)。

  Arduino射頻接收器電路圖

  同樣,在接收器端,我們需要使用另一個帶有射頻接收器模塊的 Arduino 板。然后Arduino門鈴接收器 電路也有一個蜂鳴器,當(dāng)按鈕被按下時播放一些旋律。

pYYBAGL_QgSAa1qLAAHNnDJm1qo997.png

  在這里,我們將Arduino的引腳7連接到蜂鳴器正極,負(fù)極接地。VCC 的電源電壓提供給接收模塊,模塊的 GND 引腳接地。接收模塊的輸出引腳連接到 Arduino 的第 12引腳。

poYBAGL_QgGAFP37AAi-TRXbYr4979.png

  接收模塊由 4 個引腳組成,其中一個引腳接地,另一個引腳用于提供 VCC 電源,其余兩個引腳用于數(shù)據(jù)傳輸。在上圖中,一個蜂鳴器連接到 Arduino 的數(shù)字 7 引腳,而 Arduino 的第 12 引腳連接到接收模塊輸出引腳。

Arduino發(fā)射器代碼說明

本頁底部給出了 Arduino 發(fā)射器部分的完整代碼。代碼解釋如下。

這些是使用 RF 模塊發(fā)送或接收數(shù)據(jù)所需的頭文件。這些庫使 Arduino 和模塊之間的連接變得簡單。如果沒有這些,您必須手動編寫將 RF 模塊與 Arduino 連接的代碼。創(chuàng)建一個對象“驅(qū)動程序”以訪問用于發(fā)送和接收數(shù)據(jù)的命令。您可以從 Github下載適用于 Arduino 的 Radio Head Library。

?

#include 
#include  // 沒有實際使用,但需要編譯
RH_ASK 驅(qū)動程序;

?

?Serial.begin() 用于查找 RF 發(fā)射器模塊是否工作,我已將 PIN 5(數(shù)字引腳 5)初始化為輸入引腳,它充當(dāng)門鈴開關(guān)。

?

無效設(shè)置()
{
   序列號.開始(9600);// 僅調(diào)試
   pinMode(5,輸入);

?

此代碼用于在程序啟動時 RF TX 模塊未初始化并且僅運行那些時打印消息“init failed”。

?

   如果 (!driver.init())
        Serial.println("初始化失敗");

?

if函數(shù)檢查引腳是邏輯高電平還是低電平,即門鈴開關(guān)是打開狀態(tài)還是關(guān)閉狀態(tài)。指針 msg 包含我們要通過發(fā)送器發(fā)送的消息。需要注意的是,我們必須知道需要發(fā)送的字符數(shù)。這將有助于編寫接收器代碼。?

?

   如果(數(shù)字讀?。?)==高){
 const char *msg = "a";

?

strlen()命令檢查消息的長度,在本例中為 1。driver.send() 命令將數(shù)據(jù)發(fā)送到 tx 模塊,然后將其轉(zhuǎn)換為波形。命令 driver.waitPacketSent() 用于等待數(shù)據(jù)發(fā)送完畢。

?

driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();

?

Arduino接收器代碼說明

Receiver 程序也在本頁末尾的 Transmitter 代碼下方給出,或者可以從這里下載。您可以直接將它與您的硬件一起使用;代碼解釋如下。

這些是使用 RF 模塊發(fā)送或接收數(shù)據(jù)所需的頭文件。這些庫使 Arduino 和 RF 模塊之間的連接變得簡單。如果沒有這些,您必須手動編寫將 RF 模塊與 Arduino 連接的代碼。

?

#include 
#include  // 沒有實際使用,但需要編譯

?

這些是為代碼創(chuàng)建的頭文件,用于將頻率值等同于特定音符并獲取音符值以獲取音調(diào)。如果您想了解更多有關(guān) pitches.h 或如何使用 Arduino 和蜂鳴器演奏旋律的信息,您可以參考這個Melody using Tone() Function教程。?

?

#include "pitches.h" //為音符添加等效頻率
#include "themes.h" //添加注釋值和持續(xù)時間

?

創(chuàng)建一個對象“驅(qū)動程序”以訪問用于發(fā)送和接收數(shù)據(jù)的命令。

?

RH_ASK 驅(qū)動程序;

?

在串行監(jiān)視器中打印消息。然后 if?條件檢查初始化是否失敗。

?

無效設(shè)置()
{
    序列號.開始(9600);// 調(diào)試目的
  如果 (!driver.init())
         Serial.println("初始化失敗");
     別的
        Serial.println("完成");

?

整個代碼處理所需旋律的音符、音高和持續(xù)時間

?

無效 Play_Pirates()
{
  for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {
    int noteDuration = 1000 / Pirates_duration[thisNote];//將持續(xù)時間轉(zhuǎn)換為時間延遲
    音調(diào)(8, Pirates_note[thisNote], noteDuration);
    int pauseBetweenNotes = noteDuration * 1.05; //這里1.05是節(jié)奏,增加播放更慢
    延遲(pauseBetweenNotes);
    無音(8);//停止8號針上的音樂
    }
}

?

命令uint8_t buf[1]將buf初始化為長度為 8 位的無符號整數(shù),buf變量的大小為 1,正如我之前告訴你的,我們應(yīng)該發(fā)送多少位并獲取buf變量的長度以二進(jìn)制形式。

?

無效循環(huán)()
{
        uint8_t buf[1];
    uint8_t buflen = sizeof(buf);

?

此代碼檢查我們是否接收到正確的數(shù)據(jù),如果接收到的信號正確,它會播放歌曲。

?

    if (driver.recv(buf, &buflen)) // 非阻塞
      Serial.println("選中 -> '他是海盜'");
      Play_Pirates();
      Serial.println("停止");

?

  無線Arduino門鈴工作

  發(fā)射器模塊和 Arduino 一起連接在門附近,接收器模塊和 Arduino 一起可以安裝在房間的任何地方。當(dāng)有人按下開關(guān)時,它會向Arduino的第5個引腳發(fā)送高脈沖,該引腳與發(fā)射器模塊一起連接在門附近。在我們的接收器代碼中,我們編寫了一個命令——digitalRead(5),這個命令使 Arduino 繼續(xù)讀取這個引腳。當(dāng)該引腳變?yōu)楦唠娖綍r,Arduino 通過發(fā)送器發(fā)送數(shù)據(jù),這些信號被接收器接收。連接蜂鳴器的 Arduino 讀取這些信號,當(dāng)接收到所需數(shù)據(jù)時,滿足 if 函數(shù),代碼將啟動函數(shù)Play_Pirates()并開始播放音樂。

pYYBAGL_QfeAfkFHAAbI5cU9_vQ355.png

門鈴發(fā)射器代碼


// ask_transmitter.pde

// -*- 模式:C++ -*-

// 如何使用 RadioHead 傳輸消息的簡單示例

// 以非常簡單的方式使用簡單的 ASK 發(fā)送器。

// 使用 TX-C1 模塊實現(xiàn)單工(單向)發(fā)送器



#include

#include // 沒有實際使用,但需要編譯



RH_ASK 驅(qū)動程序;

// RH_ASK 驅(qū)動程序(2000, 2, 4, 5); // ESP8266ESP32:不要使用 pin 11





無效設(shè)置()

{

序列號.開始(9600);// 僅調(diào)試

pinMode(5,輸入);

如果 (!driver.init())

Serial.println("初始化失敗");

}



無效循環(huán)()

{

如果(數(shù)字讀?。?)==高){

const char *msg = "a";

driver.send((uint8_t *)msg, strlen(msg));

driver.waitPacketSent();

延遲(200);

}

}




門鈴接收器代碼


#include

#include // 沒有實際使用但需要編譯

#include "pitches.h" //為音符添加等效頻率

#include "themes.h" //添加注釋值和持續(xù)時間



RH_ASK 驅(qū)動程序;



無效設(shè)置()

{

序列號.開始(9600);// 僅調(diào)試



如果 (!driver.init())

Serial.println("初始化失敗");

別的

Serial.println("完成");

}



無效 Play_Pirates()

{

for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {



int noteDuration = 1000 / Pirates_duration[thisNote];//將持續(xù)時間轉(zhuǎn)換為時間延遲

音調(diào)(8, Pirates_note[thisNote], noteDuration);



int pauseBetweenNotes = noteDuration * 1.05; //這里1.05是節(jié)奏,增加播放更慢

延遲(pauseBetweenNotes);

無音(8);//停止8號針上的音樂

}

}



無效循環(huán)()

{

uint8_t buf[1];

uint8_t buflen = sizeof(buf);



if (driver.recv(buf, &buflen)) // 非阻塞

{

Serial.println("選中 -> '他是海盜'");

Play_Pirates();

Serial.println("停止");

}

}

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

( 發(fā)表人:陳翠 )

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?