首页 > 解决方案 > 我想通过蓝牙将数据从 Android 发送到 Arduino

问题描述

我编写了一个 Android 应用程序,它应该通过蓝牙模块将数据发送到 Arduino hc-06 传感器,以控制汽车。蓝牙连接没问题。

我只想向 arduino 发送一个信号,例如当我按下向右按钮时。

我想写这样的东西:

customButtonRight.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Bluetooth.sendValue("R");
           }
       });

用于接收信号的arduino代码部分:

if(mySerial.available() > 0)  // Send data only when you receive data:
    {
      
        data = mySerial.read();      //Read the incoming data and store it into variable data
        Serial.print(data);        //Print Value inside data in Serial monitor
        Serial.print("\n");        //New line 
     
        switch(data) 
        {
                 case 'F':
                      digitalWrite(led_galben_fata,    HIGH);
                      
                      digitalWrite(led_rosu_spate,      LOW);
                      digitalWrite(led_albastru_stanga, LOW);
                      digitalWrite(led_alb_dreapta,     LOW);
                      
                 break;
                    
                 case 'B':
                      digitalWrite(led_rosu_spate,     HIGH);
                      
                      digitalWrite(led_galben_fata,     LOW);
                      digitalWrite(led_albastru_stanga, LOW);
                      digitalWrite(led_alb_dreapta,     LOW);
                 break;
  
                 case 'L':
                      digitalWrite(led_albastru_stanga,  HIGH);
                      
                      digitalWrite(led_galben_fata,      LOW);
                      digitalWrite(led_rosu_spate,       LOW);
                      digitalWrite(led_alb_dreapta,      LOW);
                 break;
  
                 case 'R':
                      digitalWrite(led_alb_dreapta,     HIGH);

                      digitalWrite(led_galben_fata,     LOW);
                      digitalWrite(led_rosu_spate,      LOW);
                      digitalWrite(led_albastru_stanga, LOW);
                 break;
                 
                 case 'G':   ////   fata stanga
                      digitalWrite(led_galben_fata, HIGH);
                      digitalWrite(led_albastru_stanga, HIGH);

                      digitalWrite(led_rosu_spate,      LOW);
                      digitalWrite(led_alb_dreapta,     LOW);
                 break;
                    
                 case 'I':   ///// fata dreapta
                      digitalWrite(led_galben_fata, HIGH);
                      digitalWrite(led_alb_dreapta, HIGH);

                      digitalWrite(led_rosu_spate, LOW);
                      digitalWrite(led_albastru_stanga, LOW);
                 break;
  
                 case 'H':   //// spate stanga
                      digitalWrite(led_rosu_spate, HIGH);
                      digitalWrite(led_albastru_stanga, HIGH);

                      digitalWrite(led_galben_fata, LOW);
                      digitalWrite(led_alb_dreapta, LOW);
                 break;
  
                 case 'J':   //// spate dreapta
                      digitalWrite(led_rosu_spate, HIGH);
                      digitalWrite(led_alb_dreapta, HIGH);

                      digitalWrite(led_galben_fata, LOW);
                      digitalWrite(led_albastru_stanga, LOW);
                 break;
                 
                 default:
                     digitalWrite(led_galben_fata, LOW);
                     digitalWrite(led_rosu_spate, LOW);
                     digitalWrite(led_albastru_stanga, LOW);
                     digitalWrite(led_alb_dreapta, LOW);
        }   
     }

这是我的 android 活动的全部代码:

public class MonitoringScreen extends Activity {


    private static String LOG_TAG = "UIElementsPracticeLog";
    private static final String TAG = "BlueTest5-MainActivity";
    private int mMaxChars = 50000;//Default
    private UUID mDeviceUUID;
    private BluetoothSocket mBTSocket;
    private ReadInput mReadThread = null;


    private boolean mIsUserInitiatedDisconnect = false;

    private boolean mIsBluetoothConnected = false;

