基于无线传感器的综合展示平台设计

 

基于无线传感器的综合展示平台设计

【实验日期】2013年1月29日

【实验内容】设计一个基于无线传感器的综合展示平台,实现以下功能:

(1)环境感知:能够获取环境中的温度、湿度、光照强度、CUP电压

(2)信号传输:所采集的环境参数通过无线多跳的形式传输,最终通过基站串口上传到上位机终端

(3)数据解析:采用串口调试助手接收串口数据,并解析接收到的数据

 

【具体要求】

(1)系统由4个普通节点、1个基站、和一台上位机组成

(2)1#节点采集温度,2#节点采集湿度,3#节点采集光照强度,4#节点采集电压参数

(3)基站程序可以选用BaseStation程序

(4)1#节点将温度参数传给2#节点,并在1#节点连接的PC上显示“已发送数**数据至2#节点”的字样。

 

2#节点反馈“2”给1#节点,1#节点通过LED灯显示,并在1#节点连接的PC上print出“接收到来自2#节点的反馈信息:**”的字样

 

2#节点将1#节点的信息连同自己感知的信息转发至3#信息,并在2#节点连接的PC上print出“已发送**数据至3#节点”的字样

 

3#节点反馈“3”给2#节点,2#节点通过LED的形式显示,并在2#节点连接的PC上print出“接收到来自2#节点的反馈信息:**”的字样

 

剩下节点依此类推

注意4#节点将获得的所有参数转发至基站

(5)基站连接的PC上装有串口调试助手,能获得来自基站发送的数据

 

(6)串口调试助手收到数据后,将所采集到的传感参数发送至基站,并由基站通过广播的形式发送数据到普通节点。普通节点只提取自己原来所采集的传感数据,如果与原来发送的数据相同,则3个LED同时闪烁。否则3个LED一直亮。

 

(7)循环(1)~(6)

1.任务

*本人设计的为2号节点,其他节点略有差别。

由于二号节点兼有接收和发送的通信功能,因此定义结构体变量TemMsg、RealMsg、BackMsg、TotalMsg以及message_t变量,如ToUartMsg,Feedback,Total来完成数据的解包和封装

 

除通信功能外,2号节点还需对周围环境采集湿度Humidity并与1号节点发来的数据封装并发送,以及分析反馈信息和提取校验来自上位机的总反馈信息的逻辑功能

以下为流程简图

 

2.设计过程

首先是基于Linux下的TinyOS系统,使用Telosb节点实现



3.实验过程及现象

在设计过程中还是陆续出现了不少的问题,如:

1.      不同的数据包如何识别与区分,打印库对实验数据的干扰

2.      因为不够细心导致提取变量时的错误

3.      有效数据数据段没有一开始就统一起来,导致后期需要作修改

4.      全局变量赋值语句不能在Boot.booted()前

 

上位机通过窜口侦听的数据:

7E 45 00 00 02 00 01 02 00 06 1A 80CE 8C 7E

7E 45 00 00 01 00 02 01 00 06 01 BB 80 7E

7E 45 00 00 03 00 02 04 00 06 1A 80 0420 C4 88 7E

7E 45 00 00 02 00 03 01 00 06 01 68 F2 7E

7E 45 00 00 04 00 03 06 00 06 1A 80 0420 00 35 66 CC 7E

7E 45 00 00 03 00 04 01 00 06 01 DD 2D 7E

7E 45 00 00 05 00 04 08 00 06 1A 80 0420 00 35 0F D9 63 35 7E

F |P | S| D|            Payload               |CR  |F

Payload为串口协议包中的Payload

 

在此组数据中:

1A 80 表示温度,由1号节点收集

04 20 表示湿度,由2号节点收集

00 35 表示光照强度,由3号节点收集

0F D9 表示电压,由4号节点收集

5.    总结

  学艺未精,查阅了很多资料才总算完成了这个基于无线传感器的综合设计。但经过本次试验,收获颇多,很多以前忘记了的知识也一点点地捡回来了。我是在一开始就作了一个流程简图,也正正是因为这一点,给我在程序的编写和调试时带来了不少便捷。还学习了有关串口数据包格式分析,以及sendDone函数、startDone函数等的调用。其实程序中依然存在不少问题,如再次传输数据时,由于是先由上位机发送反馈,等校验成功后才被动执行下一次传输,但是上位机再一次接收到的数据却并不准确,此问题还有待解决。

 

附代码:

RadioC.nc

 

#include "Timer.h" 

#include "AM.h"

