在这篇文章中,我想介绍一种使用 Android 手机的新方法,并解释我们如何使用它来控制Sphero球。如果您不知道这个令人难以置信的球,请查看Sphero 网站。
在这个 Android 项目中,我想描述我们如何在智能手机中集成温度传感器来控制 Sphero 球的颜色。换句话说,我想根据智能手机测量的温度改变球的颜色,即使它处于待机状态。这是一个有趣的项目,因为它可以用来演示一些重要的概念:
最后但同样重要的是,如何连接和使用Sphero ball 及其 SDK 。我们要设计的是一个如下图所示的应用程序:
现在我们知道我们想要获取什么,我们可以混合使用 Android 特性和组件来获取它。我们需要一个监控温度传感器的组件和另一个连接到 Sphero 的组件。如前所述,即使应用程序不在前台或智能手机处于待机状态,我们也想让这项工作正常进行。所以我们需要一个Service,因为这个Android组件可以满足我们的要求。我们将用来控制 Sphero 的组件是:
UI 活动启动两个服务并侦听来自它们的事件。该活动设置了一个警报,用于启动温度传感器服务,这样我们就不会耗尽电池。警报可以配置为以固定的时间间隔启动。每次温度传感器启动时,它都会测量环境温度并广播该值。UI 活动侦听这些事件并在 UI 中显示值。同时,球连接服务监听相同的事件并计算颜色分量(R、G、B)并设置球的颜色。
现在我们已经大致了解了应用程序中的主要组件,我们可以开始对其进行编码了。我们要编码的第一个元素是温度传感器服务。
我们必须实施的另一项服务是通过蓝牙处理 Sphero 连接。您可以参考 Sphero SDK 了解更多信息。我们想在 android 服务中处理连接:
public class BallConnectionService extends Service {
..
}
现在onStartCommand
我们开始连接到 Sphero,同时我们开始监听传入的温度事件(第 8 行)。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (mySphero == null)
doConnection();
IntentFilter rec = new IntentFilter();
rec.addAction(SensorService.TEMP_BALL_SENSOR);
registerReceiver(receiver, rec);
return Service.START_STICKY;
}
在doConnection
我们进行实际连接时:
private void doConnection() {
sendStatus(CONNECTING);
createNotification("Connecting...");
RobotProvider.getDefaultProvider().addConnectionListener(new ConnectionListener() {
@Override
public void onConnected(Robot robot) {
Log.d("Temp", "Connected");
mySphero = (Sphero) robot;
sendStatus(CONNECTED);
createNotification("Connected");
}
@Override
public void onConnectionFailed(Robot robot) {
Log.d("Temp", "Conection failed");
sendStatus(FAILED);
}
@Override
public void onDisconnected(Robot robot) {
Log.d("Temp", "Disconnected");
mySphero = null;
createNotification("Disconnected!");
}
});
RobotProvider.getDefaultProvider().addDiscoveryListener(new DiscoveryListener() {
@Override
public void onBluetoothDisabled() {
Log.d("Temp", "BT Disabled");
}
@Override
public void discoveryComplete(Listspheros) {
Log.d("Temp", "Found ["+spheros.size()+"]");
}
@Override
public void onFound(Listspheros) {
// Do connection
Log.d("Temp", "Found ball");
RobotProvider.getDefaultProvider().connect(spheros.get(0));
}
});
boolean success = RobotProvider.getDefaultProvider().startDiscovery(this);
}
代码看似复杂,仔细看其实很简单。我们开始广播我们尝试连接到 Sphero 的事件(第 3 行),然后,使用 Sphere API,我们注册一个侦听器以了解连接何时建立,并在最后广播连接处于活动状态的新事件通过这种方法,我们开始发现周围是否有新的 Sphero 并准备好连接。
服务的最后一部分用于监听温度事件并设置球的颜色:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
float val = intent.getFloatExtra("value", 0);
Log.d("Temp", "Received value ["+val+"]");
if (mySphero != null) {
// send color to sphero
int red = (int) (255 * val / RANGE) * (val > 10 ? 1 : 0);
int green = (int) ( (255 * (RANGE - Math.abs(val)) / RANGE) * (val < 10 ? 0.2 : 1) );
int blue = (int) (255 * (10 - val) / 10) * (val < 10 ? 1 : 0);
mySphero.setColor(red, green, blue);
}
}
;
现在是创建应用程序并使用 Android 温度传感器控制 Sphero 的时候了。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !