Android App:
private static final String TAG = "HC-05";
Button btnReceive;
TextView txtReading;
Handler h;
ImageView imv1, imv2, imv3, imv4;
int s1=0, s2=0;
final int RECIEVE_MESSAGE = 1; // Status for Handler
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder sb = new StringBuilder();
private ConnectedThread mConnectedThread;
// SPP UUID service
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// MAC-address of Bluetooth module (you must edit this line)
private static String address = "98:D3:31:80:57:0D";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imv1 =(ImageView) findViewById(R.id.imageView1);
imv2 =(ImageView) findViewById(R.id.imageView2);
imv3 =(ImageView) findViewById(R.id.imageView3);
imv4 =(ImageView) findViewById(R.id.imageView4);
btnReceive = (Button) findViewById(R.id.btnReceive); // button LED OFF
txtReading = (TextView) findViewById(R.id.txtReading);
h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case RECIEVE_MESSAGE: // if receive massage
byte[] readBuf = (byte[]) msg.obj;
String strIncom = new String(readBuf, 0, msg.arg1); // create string from bytes array
sb.append(strIncom); // append string
int endOfLineIndex = sb.indexOf("\r\n"); // determine the end-of-line
if (endOfLineIndex > 0) { // if end-of-line,
String sbprint = sb.substring(0, endOfLineIndex); // extract string
sb.delete(0, sb.length()); // and clear
txtReading.setText("Data from Arduino: " + sbprint);
//System.out.println(sbprint);
**if(sbprint!=null || !"0".equals(sbprint)){
s2 = Integer.parseInt(sbprint);
initOpacity();
}**
// update TextView
btnReceive.setEnabled(true);
// if(!"".equals(sbprint)){
// }
// else
// {
// s2=0;
// }
System.out.println("================== VAlUE BT = " +s2+ "===================");
}
//Log.d(TAG, "...String:"+ sb.toString() + "Byte:" + msg.arg1 + "...");
break;
}
};
};
btAdapter = BluetoothAdapter.getDefaultAdapter(); // get Bluetooth adapter
checkBTState();
/* btnReceive.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
btnReceive.setEnabled(false);
mConnectedThread.write("1"); // Send "1" via Bluetooth
//Toast.makeText(getBaseContext(), "Turn on LED", Toast.LENGTH_SHORT).show();
}
});*/
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
if(Build.VERSION.SDK_INT >= 10){
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
return (BluetoothSocket) m.invoke(device, MY_UUID);
} catch (Exception e) {
Log.e(TAG, "Could not create Insecure RFComm Connection",e);
}
}
return device.createRfcommSocketToServiceRecord(MY_UUID);
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "...onResume - try connect...");
// Set up a pointer to the remote node using it's address.
BluetoothDevice device = btAdapter.getRemoteDevice(address);
// Two things are needed to make a connection:
// A MAC address, which we got above.
// A Service ID or UUID. In this case we are using the
// UUID for SPP.
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
}
// Discovery is resource intensive. Make sure it isn't going on
// when you attempt to connect and pass your message.
btAdapter.cancelDiscovery();
// Establish the connection. This will block until it connects.
Log.d(TAG, "...Connecting...");
try {
btSocket.connect();
Log.d(TAG, "....Connection ok...");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
}
}
// Create a data stream so we can talk to server.
Log.d(TAG, "...Create Socket...");
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "...In onPause()...");
try {
btSocket.close();
} catch (IOException e2) {
errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
}
}
private void checkBTState() {
// Check for Bluetooth support and then check to make sure it is turned on
// Emulator doesn't support Bluetooth and will return null
if(btAdapter==null) {
errorExit("Fatal Error", "Bluetooth not support");
} else {
if (btAdapter.isEnabled()) {
Log.d(TAG, "...Bluetooth ON...");
} else {
//Prompt user to turn on Bluetooth
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
}
}
}
private void errorExit(String title, String message){
Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
finish();
}
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[256]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer); // Get number of bytes and message in "buffer"
h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); // Send to message queue Handler
} catch (IOException e) {
break;
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(String message) {
Log.d(TAG, "...Data to send: " + message + "...");
byte[] msgBuffer = message.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
Log.d(TAG, "...Error data send: " + e.getMessage() + "...");
}
}
}
public void initOpacity()
{
if( s2 < 100)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha1);
imv1.startAnimation(an);
}
else if(s2 > 100 && s2 < 200)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha2);
imv1.startAnimation(an);
}
else if(s2 > 200 && s2 < 300)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha3);
imv1.startAnimation(an);
}
else if(s2 > 300 && s2 < 400)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha4);
imv1.startAnimation(an);
}
else if(s2 > 400 && s2 < 500)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha5);
imv1.startAnimation(an);
}
else if(s2 > 500 && s2 < 600)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha6);
imv1.startAnimation(an);
}
else if(s2 > 600 && s2 < 700)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha7);
imv1.startAnimation(an);
}
else if(s2 > 700 && s2 < 800)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha8);
imv1.startAnimation(an);
}
else if(s2 > 800 && s2 < 900)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha9);
imv1.startAnimation(an);
}
else if(s2 > 900)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha10);
imv1.startAnimation(an);
}
//i2
if( s2 < 100)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha1);
imv2.startAnimation(an);
}
else if(s2 > 100 && s2 < 200)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha2);
imv2.startAnimation(an);
}
else if(s2 > 200 && s2 < 300)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha3);
imv2.startAnimation(an);
}
else if(s2 > 300 && s2 < 400)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha4);
imv2.startAnimation(an);
}
else if(s2 > 400 && s2 < 500)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha5);
imv2.startAnimation(an);
}
else if(s2 > 500 && s2 < 600)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha6);
imv2.startAnimation(an);
}
else if(s2 > 600 && s2 < 700)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha7);
imv2.startAnimation(an);
}
else if(s2 > 700 && s2 < 800)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha8);
imv2.startAnimation(an);
}
else if(s2 > 800 && s2 < 900)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha9);
imv2.startAnimation(an);
}
else if(s2 > 900)
{
Animation an = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha10);
imv2.startAnimation(an);
}
//Right Foot Blank
Animation an1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha0);
imv3.startAnimation(an1);
Animation an2 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha0);
imv4.startAnimation(an2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}}
Arduino Bluetooth:
#include <SoftwareSerial.h>// import the serial library
SoftwareSerial Genotronex(10, 11); // RX, TX
int BluetoothData; // the data given from Computer
int sensorPin = A0;
int sensorValue = 0;
int ledPin = 13;
void setup() {
Genotronex.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
sensorValue = analogRead(sensorPin);
Genotronex.println(sensorValue);
delay(500);
}
logcat:
01-29 17:17:11.637: I/System.out(1776): ================== VAlUE BT = 0===================
01-29 17:17:11.797: I/System.out(1776): ================== VAlUE BT = 777===================
01-29 17:17:12.327: I/System.out(1776): ================== VAlUE BT = 975===================
01-29 17:17:12.807: I/System.out(1776): ================== VAlUE BT = 669===================
01-29 17:17:13.327: I/System.out(1776): ================== VAlUE BT = 971===================
01-29 17:17:13.817: I/System.out(1776): ================== VAlUE BT = 224===================
01-29 17:17:14.327: D/AndroidRuntime(1776): Shutting down VM
01-29 17:17:14.327: E/AndroidRuntime(1776): FATAL EXCEPTION: main
01-29 17:17:14.327: E/AndroidRuntime(1776): Process: com.example.blutooth, PID: 1776
01-29 17:17:14.327: E/AndroidRuntime(1776): java.lang.NumberFormatException: Invalid int: "
"
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.Integer.invalidInt(Integer.java:138)
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.Integer.parse(Integer.java:410)
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.Integer.parseInt(Integer.java:367)
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.Integer.parseInt(Integer.java:334)
01-29 17:17:14.327: E/AndroidRuntime(1776): at com.example.blutooth.MainActivity$1.handleMessage(MainActivity.java:88)
01-29 17:17:14.327: E/AndroidRuntime(1776): at android.os.Handler.dispatchMessage(Handler.java:102)
01-29 17:17:14.327: E/AndroidRuntime(1776): at android.os.Looper.loop(Looper.java:145)
01-29 17:17:14.327: E/AndroidRuntime(1776): at android.app.ActivityThread.main(ActivityThread.java:5944)
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.reflect.Method.invoke(Native Method)
01-29 17:17:14.327: E/AndroidRuntime(1776): at java.lang.reflect.Method.invoke(Method.java:372)
01-29 17:17:14.327: E/AndroidRuntime(1776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
01-29 17:17:14.327: E/AndroidRuntime(1776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
I have the app crashing when the value of the sensor is below 10. I tried to filter the 's2' to be filled with the data from the arduino, only when there is an integer value. but somehow it still crashes with the same error. Am I missing something here?
java.lang.NumberFormatException occurs so you check your string whether is empty or null then convert into int
if(sbprint!=null || !"0".equals(sbprint)){
s2 = Integer.parseInt(sbprint);
initOpacity();
}
change into
if((sbprint!= null) && (!sbprint.isEmpty())){
isNumeric(String sbprint)
{
s2 = Integer.parseInt(sbprint);
initOpacity();
}
else
{
//your string not in numeric format
}
}
And also check your string is numberformat or not by using belowcode.source
public static boolean isNumeric(String str)
{
try
{
double d = Double.parseDouble(str);
}
catch(NumberFormatException nfe)
{
return false;
}
return true;
}