創作內容

32 GP

arduino 藍芽通信功能實作

作者:貓貓風 ฅ●ω●ฅ│2017-08-05 17:04:53│巴幣:412│人氣:32457
.


















這次要測試的是用 arduino 跟手機做訊息的傳遞,我用的藍芽模組為 HC-06 ;

還有另外一個也常被使用的藍芽模組為HC-05,兩者主要的不同為傳輸的鮑率(baud)不一樣

HC -06 的baud rate預設為9600 , HC-05 預設值為38400 (不確訂有沒有記錯)

兩者功能上的不同如下

HC-05模組可以建立與其他模塊的連接。 例如可以當Master並連接到Slave藍牙模塊。
            或者在Slave模式下使用無線網路接到記事本。

HC-06模組只能作為Slave。 它僅適用於將筆電作為Master連接到具有Slave模組的裝置

藍芽的特性就是可以當Master也可以當Slave,看誰先連上誰

先連上的為Master 被連上的為Slave




Arduino 上的接收程式 , 主要使用pin11當Tx pin12當Rx


  1. #include <SoftwareSerial.h>  
  2. SoftwareSerial BT(11,12);   // 接收腳(RX), 傳送腳(TX);接HC-06之TXD、RXD   
  3.   
  4. char val;  
  5. String recieveData = "";   
  6. bool startRecieve = false;  
  7. void setup()  
  8. {  
  9.   Serial.begin(9600);   
  10.   BT.begin(9600); //HC-06 預設 baud  
  11. }  
  12.   
  13. void loop()  
  14. {  
  15.   while(BT.available()) //如果有收到資料  
  16.   {  
  17.     startRecieve = true;  
  18.     val=BT.read(); //每次接收一個字元  
  19.     recieveData += val; //字元組成字串  
  20.     BT.write(byte(val)); //把每次收到的字元轉成byte封包傳至手機端  
  21.     delay(200);  //每次傳輸間隔,如果太短會造成資料遺失或亂碼  
  22.   }  
  23.     
  24.   if(startRecieve)  
  25.   {  
  26.   startRecieve = false;  
  27.   Serial.println(recieveData); //呈現收到字串  
  28.   recieveData = "";  
  29.   }  
  30.     delay(300);  
  31. }  


Android端藍芽發送與接收程式,很多人應該都會用AppInventor做

不過我覺得那好難用,還是習慣直接自己寫

太久沒寫android有點不知道自己在寫什麼,光假設環境又用了一整天

從以前的 NetBean IDE 到 Eclipse 最後到現在的 android Studio感覺變化好大

設定方便搞了有點久~有空在來發環境建制的文章,從安裝Java與設定環境變數開始講起

然後環境好像越來越重,電腦都快跑不動了..

