作者共发了10篇帖子。 内容转换:不转换▼
 
点击 回复
465 9
【程序】两节点间通过无线收发并显示温度数据
一派护法 十九级
1楼 发表于:2016-8-12 22:08
一派护法 十九级
2楼 发表于:2016-8-12 22:08
一派护法 十九级
3楼 发表于:2016-8-12 22:10
【公共头文件:data.h】
#ifndef RADIO_ID
#define RADIO_ID 0x85

struct node1_data
{
    uint16_t light;
    uint16_t temperature;
    uint16_t humidity;
};
#endif
【1号节点:数据采集和发送节点】
【代码】
[MyAppC.nc]
#include "data.h"

configuration MyAppC
{
}
implementation
{
    components MyC, MainC, LedsC;
    components new TimerMilliC();
    MyC.Boot -> MainC;
    MyC.Leds -> LedsC;
    MyC.Timer0 -> TimerMilliC;
   
    components new HamamatsuS1087ParC();
    components Sht21C;
    MyC.Humidity -> Sht21C.Humidity;
    MyC.Light -> HamamatsuS1087ParC;
    MyC.Temperature -> Sht21C.Temperature;
   
    components ActiveMessageC;
    MyC.AMSend -> ActiveMessageC.AMSend[RADIO_ID];
    MyC.Packet -> ActiveMessageC;
    MyC.SplitControl -> ActiveMessageC;
}
一派护法 十九级
4楼 发表于:2016-8-12 22:12
[MyC.nc]
#include "data.h"

module MyC
{
    uses interface Boot;
    uses interface Leds;
    uses interface Timer<TMilli> as Timer0;
   
    uses interface Read<uint16_t> as Humidity;
    uses interface Read<uint16_t> as Light;
    uses interface Read<uint16_t> as Temperature;
   
    uses interface AMSend;
    uses interface Packet;
    uses interface SplitControl;
}
implementation
{
    message_t msg;
    struct node1_data data;
    uint8_t step;
   
    event void Boot.booted(void)
    {
        step = 0;
        call SplitControl.start();
    }
   
    event void SplitControl.startDone(error_t err)
    {
        if (err == SUCCESS)
            call Timer0.startPeriodic(1000);
        else
            call SplitControl.start();
    }
   
    event void SplitControl.stopDone(error_t err)
    {
    }
   
    void send(void)
    {
        struct node1_data *ptr = (struct node1_data *)call Packet.getPayload(&msg, sizeof(data));
        if (ptr == NULL)
        {
            step = 6; // 重试
            return;
        }
       
        call Leds.led1Off();
        call Leds.led2Off();
        memcpy(ptr, &data, sizeof(data));
        if (call AMSend.send(AM_BROADCAST_ADDR, &msg, sizeof(data)) == SUCCESS)
            call Leds.led0On();
        else
            step = 6;
    }
   
    event void Timer0.fired(void)
    {
        if (step == 0)
        {
            step = 1;
            call Light.read();
        }
        else if (step == 2)
        {
            step = 3;
            call Temperature.read();
        }
        else if (step == 4)
        {
            step = 5;
            call Humidity.read();
        }
        else if (step == 6)
        {
            step = 7;
            send();
        }
    }
   
    event void AMSend.sendDone(message_t *pMsg, error_t err)
    {
        if (pMsg == &msg)
        {
            call Leds.led0Off();
            step = 0;
        }
        else
            step = 6;
    }
   
    event void Light.readDone(error_t result, uint16_t val)
    {
        if (result == SUCCESS)
        {
            data.light = val;
            call Leds.led1On();
            step = 2;
        }
        else
            step = 0;
    }
   
    event void Temperature.readDone(error_t result, uint16_t val)
    {
        if (result == SUCCESS)
        {
            data.temperature = val;
            call Leds.led1Off();
            call Leds.led2On();
            step = 4;
        }
        else
            step = 2;
    }
   
    event void Humidity.readDone(error_t result, uint16_t val)
    {
        if (result == SUCCESS)
        {
            data.humidity = val;
            call Leds.led1On();
            step = 6;
        }
        else
            step = 4;
    }
}
一派护法 十九级
5楼 发表于:2016-8-12 22:13
[Makefile]
COMPONENT = MyAppC
include $(MAKERULES)
【1号节点下载命令】
make telosb install,1 bsl,/dev/ttyUSB3
一派护法 十九级
6楼 发表于:2016-8-12 22:13
【2号节点:数据接收和显示节点】
[MyAppC.nc]
#include "data.h"
configuration MyAppC
{
}
implementation
{
    components MyC, MainC, LedsC;
    components new TimerMilliC();
    MyC -> MainC.Boot;
    MyC.Leds -> LedsC;
    MyC.Timer0 -> TimerMilliC;
   
    components ActiveMessageC;
    MyC.Receive -> ActiveMessageC.Receive[RADIO_ID];
    MyC.SplitControl -> ActiveMessageC;
}
一派护法 十九级
7楼 发表于:2016-8-12 22:14
[MyC.nc]
module MyC
{
    uses interface Boot;
    uses interface Leds;
    uses interface Timer<TMilli> as Timer0;
    uses interface Receive;
    uses interface SplitControl;
}
implementation
{
    #define _BV(n) (1 << (n))
    #define RST_0 P2OUT &= ~_BV(0)
    #define RST_1 P2OUT |= _BV(0)
    #define CE_0 P2OUT &= ~_BV(1)
    #define CE_1 P2OUT |= _BV(1)
    #define DC_0 P2OUT &= ~_BV(3)
    #define DC_1 P2OUT |= _BV(3)
    #define DIN_0 P2OUT &= ~_BV(6)
    #define DIN_1 P2OUT |= _BV(6)
   
    #define BL_1 P6OUT |= _BV(6) // 接ADC6接线柱即可
    #define SCLK_0 P6OUT &= ~_BV(7) // 接ADC7接线柱即可
    #define SCLK_1 P6OUT |= _BV(7)
   
    const unsigned char chAlphabetL[][6] = {
        {0x00, 0x20, 0x54, 0x54, 0x54, 0x78},
        {0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},
        {0x00, 0x38, 0x44, 0x44, 0x44, 0x20},
        {0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},
        {0x00, 0x38, 0x54, 0x54, 0x54, 0x18},
        {0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},
        {0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},
        {0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},
        {0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},
        {0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},
        {0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},
        {0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},
        {0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},
        {0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},
        {0x00, 0x38, 0x44, 0x44, 0x44, 0x38},
        {0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},
        {0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},
        {0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},
        {0x00, 0x48, 0x54, 0x54, 0x54, 0x20},
        {0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},
        {0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},
        {0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},
        {0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},
        {0x00, 0x44, 0x28, 0x10, 0x28, 0x44},
        {0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},
        {0x00, 0x44, 0x64, 0x54, 0x4C, 0x44}
    };
    const unsigned char chAlphabetU[][6] = {
        {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C},
        {0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},
        {0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},
        {0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},
        {0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},
        {0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},
        {0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},
        {0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},
        {0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},
        {0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},
        {0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},
        {0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},
        {0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},
        {0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},
        {0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},
        {0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},
        {0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},
        {0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},
        {0x00, 0x46, 0x49, 0x49, 0x49, 0x31},
        {0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},
        {0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},
        {0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},
        {0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},
        {0x00, 0x63, 0x14, 0x08, 0x14, 0x63},
        {0x00, 0x07, 0x08, 0x70, 0x08, 0x07},
        {0x00, 0x61, 0x51, 0x49, 0x45, 0x43}
    };
   
    const unsigned char chColon[6] = {0x00, 0x00, 0x36, 0x36, 0x00, 0x00};
    const unsigned char chDot[6] = {0x00, 0x00, 0x60, 0x60, 0x00, 0x00};
    const unsigned char chMinus[6] = {0x00, 0x08, 0x08, 0x08, 0x08, 0x08};
    const unsigned char chNum[][6] = {
        {0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},
        {0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},
        {0x00, 0x42, 0x61, 0x51, 0x49, 0x46},
        {0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},
        {0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},
        {0x00, 0x27, 0x45, 0x45, 0x45, 0x39},
        {0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},
        {0x00, 0x01, 0x71, 0x09, 0x05, 0x03},
        {0x00, 0x36, 0x49, 0x49, 0x49, 0x36},
        {0x00, 0x06, 0x49, 0x49, 0x29, 0x1E}
    };
   
    const unsigned char img[][84] = {
        {0xdc, 0x32, 0x3a, 0xdc, 0x20, 0xa0, 0xa0, 0xc0, 0x0e, 0x30, 0x7e, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa0, 0x90, 0x88, 0xd4, 0xe4, 0x70, 0x72, 0xbc, 0x78, 0x38, 0x38, 0x3e, 0x7c, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xe0, 0xc0, 0xc0, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0x1e, 0x02},
        {0x47, 0x41, 0x41, 0xd1, 0x23, 0x1d, 0x81, 0x40, 0x20, 0x98, 0x04, 0x83, 0x3c, 0x90, 0xf1, 0x3e, 0xce, 0x77, 0x63, 0xc3, 0xc3, 0x27, 0x3f, 0xfe, 0xfe, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x07, 0xf1, 0xfc, 0xfe, 0xff, 0xff, 0xfc, 0xf8, 0x98, 0x98, 0xe4, 0xe7, 0xff, 0xdc, 0xfc, 0xcf, 0xcf, 0xff, 0xbf, 0xff, 0xef, 0x1e, 0xf8, 0x10, 0x00, 0x40, 0x3f, 0x8f, 0x43, 0x71, 0x49, 0x49, 0x89, 0x01, 0x03, 0x0f, 0xf3, 0x00, 0x00, 0x88},
        {0xf8, 0xf0, 0xf0, 0xf8, 0x77, 0xd1, 0x30, 0x90, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x21, 0x8e, 0x70, 0x1f, 0xfe, 0xfe, 0xff, 0xff, 0x3f, 0x3f, 0x3f, 0x7f, 0x9f, 0xff, 0x3f, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x00, 0x03, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xbf, 0x3f, 0x1f, 0x0f, 0x0f, 0x0f, 0x8f, 0x8f, 0xcf, 0xe3, 0xf7, 0x79, 0x1f, 0x07, 0x00, 0x00, 0x00, 0x80, 0x60, 0x80, 0x87, 0x04, 0x01, 0x00, 0x84, 0x83, 0x40, 0x30, 0x8c, 0x03, 0xa8, 0x00, 0x88},
        {0x77, 0x65, 0xe3, 0xea, 0xc1, 0xca, 0x00, 0x88, 0x00, 0xaa, 0x00, 0x88, 0x00, 0xa0, 0x0f, 0xb0, 0x40, 0x82, 0x11, 0x2b, 0x4a, 0x4a, 0x72, 0x0a, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x1e, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x1b, 0x23, 0x23, 0x23, 0x23, 0x23, 0x25, 0x15, 0x0c, 0x80, 0x80, 0x40, 0x20, 0x70, 0x28, 0x46, 0x81, 0xca, 0x40, 0x28, 0x21, 0x39, 0x45, 0x82, 0x82, 0x82, 0x44, 0x78, 0x40, 0x4a, 0x40, 0x88},
        {0x9a, 0x9d, 0x65, 0x65, 0x1a, 0x2d, 0x00, 0x88, 0x00, 0x2a, 0x00, 0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x2a, 0x01, 0x8a, 0x02, 0x24, 0x04, 0x88, 0x08, 0x10, 0x10, 0x10, 0x20, 0xa0, 0xa0, 0x60, 0x40, 0x20, 0x21, 0x23, 0x25, 0x24, 0x24, 0x24, 0x44, 0x44, 0x42, 0xc1, 0xa0, 0xa0, 0x60, 0x20, 0x20, 0x30, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x14, 0x14, 0x12, 0x22, 0x21, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x00, 0x03, 0x04, 0x04, 0x3c, 0xc4, 0x82, 0x83, 0x83, 0x47, 0xf8, 0x08, 0x08, 0x08, 0x18, 0x27},
        {0x7f, 0x7f, 0x3e, 0x0e, 0x08, 0x0a, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x0a, 0x09, 0x0d, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x1e, 0x21, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x08, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0d, 0x08, 0x08, 0x08, 0x08, 0x09, 0x0e, 0x08, 0x08, 0x08, 0x08}
    };
   
    bool clearlcd = FALSE;
    uint8_t count = 4;
    struct node1_data data;
   
    void LCDWrite(unsigned char dat)
    {
        unsigned char i;
        CE_0;
        for (i = 0; i < 8; i++)
        {
            if (dat & 0x80)
                DIN_1;
            else
                DIN_0;
            SCLK_0;
            dat <<= 1;
            SCLK_1;
        }
        CE_1;
    }
   
    // 写入命令
    void LCDWriteCmd(unsigned char cmd)
    {
        DC_0;
        LCDWrite(cmd);
    }
   
    // 写入数据
    void LCDWriteData(unsigned char dat)
    {
        DC_1;
        LCDWrite(dat);
    }
   
    // 设置显示位置
    void LCDSetPos(unsigned char x, unsigned char y)
    {
        LCDWriteCmd(0x40 | y);
        LCDWriteCmd(0x80 | x);
    }
   
    // 清屏
    void LCDClear(void)
    {
        unsigned char i, j;
        LCDSetPos(0, 0);
        for (i = 0; i < 6; i++)
        {
            for (j = 0; j < 84; j++)
                LCDWriteData(0x00);
        }
    }
   
    // 初始化LCD
    void LCDInit(void)
    {
        // 复位
        RST_0;
        _NOP();
        _NOP();
        _NOP();
        _NOP();
        RST_1;
       
        LCDWriteCmd(0x21); // 使用扩展命令设置LCD模式
        LCDWriteCmd(0xa7); // 设置显示亮度
        LCDWriteCmd(0x06); // 温度校正
        LCDWriteCmd(0x13); // 1:48
       
        LCDWriteCmd(0x20); // 使用基本命令, 且水平寻址
        LCDClear();
        LCDWriteCmd(0x0c); // 正常显示
       
        CE_0;
        BL_1; // 开背光
    }
   
    // 显示字符A
    void LCDWriteChar(const unsigned char *ch)
    {
        unsigned char i;
        for (i = 0; i < 6; i++)
            LCDWriteData(ch[i]);
    }
   
    void LCDDisplayImage(void)
    {
        unsigned char i, j;
        LCDSetPos(0, 0);
        for (i = 0; i < 6; i++)
        {
            for (j = 0; j < 84; j++)
                LCDWriteData(img[i][j]);
        }
    }
   
    void LCDWriteWord(const unsigned char *s)
    {
        while (*s)
        {
            if (*s >= 'a' && *s <= 'z')
                LCDWriteChar(chAlphabetL[*s - 'a']);
            else if (*s >= 'A' && *s <= 'Z')
                LCDWriteChar(chAlphabetU[*s - 'A']);
            s++;
        }
    }
   
    void LCDWriteSpace(void)
    {
        unsigned char i;
        for (i = 0; i < 6; i++)
            LCDWriteData(0x00);
    }
   
    void LCDWriteUINT(uint16_t num, bool dot)
    {
        LCDWriteChar(chNum[num / 10000]);
        LCDWriteChar(chNum[num % 10000 / 1000]);
        if (dot)
            LCDWriteChar(chDot);
        LCDWriteChar(chNum[num % 1000 / 100]);
        LCDWriteChar(chNum[num % 100 / 10]);
        LCDWriteChar(chNum[num % 10]);
    }
   
    event void Boot.booted(void)
    {
        LCDInit();
        LCDDisplayImage();
        call Leds.led2On();
        call SplitControl.start();
    }
   
    event void SplitControl.startDone(error_t err)
    {
        if (err == SUCCESS)
            call Timer0.startPeriodic(1000);
        else
            call SplitControl.start();
    }
   
    event void SplitControl.stopDone(error_t err)
    {
    }
   
    event void Timer0.fired(void)
    {
        if (count >= 2)
            count--;
        else if (count == 1)
            call Leds.led2Off();
        else if (count == 0)
        {
            if (!clearlcd)
            {
                LCDClear();
                clearlcd = TRUE;
            }
            LCDSetPos(0, 0);
           
            LCDWriteWord("Light");
            LCDWriteChar(chColon);
            LCDWriteSpace();
            LCDWriteUINT(data.light, FALSE);
           
            LCDSetPos(0, 1);
            LCDWriteWord("Temperature");
            LCDWriteChar(chColon);
            LCDWriteSpace();
            LCDSetPos(0, 2);
            LCDWriteUINT(data.temperature, TRUE);
           
            LCDSetPos(0, 3);
            LCDWriteWord("Humidity");
            LCDWriteChar(chColon);
            LCDWriteSpace();
            LCDSetPos(0, 4);
            LCDWriteUINT(data.humidity, TRUE);
            count = 1;
            call Leds.led1Off();
        }
    }
   
    event message_t *Receive.receive(message_t *pMsg, void *payload, uint8_t len)
    {
        if (len == sizeof(struct node1_data))
        {
            memcpy(&data, payload, len);
            count = 0;
            call Leds.led1On();
        }
        return pMsg;
    }
}
一派护法 十九级
8楼 发表于:2016-8-12 22:14
[Makefile]
COMPONENT = MyAppC
include $(MAKERULES)
【2号节点下载命令】
make telosb install,2
一派护法 十九级
9楼 发表于:2016-8-12 22:16
【源代码下载地址】
http://pan.baidu.com/s/1i5JfyGt
一派护法 十九级
10楼 发表于:2016-8-12 22:20
如果用手机的手电筒照射光照传感器,则得到的数据在950~1450之间。
晚上室内则是20~35之间。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:465 回复数:9
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-8-12 22:20
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。