龙空技术网

物联网智能家居系统实训项目

大数据java架构师 591

前言:

眼前小伙伴们对“cc2530接收串口数据的方式”可能比较讲究,看官们都想要知道一些“cc2530接收串口数据的方式”的相关资讯。那么小编同时在网摘上搜集了一些对于“cc2530接收串口数据的方式””的相关资讯,希望咱们能喜欢,大家快快来学习一下吧!

1.需求分析、原理/基础准备

1.1实验目的

利用qt以及c++语言数据结构等相关知识后,在windows开发环境下,以cc2530芯片为控制核心,利用Zigbee和串口通信技术,温湿度、电机、烟雾、红外等传感器为环境信息采集源,以串口控制为辅助,来制作一个物联网智能家居系统。

基本要求如下:

(1)界面友好,易与操作。采用菜单或其它人机交互方式进行选择。

(2)能实现数据的采集与处理,通过智能的软硬件处理方式,使用简单的方式,能够在PC端解决一些生活中常见的问题。

1.2基本功能

(1)在IAR环境下编写传感器模块程序,并利用烧写器将实现各传感器模块功能的程序烧进传感器内,使传感器实现功能。

(2)通过Qt编写可运行程序并利用超级终端加载到网关,在网关上实现对各模块反馈的信息显示以及控制。

(3)利用Zigbee通信技术实现各模块之间的通信,并与串口相连,以交换信息。

1.3模块功能描述

1.3.1主功能函数模块

本模块在windows系统环境下利用Qt Creator编写可执行程序,来实现各种功能。本模块的主要功能是通过鼠标点击操作界面可以实现串口的打开和关闭,电机的正转.停止操作,LED灯的打开和关闭,实时更新显示当前环境下温度、湿度以及光照强度,显示当前烟雾反应情况和当前的系统时间,并且通过操作程序中的一个窗口来显示操作信息。

1.3.2串口通信模块

通信模块主要是以CC2530芯片的Zigbee结点和串口通信模块实现了收集各个传感器模块的信息,并连接到网关进行信息反馈,再将网关的控制信息反馈到各个模块。

1.3.3电机模块

本模块的主要功能是用户在网关的程序中通过按键,实现对电机的正转、反转、停转的操作,以此来模拟智能家居中的风扇开关或窗帘的拉起落下等。电机模块的LED灯则是模拟智能家居中的分布于各个房间的电灯,通过操作界面选择某个灯可以控制LED灯的打开和关闭。

1.3.4时间获取模块

本模块的主要功能是在操作界面上显示当前系统的时间,通过串口与PC机连接获取时间信息,用来模拟智能家居中的时钟等设施。

1.3.5温湿度光电模块

本模块的主要功能是通过温湿度光照传感器模块收集当前环境下的温度、湿度以及光照强度,并通过通信模块将信息反馈到操作界面中显示,并实时更新。用来模拟温度计湿度计等智能家居中的环境采集器,使人们能生活在舒服的环境中。

1.3.6烟雾模块

本模块的主要功能是利用烟雾传感器来判断当前环境中是否存在过量烟雾,当烟雾过大时,就会将信息反馈到网关中的程序,提示有烟雾,开启蜂鸣器。以此来模拟智能家居中的火警报警器,当有烟雾反应时即刻反馈信息并报警。

1.3.7 PWM调光模块

本模块的主要功能是通过操作界面程序中的调光灯模块的滑块来控制灯光(光照强度)的大小,以此来模拟家居中的柔光强光等各种情况分别适宜的光线。

1.3.8 灯泡模块

本模块的主要功能是通过操作界面程序中的自动化调节模块下环境变化以及阈值来控制灯光的亮灭,以此来模拟家居中的自动开光灯提供适宜的光线。

2.概要设计说明

2.1模块调用图

3.详细设计说明(各部分成员分工部分)

3.1主程序模块

— 主程序在windows系统环境下,利用Qt来编写的可执行程序,分别调用了串口、电机、温湿度光电等传感器模块,在mainwindow.h和mainwindow.cpp文件调用,使其可执行。

3.2通信模块

该模块主要包括ZigBee结点通信和串口通信模块。ZigBee协议栈中定义了通信协议,利用IAR程序和烧写器将协调器程序烧写到串口模块,从而收发传感器和网关信息。

3.3串口模块

该模块的主要要求部分是在对数据的16进制读取和发送的处理下,实现对接受的数据包的处理。

QByteArray QString2Hex(QString str)

