0
votes

I'm working on a simple vehicle project, made with Arduino Uno and controlled by an Android App.

My matter is to send continuous stream from the app to my bluetooth module (HC-06) on Arduino. I did it with onTouch events and a new thread called from my main activity, but something is obviously wrong because the app seems to send each command as i want it to do, but the Arduino waits until the finger is off the button and receives all data (from action.down to action.up) at a time.

To understand : I update a small string like this "1255090" each time a command button is action.down or action_move, convert it to bytes and send it via bluetooth. If i briefly click on the button, Arduino will receive the correct string "1255090", but if i maintain my finger on the button, Arduino waits for the string, and when i release the button, Arduino receives for example "125509012540901253090125209012510901252090" (depending on how long i clicked).

Android activity (partial)

drive.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent m) {
        if (m.getAction() != MotionEvent.ACTION_UP) {
            accelerer(); // inscreases the speed
            str_flux(); // constructs the string
            byte[] bytes = new byte[0];
            try { bytes = flux.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
            sendReceiveBT.write(bytes); // calls the thread's method
        } else{ralentir();}
        return true;
    }
});

Thread

package com.*.vehicle.util;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
public class SendReceiveBytes implements Runnable {
    private BluetoothSocket btSocket;
    private OutputStream btOutputStream = null;
    String TAG = "SendReceiveBytes";
    public SendReceiveBytes(BluetoothSocket socket) {
        btSocket = socket;
    try { btOutputStream = btSocket.getOutputStream(); } catch (IOException streamError) { Log.e(TAG, "Error when getting input or output Stream"); }
    }
    public void run() {
        byte[] buffer = new byte[1024]; 
        int bytes; 
    }
    public void write(byte[] bytes) {
        try {
            btOutputStream.write(bytes); // Send the bytes to Arduino
            btOutputStream.flush(); // don't know if it really does something...
            Log.e(TAG, "SUCCESS !");
        }
        catch (IOException e) {
            Log.e(TAG, "Error when writing to btOutputStream");
        }
    }    
}

Arduino loop

void loop() {    
    s = Serial.readString();  // 1255090  
    if (s!=""){
        Serial.println(s);
        bt_direction = s.substring(0,1).toInt();        
        bt_speed = s.substring(1,4).toInt();    
        bt_angle = s.substring(4,7).toInt();    
        s = "";
    } else{ 
        if (bt_speed>0){
            for(int i=bt_speed;i>=0;i--){bt_speed--;}
        }
        else{ bt_speed = 0; }
    }  
    if (bt_direction==1){bt_dir = true;} else{bt_dir = false;}
    if (bt_speed==0){stop_motor();} else{dc_motor(bt_speed, bt_dir);}  
    Serial.println(bt_direction);
    servo_turn(bt_angle);
}
1

1 Answers

0
votes

If I am getting you correctly, you can easily handle it using multiple states. For example, State1: 123456: is for tap, State2: 123457: is for press & hold, State3: 123458: is for release,

And so on. And in you ui detect whether user is tapping or press and hold.

If press and hold , instruct arduino to do something until receives release.

In this way you can even handle the situation without continuously sending bit, And as per my understanding you don't need this.

Correct me if I am wrong.

Thanks !!!