基于Zigbee与Qt的室内环境检测系统——详细介绍QT部分

该系统主要以Zigbee为作为下位机链接对象,以Qt作为人机交互界面的设计,这里主要以Windows下开发Qt程序。

在Qt上的主要包括
(1)上位机与下位机之间的串口通信功能的实现;
(2)温度、湿度、甲烷含量数据的接收与显示;
(3)建立数据库;
(4)设置警报系统;
(5)建立用户注册与登录机制。

1、 串口通信功能与数据显示
在Qt中预设有与串口相关的板块serialport,该板块中封装多种与串口设置相关的类。通过对串口波特率、数据位、奇偶位、停止位、控制流等参数的设置,配置好与下位机的串口连接。代码如下图1:
//串口通信

   QSerialPort *serial_1=new QSerialPort;
    foreach(const QSerialPortInfo &str,QSerialPortInfo::availablePorts ())
    {
        serial_1->setPort (str);//将获取到的串口赋给serial_1
        if(!serial_1->open (QIODevice::ReadWrite))//以读写方式打开
        {
          qDebug()<<"初始串口打开失败";
        }
        else
        {
            serial_1->close ();
        }
        serial=serial_1;
        if(!serial->open (QIODevice::ReadWrite))
        {
             QMessageBox::information (this,"错误","串口打开不成功");
             ui->label_focus->setText ("设备连接失败");
        }
        else
        {

    serial->setBaudRate (QSerialPort::Baud115200);//设置波特率为115200
    serial->setDataBits (QSerialPort::Data8);//设置数据位8位
    serial->setParity (QSerialPort::NoParity);//设置为没有奇偶校正位
    serial->setStopBits (QSerialPort::OneStop);//设置停止位数为1位
    serial->setFlowControl (QSerialPort::NoFlowControl);//设置控制流为无
    //QMessageBox::information (this,"提示","连接下位机成功");
    ui->label_focus->setText ("设备连接成功");
    }

}

过以上设置,我们可以实现电脑与ZigBee下位机的串口通信,由ZigBee下位机发通过串口发送检测到的数据到上位机(电脑),在使用Qt的开发的界面接收数据,然后截取并显示数据。进而做到温度、湿度、甲烷含量的数据接收与显示,反应出室内环境的实时情况。同时为了使用户更加直观的感受到温湿度、甲烷含量的程度变化,我们还将数据转化为了动态的曲线图表。而这里则用到了Qt的另一板块——charts。
这里插一句如何找到所有有效串口并返回到combox控件:

    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        ui->comboBox_com->addItem(serial.portName());
    }

2、 数据库与数据储存
利用Qt关于数据库的板块sql,该板块包括有与使用数据库功能的相关类,调用相关类实现数据库的连接、打开、储存的操作,这里我们根据本项目的需求量要求,选择了轻量化数据库SQLITE数据库。

 this->db=QSqlDatabase::addDatabase ("QSQLITE");
    db.setDatabaseName ("abab.db");//与abab相连接
    bool ok;
    ok=db.open ();
    if(!ok)
    {
        qDebug()<<"数据库打开失败";
    }
    else
    {
        qDebug()<<"数据库打开成功";
    }

Qt界面接受在显示温湿度、甲烷含量数据的同时会按固定时间间隔来存储相关数据,便于用户查看并了解室内环境的过往情况(数据查询代码如图4)。在数据库中的储存方式上我们以时间对应数据的方式储存(数据储存代码如图3),并且为了方便查看与优化数据库的内存,数据量可以根据用户的想法设置,超过设置值,数据库会自动清空数据,然后重新储存新的数据。当然用户也能手动清空数据列表。