{

QByteArray senddata;

int hexdata,lowhexdata;

int hexdatalen = 0;

int len = str.length();

senddata.resize(len/2);

char lstr,hstr;

for(int i=0; i<len; )

{

hstr=str[i].toLatin1();

if(hstr == ’ ')

{

i++;

continue;

}

i++;

if(i >= len)

break;

lstr = str[i].toLatin1();//qt内置函数

hexdata = ConvertHexChar(hstr);

lowhexdata = ConvertHexChar(lstr);

if((hexdata == 16) || (lowhexdata == 16))

break;

else

hexdata = hexdata*16+lowhexdata;

i++;

senddata[hexdatalen] = (char)hexdata;

hexdatalen++;

}

senddata.resize(hexdatalen);

return senddata;

}

3.4 PWM调光模块

本模块利用IAR程序和烧写器将PWM调光程序烧写到pwm传感器模块上,通过网关程序中的调光灯模块的滑块来控制灯光的大小,以此来模拟家居中的灯光大小。

ui->horizontalSlider->setRange(0, 2);

ui->horizontalSlider->setTickPosition(QSlider::TicksRight);

ui->horizontalSlider->setPageStep(1);

ui->horizontalSlider_2->setRange(0, 2);

ui->horizontalSlider_2->setTickPosition(QSlider::TicksRight);

ui->horizontalSlider_2->setPageStep(1);

//将ui部分的滑动部分提前进行初始化,设置不同的档位,发现pwm灯泡的变化幅度00-09本身的亮度强度变化并不会相差很大,故把亮暗设置为3档

void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )

{

uint8 num1,num2=0;

static UART_Format_Control *receiveData;

static UART_Format_End1 Rsp;

Rsp.Header = ‘@’;

Rsp.Len = 0x07;

Rsp.NodeSeq = 0x01;

Rsp.NodeID = LED_PWM;

Rsp.Command = MSG_RSP;

switch ( pkt->clusterId )

{

case SERIALAPP_CLUSTERID1: //处理各个传感器节数据

receiveData = (UART_Format_Control )(pkt->cmd.Data);

HalLedBlink(HAL_LED_1,1,50,200);

num1 = CheckSum((uint8)receiveData,receiveData->Len);

if((receiveData->Header0x40)&&(receiveData->Verifynum1)) //校验包头包尾

{

if(receiveData->NodeID == LED_PWM) //地址

{

//占空比调节

if(receiveData->Command != MSG_RSC)

{

DutyRatio = receiveData->Command; //根据指令设置占空比

if( DutyRatio != receiveData->Command)

{

DutyRatio = receiveData->Command; //如果设置不成功再次根据指令设置占空比

}

Rsp.Data[0]= DutyRatio;//返回当前占空比

}

if(receiveData->Command == MSG_RSC)

{

Rsp.Data[0]= DutyRatio;//返回当前占空比

}

}

num2 = CheckSum(&Rsp.Header,Rsp.Len);

Rsp.Verify = num2;

SerialApp_OTAData(&SerialApp_TxAddr, SERIALAPP_CLUSTERID1, &Rsp, sizeof(UART_Format_End1));

FLASHLED(4);

}

break;

case SERIALAPP_CLUSTERID2:

break;

default:

break;

}

}

//处理接收到的RF消息

void MainWindow::on_horizontalSlider_2_valueChanged(int value)

{

if (value == 0)

{

QString str = “400602090051”;

serial->write(QString2Hex(str));

str1+=“控制调节灯2灭\n”;

ui->textEdit->setText(str1);

}

if (value == 1)

{

QString str = “400602090556”;

serial->write(QString2Hex(str));

str1+=“控制调节灯2打到1档\n”;

ui->textEdit->setText(str1);

}

if (value == 2)

{

QString str = “40060209095a”;

serial->write(QString2Hex(str));

str1+=“控制调节灯2打到2档\n”;

ui->textEdit->setText(str1);

}

}

//处理发送的不同档位灯泡亮度部分代码

3.5 烟雾模块

烟雾模块实现对室内环境的防火防空实时监控系统,实现自动化预警警报反馈,具体的实现检测手段囿于现实原因无法在实验室进行检验,以下为部分实现代码。

timer = new QTimer(this);

connect(timer,SIGNAL(timeout()),this,SLOT(environment()));

//设定一个environment函数,再添加一个定时器timer对变量及时的捕捉,

void MainWindow::ReadData()

