interface Boot;
interface Timer<TMilli>;
interface Leds;
interface SplitControl as RadioControl;
interface SplitControl as SerialControl;
interface Receive;
interface AMSend;
interface Packet;
}
}
这里唯一需要注意的是两个 SplitControl 接口,他们一个负责启动无线通讯,一个负责启动
串口通讯,所以两者被分别重命名为 RadioControl 和 SerialControl。他们一个由
ActiveMessageC 组件提供,另一个由 SerialActiveMessageC 提供。和发送端一样,Timer 和
Leds 只是用于定时点亮、熄灭发光二极管。
数据的处理
从温度传感器返回的数值,称之为 RAW 值,意为未经任何处理、加工的数值,是“毛坯”。
通常这类数值是无法被直接理解的,因为他们只是被简单地从模拟信号传唤成数字信号。
例如温度,如果不对感应到的数值进行处理,返回的则是一串奇怪的 16 进制数值。通过更
换环境,我们可以看到这串 16 进制数值的变化,但是不是我们通常可以直接理解的摄氏温
度(或者华氏)。RAW 值到摄氏温度的转换,根据感应设备不同而不同。这里 TelosB 使
用的是 Sensirion SHT11,于是我就 Google 了 SHT11 的 Datasheet,里面有输出信号转换成
摄氏温度的公式。因为这里负责测温的感应器是用干电池供电的,所以我们摄影供电电压
为 3V,则转换公式为:-40.1 + 0.01 * val,其中 val 为直接从感应器读取的 RAW 值。
多部传感器同时工作
在 TinyOS 官方的文档内,每当无线通讯部分的代码,调用 AMSend 的 send 命令时,使用
的地址均为 AM_BROADCAST_ADDR。也就是“广播”,是不取分对象的发送数据。那如果
有两个不同的传感器分别检测不同地区的温度,那一“广播”,两头的数据就会混在一起。
Google 一通之后发现,send 命令其实是可以指定地址的,通常可以使用接收方的 ID,该