工业互联网作业:实时监测芯片的温度和光照强度电压

课程期末项目报告

课程名称:  物联网工程关键技术应用       

班级:本科2020级电子信息工程技术1班    

组员姓名:   李庭光 冯德淮 李思骏        

授课教师:           邱越                 

2023年6月29日

目 录

1.项目任务要求... 3

2.项目所用硬件模块... 4

3.项目程序流程... 5

3.1 主程序流程图... 5

3.2 温度测量流程图... 6

3.3 事件处理流程图... 6

4.关键功能函数代码... 7

4.1 片内温度传感器数值采集... 7

4.2 片外气体传感器电压值采集... 8

4.3 无线传感器网络建立... 8

4.4 无线数据发送与接收... 9

4.5 协调器数据串口发送... 10

5.项目实现效果... 12

5.1 上位机程序界面... 12

5.2 项目实现效果... 13

6.项目总结... 14

1.项目任务要求

  • 系统功能:实时监测环境的温度和光照强度
  • 系统组成:由zigbee硬件监测部分和pc监控软件两部分组成。
  • 硬件由三个zigbee设备组成,一个协调器,两个终端节点。其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,无线通信方式为组播。协调器接收到两个终端节点的数据后通过串口转发给PC机。
  • PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
  • 要求完成以下内容:
  • 三个zigbee设备的底层编程,组成无线网络,其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,协调器接收到两个终端节点的数据后通过串口转发给PC机
  • 编写上位机程序实现:PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
  • 要求完成以下内容:
  1. 三个zigbee设备的底层编程,组成无线网络,其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,协调器接收到两个终端节点的数据后通过串口转发给PC机
  2. 编写上位机程序实现:PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
  3. PC上位机程序动态显示温度和光照强度电压曲线(拓展,不做硬性要求)

 

2.项目所用硬件模块

三个ZIGBEE模块,一个温度、光照传感模块,两个实验平台。

 

协调器

 

温度传感器             光感电压

3.项目程序流程

3.1 程序流程图

 

 

3.2 温度测量流程图

 

 

3.3 事件处理流程图

 

4.关键功能函数代码

4.1 片内温度传感器数值采集

#include <ioCC2530.h>

char data[]="测试 CC2530片内温度传感器!\n";

char name_string[20];

//unsigned char temp,RX_flag,counter=0;

unsigned int adcvalue;

float temper;

//*********************************************************************************

void delay(unsigned int i)

{   unsigned int j,k;

    for(k=0;k<i;k++)

    { for(j=0;j<500;j++);

    }

}

//*********************************************************************************

void initial_usart()

{   CLKCONCMD &= ~0X7F;                  //晶振设置为32MHz

    while(CLKCONSTA & 0X40);             //等待晶振稳定

    CLKCONCMD &= ~0X47;                   //设置系统主时钟频率为32MHz

    PERCFG = 0X00;                       //usart0 使用备用位置1 TX-P0.3 RX-P0.2

    P0SEL |=0X3C;                         //P0.2 P0.3 P0.4 P0.5用于外设功能

    P2DIR &= ~0xC0;                         //P0优先作为UART方式

    U0CSR |= 0XC0;                         //uart模式 允许接收   

    U0GCR = 9;

    U0BAUD = 59;                          //波特率设为19200

    URX0IF = 0;                           //uart0 tx中断标志位清零   

//    IEN0 = 0X84;                          //接收中断使能 总中断使能

}

//*********************************************************************************

void uart_tx_string(char *data_tx,int len)

{   unsigned int j;

    for(j=0;j<len;j++)

    {   U0DBUF = *data_tx++;

        while(UTX0IF == 0);

        UTX0IF = 0;

    }

}

//*********************************************************************************

//#pragma vector = URX0_VECTOR

//__interrupt void UART0_RX_ISR(void)

//{   URX0IF = 0;

//    temp = U0DBUF;

//    RX_flag=1;

//}

//*********************************************************************************

void main(void)

{   initial_usart();                                 //调用UART初始化函数

    uart_tx_string(data,sizeof(data));                  //发送What is your name?

    while(1)

    { 

        ADCCON3 |= 0x3E;    //内部1.25V为参考电压,13位分辨率,AD源为片内温度

        while(!(ADCCON1&0X80));            //等待AD转换完成

        adcvalue = (unsigned int )ADCL;

        adcvalue |= (unsigned int ) (ADCH << 8);

        adcvalue = adcvalue >> 2;

        temper = adcvalue*0.06229-303.3 - 35;

        data[0] = (unsigned char)(temper)/10 + 48;  //十位

        data[1] = (unsigned char)(temper)%10 + 48;  //个位

        data[2] = '.';                              //小数点

        data[3] = (unsigned char)(temper*10)%10+48;  //十分位

        data[4] = (unsigned char)(temper*100)%10+48;  //百分位

        uart_tx_string(data,5);                       //在PC上显示温度值和℃符号

        uart_tx_string("℃\n",3);

         delay(10000);                                 //延时

    }

}

4.2 片外气体传感器电压值采集

uint16 get_adc(void)

{

   int32 value;

   hal_adc_Init(); // ADC初始化

   ADCIF = 0;   //清ADC 中断标志

   //采用基准电压avdd5:3.3V,通道0,启动AD转化

   ADCCON3 = (0x80 | 0x10 | 0x00);

   while ( !ADCIF )

   {

       ;  //等待AD转化结束

   }

   value = ADCH;

   value = value<< 8;

   value |= ADCL;

   if(value&0x8000)

       value=0;

  // AD值转化成电压值

  // 0 表示 0V ,32768 表示 3.3V

  // 电压值 = (value*3.3)/32768 (V)

  value = (value * 330);

  value = value >> 15;   // 除以32768

  // 返回分辨率为0.01V的电压值

  return (uint16)value;

}

uint16 get_guangdian_ad(void)

{

  return get_adc();

}

4.3 无线传感器网络建立

/采集光照设置

/*****点对点通讯地址设置******/

#define RF_CHANNEL                23         // 频道 11~26

#define PAN_ID                    0x0025     //网络id 

#define MY_ADDR                   0x000a     //本机模块地址

#define SEND_ADDR                 0x000b     //发送地址

//采集内部温度设置

/*****点对点通讯地址设置******/

#define RF_CHANNEL                23         // 频道 11~26

#define PAN_ID                    0x0025     //网络id 

#define MY_ADDR                   0x000c     //本机模块地址

#define SEND_ADDR                 0x000b     //发送地址

//协调器设置

/*****点对点通讯地址设置******/

#define RF_CHANNEL                23        // 频道 11~26

#define PAN_ID                    0x0025     //网络id 

/*此设备作为协调器*/

#define MY_ADDR                   0x000b     //本机模块地址

//#define SEND_ADDR                 0x000b     //发送地址

4.4 无线数据发送与接收

#ifndef ZCL_SAMPLELIGHT_H

#define ZCL_SAMPLELIGHT_H

#ifdef __cplusplus

extern "C"

{

#endif

/*********************************************************************

 * INCLUDES

 */

#include "zcl.h"

/*********************************************************************

 * CONSTANTS

 */

#define SAMPLELIGHT_ENDPOINT            13

#define SAMPLELIGHT_MAX_ATTRIBUTES      12

#define LIGHT_OFF                       0x00

#define LIGHT_ON                        0x01

// Application Events

#define SAMPLELIGHT_IDENTIFY_TIMEOUT_EVT     0x0001

/*********************************************************************

 * MACROS

 */

/*********************************************************************

 * TYPEDEFS

 */

/*********************************************************************

 * VARIABLES

 */

extern SimpleDescriptionFormat_t zclSampleLight_SimpleDesc;

extern CONST zclAttrRec_t zclSampleLight_Attrs[];

extern uint8  zclSampleLight_OnOff;

extern uint16 zclSampleLight_IdentifyTime;

/*********************************************************************

 * FUNCTIONS

 */

 /*

  * Initialization for the task

  */

extern void zclSampleLight_Init( byte task_id );

/*

 *  Event Process for the task

 */

extern UINT16 zclSampleLight_event_loop( byte task_id, UINT16 events );

/*********************************************************************

*********************************************************************/

#ifdef __cplusplus

}

#endif

#endif /* ZCL_SAMPLELIGHT_H */

4.5 协调器数据串口发送

#include <ioCC2530.h>

char data[ ]="Hello ZigBee!";

//*********************************************************************************

void delay(unsigned int i)

{   unsigned int j,k;

    for(k=0;k<i;k++)

    { for(j=0;j<500;j++);    }}

//*********************************************************************************

void initial_usart_tx()

{   CLKCONCMD &= ~0X7F;                       //晶振设置为32MHz

    while(CLKCONSTA & 0X40);                     //等待晶振稳定

    CLKCONCMD &= ~0X47;                       //设置系统主时钟频率为32MHz

    PERCFG = 0X00;                                //usart0 使用备用位置1 TX-P0.3 RX-P0.2

    P0SEL |= 0X3C;                          //P0.2 P0.3 P0.4 P0.5用于外设功能

    P2DIR &= ~0xC0;                                //P0优先作为UART方式

    U0CSR = 0X80;                                 //uart模式

    U0GCR = 9;

    U0BAUD = 59;                                  //波特率设为19200

    UTX0IF = 0;                                    //uart0 tx中断标志位清零   

}

//*****************************************************************************

void uart_tx_string(char *data_tx,int len)

{   unsigned int j;

    for(j=0;j<len;j++)

    {   U0DBUF = *data_tx++;

        while(UTX0IF == 0);           //等待发送完成

        UTX0IF = 0;    }}

//*********************************************************************************

void main(void)

{   initial_usart_tx();

    while(1)

    {   uart_tx_string(data, sizeof(data));               //sizeof(data)函数计算字符串个数

        delay(1000);   

    }

}

上位机关键代码 

 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //新建一个数组接收串口数据
            byte[] data = new byte[1024];
            serialPort1.Read(data,0,data.Length);
            string str = Encoding.ASCII.GetString(data);
            double i = Convert.ToDouble(str);
            if (i > 15)
            {
                string s2 = Convert.ToString(i);
                WS[0] = s2;
            }
            if (i < 15)
            {
                string s1 = Convert.ToString(i);
                WS[1] = s1;
            }
            // //将接收的数据转换成字符串
            // string str = Encoding.ASCII.GetString(data);
            // //对数据进行解析(分割字符串,只取|符号之前的数据‘为防止数据粘包’)
            // string[] value = str.Split('|');
            // string[] WS = value[0].Split('&');/*分割字符串取出温度和湿度数据*/
            // //让接收到的温湿度数据显示在窗口
            lb_temp.BeginInvoke(
               (MethodInvoker)delegate
            {
                lb_temp.Text = WS[0];
            }
            );
            lb_Hum.BeginInvoke(
                (MethodInvoker)delegate
                {
                    lb_Hum.Text = WS[1];
                }
             );
            //给表里数据做限制
            if (Temps.Count > 10)
            {
                Temps.Remove("0");
            }
            if (Humitures.Count > 10)
            {
                Humitures.Remove("0");
            }
            //温湿度数据分别加入到列表里
            Temps.Add(WS[0]);
           Humitures.Add(WS[1]);
            //将添加的数据加到图表显示
            chart1.BeginInvoke(
                (MethodInvoker)delegate
                {
                    chart1.Series[0].Points.DataBindY(Temps);
                    chart1.Series[1].Points.DataBindY(Humitures);
                }
                );

 }

5.项目实现效果

上位机程序界面

 

 

 

图5.1  C#窗体界面

5.2 项目实现效果

 

图5.2  串口助手接收数据

 

图5.3  上位机窗体程序动态显示

6.项目总结

经过本学期的物联网综合实验来看,我们收获颇丰。在这门课程中,深入学习了ZigBee物联网编程,并成功完成了期末项目,实时监测环境的温度和光照强度,并进行了数据采集和存储。这个过程中,我们遇到了许多困难,但通过不断请教同学和老师,查阅资料进行分析、调试和测试,最终完成了一个半成品。这个过程深刻认识到了自己的编程能力的薄弱点。

   在开始这个项目之前,我们对ZigBee通信模块的编程能力并不了解。我们需要从最基础的片内温度和片外电压采集开始,逐步学习和实践,才能完成更复杂的曲线图和数据库存储功能。这个过程中,我们遇到了许多技术难题,需要不断尝试和调整。有时候,会因为一些细微的错误而陷入困境,但我们从不放弃,坚持不懈地解决问题。在这个项目中,我们发现自己的程序编辑能力非常薄弱。为了弥补这个短板,我们积极请教身边的同学和老师,向他们请教经验和技巧。他们的帮助对我来说非常宝贵,让我能够更快地理解和解决问题。此外,我们还利用互联网上的各种资料和笔记进行学习和分析,不断提升自己的技术水平。完成这个项目的过程中,我深刻认识到了编程能力的重要性。一个优秀的程序员不仅要掌握技术,还需要具备解决问题的能力和良好的分析思维。通过这个项目,我不仅学到了ZigBee通信模块的编程能力,还提高了自己的知识储备。更重要的是,我意识到了编程能力强弱对个人发展的影响。

    此外,这个项目还增强了我们的团队协调能力。在项目中,我们组员紧密合作,共同解决问题。我们互相鼓励、互相学习,形成了良好的合作氛围。这个过程让我深深认识到了队友的重要性和团队的强大能力。只有团结合作,我们才能克服困难,取得良好的成果。

    在这个项目中,还培养了严谨好学的能力和态度。面对新的知识和技术,我们始终保持着学习的热情和求知的态度。不断尝试、不断学习,不断提高自己的技术水平。这种严谨好学的态度将伴随我一生,让我在未来的学习和工作中更加出色。

    总的来说,通过这门物联网综合实验课程,我们不仅学到了ZigBee物联网编程的技能,还提高了自己的编程能力和团队协调能力。这个过程让我们深刻认识到了编程能力的重要性,并培养了我们严谨好学的能力和态度。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_72251286

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值