├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── LICENSE.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── danyal │ │ └── bluetoothhc05 │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── danyal │ │ │ └── bluetoothhc05 │ │ │ ├── DeviceList.java │ │ │ └── ledControl.java │ └── res │ │ ├── layout │ │ ├── activity_device_list.xml │ │ └── activity_led_control.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── danyal │ └── bluetoothhc05 │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Danyal Imran 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android App HC05 Arduino 2 | 3 | ### - Introduction 4 | 5 | Arduino is a computer hardware and software company, project, and user community that designs and manufactures microcontroller kits for building digital devices and interactive objects that can sense and control objects in the physical world. [1] 6 | 7 | ![Arduino](https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Arduino_Uno_-_R3.jpg/220px-Arduino_Uno_-_R3.jpg) 8 | 9 | HC‐05 module is an easy to use Bluetooth SPP (Serial Port Protocol) module,designed for transparent wireless serial connection setup.The HC-05 Bluetooth Module can be used in a Master or Slave configuration, making it a great solution for wireless communication. [2] 10 | 11 | ![HC05](https://wiki.eprolabs.com/images/thumb/3/38/HC-05.jpg/250px-HC-05.jpg) 12 | 13 | ### - About This Application 14 | 15 | This Android Application lets you connect to HC-05 module via Bluetooth and hence lets you send signals to Arduino so that it can perform desired operations successfully. The Application sends 5 signals (numbers 1 to 5) that are used to prepare a sandwich deal accordingly. Example Combo 1 is Mayoneese, Mustard, Chicken etc. 16 | 17 | The code is pretty simple and can be ammended for desired applications. 18 | 19 | ### - Screenshots 20 | 21 | - Android App Home Page 22 | 23 | ![HomePage](http://i.imgur.com/W6q1boP.png) 24 | 25 | - Android App Device Communication 26 | 27 | ![DeviceComm](http://i.imgur.com/8EGkfox.png) 28 | 29 | - Serial Monitor for Arduino IDE 30 | 31 | ![ArduinoIDE](http://i.imgur.com/x35z1XP.png) 32 | 33 | ### - Reference 34 | 35 | - [1] - [Wikipedia - Arduino](https://en.wikipedia.org/wiki/Arduino) 36 | - [2] - [Wikipedia - HC 05](https://wiki.eprolabs.com/index.php?title=Bluetooth_Module_HC-05) 37 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | defaultConfig { 7 | applicationId "com.example.danyal.bluetoothhc05" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.2.0' 28 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 29 | testCompile 'junit:junit:4.12' 30 | } 31 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Danyal\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/danyal/bluetoothhc05/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.danyal.bluetoothhc05; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.danyal.bluetoothhc05", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/danyal/bluetoothhc05/DeviceList.java: -------------------------------------------------------------------------------- 1 | package com.example.danyal.bluetoothhc05; 2 | 3 | import android.bluetooth.BluetoothAdapter; 4 | import android.bluetooth.BluetoothDevice; 5 | import android.content.Intent; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.os.Bundle; 8 | import android.view.View; 9 | import android.widget.AdapterView; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.Button; 12 | import android.widget.ListView; 13 | import android.widget.TextView; 14 | import android.widget.Toast; 15 | 16 | import java.util.ArrayList; 17 | import java.util.Set; 18 | 19 | public class DeviceList extends AppCompatActivity { 20 | 21 | Button btnPaired; 22 | ListView devicelist; 23 | 24 | private BluetoothAdapter myBluetooth = null; 25 | private Set pairedDevices; 26 | public static String EXTRA_ADDRESS = "device_address"; 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_device_list); 32 | 33 | btnPaired = (Button) findViewById(R.id.button); 34 | devicelist = (ListView) findViewById(R.id.listView); 35 | 36 | myBluetooth = BluetoothAdapter.getDefaultAdapter(); 37 | if ( myBluetooth==null ) { 38 | Toast.makeText(getApplicationContext(), "Bluetooth device not available", Toast.LENGTH_LONG).show(); 39 | finish(); 40 | } else if ( !myBluetooth.isEnabled() ) { 41 | Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 42 | startActivityForResult(turnBTon, 1); 43 | } 44 | 45 | btnPaired.setOnClickListener(new View.OnClickListener() { 46 | @Override 47 | public void onClick(View v) { 48 | pairedDevicesList(); 49 | } 50 | }); 51 | } 52 | 53 | private void pairedDevicesList () { 54 | pairedDevices = myBluetooth.getBondedDevices(); 55 | ArrayList list = new ArrayList(); 56 | 57 | if ( pairedDevices.size() > 0 ) { 58 | for ( BluetoothDevice bt : pairedDevices ) { 59 | list.add(bt.getName().toString() + "\n" + bt.getAddress().toString()); 60 | } 61 | } else { 62 | Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show(); 63 | } 64 | 65 | final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list); 66 | devicelist.setAdapter(adapter); 67 | devicelist.setOnItemClickListener(myListClickListener); 68 | } 69 | 70 | private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener() { 71 | @Override 72 | public void onItemClick(AdapterView parent, View view, int position, long id) { 73 | String info = ((TextView) view).getText().toString(); 74 | String address = info.substring(info.length()-17); 75 | 76 | Intent i = new Intent(DeviceList.this, ledControl.class); 77 | i.putExtra(EXTRA_ADDRESS, address); 78 | startActivity(i); 79 | } 80 | }; 81 | } 82 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/danyal/bluetoothhc05/ledControl.java: -------------------------------------------------------------------------------- 1 | package com.example.danyal.bluetoothhc05; 2 | 3 | import android.app.ProgressDialog; 4 | import android.bluetooth.BluetoothAdapter; 5 | import android.bluetooth.BluetoothDevice; 6 | import android.bluetooth.BluetoothSocket; 7 | import android.content.Intent; 8 | import android.os.AsyncTask; 9 | import android.support.v7.app.AppCompatActivity; 10 | import android.os.Bundle; 11 | import android.view.View; 12 | import android.widget.Button; 13 | import android.widget.SeekBar; 14 | import android.widget.TextView; 15 | import android.widget.Toast; 16 | 17 | import org.w3c.dom.Text; 18 | 19 | import java.io.IOException; 20 | import java.util.UUID; 21 | 22 | public class ledControl extends AppCompatActivity { 23 | 24 | Button btn1, btn2, btn3, btn4, btn5, btnDis; 25 | String address = null; 26 | TextView lumn; 27 | private ProgressDialog progress; 28 | BluetoothAdapter myBluetooth = null; 29 | BluetoothSocket btSocket = null; 30 | private boolean isBtConnected = false; 31 | static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | 37 | Intent newint = getIntent(); 38 | address = newint.getStringExtra(DeviceList.EXTRA_ADDRESS); 39 | 40 | setContentView(R.layout.activity_led_control); 41 | 42 | btn1 = (Button) findViewById(R.id.button2); 43 | btn2 = (Button) findViewById(R.id.button3); 44 | btn3 = (Button) findViewById(R.id.button5); 45 | btn4 = (Button) findViewById(R.id.button6); 46 | btn5 = (Button) findViewById(R.id.button7); 47 | btnDis = (Button) findViewById(R.id.button4); 48 | lumn = (TextView) findViewById(R.id.textView2); 49 | 50 | new ConnectBT().execute(); 51 | 52 | btn1.setOnClickListener(new View.OnClickListener() { 53 | @Override 54 | public void onClick (View v) { 55 | sendSignal("1"); 56 | } 57 | }); 58 | 59 | btn2.setOnClickListener(new View.OnClickListener() { 60 | @Override 61 | public void onClick (View v) { 62 | sendSignal("2"); 63 | } 64 | }); 65 | 66 | btn3.setOnClickListener(new View.OnClickListener() { 67 | @Override 68 | public void onClick (View v) { 69 | sendSignal("3"); 70 | } 71 | }); 72 | 73 | btn4.setOnClickListener(new View.OnClickListener() { 74 | @Override 75 | public void onClick (View v) { 76 | sendSignal("4"); 77 | } 78 | }); 79 | 80 | btn5.setOnClickListener(new View.OnClickListener() { 81 | @Override 82 | public void onClick (View v) { 83 | sendSignal("5"); 84 | } 85 | }); 86 | 87 | btnDis.setOnClickListener(new View.OnClickListener() { 88 | @Override 89 | public void onClick (View v) { 90 | Disconnect(); 91 | } 92 | }); 93 | } 94 | 95 | private void sendSignal ( String number ) { 96 | if ( btSocket != null ) { 97 | try { 98 | btSocket.getOutputStream().write(number.toString().getBytes()); 99 | } catch (IOException e) { 100 | msg("Error"); 101 | } 102 | } 103 | } 104 | 105 | private void Disconnect () { 106 | if ( btSocket!=null ) { 107 | try { 108 | btSocket.close(); 109 | } catch(IOException e) { 110 | msg("Error"); 111 | } 112 | } 113 | 114 | finish(); 115 | } 116 | 117 | private void msg (String s) { 118 | Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show(); 119 | } 120 | 121 | private class ConnectBT extends AsyncTask { 122 | private boolean ConnectSuccess = true; 123 | 124 | @Override 125 | protected void onPreExecute () { 126 | progress = ProgressDialog.show(ledControl.this, "Connecting...", "Please Wait!!!"); 127 | } 128 | 129 | @Override 130 | protected Void doInBackground (Void... devices) { 131 | try { 132 | if ( btSocket==null || !isBtConnected ) { 133 | myBluetooth = BluetoothAdapter.getDefaultAdapter(); 134 | BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address); 135 | btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID); 136 | BluetoothAdapter.getDefaultAdapter().cancelDiscovery(); 137 | btSocket.connect(); 138 | } 139 | } catch (IOException e) { 140 | ConnectSuccess = false; 141 | } 142 | 143 | return null; 144 | } 145 | 146 | @Override 147 | protected void onPostExecute (Void result) { 148 | super.onPostExecute(result); 149 | 150 | if (!ConnectSuccess) { 151 | msg("Connection Failed. Is it a SPP Bluetooth? Try again."); 152 | finish(); 153 | } else { 154 | msg("Connected"); 155 | isBtConnected = true; 156 | } 157 | 158 | progress.dismiss(); 159 | } 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_device_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 20 | 21 | 31 | 32 |