wsn实验

  【记录一下关键步骤】


  【实验一LED】

下面两个.nc文件在分别Notepad++中新建,并保存到同一个文件夹中


  【LED_C.nc】

复制代码
configuration LED_C  
{ }  
  
implementation  
{  
    components LED_M as App;  
    components MainC;     
    App.Boot->MainC.Boot;  
      
    components LedsC;  
    App.Leds -> LedsC.Leds;  
      
    //CC2530 GPIO组件  
    components HplCC2530GeneralIOC as GPIO;  
    App.Key->GPIO.P2_Port[0];  
      
    //定时器组件  
    components new TimerMilliC() as Timer1;  
    App.Timer1->Timer1;    
      
    //ADC 组件      
    components new AdcC() as Ad;  
    App.AdControl->Ad;  
    App.AdRead->Ad;    
}  
复制代码

  【LED_M.nc】

复制代码
/*********************************************** 
*   文 件 名 : LED_M.nc 
*   功能描述 : 当按下上、下、左键中一个按键时 
*              分别反转红、黄、绿颜色的LED状态。 
*   日    期 : 2019/12/4 
***********************************************/  
#include "ADC.H"  
module LED_M  
{  
    uses interface Boot;  
    uses interface Leds;  
    uses interface AdcControl as AdControl;  
    uses interface Read<int16_t> as AdRead;  
    uses interface Timer<TMilli> as Timer1;  
    uses interface GeneralIO as Key;  
}  
implementation  
{  
      
    uint8_t keyValue;   
    enum {NoKey,KeyDown,KeyHold};   //按键状态  
    uint8_t keyState;             
      
    task void NopTask()     //空任务  
    {  
    }  
    event void Boot.booted()  
    {  
        // 使能ADC采样,采样端口 P0.6  
        call AdControl.enable(ADC_REF_AVDD,ADC_12_BIT,ADC_AIN6);  
        //设置ADC采样时间 1s钟采样一次  
        call Timer1.startPeriodic(100);  
    }  
    event void AdRead.readDone(error_t result, int16_t val)  
    {  
         unsigned char s[16];  
         //读取高8位的ADC采样寄存器的值  
         uint8_t adc_value=val>>5;   
         if((adc_value>20) && (adc_value<40))//最初(10,20)  
            call Leds.led1Toggle();//up键按下红灯状态翻转  
         else if((adc_value>80) && (adc_value<100))  
            call Leds.led2Toggle();//down键按下黄灯状态翻转  
         else if((adc_value>110) && (adc_value<140))  
            call Leds.led0Toggle();//left键按下绿灯状态翻转  
  
            DbgOut(9,"adc_value is:%d\n",adc_value);      
    }  
    event void Timer1.fired()  
    {  
        keyValue=call Key.get();      
        switch(keyState)  
        {  
            //没有键按下的状态  
            case NoKey:   
                if(keyValue==0)  
                    //无键按下  
                    keyState=NoKey;   
                else  
                    //有键按下  
                    keyState=KeyDown;  
            break;  
            //有键按下的状态  
            case KeyDown:  
                if(keyValue==1)  
                {  
                    //转按下键保持状态  
                    keyState=KeyHold;  
                }  
                //调用ADC采样读取命令  
                call AdRead.read();  
            break;  
            case KeyHold:                 
                if(keyValue==1)  
                {  
                    //按键保持  
                    keyState=KeyHold;  
                }  
                else  
                {  
                    //按键松开  
                    keyState=NoKey;  
                }     
            break;  
        }     
    }  
}  
复制代码

  【新建makefile文件(要求无后缀名!)】

新建一个txt文件,文件内容如下,保存后关闭,再重命名去掉后缀,把文件放到之前的同一个文件夹中

COMPONENT=LED_M
include $(MAKERULES)


  【编译】

打开cygwin

使用目录切换命令:cd

切换至刚才文件夹下

然后输入命令:make enmote

回车进行编译

此处可能会出现以下错误:

问题原因:makefile文件按下图修改


  【编译成功后如下界面】


   【烧录】

除了下面的方法也可以在cygwin中使用 make enmote install 命令进行快速的编译下载

打开桌面的SmartRF Flash Program and verify 软件,按下图操作

如果没有显示上图中的写节点地址的那一块那么原因可能是USB接口的问题,换成USB2.0即可

烧录成功,观察现象是否符合预期


  【二次多次烧录时无法烧录的解决办法】

问题:Chip is locked! Not able to read IEEE address. (Uncheck the "Retain IEEE address" option.)

  解决办法:

    然后选择第三个 Erase,program and verify,再次单击 Perform actions 可下载成功


  【实验二】

  代码文件中需要做更改

文件目录C:\emotenet\cygwin\opt\tinyos-2.x\apps\CC2530\TestP2M...

  按下图更改

    先编译烧录node

  按下图更改

   换板子

   再编译烧录sink节点

  打开串口助手,观察数据接收情况

   使用sniffer

  操作步骤,双击桌面上的sniffer

 

 

 

 

   下图是点对点的情况

    更改目标地址destaddress为0xFFFF以进行广播通信,编译下载至node节点(不需要下载到sink节点)

  使用sniffer观察广播的数据包

  可见广播没有ack应答包


  【实验三】

  实验目的

熟悉 A/D 转换、串行通信和点对点通信相关的组件和接口,掌握 WSN 应用 系统软件的基本设计方法。

  要求

系统由传感器节点和汇聚节点组成,传感器节点周期地采集光度数据,并将 数据发送给汇聚节点,采集周期为 5s. 汇聚节点接收到数据后,向传感器节点发 送应答消息,并将数据通过串口发送到 PC。如果传感器节点发送数据后,未接 收到应答,则重新发送数据,如果重发 3 次仍未成功,则丢弃当前数据。


   先下载node,由于node代码中的目标地址是01所以这里node节点的ID设为02(区别于01)

    设node节点id为02,编译下载

    切换目录至sink

   更换板子作为sink节点,

   执行,id设为01

   下载成功后打开sniffer

   串口助手显示3号数据丢失,实验成功   

  


 

posted @   18751612782  阅读(577)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示