void Widget::save_data ()
{
    this->db=QSqlDatabase::addDatabase ("QSQLITE");//建立数据库链接
    db.setDatabaseName ("abab.db");//与abab相连接
    bool ok=true;
    ok=db.open ();
    if(!ok)
    {
        qDebug()<<"存储时数据库打开失败";
    }
    else
    {
        qDebug()<<"存储时数据库打开成功";
    }

    QDateTime curDatatime=QDateTime::currentDateTime ();
    QString time;
    time=curDatatime.toString ("yyyy-MM-dd hh:mm");

    QSqlQuery query;//用于储存数据
    query.prepare ("insert into detection_data(time,temperature,humidity,methane)"
                   "values(:time,:temperature,:humidity,:methane)");
    query.bindValue (":time",time);
    query.bindValue (":temperature",view.mid (0,2));
    query.bindValue (":humidity",view.mid (2,2));
/*****************改*********************/
    int change1;
    change1=view.mid(4,3).toInt ();
    change1=change1-30;
/***************************************/
    query.bindValue (":methane",change1);
    //query.bindValue (":methane",view.mid (4,3));
    bool ok_1 = true;
    ok=query.exec ();
    if(!ok_1)
    {
        qDebug()<<"数据添加失败";
    }
    else
    {
        qDebug()<<"数据添加成功";
    }

}

以下则是通过数据库查询注册的用户俩判断用户是否存在从而实现登录功能。

void log_in::on_pushButton_log_in_clicked()//点击登录转移到主要界面
{
    this->db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("abab.db");
    if(!db.open())
    {
        QMessageBox::warning(this,"错误","数据库打开失败");
        return ;
    }
    if(ui->lineEdit_username->text().isEmpty ()|ui->lineEdit_password->text ().isEmpty ())
    {
        QMessageBox::warning(this,"提示","用户名和密码不能为空!!!");
    }
    else
    {
        int a=0,b=0;
        QSqlQuery query("SELECT * FROM user_s");
              int fieldone = query.record().indexOf("name");
              int fieldtwo = query.record().indexOf("password");
              while (query.next()) {
                  if(ui->lineEdit_username->text ()== query.value(fieldone).toString()&&ui->lineEdit_password->text ()==query.value(fieldtwo).toString())
                  {
                      a=1;
                      break;
                  }
              }
              if(a)
              {
                  this->close();
                  Widget *Widget=new class Widget();
                  Widget->show();
                  db.close();
              }
              else {
                  QSqlQuery query("SELECT name FROM user");
                        while (query.next()) {
                            if(ui->lineEdit_username->text ()== query.value(0).toString())
                            {
                                b=1;
                                break;
                            }
                        }
                        if(b)
                        {
                            QMessageBox::information(this,"提示","密码错误");
                        }
                        else{
                            QMessageBox::information(this,"提示","该用户不存在,请先注册");
                        }
              }
    }
}

3、 警报系统与背景音乐
本系统除了具备检测室内环境的功能外,还具备警报系统。系统内部设置有针对温湿度、甲烷含量危险值的设定,若接收到的温度、甲烷含量、湿度超过或低于设定的危险值时,系统就会发出警报,提醒用户有危险出现。当危险解除时,警报也会随之解除。
此外,为了给用户营造一种温馨氛围,系统设置有在操作时播放的温馨背景音乐。当然用户爱听的话,也能手动关闭。(警报与背景音乐代码如图5)

void Widget::music()//背景音乐
{
    if(ui->pushButton_music->text ()=="开启音乐")
    {
       qDebug()<<"执行了";
       playlist->setPlaybackMode (QMediaPlaylist::CurrentItemInLoop);//循环播放当前项
       player->play ();
        ui->pushButton_music->setText ("关闭音乐");
    }
    else
    {
        qDebug()<<"暂停";
         player->stop();
         ui->pushButton_music->setText ("开启音乐");
    }
}

void Widget::alarm ()//警报声
{
    if(ui->pushButton_alarm->text ()=="关闭警报")
        {
        player_alarm->stop ();
        ui->pushButton_music->setText ("开启音乐");
        ui->pushButton_alarm->setText ("警报中");
        ui->pushButton_alarm->setEnabled (false);
        q=0;
        }
    else
    {
        q=1;
        ui->pushButton_alarm->setText ("关闭警报");
        ui->pushButton_alarm->setEnabled (true);
//        ui->pushButton_alarm->styleSheet ().clear ();
//        ui->pushButton_alarm->setStyleSheet ("image: url(:phono/in09.png;"
//                                             "font: 8pt '微软雅黑';"
//                                             "background-color: rgb(208, 208, 208);"
//                                             "background-image: url(:phono/in09.png);");
    }
}

