Hi guys,
am building a small app in android studio that reads the electron sensor variable from the particle cloud every ten seconds. It works fine, i can read the variables from the sensor values on my app, its all good. Just that i am only able to get the values when the electron is connected to the usb cable, when i unplug the usb cable and use battery power, i get a zero reading on the sensor values. As soon as i plug in the usb cable to the electron, i get normal values, and when i unplug i get a zero reading on my app.
here’s my android studio and electron code if you need to see it
android studio :
package com.example.smart_trashcan;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.IntegerRes;
import android.support.annotation.NonNull;
import android.support.v4.app.NotificationCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;
import io.particle.android.sdk.cloud.ParticleCloud;
import io.particle.android.sdk.cloud.ParticleCloudSDK;
import io.particle.android.sdk.cloud.ParticleDevice;
import io.particle.android.sdk.cloud.exceptions.ParticleCloudException;
import io.particle.android.sdk.utils.Async;
import io.particle.android.sdk.utils.Toaster;
public class MainActivity extends AppCompatActivity {
ArrayList canNumbers = new ArrayList<>(Arrays.asList("Trash Can 1"));//, "Trash Can 2", "Trash Can 3", "Trash Can 4", "Trash Can 5", "Trash Can 6", "Trash Can 7","Trash Can 8", "Trash Can 9", "Trash Can 10", "Trash Can 11", "Trash Can 12", "Trash Can 13", "Trash Can 14"));
ArrayList trashCanImgs = new ArrayList<>(Arrays.asList(R.mipmap.trash));//,R.mipmap.trash,R.mipmap.trash, R.mipmap.trash, R.mipmap.trash, R.mipmap.trash, R.mipmap.trash,R.mipmap.trash,R.mipmap.trash,R.mipmap.trash,R.mipmap.trash,R.mipmap.trash,R.mipmap.trash, R.mipmap.trash));
RecyclerView recyclerView;
private static final String ARG_DEVICEID = "ARG_DEVICEID";
double bucketHeight;
ProgressDialog progressDialog;
private NotificationManager mNotificationManager;
private static String DEFAULT_CHANNEL_ID = "default_channel";
private static String DEFAULT_CHANNEL_NAME = "Default";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ParticleCloudSDK.init(this);
setContentView(R.layout.activity_main);
// get the reference of RecyclerView
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
// set a LinearLayoutManager with default vertical orientaion
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(linearLayoutManager); // set LayoutManager to RecyclerView
Button refresh = (Button) findViewById(R.id.loadmore);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false);
progressDialog.setMessage("Loading...");
progressDialog.show();
final String email = "itwabi@gmail.com";
final String password = "tellepie123";
System.out.println("async task is executing now");
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//RunAsync(recyclerView, email, password, bucketHeight, canNumbers, trashCanImgs, canLevel);
Async.executeAsync(ParticleCloudSDK.getCloud(), new Async.ApiWork<ParticleCloud, Object>() {
@Override
public Object callApi(@NonNull ParticleCloud sparkCloud) throws ParticleCloudException, IOException {
sparkCloud.logIn(email, password);
sparkCloud.getDevices();
ParticleDevice device = sparkCloud.getDevice("37005a000551353431383736");
System.out.println(device.getVariables().size());
Object obj;
try {
obj = device.getVariable("analogvalue");
int looper = Integer.parseInt(obj.toString());
Log.d("BANANA", "distance: " + obj);
System.out.println("getting variable");
} catch (ParticleDevice.VariableDoesNotExistException e) {
Toaster.s(MainActivity.this, e.getMessage());
obj = -2;
}
return obj;
}
@Override
public void onSuccess(@NonNull Object value) {
//Toaster.l(MainActivity.this, "Logged in");
//Toaster.l(MainActivity.this, "raw value: " + value.toString());
ArrayList<Double> canLevel = new ArrayList<>();
double raw = Double.valueOf(value.toString());
//double percentage = (raw/bucketHeight) * 100;
canLevel.add(raw);
System.out.println("raw : " + raw);
if(raw < 5.0){
sendNotification("TrashCan 1", "at physics dpt, trash is ready for collection");
System.out.println("notification sent");
}
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, canNumbers, trashCanImgs, canLevel);
bucketHeight = canLevel.get(0);
recyclerView.setAdapter(customAdapter);
progressDialog.dismiss();
//Intent intent = MainActivity.buildIntent(MainActivity.this, 123, mDevice.getID());
//startActivity(intent);
}
@Override
public void onFailure(@NonNull ParticleCloudException e) {
Toaster.l(MainActivity.this, e.getBestMessage());
e.printStackTrace();
Log.d("info", e.getBestMessage());
}
});
}
});
Handler handler = new Handler();
int delay = 10000; //milliseconds
handler.postDelayed(new Runnable(){
public void run(){
//do something
System.out.println("am looping!");
Async.executeAsync(ParticleCloudSDK.getCloud(), new Async.ApiWork<ParticleCloud, Object>() {
@Override
public Object callApi(@NonNull ParticleCloud sparkCloud) throws ParticleCloudException, IOException {
sparkCloud.logIn(email, password);
sparkCloud.getDevices();
ParticleDevice device = sparkCloud.getDevice("37005a000551353431383736");
System.out.println(device.getVariables().size());
Object obj;
try {
obj = device.getVariable("distance");
Log.d("BANANA", "distance: " + obj);
System.out.println("getting variable");
} catch (ParticleDevice.VariableDoesNotExistException e) {
Toaster.s(MainActivity.this, e.getMessage());
obj = -2;
}
return obj;
}
@Override
public void onSuccess(@NonNull Object value) {
//Toaster.l(MainActivity.this, "Logged in");
//Toaster.l(MainActivity.this, "raw value: " + value.toString());
ArrayList<Double> canLevel1 = new ArrayList<>();
double raw = Double.valueOf(value.toString());
//double percentage = (raw/bucketHeight) * 100;
canLevel1.add(raw);
System.out.println("raw : " + raw);
if(raw < 5.0){
sendNotification("TrashCan 1", "at physics dpt, trash is ready for collection");
System.out.println("notification sent");
}
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, canNumbers, trashCanImgs, canLevel1);
recyclerView.setAdapter(customAdapter);
progressDialog.dismiss();
//Intent intent = MainActivity.buildIntent(MainActivity.this, 123, mDevice.getID());
//startActivity(intent);
}
@Override
public void onFailure(@NonNull ParticleCloudException e) {
Toaster.l(MainActivity.this, e.getBestMessage());
e.printStackTrace();
Log.d("info", e.getBestMessage());
}
});
handler.postDelayed(this, delay);
}
}, delay);
}
public void sendNotification(String title, String message){
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
createNotificationChannel(mNotificationManager);
//2.Build Notification with NotificationCompat.Builder
Notification notification = new NotificationCompat.Builder(MainActivity.this, DEFAULT_CHANNEL_ID)
.setContentTitle(title) //Set the title of Notification
.setContentText(message) //Set the text for notification
.setSmallIcon(android.R.drawable.ic_menu_view) //Set the icon
.build();
//Send the notification.
mNotificationManager.notify(1, notification);
}
public static void createNotificationChannel(NotificationManager notificationManager) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//Create channel only if it is not already created
if (notificationManager.getNotificationChannel(DEFAULT_CHANNEL_ID) == null) {
notificationManager.createNotificationChannel(new NotificationChannel(
DEFAULT_CHANNEL_ID, DEFAULT_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT
));
}
}
}
}
electron code :
const int trigPin = 2;
const int echoPin = 6;
int tempC;
int analogvalue;
int aString;
// defines variables
long duration;
double distance;
void setup() {
Particle.variable("distance", &distance, DOUBLE);
Particle.variable("duration", &duration);
Particle.variable("analogvalue", &analogvalue, INT);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
//analogvalue = addition(distance + 0);
// Calculating the distance
distance= duration*0.034/2;
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
analogvalue = 129;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
Your input will be appreciated.