课程期末项目报告
课程名称: 物联网工程关键技术应用
班级:本科2020级电子信息工程技术1班
组员姓名: 李庭光 冯德淮 李思骏
授课教师: 邱越
2023年6月29日
目 录
1.项目任务要求
- 系统功能:实时监测环境的温度和光照强度
- 系统组成:由zigbee硬件监测部分和pc监控软件两部分组成。
- 硬件由三个zigbee设备组成,一个协调器,两个终端节点。其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,无线通信方式为组播。协调器接收到两个终端节点的数据后通过串口转发给PC机。
- PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
- 要求完成以下内容:
- 三个zigbee设备的底层编程,组成无线网络,其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,协调器接收到两个终端节点的数据后通过串口转发给PC机
- 编写上位机程序实现:PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
- 要求完成以下内容:
- 三个zigbee设备的底层编程,组成无线网络,其中一个终端节点每隔2S采集光照强度电压传给协调器,另外一个终端节点采集内部温度每隔1s传给协调器,协调器接收到两个终端节点的数据后通过串口转发给PC机
- 编写上位机程序实现:PC机通过串口实时接受到协调器传过来的温度和光照强度电压,在界面上显示其值,并将数据写入数据库
- 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物联网编程的技能,还提高了自己的编程能力和团队协调能力。这个过程让我们深刻认识到了编程能力的重要性,并培养了我们严谨好学的能力和态度。