以下為Source Code


  1. package com.mcuhq.simplebluetooth;  
  2.   
  3. import android.bluetooth.BluetoothAdapter;  
  4. import android.bluetooth.BluetoothDevice;  
  5. import android.bluetooth.BluetoothSocket;  
  6. import android.content.BroadcastReceiver;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.content.IntentFilter;  
  10. import android.content.pm.PackageManager;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.os.SystemClock;  
  14. import android.support.v4.app.ActivityCompat;  
  15. import android.support.v4.content.ContextCompat;  
  16. import android.support.v7.app.AppCompatActivity;  
  17. import android.view.View;  
  18. import android.widget.AdapterView;  
  19. import android.widget.ArrayAdapter;  
  20. import android.widget.Button;  
  21. import android.widget.EditText;  
  22. import android.widget.ListView;  
  23. import android.widget.TextView;  
  24. import android.widget.Toast;  
  25.   
  26. import java.io.IOException;  
  27. import java.io.InputStream;  
  28. import java.io.OutputStream;  
  29. import java.io.UnsupportedEncodingException;  
  30. import java.util.Set;  
  31. import java.util.UUID;  
  32.   
  33. public class MainActivity extends AppCompatActivity {  
  34.   
  35.     // GUI Components  
  36.     private TextView mBluetoothStatus;  
  37.     private TextView mReadBuffer;  
  38.     private Button mScanBtn;  
  39.     private Button mOffBtn;  
  40.     private Button mListPairedDevicesBtn;  
  41.     private Button mDiscoverBtn;  
  42.     private BluetoothAdapter mBTAdapter;  
  43.     private Set<BluetoothDevice> mPairedDevices;  
  44.     private ArrayAdapter<String> mBTArrayAdapter;  
  45.     private ListView mDevicesListView;  
  46.     //private CheckBox mLED1;  
  47.     private EditText inputdata;  
  48.     private Button sendDevice;  
  49.   
  50.     private Handler mHandler;
  51.      // Our main handler that will receive callback notifications  
  52.     private ConnectedThread mConnectedThread;
  53.     // bluetooth background worker thread to send and receive data  
  54.     private BluetoothSocket mBTSocket = null;
  55.     // bi-directional client-to-client data path  
  56.   
  57.     private static final UUID BTMODULEUUID = UUID.fromString
  58.     ("00001101-0000-1000-8000-00805F9B34FB"); // "random" unique identifier  
  59.   
  60.     // #defines for identifying shared types between calling functions  
  61.     private final static int REQUEST_ENABLE_BT = 1;
  62.     // used to identify adding bluetooth names  
  63.     private final static int MESSAGE_READ = 2;
  64.     // used in bluetooth handler to identify message update  
  65.     private final static int CONNECTING_STATUS = 3;
  66.      // used in bluetooth handler to identify message status  
  67.     private  String _recieveData = "";  
  68.   
  69.     @Override  
  70.     protected void onCreate(Bundle savedInstanceState) {  
  71.         super.onCreate(savedInstanceState);  
  72.         setContentView(R.layout.activity_main);  
  73.         //初始化元件  
  74.         mBluetoothStatus = (TextView)findViewById(R.id.bluetoothStatus);  
  75.         mReadBuffer = (TextView) findViewById(R.id.readBuffer);  
  76.         mScanBtn = (Button)findViewById(R.id.scan);  
  77.         mOffBtn = (Button)findViewById(R.id.off);  
  78.         mDiscoverBtn = (Button)findViewById(R.id.discover);  
  79.         mListPairedDevicesBtn = (Button)findViewById(R.id.PairedBtn);  
  80.         //mLED1 = (CheckBox)findViewById(R.id.checkboxLED1);  
  81.         inputdata = (EditText)findViewById(R.id.editText);  
  82.         sendDevice = (Button)findViewById(R.id.send);  
  83.   
  84.         mBTArrayAdapter = new ArrayAdapter<String>
  85.         (this,android.R.layout.simple_list_item_1);  
  86.         mBTAdapter = BluetoothAdapter.getDefaultAdapter();
  87.          // get a handle on the bluetooth radio  
  88.   
  89.         mDevicesListView = (ListView)findViewById(R.id.devicesListView);  
  90.         mDevicesListView.setAdapter(mBTArrayAdapter); // assign model to view  
  91.         mDevicesListView.setOnItemClickListener(mDeviceClickListener);  
  92.   
  93.         // 詢問藍芽裝置權限  
  94.         if(ContextCompat.checkSelfPermission(this,
  95.             Manifest.permission.ACCESS_COARSE_LOCATION) !=
  96.             PackageManager.PERMISSION_GRANTED)  
  97.             ActivityCompat.requestPermissions(this, new String[]
  98.             {Manifest.permission.ACCESS_COARSE_LOCATION}, 1);  
  99.   
  100.         //定義執行緒 當收到不同的指令做對應的內容  
  101.         mHandler = new Handler(){  
  102.             public void handleMessage(android.os.Message msg){  
  103.                 if(msg.what == MESSAGE_READ){ //收到MESSAGE_READ 開始接收資料  
  104.                     String readMessage = null;  
  105.                     try {  
  106.                         readMessage = new String((byte[]) msg.obj, "UTF-8");  
  107.                         readMessage =  readMessage.substring(0,1);
  108.                        //取得傳過來字串的第一個字元,其餘為雜訊  
  109.                         _recieveData += readMessage; //拼湊每次收到的字元成字串  
  110.                     } catch (UnsupportedEncodingException e) {  
  111.                         e.printStackTrace();  
  112.                     }  
  113.                     mReadBuffer.setText(_recieveData); //將收到的字串呈現在畫面上  
  114.   
  115.                 }  
  116.   
  117.                 if(msg.what == CONNECTING_STATUS){
  118.                  //收到CONNECTING_STATUS 顯示以下訊息  
  119.                     if(msg.arg1 == 1)  
  120.                         mBluetoothStatus.setText("Connected to Device: "
  121.                         + (String)(msg.obj));  
  122.                     else  
  123.                         mBluetoothStatus.setText("Connection Failed");  
  124.                 }  
  125.             }  
  126.         };  
  127.   
  128.         if (mBTArrayAdapter == null) {  
  129.             // Device does not support Bluetooth  
  130.             mBluetoothStatus.setText("Status: Bluetooth not found");  
  131.             Toast.makeText(getApplicationContext(),"Bluetooth device not
  132.              found!",Toast.LENGTH_SHORT).show();  
  133.         }  
  134.         else {  
  135.   
  136.            /* mLED1.setOnClickListener(new View.OnClickListener(){
  137.                 @Override
  138.                 public void onClick(View v){
  139.                     if(mConnectedThread != null) //First check to make sure thread created
  140.                         mConnectedThread.write(inputdata.getText().toString());
  141.                 }
  142.             });*/  
  143.   
  144.             sendDevice.setOnClickListener(new View.OnClickListener(){
  145.             //當按下send開始傳輸資料  
  146.                 @Override  
  147.                 public void onClick(View v){  
  148.                     _recieveData = ""; //清除上次收到的資料  
  149.                     if(mConnectedThread != null) //First check to make sure thread created  
  150.                         mConnectedThread.write(inputdata.getText().toString());
  151.                         //傳送將輸入的資料出去  
  152.                 }  
  153.             });  
  154.   
  155.             //定義每個按鍵按下後要做的事情  
  156.             mScanBtn.setOnClickListener(new View.OnClickListener() {  
  157.                 @Override  
  158.                 public void onClick(View v) {  
  159.                     bluetoothOn(v);  
  160.                 }  
  161.             });  
  162.   
  163.             mOffBtn.setOnClickListener(new View.OnClickListener(){  
  164.                 @Override  
  165.                 public void onClick(View v){  
  166.                     bluetoothOff(v);  
  167.                 }  
  168.             });  
  169.   
  170.             mListPairedDevicesBtn.setOnClickListener(new View.OnClickListener() {  
  171.                 @Override  
  172.                 public void onClick(View v){  
  173.                     listPairedDevices(v);  
  174.                 }  
  175.             });  
  176.   
  177.             mDiscoverBtn.setOnClickListener(new View.OnClickListener(){  
  178.                 @Override  
  179.                 public void onClick(View v){  
  180.                     discover(v);  
  181.                 }  
  182.             });  
  183.         }  
  184.     }  
  185.   
  186.     private void bluetoothOn(View view){  
  187.         if (!mBTAdapter.isEnabled()) {//如果藍芽沒開啟  
  188.             Intent enableBtIntent = new
  189.              Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);//跳出視窗  
  190.             startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
  191.             //開啟設定藍芽畫面  
  192.             mBluetoothStatus.setText("Bluetooth enabled");  
  193.             Toast.makeText(getApplicationContext(),"Bluetooth turned
  194.             on",Toast.LENGTH_SHORT).show();  
  195.         }  
  196.         else{  
  197.             Toast.makeText(getApplicationContext(),"Bluetooth is already on",
  198.             Toast.LENGTH_SHORT).show();  
  199.         }  
  200.     }  
  201.   
  202.     // Enter here after user selects "yes" or "no" to enabling radio  
  203.     //定義當按下跳出是否開啟藍芽視窗後要做的內容  
  204.     @Override  
  205.     protected void onActivityResult(int requestCode, int resultCode, Intent Data){  
  206.         // Check which request we're responding to  
  207.         if (requestCode == REQUEST_ENABLE_BT) {  
  208.             // Make sure the request was successful  
  209.             if (resultCode == RESULT_OK) {  
  210.                 // The user picked a contact.  
  211.                 // The Intent's data Uri identifies which contact was selected.  
  212.                 mBluetoothStatus.setText("Enabled");  
  213.             }  
  214.             else  
  215.                 mBluetoothStatus.setText("Disabled");  
  216.         }  
  217.     }  
  218.   
  219.     private void bluetoothOff(View view){  
  220.         mBTAdapter.disable(); // turn off bluetooth  
  221.         mBluetoothStatus.setText("Bluetooth disabled");  
  222.         Toast.makeText(getApplicationContext(),"Bluetooth turned Off",
  223.         Toast.LENGTH_SHORT).show();  
  224.     }  
  225.   
  226.     private void discover(View view){  
  227.         // Check if the device is already discovering  
  228.         if(mBTAdapter.isDiscovering()){ //如果已經找到裝置  
  229.             mBTAdapter.cancelDiscovery(); //取消尋找  
  230.             Toast.makeText(getApplicationContext(),"Discovery
  231.             stopped",Toast.LENGTH_SHORT).show();  
  232.         }  
  233.         else{  
  234.             if(mBTAdapter.isEnabled()) { //如果沒找到裝置且已按下尋找  
  235.                 mBTArrayAdapter.clear(); // clear items  
  236.                 mBTAdapter.startDiscovery(); //開始尋找  
  237.                 Toast.makeText(getApplicationContext(), "Discovery started",
  238.                 Toast.LENGTH_SHORT).show();  
  239.                 registerReceiver(blReceiver, new
  240.                 IntentFilter(BluetoothDevice.ACTION_FOUND));  
  241.             }  
  242.             else{  
  243.                 Toast.makeText(getApplicationContext(), "Bluetooth not on",
  244.                 Toast.LENGTH_SHORT).show();  
  245.             }  
  246.         }  
  247.     }  
  248.   
  249.     final BroadcastReceiver blReceiver = new BroadcastReceiver() {  
  250.         @Override  
  251.         public void onReceive(Context context, Intent intent) {  
  252.             String action = intent.getAction();  
  253.             if(BluetoothDevice.ACTION_FOUND.equals(action)){  
  254.                 BluetoothDevice device =
  255.                 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
  256.                 // add the name to the list  
  257.                 mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress());  
  258.                 mBTArrayAdapter.notifyDataSetChanged();  
  259.             }  
  260.         }  
  261.     };  
  262.   
  263.     private void listPairedDevices(View view){  
  264.         mPairedDevices = mBTAdapter.getBondedDevices();  
  265.         if(mBTAdapter.isEnabled()) {  
  266.             // put it's one to the adapter  
  267.             for (BluetoothDevice device : mPairedDevices)  
  268.                 mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress());  
  269.   
  270.             Toast.makeText(getApplicationContext(), "Show Paired Devices",
  271.             Toast.LENGTH_SHORT).show();  
  272.         }  
  273.         else  
  274.             Toast.makeText(getApplicationContext(), "Bluetooth not on",
  275.             Toast.LENGTH_SHORT).show();  
  276.     }  
  277.   
  278.     private AdapterView.OnItemClickListener mDeviceClickListener = new
  279.         AdapterView.OnItemClickListener() {  
  280.         public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {  
  281.   
  282.             if(!mBTAdapter.isEnabled()) {  
  283.                 Toast.makeText(getBaseContext(), "Bluetooth not on",
  284.                 Toast.LENGTH_SHORT).show();  
  285.                 return;  
  286.             }  
  287.   
  288.             mBluetoothStatus.setText("Connecting...");  
  289.             // Get the device MAC address, which is the last 17 chars in the View  
  290.             String info = ((TextView) v).getText().toString();  
  291.             final String address = info.substring(info.length() - 17);  
  292.             final String name = info.substring(0,info.length() - 17);  
  293.   
  294.             // Spawn a new thread to avoid blocking the GUI one  
  295.             new Thread()  
  296.             {  
  297.                 public void run() {  
  298.                     boolean fail = false;  
  299.                     //取得裝置MAC找到連接的藍芽裝置  
  300.                     BluetoothDevice device = mBTAdapter.getRemoteDevice(address);  
  301.   
  302.                     try {  
  303.                         mBTSocket = createBluetoothSocket(device);  /
  304.                         //建立藍芽socket  
  305.                     } catch (IOException e) {  
  306.                         fail = true;  
  307.                         Toast.makeText(getBaseContext(), "Socket creation failed",
  308.                         Toast.LENGTH_SHORT).show();  
  309.                     }  
  310.                     // Establish the Bluetooth socket connection.  
  311.                     try {  
  312.                         mBTSocket.connect(); //建立藍芽連線  
  313.                     } catch (IOException e) {  
  314.                         try {  
  315.                             fail = true;  
  316.                             mBTSocket.close(); //關閉socket  
  317.                             //開啟執行緒 顯示訊息  
  318.                             mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)  
  319.                                     .sendToTarget();  
  320.                         } catch (IOException e2) {  
  321.                             //insert code to deal with this  
  322.                             Toast.makeText(getBaseContext(), "Socket creation failed",
  323.                             Toast.LENGTH_SHORT).show();  
  324.                         }  
  325.                     }  
  326.                     if(fail == false) {  
  327.                         //開啟執行緒用於傳輸及接收資料  
  328.                         mConnectedThread = new ConnectedThread(mBTSocket);  
  329.                         mConnectedThread.start();  
  330.                         //開啟新執行緒顯示連接裝置名稱  
  331.                         mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)  
  332.                                 .sendToTarget();  
  333.                     }  
  334.                 }  
  335.             }.start();  
  336.         }  
  337.     };  
  338.   
  339.     private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws
  340.          IOException {  
  341.         return  device.createRfcommSocketToServiceRecord(BTMODULEUUID);  
  342.         //creates secure outgoing connection with BT device using UUID  
  343.     }  
  344.   
  345.     private class ConnectedThread extends Thread {  
  346.         private final BluetoothSocket mmSocket;  
  347.         private final InputStream mmInStream;  
  348.         private final OutputStream mmOutStream;  
  349.   
  350.         public ConnectedThread(BluetoothSocket socket) {  
  351.             mmSocket = socket;  
  352.             InputStream tmpIn = null;  
  353.             OutputStream tmpOut = null;  
  354.   
  355.             // Get the input and output streams, using temp objects because  
  356.             // member streams are final  
  357.             try {  
  358.                 tmpIn = socket.getInputStream();  
  359.                 tmpOut = socket.getOutputStream();  
  360.             } catch (IOException e) { }  
  361.   
  362.             mmInStream = tmpIn;  
  363.             mmOutStream = tmpOut;  
  364.         }  
  365.   
  366.         public void run() {  
  367.             byte[] buffer = new byte[1024];  // buffer store for the stream  
  368.             int bytes; // bytes returned from read()  
  369.             // Keep listening to the InputStream until an exception occurs  
  370.             while (true) {  
  371.                 try {  
  372.                     // Read from the InputStream  
  373.                     bytes = mmInStream.available();  
  374.                     if(bytes != 0) {  
  375.                         SystemClock.sleep(100);
  376.                        //pause and wait for rest of data
  377.                         bytes = mmInStream.available();
  378.                         // how many bytes are ready to be read?  
  379.                         bytes = mmInStream.read(buffer, 0, bytes);
  380.                          // record how many bytes we actually read  
  381.                         mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)  
  382.                                 .sendToTarget(); // Send the obtained bytes to the UI activity  
  383.                     }  
  384.                 } catch (IOException e) {  
  385.                     e.printStackTrace();  
  386.   
  387.                     break;  
  388.                 }  
  389.             }  
  390.         }  
  391.   
  392.         /* Call this from the main activity to send data to the remote device */  
  393.         public void write(String input) {  
  394.             byte[] bytes = input.getBytes();           //converts entered String into bytes  
  395.             try {  
  396.                 mmOutStream.write(bytes);  
  397.             } catch (IOException e) { }  
  398.         }  
  399.   
  400.         /* Call this from the main activity to shutdown the connection */  
  401.         public void cancel() {  
  402.             try {  
  403.                 mmSocket.close();  
  404.             } catch (IOException e) { }  
  405.         }  
  406.     }  
  407. }  


執行結果

我用了兩個藍芽模組在測,在未連線前藍芽模組會一直閃,等待連線

連線後就會停止閃爍









其實一開始以為是藍芽模組有問題,才去弄第二個來測

結果後來發現是程式有問題才修正

最後是開始測試傳輸

Step1 開啟手機端程式 點選 Discover New Device 尋找附近藍芽裝置




Step2 點選藍芽裝置 HC-06   程式狀態切換為 Connecting



Step3 等待連線成功,狀態切換為 Connected to Device



Step4 : 送出文字給 Arduino, Rx的部分為 Arduino收到後回傳的Ack訊息

此部分為採用Echo的方式,收到什麼就原樣反還







最後查看 Arduino端收到的資訊,確實有收到剛剛傳的兩筆資料

分別為 test 與 Data1




相關閱讀

這篇為以前寫的,年代好像也有點久遠了,不嫌棄的話也可以去看看^^


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3671289
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風|arduino|android

留言共 41 篇留言

約瑟森林的一枚白伊
趕快留言,這樣表現的我好像看的懂

08-05 17:22

貓貓風 ฅ●ω●ฅ
這句話好像在哪聽過OAO08-05 17:23
彩゛天空゜
我一直覺得寫程式越厲害的越容易單身 大叔貓是嗎

