簡體   English   中英

通過藍牙將來自 Arduino 的超聲波傳感器的數據發送到 Android

[英]Sending data from ultrasonic sensor from Arduino to Android via Bluetooth

我正在處理我的文憑論文,但我在使用藍牙進行 Arduino -> Android 的通信時遇到問題。 這是我的應用程序:我想顯示到障礙物距離的活動

在 TextView 中,我想將來自 Arduino 的數據與距離和我需要的想法,我找不到東西,如何將數據從不同的傳感器發送到不同的視圖(例如前,后保險杠,左右)。

這里有 arduino 代碼:

 #include <SoftwareSerial.h>
// Mid-back sensor
#define trigPinLeft 11 
#define echoPinLeft 10
// Right-back sensor (looking from back)
#define trigPinRight 7
#define echoPinRight 6
SoftwareSerial btSerial = SoftwareSerial(0,1);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  btSerial.begin(115200);
  // Mid-back sensor
  pinMode(trigPinLeft, OUTPUT);
  pinMode(echoPinLeft, INPUT);
  // Right-back sensor 
  pinMode(trigPinRight, OUTPUT);
  pinMode(echoPinRight, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  long durationLeft, distanceLeft;
  digitalWrite(trigPinLeft, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPinLeft, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPinLeft, LOW);
  durationLeft = pulseIn(echoPinLeft, HIGH);
  distanceLeft = (durationLeft *0.034 / 2);
  if (distanceLeft>=400 || distanceLeft<=18){
    Serial.println("Out of range"); 
    btSerial.println("Out of range");
  }
  else{
    Serial.print("BACK LEFT: ");
    Serial.print(distanceLeft);
    Serial.println(" cm");
    btSerial.println(distanceLeft + "cm");
  }
  //delayMicroseconds(1);

  long durationRight, distanceRight;
  digitalWrite(trigPinRight, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPinRight, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPinRight, LOW);
  durationRight = pulseIn(echoPinRight, HIGH);
  distanceRight = (durationRight *0.034 / 2);
  if (distanceRight>=400 || distanceRight<=18){
    Serial.println("Out of range"); 
    btSerial.println("Out of range");
  }
  else{
    Serial.print("BACK RIGHT: ");
    Serial.print(distanceRight);
    Serial.println(" cm");
    btSerial.println(distanceRight + "cm");
  }
  delay(10000);
}

這是 Android-Studio 代碼,我想一次將數據從 Arduino 獲取到一個 textView(不工作):

public class HomeActivity extends AppCompatActivity {

ImageView imageView;
TextView rearLeft,rearMid,rearRight,frontLeft,frontMid,frontRight;
public static final String PREFS_NAME = "ParkingPrefsFile";
public static final String FIRST_TIME = "firstTime";
public static final String IMAGE_VAL = "imageValue";
private BluetoothServerSocket mmServerSocket;
private BluetoothAdapter mAdapter;
private BluetoothDevice mDevice;
private static final UUID MY_UUID = UUID.fromString("5951c386-e2e7-485d-aebe-a32eec769f7b");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    imageView = (ImageView) findViewById(R.id.carView);
    rearLeft = (TextView) findViewById(R.id.rearLeftText);
    rearMid = (TextView) findViewById(R.id.rearMidText);
    rearRight = (TextView) findViewById(R.id.rearRightText);
    frontLeft = (TextView) findViewById(R.id.frontLeftText);
    frontMid = (TextView) findViewById(R.id.frontMidText);
    frontRight = (TextView) findViewById(R.id.frontRightText);
    BluetoothSocket socket = null;
    mAdapter = BluetoothAdapter.getDefaultAdapter();

    SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    boolean firstTime = sharedPreferences.getBoolean(FIRST_TIME,false);

    if(!firstTime){
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(FIRST_TIME,true);
        int image = getIntent().getIntExtra("image", R.drawable.ic_default);
        imageView.setImageResource(image);
        editor.putString(IMAGE_VAL, String.valueOf(getIntent().getIntExtra("image",R.drawable.ic_default)));
        editor.commit();
    }
    else {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        int image = getIntent().getIntExtra("image", Integer.parseInt(sharedPreferences.getString(IMAGE_VAL,null )));
        imageView.setImageResource(image);
        editor.putString(IMAGE_VAL, String.valueOf(getIntent().getIntExtra("image",image)));
        editor.commit();
    }