module RadioC

 uses 

   { 

     interface Boot; 

     interface Leds; 

     interface Packet;

     interface AMSend; 

     interface Receive as AMReceive[am_id_t id];

     interface Timer<TMilli> as Timer0;

     interface SplitControl as AMControl; 

     interface Read<uint16_t> as ReadHumidity; 

   } 

  implementation 

 { 

     typedef nx_struct TemMsg                           //定义数据包

    {  

      nx_uint16_t Tem;  

    }TemMsg; 

      

     typedef nx_struct RealMsg                           //定义数据包

    {  

      nx_uint16_t Tem; 

      nx_uint16_t Hum; 

    }RealMsg; 

   

     typedef nx_struct BackMsg                           //定义反馈包

    {  

      nx_uint8_t back; 

    }BackMsg; 

 

     typedef nx_struct TotalMsg                          //定义校验包

    {

      nx_uint16_t Tem; 

      nx_uint16_t Hum; 

      nx_uint16_t Bri;

      nx_uint16_t Vol;

    }TotalMsg;      

 

   uint16_t REtem,REhum,Check; 

   message_t ToUartMsg,Feedback,Total; 

   task void SendMsg2AM(); 

 

     event void Boot.booted() 

      { 

       call AMControl.start(); 

      } 

 

      event void AMControl.startDone(error_t error)       //自检

       {

         call Leds.set(1);   

         if(error == !SUCCESS) 

         call AMControl.start();                         //不成功则重新启动

       } 

      event void AMControl.stopDone(error_t error)

     {} 

 

     event message_t *AMReceive.receive[am_id_t id](message_t *msg,void*payload,uint8_t len)

   {

      BackMsg *btrpkt2 = (BackMsg *)(callPacket.getPayload(&Feedback,sizeof(BackMsg)));

      if(len==sizeof(TemMsg))                           //读取的为#1节点发来的数据包

      {

      TemMsg *btrpkt=(TemMsg *)payload;

      REtem=btrpkt->Tem;    

      call ReadHumidity.read();                         //初次采集湿度

         call Leds.led0Toggle();

       btrpkt2-> back=1;                              //标记反馈信号

    if(call AMSend.send(1,&Feedback,sizeof(BackMsg))==SUCCESS)

         call Leds.led1Toggle();                        //反馈给#1节点

     }

     else if(len==sizeof(BackMsg))                       //读取的为#3节点发来的反馈包

      {                

        if(btrpkt2-> back==1)                            //解析

         {

          call Leds.led0Off();

          call Leds.led1On();

          call Leds.led2Off();

         }

      }

     else if(len==sizeof(TotalMsg))                      //读取的为#4节点发来的校验包

     {

     TotalMsg *btrpkt=(TotalMsg *)payload;

     Check=btrpkt->Hum;

         call Leds.set(7);

      if(REhum==Check)                                  //上次采集的湿度正确

        {

        call Timer0.startPeriodic(500);                 //采集下次湿度以待发送

        }

     }

     else                                               //无效

     {

     btrpkt2-> back=0; 

     call AMSend.send(1,&Feedback,sizeof(BackMsg));

      }

     return msg;

   }

 

       event void ReadHumidity.readDone(error_t result,uint16_t temp) 

         { 

           if(result == SUCCESS)

            {

            REhum =temp;

            }

           else 

              REhum = 0xFFFF;

            post SendMsg2AM(); 

         } 

          

        task void SendMsg2AM() 

         {    

           RealMsg *btrpkt = (RealMsg *)(call Packet.getPayload(&ToUartMsg,sizeof(RealMsg)));          

           btrpkt->Tem = REtem; 

           btrpkt->Hum = REhum;

           call AMSend.send(3,&ToUartMsg,sizeof(RealMsg));             //将数据打包后发送

         } 

   

        event void AMSend.sendDone(message_t *msg,error_t error) 

          { 

          }  

  

       event void Timer0.fired()

        {

          call Leds.led0Toggle();

          call Leds.led1Toggle();

          call Leds.led2Toggle(); 

        }

 } 

 

RadioAppC.nc

 

/*author:Kelvin

date:2013.01.29

*/

 

configuration RadioAppC

{

 

implementation 

 components RadioC,MainC,LedsC; 

 components new SensirionSht11C() as Temp_HumiC;  

 components ActiveMessageC; 

 components new AMSenderC(6); 

 components new TimerMilliC() as Timer0;

 

 RadioC.Boot -> MainC;

 RadioC.Leds -> LedsC;

 RadioC -> ActiveMessageC.Packet; 

 RadioC -> ActiveMessageC.Receive;

 RadioC.AMControl -> ActiveMessageC; 

 RadioC.ReadHumidity -> Temp_HumiC.Humidity;  

 RadioC.Timer0 -> Timer0;

 RadioC.AMSend -> AMSenderC; 

}  

 

Makefile

 

COMPONENT=RadioAppC

CFLAGS+=-DTASKLET_IS_TASK

include $(MAKERULES)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值