08-05 17:35

貓貓風 ฅ●ω●ฅ
還好我沒很厲害08-05 17:41
貓貓風 ฅ●ω●ฅ
然後也不是大叔@_@08-05 17:42
碎銀子
樓上沒禮貌要叫阿公

08-05 18:04

貓貓風 ฅ●ω●ฅ
怎麼越來越誇張惹@______@08-05 18:07
羽翼ˊ● ω ●ˋ
趕快留言,才不會讓別人以為我不懂

08-05 18:06

貓貓風 ฅ●ω●ฅ
怕爆08-05 18:07
羽翼ˊ● ω ●ˋ
大輸貓

08-05 18:15

貓貓風 ฅ●ω●ฅ
= __ =08-05 18:25
珀伽索斯(Ama)
好喔!找個時間來研究一下,看起來整體效果感覺還不錯[e34]

08-05 18:47

貓貓風 ฅ●ω●ฅ
其實這應用蠻多的08-05 19:34

來留言了

08-05 19:19

貓貓風 ฅ●ω●ฅ
歡迎^^08-05 19:34
雪雪
貓貓又在專業了~[e28]給GP,然後自首看不懂 >////<

08-05 19:24

貓貓風 ฅ●ω●ฅ
如果雪雪對手機程式有興趣的話可以研究看看XD08-05 19:35
無名氏
鮑率有分資料傳輸時的鮑率跟AT Command Mode下的鮑率,
原廠韌體的狀態下應該都是一樣的,除非賣家改過忘了改回去。
(HC-05為38400bps、HC-06為9600bps)