{

QByteArray buf;

buf = serial->readAll();

if(!buf.isEmpty())

{

if(0x04== buf[3])

{

if(0x00buf[5])

smoke = 0;

else if(0x01buf[5])

smoke=1;

}

}

buf.clear();

}

//对读到的数据包进行解析,简单的对类型buf进行判断

void MainWindow::environment()

{

if (smoke == 1)

ui->textBrowser->setStyleSheet(“background-color: rgb(255, 0, 0)”);

else if (smoke == 0)

ui->textBrowser->setStyleSheet(“background-color: rgb(0, 255, 0)”);

}

//对烟雾是否存在的判断

4.调试以及问题分析

问题一:在对协议传入串口,对传感器进行调控(开光灯,开光风扇)时候发现,在关闭系统后风扇和灯并不会随着系统的关闭而关闭,这个问题在自动化部分也有做相应的处理,在对关闭系统的同时,传入对应的指令对调节灯进行关闭和电机的关闭(电机原本打开和调节灯原本第三档)时发现,只能把电机关闭或者调节灯关闭,无法做到对两个设备的同时关闭

解决:

① 方案1:对串口的处理

serial->clear();

在对两个不同的指令控制传入到串口中间,加入clear(),但是发现只能传送一个指令,此方案行不通。

② 方案2:在两部分同个时间段发送的指令添加延迟

添加sleep函数对定时器的定时开关,但是实现的实验效果并不是很理想,还是只能接收一个指令

③ 方案3:

QTimer *tm = new QTimer(this);

connect(tm,SIGNAL(timeout()),this,SLOT(showTime()));

对待不同的指令所代表的不同模块进行分组,添加不同时间间隔触发的定时器,虽然此方法在准确的时间点上并不是严谨的,但是基本上可以实现两个指令在同个时间段发送可以多线程操作(如在关闭系统的同时,灯灭,电机停止)

问题二:两个相同类型传感器的控制

问题与解决:

在学习了指令的内容后,发现两个灯在同一时间亮的解决办法是改正节点ID加以区分,但是实验后发现没有成功实现两个灯的独立开关、温度调控,后来排查了串口发送的指令,传感器硬件本身等各部分原因后,对烧入传感器的协议进行了处理,发现节点的ID和地址的判断部分代码有与传感器不相对应的问题后,修改了ID以及地址,重新把代码运行烧入传感器后,实现两个调节灯的独立运行。

问题三:传感器烧写后无法使用

解决:

各个问题排查后的处理方法:

① 对应的协调器和终端网关的id保持一致

② 硬件本身的性能问题

③ 串口线的更换,协调器模块的更换,或者计算机驱动的更新后解决的兼容问题。

5.用户使用演示:

打开智能监控系统后,点击按钮打开大厅灯,可以从屏幕上看到“开启系统”和“大厅灯开启”等的提醒反馈。

这是PWM调光灯模块,滑块向右滑动,灯的亮度会增加;滑块向左滑动,灯的亮度会降低。

实验现象如上图5-2所示,对室内灯的调控。

这是烟雾报警器,当出现烟雾时,蜂鸣器会启动,图中文本显示框内容由绿色变为红色;反之,没有烟雾时,文本框会一直保持绿色

6.结论:

本次课程设计为时两周,首先熟悉了实验箱的各个模块,实现了简单的协调器和终端的单向通信、双向通信、串口通信。了解了ZigBee通信的方法和原理。为后面的实训打下了基础。 一开始上网找了一个串口的源码,并不能调通。后来又继续从网上翻阅资料,学会了如何在QT界面获取串口的信息,按照自己的需求进行了修改。 这段时间提高了自己的动手能力——这是第一次和硬件打交道。发现小小的板子里有很多门道,并不不简单。也深刻认识到自己动手能力的欠缺。这些都需要在以后好好加强。 这次实验的每一个过程都让我们受益匪浅,让我们体会到完成每一项步骤都是需要队友们认真全力的投入其中,这样才能有质量的完成任务,才能免得自己功亏一篑。难题是设计整个智能系统的框架,如何在现有的硬件资源以及已知的知识下最大程度地设计一个可实现智能化居家系统,时间方面也比较紧张,加上本身个人的能力有限,没有完美的实现自己的一些想法,也是比较遗憾的地方,发现小小的板子里有很多门道,并不不简单。也深刻认识到自己动手能力的欠缺。这些都需要在以后好好加强。

物联网车联网平台定制开发请私聊

标签: #cc2530接收串口数据的方式