一、加速度计

图一、Sun SPOT的XYZ坐标图

图二、Sun SPOT的XY坐标方向
加速度是一个矢量。在使用Sun SPOT的加速度计之前,我们需要了解该矢量所使用的坐标系统。上面两个图形介绍了Sun SPOT的坐标系统,当Sun SPOT如图一所示水平放置时,Z 轴的方向为垂直向下,其加速度值为1G。
在应用程序的开头部分,您需要import与加速度计相关的类库:
import com.sun.spot.sensorboard.peripheral.IAccelerometer3D;
在应用程序中,声明一个IAccelerometer3D对象:
private IAccelerometer3D accel = EDemoBoard.getInstance().getAccelerometer();
获得X, Y, Z三轴上的加速度值:
double accelX = accel.getAccelX();
double accelY = accel.getAccelY();
double accelZ = accel.getAccelZ();
获得X, Y, Z三轴上的倾斜度:
double tiltX = accel.getTiltX();
double tiltY = accel.getTiltY();
double tiltZ = accel.getTiltZ();
在Sun SPOT自带的传感器上,自带的加速度计型号为LIS3L02AQ。该加速度计的测量范围可以设定为2G或者是6G,在测量范围不同的时候,其测量精度也 是不同的。如果我们需要在应用程序当中得到关于加速度计的更多信息,建议您直接使用类库LIS3L02AQAccelerometer。同样,在应用程序 的开头部分,您需要import与该加速度及相关的类库:
import com.sun.spot.sensorboard.peripheral.LIS3L02AQAccelerometer;
在应用程序中访问该加速度计:
private LIS3L02AQAccelerometer acc = (LIS3L02AQAccelerometer)EDemoBoard.getInstance().getAccelerometer();
LIS3L02AQAccelerometer是IAccelerometer3D的一个子类,所以上面所介绍的获得三轴加速度和倾斜度的方法仍然可以使用。
获得加速度计的当前测量范围。如果加速度计工作在2G状态,该方法返回SCALE_2G;如果加速度计工作在6G状态,该方法范围SCALE_6G。
public int scale = acc.getCurrentScale();
设定加速度计的测量范围为2G:
acc.setScale(acc.SCALE_2G);
设定加速度计的测量范围为6G:
acc.setScale(acc.SCALE_6G);
二、光照传感器
在应用程序的开头部分,您需要import与光照传感器相关的类库:
import com.sun.spot.sensorboard.peripheral.ILightSensor;
在应用程序中,声明一个ILightSensor对象:
private ILightSensor lightSensor = EDemoBoard.getInstance().getLightSensor();
读取光照强度,其数值范围在0 到740 之间。
int lightIndication = lightSensor.getValue();
三、温度传感器
在应用程序的开头部分,您需要import与温度传感器相关的类库:
import com.sun.spot.sensorboard.io.ITemperatureInput;
在应用程序中,声明一个ITemperatureInput对象:
private ITemperatureInput tempSensor = EDemoBoard.getInstance().getADCTemperature();
读取温度数据,用华氏度表示:
double tempF = tempSensor.getFahrenheit();
读取温度数据,用摄氏度表示:
double tempC = tempSensor.getCelsius();
四、使用控制按钮
在应用程序的开头部分,您需要import与控制按钮相关的类库:
import com.sun.spot.sensorboard.peripheral.ISwitch;
在应用程序中,声明两个ISwitch对象,其中sw1为左边的控制按钮,sw2为右边的控制按钮:
private ISwitch sw1 = EDemoBoard.getInstance().getSwitches()[0];
private ISwitch sw2 = EDemoBoard.getInstance().getSwitches()[1];
控制按钮实际上是一个数字开关,它可以被设置为开启和关闭两种状态。
检查sw1是否为开启状态:
boolean status = sw1.isOpen();
检查sw2是否为关闭状态:
boolean status = sw2.isClose();
您也可以让程序等待某个控制按钮的状态发生改变,例如:
sw1.waitForChange();
waitForChange()是一个阻塞方法。也就是说,它会停止当前线程的执行,一直到该控制按钮的状态发生改变为止。
在 更多的情况下,我们可能需要知道的是某个控制按钮是否曾经被按下(作为改变系统状态的某种信号),而并不关心其当前状态是开启还是关闭。一个简单的办法是 读取该控制按钮的当前状态并且与上一次的状态进行比较,如果结果不一样则判断该按钮的状态曾经被按下(因为其状态发生了改变)。
五、综合编程练习
编 写一个Sun SPOT应用程序,用LED模拟一个在水中作单向运动的小球。该小球可以是一个密度大于水的铁球,也可以是一个密度小于水的气球,使用左边的控制按钮改变 其密度状态。该小球的颜色可以使用温度或者是亮度来控制,当温度(亮度)较高的时候,小球的颜色为红色;当温度(亮度)较低的时候,小球的颜色为绿色;过 渡颜色为蓝色。
在完成这个编程练习的时候,可以参考Demo\CodeSamples这个目录里面的例程。