比較常買到的都是有附底板(LED、供電及外接腳位等等)的藍芽模組,
附圖中底下藍色的就是底板,上面綠色郵票邊的就是藍芽模組,
底板就是隨人做的,我使用過的HC05就有三種不一樣的底板,使用上沒有差太多就是。

底板上的LED(附圖紅色的那個)會有幾種閃爍方式:
1. 快速閃爍 (等待連接)
2. 恆亮 (已連接其他裝置)
3. 慢速閃爍 (AT Command Mode)

進入AT Command Mode前,要在未通電的狀態下將KEY接到高電位,然後再通電,
如果有進入的話,就會看到LED變慢速閃爍了。
AT Command Mode下就是在設定這個藍芽模組,包含傳輸時的鮑率、主從或名稱等等。
有興趣的人可以用「HC-05 AT command set」到Google搜尋。

08-05 19:36

貓貓風 ฅ●ω●ฅ
原來如此~ 感謝經驗分享喔^^08-05 19:40
Fuwawa
窩...呃... 度 窩看的懂!留言就度ㄌ

08-05 19:47

貓貓風 ฅ●ω●ฅ
好唷 尼也很厲害owo10-25 17:26
無名氏
使用Arduino UNO板的話,要進AT Command Mode設定我有兩種做法

https://truth.bahamut.com.tw/s01/201708/e5194c2c633f2395052cbdfc9c455e87.PNG?w=300
第一種就是透過UNO板上面的ATmega16u2直接與藍芽模組溝通,
這個做法就跟直接用CP2102(USB轉TTL)直接接藍芽模組一樣,
前提是原本的程式沒有使用到0跟1這兩個腳位,
或者乾脆就開一個新的程式碼,然後setup()跟loop()都留白。

https://truth.bahamut.com.tw/s01/201708/8aeb66ac690fc8b609cb0d2c84b99063.PNG?w=300
第二種就是透過ATmega328P當中介,需要另外設定SoftwareSerial。
以前寫的測試程式:

// 連接HC-05的腳位
const uint8_t PIN_RX1 = 2;
const uint8_t PIN_TX1 = 3;
SoftwareSerial BTSerial(PIN_RX1, PIN_TX1);

void setup() {
Serial.begin(9600);
BTSerial.begin(38400);
}
void loop() {
// 藍芽模組資料轉送給電腦
if (BTSerial.available()) {
Serial.write(BTSerial.read());
}
// 電腦資料轉送給藍芽模組
if (Serial.available()) {
BTSerial.write(Serial.read());
}
}

我個人比較懶,都是用CP2102直接接藍芽模組設定[e6]

08-05 20:15

貓貓風 ฅ●ω●ฅ
很詳細的介紹呢 我用的事Mega 除了原本的 Serial 還有 Serial1 2 3 可以用~08-05 21:52
無名氏
啊,程式碼縮排被吃掉了[e17]

08-05 20:18

貓貓風 ฅ●ω●ฅ
3Q 我有空來試試 感謝分享喔^^08-05 21:51
貓兔子(っ・ω・)っ
大叔貓

