首页 理论教育 DemoSensorC组件如何定义采样的传感器

DemoSensorC组件如何定义采样的传感器

时间:2023-06-28 理论教育 版权反馈
【摘要】:Sense是一个简单的传感器数据采集程序示例。读取数据由Read.read命令的调用和Read.readDone事件的触发两部分构成。SenseC模块为Read接口使用了一个unit16_t的变量,它只能绑定到提供Read接口的组件,这表明SenseC模块希望读取16位无符号整型数据。通常,传感器的配置工作由DemoSensorC组件内部实例化的传感器组件完成。之所以是低3位,是因为Sense应用不知道返回值的精确范围。

DemoSensorC组件如何定义采样的传感器

Sense是一个简单的传感器数据采集程序示例。它周期性地采集传感器数据,并显示读取数值的低3位。Sense应用可以在/opt/tinyos-2.x/apps/Sense里找到,其配件SenseAppC的内容如下:

Sense应用的配件和Blink应用的BlinkAppC配件非常相似。为了更好地理解这些接口的绑定情况,查看SenseC模块中使用到的接口:

和BlinkC一样,SenseC模块使用了Boot、Leds和Timer<TMilli>接口。此外,它还使用了Read<unit16_t>接口。SenseC模块的具体操作步骤是:Boot接口在系统初始化后启动了一个周期性的定时器,每隔一定时间触发定时器事件,并在该事件的响应中通过Read<unit16_t>接口来读取数据。读取数据由Read.read命令的调用和Read.readDone事件的触发两部分构成。每次定时器到时都会调用Read.read命令,然后等待Read.readDone事件的触发。在Read.readDone事件中获取采样数据,并把数据的低3位显示在LED上。

Read接口一次只能读取一个数据,其定义位于“tinyos-2.x/tos/interfaces”目录:

上述代码定义了一个通用Read接口。需要注意的是,该通用接口必须带有一个参数,当且仅当提供的接口和使用的接口具有一样的参数时,两个组件才可以连接起来。还须注意,readDone事件传递了一个<val_t>类型的参数,其实这只是代替实际参数的占位符。SenseC模块为Read接口使用了一个unit16_t的变量,它只能绑定到提供Read<unit16_t>接口的组件,这表明SenseC模块希望读取16位无符号整型数据。如果将该接口连接到提供Read<unit8_t>接口的组件,就会出现编译错误

现在再来看一下SenseC模块使用的Read<unit16_t>接口的语句:

通用组件DemoSensorC提供Read<unit16_t>接口给SenseC组件,但是我们还不知道SenseC模块到底被连接到哪个传感器。事实上,SenseC组件并不定义连接的传感器类型,它甚至也不关心是否能从传感器成功读取数据。这是因为具体的读取数据功能有提供read接口的组件来完成。了解这一点对更好的理解TinyOS系统是很有帮助的。由于每个平台都是不一样的,在不同的平台上将由不同的DemoSensorC组件来提供read接口供SenseC使用,这种做法很好的屏蔽了平台差异对上层开发的影响。例如,在一个既没有内置传感器也没有附带传感板的平台上(如MicaZ平台),DemoSensorC组件可能只是简单地返回一个常量。此外,传感板也可能附带有相应的DemoSensorC组件(比如在Mica系列的传感板上,针对板载的光照传感器定义了demoSensorC组件)。

接下来,让我们来看一下DemoSensorC组件如何定义采样的传感器。

1.DemoSensorC组件(www.xing528.com)

每一个DemoSensorC组件都采用如下方式进行声明:

在不同的节点平台上,DemoSensorC组件的实现部分是不同的。例如,在TelosB平台,DemoSensorC组件里实例化一个VoltageC组件,它可以从MCU内部的电压传感器获得节点的电池电压。而micaz平台没有内置的传感器,它的DemosensorC组件使用系统库组件,比如ConstantSensorC组件或SineSensorC组件,这些组件返回虚假的传感器数据。也就是说,DemoSensorC组件间接地从相关的传感器组件(如VoltageC组件)获得传感器数据,并提供给应用程序。通常,传感器的配置工作由DemoSensorC组件内部实例化的传感器组件完成。

那么,该怎样修改Sense应用程序,使其不再采用默认的传感器?通常的做法是修改DemoSensoeC,即将第一行代码修改为第二行代码:

至于有哪些传感器可用,这就由具体平台决定。一般,传感器组件可能位于相应平台的子目录(/tos/platforms),或者传感板的子目录(/tos/sensorboards);如果是处理器内部的传感器,就可能位于各自芯片的子目录(/tos/chips)。ConstantSensorC组件和SineSensorC组件分别返回常量值和正弦值作为传感器数据,它们可以在系统组件库(/tos/system)找到。

2.运行Sense应用

在apps/Sense目录下,根据当前的硬件平台,输入以下编译命令,如果碰到如下错误:

表明当前平台还没有DemoSensorC组件。可以从/tos/platform/micaz目录复制DemoSensor C.nc文件到当前的平台目录。

如果有一个Mica系列的节点和一个基本传感板(mda100),可以做一个更有趣的测试,输入以下命令告诉节点采集基本传感板mda100上的光照传感器数据:

下载运行该程序,传感数据的低3位就会显示在节点的LED上。之所以是低3位,是因为Sense应用不知道返回值的精确范围。如果是unit_16类型值的高3位,当数值经过12位ADC转换后就毫无意义(除非数值是左对齐)。如果DemoSensorC组件从传感器那里获得的数值在上下波动,将会看到LED灯在不停地闪烁。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