    private BluetoothDevice mDevice;

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_monitoring_screen);
        ActivityHelper.initialize(this);

        Intent intent = getIntent();
        Bundle b = intent.getExtras();
        mDevice = b.getParcelable(MainActivity.DEVICE_EXTRA);
        mDeviceUUID = UUID.fromString(b.getString(MainActivity.DEVICE_UUID));
        mMaxChars = b.getInt(MainActivity.BUFFER_SIZE);

        Button customButtonDown = findViewById(R.id.custom_button_down);
        Button customButtonUp = findViewById(R.id.custom_button_up);
        Button customButtonLeft = findViewById(R.id.custom_button_left);
        Button customButtonRight = findViewById(R.id.custom_button_right);

        customButtonDown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.i(LOG_TAG, "Down-Arrow button is pressed by user");
            }
        });
        customButtonUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.i(LOG_TAG, "Up-Arrow button is pressed by user");
            }
        });
        customButtonLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Left-Arrow button is pressed by user");
            }
        });
        customButtonRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.i(LOG_TAG, "Right-Arrow button is pressed by user");
            }
        });
    }

    private class ReadInput implements Runnable {

        private boolean bStop = false;
        private Thread t;

        public ReadInput() {
            t = new Thread(this, "Input Thread");
            t.start();
        }
        public boolean isRunning() {
            return t.isAlive();
        }

        @Override
        public void run() {
            InputStream inputStream;

            try {
                inputStream = mBTSocket.getInputStream();
                while (!bStop) {
                    byte[] buffer = new byte[256];
                    if (inputStream.available() > 0) {
                        inputStream.read(buffer);
                        int i = 0;
                        /*
                         * This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
                         */
                        for (i = 0; i < buffer.length && buffer[i] != 0; i++) {
                        }
                        final String strInput = new String(buffer, 0, i);

                        /*
                         * If checked then receive text, better design would probably be to stop thread if unchecked and free resources, but this is a quick fix
                         */
                    }
                    Thread.sleep(500);
                }
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        public void stop() {
            bStop = true;
        }

    }

    private class DisConnectBT extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected Void doInBackground(Void... params) {

            if (mReadThread != null) {
                mReadThread.stop();
                while (mReadThread.isRunning())
                    ; // Wait until it stops
                mReadThread = null;

            }

            try {
                mBTSocket.close();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            mIsBluetoothConnected = false;
            if (mIsUserInitiatedDisconnect) {
                finish();
            }
        }

    }

    private void msg(String s) {
        Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPause() {
        if (mBTSocket != null && mIsBluetoothConnected) {
            new DisConnectBT().execute();
        }
        Log.d(TAG, "Paused");
        super.onPause();
    }

    @Override
    protected void onResume() {
        if (mBTSocket == null || !mIsBluetoothConnected) {
            new ConnectBT().execute();
        }
        Log.d(TAG, "Resumed");
        super.onResume();
    }

    @Override
    protected void onStop() {
        Log.d(TAG, "Stopped");
        super.onStop();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
    }

    private class ConnectBT extends AsyncTask<Void, Void, Void> {
        private boolean mConnectSuccessful = true;

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MonitoringScreen.this, "Hold on", "Connecting");// http://stackoverflow.com/a/11130220/1287554
        }

        @Override
        protected Void doInBackground(Void... devices) {

            try {
                if (mBTSocket == null || !mIsBluetoothConnected) {
                    mBTSocket = mDevice.createInsecureRfcommSocketToServiceRecord(mDeviceUUID);
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    mBTSocket.connect();
                }
            } catch (IOException e) {
// Unable to connect to device
                e.printStackTrace();
                mConnectSuccessful = false;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (!mConnectSuccessful) {
                Toast.makeText(getApplicationContext(), "Could not connect to device. Is it a Serial device? Also check if the UUID is correct in the settings", Toast.LENGTH_LONG).show();
                finish();
            } else {
                msg("Connected to device");
                mIsBluetoothConnected = true;
                mReadThread = new ReadInput(); // Kick off input reader
            }

            progressDialog.dismiss();
        }
    }

}

标签: javaandroidconnect

解决方案


推荐阅读