08-05 21:06

貓貓風 ฅ●ω●ฅ
[e20]08-05 21:54
小刀
神作,好厲害~

08-06 14:27

貓貓風 ฅ●ω●ฅ
謝謝刀姊稱讚喔^^08-06 23:32
遊蕩的鹹魚(´・ω・`)
看不懂,先膜拜一下壓壓驚(´・ω・`)

08-06 22:11

貓貓風 ฅ●ω●ฅ
好唷 歡迎鹹魚醬 (´・ω・`)08-06 23:33
透明
貓貓風是業界人士嗎?感覺好專業,而且涉獵範圍也好廣

08-10 23:25

貓貓風 ฅ●ω●ฅ
這部分算是我無聊有興趣自己用的XDD 所以就到處都會一點08-10 23:38
嚮鄉紅
超懷念的,當年比賽做過一個魚菜共生

就是藉由AppInventor+Arduino的

雖然最後沒得名拉QQ

08-11 00:15

貓貓風 ฅ●ω●ฅ
感覺是蠻有趣的創作呢10-25 17:27
塞繆爾·T·歐文
您好,想請教一個問題,最近在做藍芽通訊的專題。
是用Arduino NANO和HC-06,供電是外接行動電源,
但是每過10~15秒後行動電源就會突然斷電導致無法透過藍芽模組傳遞訊號給機器人..(機器人有另外接一顆鋰聚電池)
不知大大可否解惑,謝謝您了!!

12-04 19:48

貓貓風 ฅ●ω●ฅ
所以你的問題是??? 為什麼會斷電嗎?12-04 21:03
冰藍古可
您好,請問為什麼傳資料好像都會掉第一個字母?電腦端跟RX顯示都會少第一個
另外請問如果想傳整數的資料要怎麼處理,謝謝!

12-05 01:14

貓貓風 ฅ●ω●ฅ
我這邊測試都不會有這問題,你檢查看看baud 是否正確,可以都設成9600來測試看看,然後Delay時間也可以調整12-05 13:09
冷傾城
你好,我想要透過藍芽把資料傳輸到App,那麼請問我send要如何改成接收的程式呢? 謝謝你!

12-16 14:26

貓貓風 ฅ●ω●ฅ
這支程式本來就有接收功能, 反而是要在Arduino端改成主動傳輸12-16 16:25
SSshadow
請問大大有.xml的程式碼嗎

08-28 19:25

貓貓風 ฅ●ω●ฅ
寄給你?10-01 09:09
jjjj
請問有設 Mainfest或strings嗎?

09-29 20:38

貓貓風 ฅ●ω●ฅ
Mainfest是設定藍芽開啟相關權限10-01 08:49
被影沒的人物
請問能給layout程式碼嗎?
能的話直接寄email:qweewqqwe1236@gmail.com

10-08 17:00

Phil
您好!
不知道能不能請教您一些程式上的問題
我目前正在做analog感測器相關。
但我將感測器數值合併字串之後就會一直重複累積。
假設收到值100,下個run字串就會變成100100。
不曉得您方不方便幫我個忙呢?

11-08 00:50

貓貓風 ฅ●ω●ฅ
每收到一筆資料後清除變數,
例如: sensor_value = readSensorValue();
這樣 sensor_value 每次就會被重置,不會累加11-08 08:45
Phil
感謝你的回應,我另外使用看門狗直接對板子做重置,已經達到我想要的效果了謝謝

11-08 16:14

貓貓風 ฅ●ω●ฅ
OK11-08 21:09
阿勛
我再用HC-06 配合C# , 連serialport 會連不上, 超懊惱w

12-17 23:55

貓貓風 ฅ●ω●ฅ
你看PC顯示 COM 多少12-18 00:24
阿勛
COM port 是 7 , 但是連線時最後會出現Access denied 的 exception, 我用HC-05就會可open port 所以我很好奇到底問題出在哪QQ

12-18 00:27

貓貓風 ฅ●ω●ฅ
會不會有藍芽已經跟他自動配對到 PORT被咬住12-18 20:43

請問您是否方便提供layout程式碼

01-12 22:15


大大請問可以寄給我main的資料夾嗎?
mail:ms0746516@gmail.com
感恩~

01-21 12:32

allen
大大 請問可以寄給我main的資料夾嗎?
mail:a0958991737@gmail.com
我的專題需要大大的程式當範例

04-11 20:36

allen
我把大大的程式碼都會進去後也按照步驟做 但我點DISCOVER NEW DEVICES都沒有東西跑出來 而且我的HC-06也都裝好了 就是找不到HC-06這個裝置

04-11 20:38

TxT
大大請問可以寄給我apk專案的資料夾嗎?
郵箱:asd618088@gmail.com
我的專題需要大大的程式當參考
藍芽端可用 但目前卡在app無法回傳藍芽值

04-21 01:20

20206666
大大請問能給layout程式碼嗎?
郵箱:0910212176willy@gmail.com
謝謝

04-21 15:04

翔翔
請問大大可以寄給我你的apk整個專案檔嗎?
郵箱:ssky123450@gmail.com
現在卡在讀跟寫的階段 需要參考你的感謝

05-03 11:45

萊因哈特
我想問一下
我想用手機連到Arduino藍芽模組HC-05
卻顯示can’t connect to device這串英文
請問該如何解決?

05-29 15:58

asdfg
請問有辦法從arduino傳值讓手機接收到嗎?

10-23 23:55


大大可以寄給我你的apk整個專案檔嗎?
郵箱:midasweiting@gmail.com
謝謝您

07-10 14:04

ㅋㅋㅋㅋㅋㅋㅋㅋ
請求大大支援你的apk整個專案檔!
郵箱:brian00782@hotmail.com
非常感謝!

12-31 00:20

我也太廢了吧
不好意思,可以要跟您要專案檔嗎?
信箱:qwer83154@gamil.com
謝謝您!

01-19 21:16

崁良
大大,請問在下能斗膽一窺您的專案檔嗎?非常感謝!!!
boy901117@gmail.com
(膜拜)

09-05 20:34

Poo
大大您好,本人參考了您的程式
在我自己的專案中修改了部分的程式碼來測試
有一個問題是藍芽接收的字串 有時候會掉字和遺漏的問題
發送端是使用Arduino開發版+hc06藍芽模組
已在其他Serial Bluetooth APP上測試過,硬體沒有問題

對於接收端的字串處理,大大有什麼想法和建議嗎?

05-09 02:43

我要留言提醒:您尚未登入,請先登入再留言

32喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:arduino HC-S... 後一篇:Android Thre...

追蹤私訊切換新版閱覽

作品資料夾

pjfl20180818空氣
真糟糕看更多我要大聲說4小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】