4、用户注册与登录
本系统采用权限管理机制,只有通过系统注册账号后才能使用。初次使用者需要首先转入注册界面进行注册(用户注册功能代码如图6),获得账号后,返回登录界面输入注册的账号密码,进入操作主界面。
对于系统的登录功能,我们同样是采用建立数据库的方式完成的,注册账号即是加入新的用户信息到数据库,而登录即是在数据库中查找对应的注册数据,从而实现登录功能(用户登录功能代码如图7)。

void MainWindow::on_pushButton_register_clicked()
{
   int a = 1;
    if(ui->lineEdit_setUserName->text ().isEmpty ()|ui->lineEdit_setPassword->text ().isEmpty ()|ui->lineEdit_surePassword->text ().isEmpty ())
    {
        QMessageBox::warning(this,"警告","用户名和密码不能为空!!!");
    }
    else
    {
        if(ui->lineEdit_setPassword->text ()!=ui->lineEdit_surePassword->text ())
        {
            QMessageBox::warning(this,"警告","两次密码不一致!!");
        }
        else
        {
                if(!db.open())
                {
                    QMessageBox::warning(this,"错误","数据库打开失败");
                    return ;
                }

                else
                {

                  QSqlQuery  query("SELECT name FROM user_s");
                    while (query.next())
                    {
                        QString country = query.value(0).toString();
                        if(country==ui->lineEdit_setUserName->text ())
                        {
                            QMessageBox::information(this,"提示","该用户名已注册!");
                            a=0;
                            break;
                        }
                    }
                   if(a==1)
                   {
                        query.prepare("INSERT INTO user_s (name, password) "
                                      "VALUES (:name, :password)");
                        query.bindValue(":name", ui->lineEdit_setUserName->text ());
                        query.bindValue(":password", ui->lineEdit_setPassword->text ());
                        bool ok=query.exec();
                        if(ok)
                        {
                            QMessageBox::information(this,"提示","注册成功!");
                            this->db.close();
                        }
                        else
                        {
                            QMessageBox::information(this,"提示","注册失败!");
                            return;
                        }
                    }
                 }
             }
         }
  }

相关界面效果如下:
登录界面
主界面
数据库
以上是本人在Qt学习路上做过的一些设计中的一个,后续还会有更多关于Qt应用的更新,希望大家关注哦!!!
以上程序的源代码:
程序源代码

  • 0
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
基于ZigBee技术的室内环境监测系统系统设计,主要包括以下方面: 1. 系统硬件设计:系统硬件设计包括传感器、控制器、通信模块等硬件设备的选型和连接方式。传感器可以选择温度、湿度、光照强度、二氧化碳浓度等多种类型,控制器可以选用单片机或嵌入式系统,通信模块选用ZigBee模块。 2. 系统软件设计:系统软件设计主要包括传感器数据采集、数据处理、数据存储、通信协议等。其中,数据采集可以采用定时采集或触发式采集,数据处理可以采用滤波算法、数据转换等,数据存储可以采用本地存储或云端存储,通信协议可以采用ZigBee协议。 3. 系统架构设计:系统架构设计主要包括系统拓扑结构、网络协议、通信方式等。系统拓扑结构可以采用星型、网状或混合型结构,网络协议可以采用ZigBee协议或其他协议,通信方式可以采用广播、点对点或多播方式。 4. 系统安全设计:系统安全设计主要包括数据加密、身份认证、访问控制等。数据加密可以采用AES、DES等算法,身份认证可以采用数字证书、口令等方式,访问控制可以采用ACL、RBAC等策略。 5. 系统测试与验证:系统测试与验证主要包括功能测试、性能测试、可靠性测试等。功能测试包括传感器数据采集、数据处理、通信功能等,性能测试包括数据传输速率、响应时间等,可靠性测试包括系统稳定性、容错性等。 综上所述,基于ZigBee技术的室内环境监测系统系统设计需要从硬件、软件、架构、安全和测试等多个方面综合考虑,才能实现高效、可靠、安全的环境监测和数据管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LionelMartin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值