資料介紹
描述
簡介
僅使用智能手機即可控制家中任何電器的能力非常有趣。這個項目包括使用一個 Arduino、一個便宜的藍牙模塊和一個繼電器來控制,例如,通過藍牙將它與您的智能手機連接來控制一盞燈。這個項目旨在使用最少的資源和代碼來簡單,但仍然包括整個過程的重要演示和描述。
重要說明:此項目涉及使用高壓設備,因此建議格外小心,并盡可能在有經驗的人的監督下進行此項目。
內容簡介
在接下來的部分中,我們將按如下所示的順序更詳細地討論一些主題。
原理圖
![relay_bb_jHQ48yEvCR.png?auto=compress%2Cformat&w=740&h=555&fit=max](https://hackster.imgix.net/uploads/attachments/273065/relay_bb_jHQ48yEvCR.png?auto=compress%2Cformat&w=740&h=555&fit=max)
讓我們從設置藍牙模塊(圖中左下方的組件)開始。如您所見,我們從 Arduino 一直拉出 5V 和地線,一直到藍牙模塊(紅線和黑線)。對于通信引腳,我們需要將發射器引腳 (TX) 連接到 Arduino 的接收器引腳 (RX)(綠線),將發射器引腳連接到 Arduino 的接收器引腳(橙色線)。如果你檢查藍牙模塊的背面,它會有一個標簽顯示它的接收器引腳可以處理多少電壓(在我的例子中是 3.3V)并且由于我們的 Arduino 提供 5V,藍牙模塊在頻繁使用后可能會燒毀,這是為什么我們需要將該電壓降低到 3.3V。因此,它包含 2 個電阻器,用作穿過橙色線的“分壓器”。電阻是 560 歐姆,而第二個R2是 1K 歐姆。我使用這些電阻器是因為它是我設備中的電阻器,但如果你有任何其他電阻器,也許你可以使用這個公式找到適合你的設置,這會使電壓降低一點:
Vout = (Vsource x R2)/R1+R2
就我而言,我得到了:
Vout = 5 x 1000 / 1560 = 3.2V..足夠接近..
(在谷歌上搜索分壓器計算器,它會給你很好的解釋和快速的計算)。
至于繼電器,我們還為它提供電源和地線(紅線和黑線)以及連接到 Arduino 的 10 號引腳的信號線,例如,它將命令繼電器何時打開或關閉我們的燈。
藍色線代表插頭/插座擴展線。顯然,您不希望將繼電器直接連接到燈的內置插頭延長件,這會破壞該項目,因此建議購買獨立的插頭/插座延長件。我所做的是購買一根較小的電線,并在上面的幻燈片照片中添加插頭和插座。
現在您有了延長線,拉出 1 根延長線并剪斷它,您最終會得到 2 個電線末端(如上面的 2 張照片所示)。但是你在哪里可以將這兩個端點連接到繼電器呢?Relay有3個端口,NC(常閉),C(Common),NO(常開)。這意味著,當繼電器處于正常狀態(沒有信號發送到繼電器)時,NC 和 C 端口之間將建立連接。當發送信號時,將在 C 和 NO 之間設置連接。這就是為什么我們將 2 線端連接到 C 和 NO 的原因,因為我們想向繼電器發送信號,以便讓電流流過這兩個通道并為我們的設備提供能量。這里有很好的解釋:http ://www.pcbheaven.com/wikipages/How_Relays_Work/
Arduino代碼
#include
#define RELAY 10
#define LIGHT 13
SoftwareSerial btm(2,3); // rx tx
int index = 0;
char data[10];
char c;
boolean flag = false;
void setup() {
pinMode(RELAY,OUTPUT);
pinMode(LIGHT,OUTPUT);
digitalWrite(RELAY,HIGH);
digitalWrite(LIGHT,LOW);
btm.begin(9600);
}
void loop() {
if(btm.available() > 0){
while(btm.available() > 0){
c = btm.read();
delay(10); //Delay required
data[index] = c;
index++;
}
data[index] = '\0';
flag = true;
}
if(flag){
processCommand();
flag = false;
index = 0;
data[0] = '\0';
}
}
void processCommand(){
char command = data[0];
char inst = data[1];
switch(command){
case 'R':
if(inst == 'Y'){
digitalWrite(RELAY,LOW);
btm.println("Relay: ON");
}
else if(inst == 'N'){
digitalWrite(RELAY,HIGH);
btm.println("Relay: OFF");
}
break;
case 'L':
if(inst == 'Y'){
digitalWrite(LIGHT,HIGH);
btm.println("Light: ON");
}
else if(inst == 'N'){
digitalWrite(LIGHT,LOW);
btm.println("Light: OFF");
}
break;
}
}
上面顯示的 Arduino 代碼通常分為 4 個階段。
- 5.1. 初始化
- 52.設置
- 5.3. 環形
- 5.4. 處理命令
重要的是要注意上面的所有代碼都是從 Arduino 的角度來看的,這意味著所有的“讀取”操作都是 arduino 從其他來源接收數據的操作,寫操作是 arduino 發送的操作消息也發送到其他來源。我們系統中的使用順序是這樣的:
- 一種。用戶單擊智能手機中的按鈕以執行藍牙命令。
- b. 藍牙模塊接收它并將該命令發送到 Arduino。
- C。然后 Arduino 將處理該命令并向繼電器發送信號以將其打開或關閉。
- d. 然后 Arduino 向藍牙模塊發送成功消息,藍牙模塊將此消息發送回智能手機。
初始化
在前幾行代碼中,我們首先包含允許我們與藍牙模塊通信的 SoftwareSerial 庫。它還允許我們將不同的引腳用作接收器和發射器引腳,而不是為 Arduino 預定義的引腳(引腳 0 = RX 和引腳 1 = TX)。相反,我們將為 Arduino 的 RX 使用 2 號引腳,為 Arduino 的 TX 使用 3 號引腳。然后我們創建常量來標識我們希望用于每個組件的引腳,在這種情況下,Arduino 控制繼電器的引腳是 10 號,而控制 Arduino 內置燈的引腳是 13 號。(這是可選的,如果你不想使用它也沒關系)。然后,名為“data”的“char”類型的數據結構充當我們從藍牙模塊傳入的消息的緩沖區,循環部分。
設置
預定義方法“setup”將是我們實際預期的程序開始運行之前要執行的第一個方法。它基本上允許我們在主程序執行之前配置一些 Arduino 的引腳和其他東西。因此,我們首先說 RELAY 引腳將是一個 OUTPUT 引腳,因為我們要發送一個信號來關閉或打開繼電器。LIGHT 引腳也是如此。此外,我們可以選擇是否要啟動程序并使用“digitalWrite”立即開始發送信號。在繼電器的情況下,我們確實想要開始發送信號,因為繼電器的工作方式有點違反直覺,因為繼電器的工作方式是當繼電器檢測到信號時,它會自行關閉,否則它切換回 ON。
環形
顧名思義,循環是一種被迭代調用的方法,以便重復處理我們傳遞給它的任何信息。話雖如此,我們首先檢查是否有來自藍牙模塊的傳入消息,如果有,則我們進入一個循環以繼續逐字節讀取這些消息(每次迭代讀取類型“char”)。關于代碼 delay(10) 行,老實說,我不完全確定為什么代碼只適用于該 delay(10)。當我嘗試不使用那行代碼時,消息沒有被正確地接收到稱為“數據”(我們的緩沖區)的字符數組中,我得到的只是緩沖區中的一堆垃圾。我最好的猜測,這就是我使用它的原因,事實上,我們的組件在接收和傳輸時有不同的處理速度,在這種情況下是 Arduino 和藍牙模塊。在網絡上的一些 Arduino 代碼中,可以看到一些延遲代碼行,其中一些可能用于此目的。在這個延遲之后,假設我們已經讀取了消息的第一個字節 (char),然后我們將它添加到我們的緩沖區并增加稱為“索引”的計數器以繼續沿著數組的維度迭代和遞增地添加更多字節/緩沖。消息被讀取后,我們退出 while 循環并說“是”,有一條消息要處理(通過將標志設置為 true)。并且還添加一個 '\0' 來指示緩沖區的結束。最后,
處理命令
最后,processCommand 方法將決定如何處理之前在循環代碼部分收到的藍牙消息。對于這個項目,我決定通過藍牙將智能手機發送的簡單命令發送到 Arduino。要打開繼電器,基于 Android 應用程序構建的簡單消息將以字節形式發送以下字符串:“RY”(繼電器是)如果我們希望打開繼電器或“RN”(繼電器否)如果我們希望打開繼電器關閉。如前所述,我還包括一個“附加組件”,您可以在其中控制 Arduino 的內置 LED(引腳號 13),因此命令為“LY”和“LN”,但您不必使用它。請記住,要打開繼電器,我們需要從 Arduino 發送一個低電平信號,反之亦然。
安卓代碼
在本節中,我們將討論如何實現 Android 應用程序以與藍牙模塊通信。我不會介紹 Android 功能的某些方面以及您應該如何做某些事情,但主要介紹源代碼的內容并對其進行更好的解釋。但一般來說,該應用程序是使用 Android Studio (AS) 創建的,并且 AS 允許您選擇一個簡單的模板來啟動您的應用程序,選擇該基本模板。然后,AS 設置了啟動應用程序所需的所有內容,包括 Android 清單,您可以在其中包含應用程序的一般屬性,例如應用程序需要的權限。一個簡單的空白布局,您可以在其中添加一些組件(如按鈕)和一個 java 源代碼,用于初始化應用程序并控制布局上的所有 UI 內容。如果你沒有 如果不選擇基本模板并選擇空模板,那么您始終可以創建一個新活動來設置您需要的布局和相應的源文件。源代碼和資源也可以在我的github上找到:https://github.com/serge144/ArduinoConnectorBT
下面是我們接下來要介紹的內容:
- 安卓清單
- 簡單的布局
- Java 源代碼 (Ardcon.java + ConnectedThread.java)
6.1 安卓清單
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="flipser.bluetooth">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Bluetooth">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
application>
manifest>
android 清單描述了應用程序的主要結構以及應用程序將使用哪些操作系統的功能。在我們的例子中,我們需要包括與藍牙接口相關的權限。從上面的代碼中我們可以看出,為了使用操作系統的藍牙功能,插入了以下幾行:
簡單布局
布局如下圖所示:
![layout_mqeu1pGl8O.png?auto=compress%2Cformat&w=740&h=555&fit=max](https://hackster.imgix.net/uploads/attachments/693730/layout_mqeu1pGl8O.png?auto=compress%2Cformat&w=740&h=555&fit=max)
文本視圖僅用于輸出 Arduino + 藍牙模塊發送的消息。例如,通過向 arduino 發送消息,如果成功,它將向智能手機發回響應,并在文本視圖中顯示該消息。然后我們有兩個按鈕,繼電器按鈕和燈按鈕,用于打開/關閉 Arduino 上的內置 LED。我相信在這種情況下沒有必要包含代碼,因為您需要做的就是將兩個按鈕和一個文本視圖拖到您想要放置的位置。
6.3 Java 源代碼
(Ardcon.java)
我們將介紹的第一個源文件是Ardcon.java文件 (Arduino Connection)。這個文件主要做的是先初始化藍牙,建立連接。然后它檢查我們的兩個按鈕是否被點擊,并做相應的操作。那么讓我們從初始化開始:
public final static String MODULE_MAC = "98:D3:34:90:6F:A1";
public final static int REQUEST_ENABLE_BT = 1;
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
BluetoothAdapter bta; //bluetooth stuff
BluetoothSocket mmSocket; //bluetooth stuff
BluetoothDevice mmDevice; //bluetooth stuff
Button switchLight, switchRelay; //UI stuff
TextView response; //UI stuff
boolean lightflag = false; //flags to determ. if ON/OFF
boolean relayFlag = true; //flags to determ. if ON/OFF
ConnectedThread btt = null; //Our custom thread
public Handler mHandler; //this receives messages from thread
在我的例子中,藍牙模塊的媒體訪問控制或 MAC 地址是 。為了找到你的藍牙模塊的MAC,你首先需要打開電路,或者只是設置一些基本電路來打開藍牙模塊。然后,使用您的智能手機檢查藍牙信號,您的藍牙模塊應該連同其 MAC 地址一起出現。如果未顯示 MAC 地址,請嘗試使用其他設備,例如您的 PC。然后藍牙模塊 HC-06 的 UUID始終是相同的,如果您使用的是 Android,這個數字可能會改變 iOS 使用。(查找 UUID 以獲取更多信息)。"98:D3:34:90:6F:A1"
00001101-0000-1000-8000-00805f9b34fb
然后我們初始化按鈕、文本視圖、標志以確定繼電器和燈是關閉還是打開,一個 ConnectedThread 主要負責向/從 Arduino + 藍牙發送/接收消息,最后是一個負責處理的處理程序從線程接收到的消息。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ardcon);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Log.i("[BLUETOOTH]", "Creating listeners");
response = (TextView) findViewById(R.id.response);
switchRelay = (Button) findViewById(R.id.relay);
switchLight = (Button) findViewById(R.id.switchlight);
switchLight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) {
if (!lightflag) {
String sendtxt = "LY";
btt.write(sendtxt.getBytes());
lightflag = true;
} else {
String sendtxt = "LN";
btt.write(sendtxt.getBytes());
lightflag = false;
}
} else {
Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
switchRelay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) {
if(relayFlag){
String sendtxt = "RY";
btt.write(sendtxt.getBytes());
relayFlag = false;
}else{
String sendtxt = "RN";
btt.write(sendtxt.getBytes());
relayFlag = true;
}
//disable the button and wait for 4 seconds to enable it again switchRelay.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(4000);
}catch(InterruptedException e){
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
switchRelay.setEnabled(true);
}
});
}
}).start();
} else {
Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
bta = BluetoothAdapter.getDefaultAdapter();
//if bluetooth is not enabled then create Intent for user to turn it onif(!bta.isEnabled()){
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
}else{
initiateBluetoothProcess();
}
}
我現在將簡要概述上面的代碼。
這是初始化應用程序和所有 UI 的方法,我們首先從布局中獲取按鈕和文本視圖的引用。然后我們向兩個按鈕添加一些邏輯。例如,對于 switchLight,點擊偵聽器將首先確定是否存在與模塊的藍牙連接,如果存在,則發送消息以關閉或打開燈。這同樣適用于 switchRelay 按鈕,但在這種情況下,我們還包括一個小計時器,在執行操作后將繼電器按鈕禁用 4 秒。這是一項安全措施,因為我們不會在快速按下按鈕的同時快速打開/關閉來開始弄亂設備。然后,在完成所有按鈕邏輯后,我們嘗試在初始化時立即連接到藍牙模塊。ACTION_REQUEST_ENABLE。這將觸發一個對話框窗口以確認藍牙激活。然后我們設置一個 onActivityResult 來接收用戶的確認,如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == REQUEST_ENABLE_BT){
initiateBluetoothProcess();
}
}
然后,initiaBluetoothProcess() 方法與藍牙模塊建立連接并創建一個處理程序,該處理程序是從 ConnectedThread 接收信息的組件,同樣,該線程負責從藍牙模塊接收/發送藍牙信息阿杜伊諾。處理程序只需使用響應文本更新 TextView。
public void initiateBluetoothProcess(){
if(bta.isEnabled()){
//attempt to connect to bluetooth module BluetoothSocket tmp = null;
mmDevice = bta.getRemoteDevice(MODULE_MAC);
//create socket try {
tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID);
mmSocket = tmp;
mmSocket.connect();
Log.i("[BLUETOOTH]","Connected to: "+mmDevice.getName());
}catch(IOException e){
try{mmSocket.close();}catch(IOException c){return;}
}
Log.i("[BLUETOOTH]", "Creating handler");
mHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg); if(msg.what == ConnectedThread.RESPONSE_MESSAGE){
String txt = (String)msg.obj;
response.append("\n" + txt);
}
}
};
Log.i("[BLUETOOTH]", "Creating and running Thread");
btt = new ConnectedThread(mmSocket,mHandler);
btt.start();
}
}
(ConnectedThread.java)
如前所述,ConnectedThread.java文件包含通過藍牙發送和接收消息的必要代碼。它還通過處理程序將信息發送到Ardcon.java源文件。
public class ConnectedThread extends Thread{
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public static final int RESPONSE_MESSAGE = 10;
Handler uih;
...
首先我們用 Thread 擴展我們的類,然后我們初始化一些允許我們接收和發送消息到藍牙模塊的對象。Handler 是負責將響應發送回 UI 線程 (Ardcon.java) 的組件,以便我們可以更新文本視圖。
public ConnectedThread(BluetoothSocket socket, Handler uih){
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
this.uih = uih;
Log.i("[THREAD-CT]","Creating thread");
try{
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch(IOException e) {
Log.e("[THREAD-CT]","Error:"+ e.getMessage());
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
try {
mmOutStream.flush();
} catch (IOException e) {
return;
}
Log.i("[THREAD-CT]","IO's obtained");
}
因此,我們的 ConnectedThread 接收到名為 BluetoothSocket 的藍牙模塊和 Handler 的連接。此構造函數初始化通信的輸入和輸出流。
public void run(){
BufferedReader br;
br = new BufferedReader(new InputStreamReader(mmInStream));
while(true){
try{ String resp = br.readLine();
Message msg = new Message();
msg.what = RESPONSE_MESSAGE;
msg.obj = resp;
uih.sendMessage(msg);
}catch(IOException e){
break;
}
}
Log.i("[THREAD-CT]","While loop ended");
}
然后,我們覆蓋Thread擴展的run方法,在這個方法中,有一個循環不斷地尋找新到達的消息,如果是,則通過handler返回到UI線程。
public void write(byte[] bytes){
try{
Log.i("[THREAD-CT]", "Writting bytes");
mmOutStream.write(bytes);
}catch(IOException e){}
}
public void cancel(){
try{
mmSocket.close();
}catch(IOException e){}
}
最后,這兩個方法負責通過Outputstream向藍牙模塊寫入(發送字節)和取消連接。
- Arduino和Android窗簾控制
- 使用Arduino的Android控制RGB LED燈條
- Arduino Nano 33 IoT 12V WS2811 LED燈條控制器
- Arduino/Android藍牙多伺服電機控制
- 基于Arduino的數控燈控制器的設計 0次下載
- 基于arduino nano的數控燈控制器 0次下載
- Arduino/Android藍牙串行監視器應用程序
- 基于Arduino UNO的簡單交通燈控制器 0次下載
- Arduino/Android藍牙伺服電機控制安卓APP
- 使用MKR IoT載體的Arduino燈控制器
- 適用于PC和Android的Arduino游戲控制器
- 兆易創新AN014 GD32微控制器在Arduino中的應用
- 基于Arduino的控制器
- arduino藍牙控制LED燈模擬實驗的詳細資料說明 4次下載
- 使用Arduino為微控制器打造能用舵機控制的游戲平臺 14次下載
- Arduino WS2812B LED燈帶設計方案 1.2w次閱讀
- 如何使用Arduino Uno和HC-06實現智能手機對電燈的控制 5044次閱讀
- 如何從網頁控制arduino? 4186次閱讀
- 基于Arduino UNO和HC-05藍牙模塊控制伺服電機 5095次閱讀
- 自制一臺廣告燈控制器 1961次閱讀
- dfrobot低功耗藍牙控制器簡介 1592次閱讀
- dfrobotBluno Mega1280控制器 Arduino兼容簡介 2290次閱讀
- dfrobotRomeo BLE多合一控制器簡介 2557次閱讀
- dfrobotDFRduino Pro Mini控制器簡介 2200次閱讀
- dfrobotArduino Leonardo 控制器介紹 2425次閱讀
- dfrobotCheapduino控制器介紹 1496次閱讀
- dfrobotRomeo 三合一Arduino兼容控制器介紹 2580次閱讀
- 遠程控制通訊--基于Arduino + ESP8266控制LED燈 4w次閱讀
- led燈帶控制器怎么用 2.9w次閱讀
- 簡單的溫度控制器電路 5577次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論