最近参加了一个比赛,拿实验室中的zigbee传感器模块来实现的一个智能大棚系统:这次比赛感觉自己在硬件方面的知识还是欠缺很多,现在zigbee的更新换代很快,然而我还停留在最近出的传感器模块,在实现代码方面做的还可以,但是硬件方面跟他人差距很大。
https://download.csdn.net/download/qq_36819130/10739556 下载地址
环境是ubuntu下 qt4.8 最好是root用户下,因为串口的调用需要权限。
基本功能实现:
温湿度的显示,电机模块的控制,调光装置的控制,socket服务器通信,红外检测,烟雾检测,动态增加节点。
实现界面
串口通信
bool SerialService::openCom() // 打开串口
{
if(my_com)
{
closeCom();
}
else
{
QString com_name = "/dev/ttyS0"; // 这个是根据自己的串口来的我是在ubuntu下写的
my_com = new Posix_QextSerialPort(com_name, QextSerialBase::Polling);
}
my_com->open(QIODevice::ReadWrite);
if(my_com->isOpen())
{
com_state = 1;
my_com->setBaudRate(BAUD115200);
my_com->setDataBits(DATA_8);
my_com->setParity(PAR_NONE);
my_com->setStopBits(STOP_1);
my_com->setFlowControl(FLOW_OFF);
my_com->setTimeout(50);
return true;
}
else
{
com_state = 0;
return false;
}
}
void SerialService::readFromSerial() //从串口接收信息
{
if(my_com && 1 == com_state)
{
QByteArray byte = my_com->readAll();
if(!byte.isEmpty())
emit receiveMsgFromSerial(byte);
}
}
int SerialService::writeToSerial(const QByteArray &byte)//从串口发送信息
{
if(my_com && 1 == com_state)
{
return my_com->write(byte);
}
return -1;
}
sockt通信
socket = new QTcpSocket(this);
socket->connectToHost(QHostAddress("192.168.1.104"), 8888);
thread=new mythread(socket);
// 创建socket 要创建一个新的线程,其中通过槽函数来实现消息的发送和接收
ui->msgInfo->append(mesg);
if(UPLoad == OPEN)
{
QString str = mesg + "\r\n";
socket->write(str.toAscii());
socket->flush();
}
//发送信息
mythread::mythread(QTcpSocket *sock)
{
socket=sock;
connect(socket,SIGNAL(readyRead()),this,SLOT(readMsg()));
}
void mythread::run()
{
qDebug()<<socket->isOpen()<<endl;
}
void mythread::readMsg()
{
QByteArray qdb=socket->readAll();
QString msg = QString(qdb);
qDebug()<<msg<<" is the sent msg!"<<endl;
emit sendMsg(msg);
}
//接收信息,并调用槽函数来调用相应的函数
串口信息的接收
//一部分的代码的展示,具体的代码可以下载来看
void MainWindow::handleMSG(QByteArray msg)
{
if(msg.length() < 6)
return ;
//温度传感器
if(0x02 == msg[3] && 0x01 == msg[4])
{
QString str = "";
if(0x01 == msg[2]) //1号传感器
{
timer3->start(timeBlock);
tempA->ValueOf(msg);
templist.replace(0,tempA);
if(kas++ >= 10)
{
kas = 0;
//emit goMsg("Update temphumlight A value!");
}
}
}
对于串口接收的数据,有一些需要做一些特殊的处理,例如温湿度模块发送的信息,我们需要经过计算才可以得到信息
void Temp_Humi_Ligh::ValueOf(QByteArray &msg)
{
unsigned char XH = msg[5], XL = msg[6];
unsigned char YH = msg[7], YL = msg[8];
unsigned char GH = msg[9], GL = msg[10];
temperature = XH*256 + XL;
humidity = YH*256 + YL;
light = 1.0*(GH*256 + GL)*3012.9/(32768*4);
}
对于qt的背景图的添加我会在另外的一个博客中写到