如何使用Arduino構建一個無線門鈴
我們都知道有線門鈴系統需要電線和合適的插座才能令人滿意地工作。由于有線門鈴系統需要復雜的布線,需要有經驗的人才能完成工作,無論是工作還是外觀都不好。它的另一個問題是,如果您想為現有房屋安裝有線門鈴系統,則安裝需要更多的精力和時間。由于溫度和濕度以及其他環境因素,電線會損壞并導致短路。這就是無線門鈴系統發揮作用的地方。盡管無線門鈴系統的成本更高,但與有線門鈴系統相比,無線門鈴系統的定期維護比有線門鈴系統低,這需要有經驗的人進行維護。在安裝方面,無線門鈴系統的安裝非常簡單,無需經驗人員即可安裝。除此之外,無線門鈴系統還具有攝像頭、錄像機等附加功能,外觀時尚,完全無線,可以輕松安裝在房子的任何地方。
在這個項目中,我們將使用 Arduino 構建一個無線門鈴。我們將有一個按鈕,按下該按鈕將無線播放我們選擇的旋律,以指示有人在門口。對于無線連接,我們將使用 433 MHz 射頻模塊。一般來說,RF 模塊必須始終伴隨著解碼器和編碼器模塊,但我們也可以使用本教程中使用的 Arduino 等微控制器來代替解碼器和編碼器模塊。
所需硬件:
射頻模塊
阿杜諾
蜂鳴器
按鈕
面包板
連接線
433 MHz 射頻模塊:
對于我們基于 Arduino 的無線門鈴,我們將使用 433 MHz 無線射頻模塊。RF模塊,即射頻模塊,由兩個模塊組成,一個接收數據的模塊稱為接收器,一個傳輸數據的模塊稱為發射器。
射頻發射器:
發射器由一個調諧到 433MHz 頻率的 SAW 諧振器、一個開關電路和一些無源元件組成。
當數據引腳的輸入為高電平時,開關將起到短路作用,振蕩器運行,在一段時間內產生固定幅度的載波和固定頻率。當數據引腳的輸入為低電平時,開關作為開路,輸出為零。這也稱為幅移鍵控 (ASK)。我們將在本文后面討論更多
接收電路:
射頻接收器是一個簡單的電路,由射頻調諧電路、放大器電路和鎖相環電路組成。
RF調諧器用于將電路調諧到特定頻率,該頻率需要滿足發射頻率。放大器電路用于從所有其他信號放大特定頻率并增加特定頻率的靈敏度。
鎖相環電路:
鎖相環電路 (PLL) 是一種用于我們希望從低頻參考信號中獲得高度穩定頻率的設備類型的電路。PLL 是一個負反饋系統,由一個壓控振蕩器和一個相位比較器組成,其連接方式使振蕩器頻率始終與輸入信號匹配,如下所示。
在 PLL 電路中,兩個信號,即來自參考信號和來自壓控振蕩器 (VCO) 的信號,作為相位檢測器的輸入,相位檢測器的輸出是兩個輸入之間的差異,這個輸出是兩個信號的相位差。該輸出包含頻率分量,它們是信號的和和差。所以,這個輸出作為低通濾波器的輸入,它只允許低頻,不允許高頻信號通過。低通濾波器的輸出被饋送到壓控振蕩器 (VCO),這個輸入充當 VOC 的一個值,必須改變它以減小兩個信號之間的相位差。VCO 發生變化,直到相位差最小,或者相位檢測器的輸出具有恒定的誤差輸出。這會導致循環鎖定情況。
通過所有這些組件,接收器接收來自天線的信號,然后通過射頻調諧電路進行調諧,并使用 OP-Amp 放大這個微弱的信號,并將這個放大的信號進一步用作 PLL 的輸入,從而使解碼器鎖定到輸入的數字位上,這會產生噪聲較小的輸出。
調制:
調制是將數據轉換為電信號的過程,這些調制后的信號用于傳輸。我們調制信號,以便我們可以將必要的信號與其他信號分開。如果沒有調制,所有具有相同頻率的信號將混合在一起,這將導致錯誤。調制方式有很多種,流行的有模擬調制、數字調制、脈沖調制和擴頻。
其中,無線傳輸中最常用的一種是數字調制。流行的數字調制技術是幅移鍵控、頻移鍵控、相移鍵控、正交幅度調制。
幅移鍵控 (ASK) 調制:
在幅移鍵調制中,正弦載波會不斷產生連續的高頻載波,被調制的信號是二進制序列,這些信號使輸入到開關電路的信號為高電平或低電平。
如上圖所示,當輸入為低電平時,開關將作為開路,輸出為零。當開關的輸入為高電平時,輸出將是載波信號。
Arduino射頻發射器電路圖
我們的無線門鈴項目需要一個發射器和接收器電路,每個電路都有自己的 Arduino 板。門鈴發射器的電路圖如下所示
Arduino管腳5接門鈴開關的一端,開關的另一端接電源電壓。一個10kohm的下拉電阻連接到引腳5,如圖所示。引腳 11 連接到發射器模塊的數據引腳。Vcc 連接到電源電壓,發射器模塊的接地引腳接地。
在這里,我使用面包板連接模塊,按鈕用作門鈴開關。
Arduino射頻接收器電路圖
同樣,在接收器端,我們需要使用另一個帶有射頻接收器模塊的 Arduino 板。然后Arduino門鈴接收器 電路也有一個蜂鳴器,當按鈕被按下時播放一些旋律。
在這里,我們將Arduino的引腳7連接到蜂鳴器正極,負極接地。VCC 的電源電壓提供給接收模塊,模塊的 GND 引腳接地。接收模塊的輸出引腳連接到 Arduino 的第 12引腳。
接收模塊由 4 個引腳組成,其中一個引腳接地,另一個引腳用于提供 VCC 電源,其余兩個引腳用于數據傳輸。在上圖中,一個蜂鳴器連接到 Arduino 的數字 7 引腳,而 Arduino 的第 12 引腳連接到接收模塊輸出引腳。
Arduino發射器代碼說明
本頁底部給出了 Arduino 發射器部分的完整代碼。代碼解釋如下。
這些是使用 RF 模塊發送或接收數據所需的頭文件。這些庫使 Arduino 和模塊之間的連接變得簡單。如果沒有這些,您必須手動編寫將 RF 模塊與 Arduino 連接的代碼。創建一個對象“驅動程序”以訪問用于發送和接收數據的命令。您可以從 Github下載適用于 Arduino 的 Radio Head Library。
?
#include #include // 沒有實際使用,但需要編譯 RH_ASK 驅動程序;
?
?Serial.begin() 用于查找 RF 發射器模塊是否工作,我已將 PIN 5(數字引腳 5)初始化為輸入引腳,它充當門鈴開關。
?
無效設置() { 序列號.開始(9600);// 僅調試 pinMode(5,輸入);
?
此代碼用于在程序啟動時 RF TX 模塊未初始化并且僅運行那些時打印消息“init failed”。
?
如果 (!driver.init()) Serial.println("初始化失敗");
?
if函數檢查引腳是邏輯高電平還是低電平,即門鈴開關是打開狀態還是關閉狀態。指針 msg 包含我們要通過發送器發送的消息。需要注意的是,我們必須知道需要發送的字符數。這將有助于編寫接收器代碼。?
?
如果(數字讀取(5)==高){ const char *msg = "a";
?
strlen()命令檢查消息的長度,在本例中為 1。driver.send() 命令將數據發送到 tx 模塊,然后將其轉換為波形。命令 driver.waitPacketSent() 用于等待數據發送完畢。
?
driver.send((uint8_t *)msg, strlen(msg)); driver.waitPacketSent();
?
Arduino接收器代碼說明
Receiver 程序也在本頁末尾的 Transmitter 代碼下方給出,或者可以從這里下載。您可以直接將它與您的硬件一起使用;代碼解釋如下。
這些是使用 RF 模塊發送或接收數據所需的頭文件。這些庫使 Arduino 和 RF 模塊之間的連接變得簡單。如果沒有這些,您必須手動編寫將 RF 模塊與 Arduino 連接的代碼。
?
#include #include // 沒有實際使用,但需要編譯
?
這些是為代碼創建的頭文件,用于將頻率值等同于特定音符并獲取音符值以獲取音調。如果您想了解更多有關 pitches.h 或如何使用 Arduino 和蜂鳴器演奏旋律的信息,您可以參考這個Melody using Tone() Function教程。?
?
#include "pitches.h" //為音符添加等效頻率 #include "themes.h" //添加注釋值和持續時間
?
創建一個對象“驅動程序”以訪問用于發送和接收數據的命令。
?
RH_ASK 驅動程序;
?
在串行監視器中打印消息。然后 if?條件檢查初始化是否失敗。
?
無效設置() { 序列號.開始(9600);// 調試目的 如果 (!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];//將持續時間轉換為時間延遲 音調(8, Pirates_note[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.05; //這里1.05是節奏,增加播放更慢 延遲(pauseBetweenNotes); 無音(8);//停止8號針上的音樂 } }
?
命令uint8_t buf[1]將buf初始化為長度為 8 位的無符號整數,buf變量的大小為 1,正如我之前告訴你的,我們應該發送多少位并獲取buf變量的長度以二進制形式。
?
無效循環() { uint8_t buf[1]; uint8_t buflen = sizeof(buf);
?
此代碼檢查我們是否接收到正確的數據,如果接收到的信號正確,它會播放歌曲。
?
if (driver.recv(buf, &buflen)) // 非阻塞 Serial.println("選中 -> '他是海盜'"); Play_Pirates(); Serial.println("停止");
?
無線Arduino門鈴工作
發射器模塊和 Arduino 一起連接在門附近,接收器模塊和 Arduino 一起可以安裝在房間的任何地方。當有人按下開關時,它會向Arduino的第5個引腳發送高脈沖,該引腳與發射器模塊一起連接在門附近。在我們的接收器代碼中,我們編寫了一個命令——digitalRead(5),這個命令使 Arduino 繼續讀取這個引腳。當該引腳變為高電平時,Arduino 通過發送器發送數據,這些信號被接收器接收。連接蜂鳴器的 Arduino 讀取這些信號,當接收到所需數據時,滿足 if 函數,代碼將啟動函數Play_Pirates()并開始播放音樂。
門鈴發射器代碼
// ask_transmitter.pde
// -*- 模式:C++ -*-
// 如何使用 RadioHead 傳輸消息的簡單示例
// 以非常簡單的方式使用簡單的 ASK 發送器。
// 使用 TX-C1 模塊實現單工(單向)發送器
#include
#include // 沒有實際使用,但需要編譯
RH_ASK 驅動程序;
// RH_ASK 驅動程序(2000, 2, 4, 5); // ESP8266 或 ESP32:不要使用 pin 11
無效設置()
{
序列號.開始(9600);// 僅調試
pinMode(5,輸入);
如果 (!driver.init())
Serial.println("初始化失敗");
}
無效循環()
{
如果(數字讀取(5)==高){
const char *msg = "a";
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
延遲(200);
}
}
門鈴接收器代碼
#include
#include // 沒有實際使用但需要編譯
#include "pitches.h" //為音符添加等效頻率
#include "themes.h" //添加注釋值和持續時間
RH_ASK 驅動程序;
無效設置()
{
序列號.開始(9600);// 僅調試
如果 (!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];//將持續時間轉換為時間延遲
音調(8, Pirates_note[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.05; //這里1.05是節奏,增加播放更慢
延遲(pauseBetweenNotes);
無音(8);//停止8號針上的音樂
}
}
無效循環()
{
uint8_t buf[1];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) // 非阻塞
{
Serial.println("選中 -> '他是海盜'");
Play_Pirates();
Serial.println("停止");
}
}
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
相關閱讀:
- [電子說] 超詳細!安信可BW16模組如何搭建Arduino開發環境? 2023-10-23
- [電子說] 安信可BW16模組如何搭建Arduino開發環境? 2023-10-21
- [電子說] DIY錫膏自動分配器項目分享 2023-10-17
- [電子說] 使用Arduino的帶有語音警報的運動傳感器 2023-10-15
- [電子說] 使用TCS3200模塊進行顏色識別 2023-10-15
- [電子說] 使用Arduino的無線傳感器節點和遠程數據接收器 2023-10-15
- [電子說] 如何使用Python和PinPong庫控制Arduino 2023-10-13
- [電子說] Arduino CEO揭秘開源開發環境的演進之路 2023-10-12
( 發表人:陳翠 )