One more request; this time a display of the axis position of a motor. Here the object is drawn in the draw() loop instead of the plot() event, the latest is faster and excellent for wave-line plotting, but not as stable as draw();
Code
- Arduino code (just used for testing, because I don’t have the hardware.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 12); // RX, TX
int value = 0;
void setup() {
mySerial.begin(115200); // Set the baudrate equal to HC06 setting
}
void loop() {
mySerial.println(value);
value++;
delay(5);
if(value > 1023) value = 0;
}
- Processing code
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import processing.core.PConstants;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Activity activity;
Permission bt, afl;
Knob knob_1;
Thread runThread;
byte[] readBuffer;
int buffer_index;
int counter;
boolean stop_thread, plotting = false, init = true;
String myString = null;
String msg = " ";
String device_name = "HC-05";
String r_str = " ";
String t_str;
String incoming_position = "";
float px, py, x, y;
float s_angle = 0;
float position_in_degree = 0;
void setup() {
fullScreen();
orientation(PORTRAIT);
bt = new Permission(this, "BLUETOOTH");
afl = new Permission(this, "ACCESS_FINE_LOCATION");
knob_1 = new Knob(width/2, height/3, int(width/1.5));
textAlign(CENTER);
textSize(70);
t_str = "Click to connect.";
textSize(12); // To create a "text width factor",
float twf = width/textWidth(t_str);
int f = 6; // Empericaly found
textSize(f*twf); // Making it proportional for other screen resolutions
activity = this.getActivity();
}
void draw() {
if (plotting == false && init) {
background(150);
text(t_str, width/2, height/2);
} else {
background(100);
knob_1.render(s_angle);
fill(255);
text("Position in Degree: ", width/2, 2*height/3);
text(int(degrees(s_angle)), width/2, 2*height/3+1.5*textAscent());
text("RAW Position:", width/2, 3*height/4);
text(incoming_position, width/2, 3*height/4+1.5*textAscent());
}
}
void mousePressed () {
if (init) {
try {
init = false;
findBluetooth();
connect();
plotting = true;
fill(0, 0, 90);
rect(0, 0, width, height);
}
catch (IOException ex) {
println(ex);
}
}
}
void plot(String r_str) {
if(r_str.length() < 1 || r_str == null) r_str = "0";
incoming_position = r_str;
s_angle = map(float(r_str), 0, 1024, 0, TWO_PI);
}
class Knob {
float size, slice, angle;
PVector center;
Knob(int x, int y, int diameter) {
this.center = new PVector(x, y);
this.size = diameter;
this.slice = TWO_PI/24;
}
void render(float angle) {
pushStyle();
pushMatrix();
translate(center.x, center.y);
noFill();
strokeWeight(size/100);
stroke(255);
ellipse(0, 0, size, size);
float e;
for (int i = 0; i < 24; i++) {
if(i % 6 == 0) e = size/18;
else e = 0;
line(size*0.41, 0, size*0.47+e, 0);
rotate(slice);
}
rotate(angle);
line(0, 0, size*0.47, 0);
popMatrix();
popStyle();
}
}
void findBluetooth() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
println("No bluetooth adapter available");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
print("Paired devices MAC Adress:");
printArray(pairedDevices);
for (BluetoothDevice device : pairedDevices) {
print("Paired devices by name:");
println(device.getName());
if (device.getName().equals(device_name)) {
mmDevice = device;
println("Bluetooth device name found");
break;
}
}
}
}
void connect() throws IOException {
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
println("Bluetooth connected");
final byte delimiter = 10; //This is the ASCII code for a lf
stop_thread = false;
buffer_index = 0;
readBuffer = new byte[1024];
runThread = new Thread(new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted() && !stop_thread) {
try {
int bytesAvailable = mmInputStream.available();
if (bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for (int i = 0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes = new byte[buffer_index];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
plot(data);
buffer_index = 0;
} else {
readBuffer[buffer_index++] = b;
}
}
}
}
catch (IOException ex)
{
stop_thread = true;
}
}
}
}
);
runThread.start();
}
void closeBluetooth() throws IOException {
stop_thread = true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
println("Bluetooth stopped");
}
class Permission {
PApplet parent;
boolean requestedPortraitImage = false;
Permission(PApplet pParent, String permissionName) {
parent = pParent;
parent.requestPermission("android.permission."+permissionName, "onPermissionResult", this);
}
void onPermissionResult(boolean granted) {
if (granted) println("User did grant permission.");
else println("User did NOT grant permission.");
}
}
void onPause() {
try {
closeBluetooth();
}
catch (Exception ex) {
}
super.onPause();
}
void onStop () {
try {
closeBluetooth();
}
catch (Exception ex) {
}
super.onStop();
}
void onRestart() {
try {
findBluetooth();
connect();
}
catch (IOException ex) {
println(ex);
}
}