    /*try{
        //mmServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord("My Adapter", MY_UUID);
        mmServerSocket.accept();
    } catch (IOException e) {
        e.printStackTrace();
    }*/

    /*byte[] buffer = new byte[256];
    int bytes;
    try{
        mmServerSocket.close();
        InputStream inputStream = null;
        OutputStream outputStream = null;
        inputStream = socket.getInputStream();
        outputStream = socket.getOutputStream();

        DataInputStream mmInputStream = new DataInputStream(inputStream);
        DataOutputStream mmOutputStream = new DataOutputStream(outputStream);

        bytes = mmInputStream.read(buffer);
        String readMessage = new String(buffer, 0 , bytes);

        rearLeft.setText(readMessage);
    } catch (IOException e) {
        e.printStackTrace();
    }*/

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.home_activity_menu,menu);
    return true;
}
}

我編譯並運行了應用程序,但是在看到啟動畫面后,我有白屏並在手機上滯后。 我在 Android-Studio 中沒有錯誤。 感謝幫助。

您顯然似乎有線程問題。

在您的HomeActivity ,您已注釋掉允許在手機上打開藍牙服務器的代碼,以便您的 Arduino 設備可以連接到它,並在 RFCOM 模式下提供相關的UUID和其他相關參數。

然而,該代碼與網絡相關且阻塞,因此不應在負責處理所有 UI 任務(例如顯示視圖、監視用戶交互(觸摸事件)等)的應用程序UI 線程上執行。

這就是您的手機顯示滯后的白屏的原因。

因此,您絕對應該在單獨的線程上執行藍牙邏輯。

我建議使用以下 class 來處理所有與藍牙相關的邏輯。 這很簡單。

public class BluetoothHandler {

    private final Handler handler;
    private final BluetoothAdapter bluetoothAdapter;

    @Nullable
    private BluetoothServerSocket serverSocket;
    private BluetoothSocket bluetoothSocket;


    public BluetoothHandler(Context context) {
        final HandlerThread ht = new HandlerThread("Bluetooth Handler Thread", Thread.NORM_PRIORITY);
        ht.start(); // starting thread

        this.handler = new Handler(ht.getLooper());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            this.bluetoothAdapter = ((BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();
        } else {
            this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        }
    }


    public void startBluetoothServer() {
        // execute code in our background worker thread
        this.handler.post(new Runnable() {
            @Override
            public void run() {
                try {
                    serverSocket = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("name", "your UUID");
                    bluetoothSocket = serverSocket.accept(); // will wait as long as possible (no timeout) so there is blocking

                    // do your logic to retrieve in and out put streams to read / write data from / to your Arduino device

                }  catch (IOException ioe) {

                }
            } 
        });
    }


    @AnyThread
    public void writeData(byte[] data) {
        // remember, all network operation are to be executed in a background thread
        this.handler.post(new Runnable() {
            @Override
            public void run() {
                // write data in output stream     
            }
        });
    }


    @AnyThread
    public void readData(OnDataReadCallback callback) {
        // remember, all network operation are to be executed in a background thread
        this.handler.post(new Runnable() {
            @Override
            public void run() {
                // read data and notify via callback.
            }
        });
    }


    @AnyThread // should be call from your Activity onDestroy() to clear resources and avoid memory leaks.
    public void termainte() {
       try {
           if (serverSocket != null) {
               serverSocket.close();
           }

           if (bluetoothSocket != null) {
                bluetoothSocket.close();
           }
       } catch (IOException ioe) {

       }

        this.handler.getLooper().quit(); // will no longer be usable. Basically, this class instance is now trash.
    }


    public interface OnDataReadCallback {
        @WorkerThread // watch out if you need to update some view, user your Activity#runOnUiThread method !
        void onDataRead(byte[] data);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM