基于Zigbee的智能路灯控制系统的Qt操作界面

2023-10-26

本项目已经用于参加过比赛,在加之本人确实有点忙,所以拖到现在才发。这里只详细说明关于Qt控制界面的相关功能说明,本来是19年写的,代码量有点大,具体的地方,我自己都可能有点遗忘了,不过还是发出来供大家参考使用,因为当初时间紧迫可能代码格式不够规范,看起来有些吃力,希望大家见谅,大部分核心的控制函数,我还是有较为详细的功能说明的。
言归正传,因为代码量确实大,总和代码量大概在2000+行的样子,所以我就只在博文中说明部分即可,若想进一步了解的话,请自行点击下方的下载链接进行下载。
首先,本项目Qt操作界面的整体功能框架如下:
在这里插入图片描述
已经用于的功能和带扩展的功能,上图都已经有说明。
下面进行分部分介绍:

一、 智能照明

本智能路灯可以根据光照亮度,来进行自动照明。其通过光敏传感器所接收到的光照,判断其光照强度,外界环境较亮时(即傍晚)照射黄光,外界环境光亮弱时(即夜晚)照射白光。(这个部分是Zigbee部分的控制,Qt只是在控制切换自动模式还是手动模式)

此外还可以通过上位机Qt端的天气情况,将数据发送到ZigBee端,自动转换灯色,以适应天气。(联网获取天气信息在文章后面会提)

此外,系统设计之初设置有光强的渐变,即在智能自动模式下,灯光会根据环境的光照情况或灯内部的红外传感是否感应到行人来自动调节光线强度,目前光强渐变功能正处于研究与测试阶段。(Qt的界面控制中有否有人通过的图像显示标识)

void Widget::open_sum ()//灯开关设定******P
{

    if(ui->checkBox_lighting_1->checkState ()==0&&ui->checkBox_lighting_2->checkState ()==0)
    {
        qDebug()<<"请勾选需要点亮的灯泡";
        QMessageBox::information (this,"提示","请勾选需要点亮的灯泡");
        ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_notlighting.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_notlighting.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
    }
    if(ui->checkBox_lighting_1->checkState ()==2&&ui->checkBox_lighting_2->checkState ()==0)
    {

        chocie="1";
        if(ui->comboBox_lighting_1->currentText ()=="white")
        {
            P_1="1";
            P_2="3";
        ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_white.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
        }
        if(ui->comboBox_lighting_1->currentText ()=="yellow")
        {
            P_1="0";
            P_2="3";
            ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_yellow.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
        }
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_notlighting.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
        send_datas ();
    }
    if(ui->checkBox_lighting_1->checkState ()==0&&ui->checkBox_lighting_2->checkState ()==2)
    {
        chocie="2";
        if(ui->comboBox_lighting_2->currentText ()=="white")
        {
            P_1="3";
            P_2="0";
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_white.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
        }
        if(ui->comboBox_lighting_2->currentText ()=="yellow")
        {
            P_1="3";
            P_2="1";
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_yellow.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
        }
        ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_notlighting.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
        send_datas ();
    }
    if(ui->checkBox_lighting_1->checkState ()==2&&ui->checkBox_lighting_2->checkState ()==2)
    {
        chocie="3";
         if(ui->comboBox_lighting_1->currentText ()=="white")
         {
             P_1="1";
//             P_2="1";
        ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_white.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
         }
        if(ui->comboBox_lighting_2->currentText ()=="white")
        {
//            P_1="1";
            P_2="0";
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_white.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
        }
        if(ui->comboBox_lighting_1->currentText ()=="yellow")
        {
            P_1="0";
//            P_2="0";
        ui->label_bulb_1->setPixmap (QPixmap("phono/bulb_yellow.png"));
        ui->label_bulb_1->setScaledContents (true);//使图片适于label的大小
        }
        if(ui->comboBox_lighting_2->currentText ()=="yellow")
        {
//            P_1="0";
            P_2="1";
        ui->label_bubl_2->setPixmap (QPixmap("phono/bulb_yellow.png"));
        ui->label_bubl_2->setScaledContents (true);//使图片适于label的大小
        }
        send_datas ();//发送数据给下位机
    }

}

里面存在很多图像标识设置。

二、路灯升降,角度转动

本智能路灯可以控制升降。它分为自动模式和手动模式。自动模式下路灯将自动调节照射的范围,使照射到地面上的光照更强,达到较好照明效果。手动模式下,用户可手动控制路灯高低,路灯与地面的仰角。在现实应用中,该模式不仅方便维修人员进行相关操作,减少维修人员高空作业风险,还使路灯控制更加人性化。(大部分语句使用的是我们报告中的语句,所以显的有点那啥。。。哈哈哈)
这个部分功能的实现主要使用的滑块组件与qss语言的配合实现的图像的变换,因为本人还没有系统的学习关于Qt自定义控件的设计,所以只能依托PS和qss语句进行变换图像的显示功能。
路灯的升降:

void Widget::send_up()//灯部上升****G
{

    if(ui->checkBox_dial_1->checkState ()==0&&ui->checkBox_dial_2->checkState ()==0)
    {
        qDebug()<<"未被选中";
        QMessageBox::information (this,"提示","请勾选需要升降的路灯");
    }

    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==0)//选择灯口1
    {
        chocie="1";
        G_1="1";
        G_2="0";
        send_datas ();
    }
    if(ui->checkBox_dial_1->checkState ()==0&&ui->checkBox_dial_2->checkState ()==2)//选择灯口2
    {
       chocie="2";
       G_2="1";
       G_1="0";
       send_datas ();
    }
    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==2)//选择灯口1,2
    {
        chocie="3";
        G_1="1";
        G_2="1";
        send_datas ();
    }

}

void Widget::show_up ()
{
    int max=6;
    int min=0;
    ui->verticalSlider_light->setRange (min,max);
    ui->verticalSlider_light->setSingleStep (1);
    ui->verticalSlider_light_2->setRange (min,max);
    ui->verticalSlider_light_2->setSingleStep (1);

    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==0)
    {
        ui->label_gan_hint_1->show ();
        ui->label_gan_hint_2->show ();
        ui->verticalSlider_light->setValue (add);
         add++;
         if(add>=7)
         {
             timer_5->stop ();
              qDebug()<<"1上升完毕";
              QMessageBox::information (this,"提示","灯1上升完毕");
              ui->label_gan_hint_1->hide();
              ui->label_gan_hint_2->hide ();
         }
    }
    if(ui->checkBox_dial_1->checkState ()==0&&ui->checkBox_dial_2->checkState ()==2)
    {
        ui->label_gan_hint_1->show ();
        ui->label_gan_hint_2->show ();
        ui->verticalSlider_light_2->setValue (bdd);
          bdd++;
          if(bdd>=7)
          {
              timer_8->stop ();
               qDebug()<<"2上升完毕";
               QMessageBox::information (this,"提示","灯2上升完毕");
               ui->label_gan_hint_1->hide();
               ui->label_gan_hint_2->hide ();
          }
    }
    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==2)
    {
        if(add==bdd)
      {
            ui->label_gan_hint_1->show ();
            ui->label_gan_hint_2->show ();
       ui->verticalSlider_light->setValue (add);
       ui->verticalSlider_light_2->setValue (bdd);
       add++;
       bdd++;

        if(add==7&&bdd==7)
        {
           timer_5->stop ();
           timer_8->stop ();
            qDebug()<<"两盏上升完毕";
            QMessageBox::information (this,"提示","两盏灯上升完毕");
            ui->label_gan_hint_1->hide();
            ui->label_gan_hint_2->hide ();
        }
      }
      else
      {
            timer_5->stop ();
            timer_8->stop ();
        qDebug()<<"请取消无需升降操作的选项";
        QMessageBox::information (this,"提示","请取消无需升降操作的选项");
        ui->label_gan_hint_1->hide();
        ui->label_gan_hint_2->hide ();
      }
    }

}
void Widget::timer_up ()//灯上升动画定时器使用
{
    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==0)
    {
        timer_6->stop ();
        timer_5->start (1000);
    }
    if(ui->checkBox_dial_1->checkState ()==0&&ui->checkBox_dial_2->checkState ()==2)
    {
        timer_9->stop ();
        timer_8->start (1000);
    }
    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==2)
    {
        timer_6->stop ();
        timer_5->start (1000);
        timer_9->stop ();
        timer_8->start (1000);

    }
}

第一个函数判断选中的控制路灯(因为此项目控制的是两个升降路灯模型);第二个函数控制路灯升降控制的图像变换显示,主要机制还是定时器的使用。(这里下降与上升异曲同工)
路灯灯部转动

void Widget::dial_1()//灯部旋转模块链接设置
{
    int max=180;
    int min=90;
    int single_sp=15;
    int single_ver=15;

    ui->spinBox_3->setMaximum (max);
    ui->spinBox_3->setMinimum (min);
    ui->spinBox_5->setRange (90,180);

    ui->spinBox_3->setSingleStep (single_sp);
    ui->spinBox_5->setSingleStep (single_sp);

    ui->spinBox_3->setValue (90);
    ui->spinBox_5->setValue (90);

    ui->dial->setSingleStep (single_ver);
    ui->dial_2->setSingleStep (single_ver);

    connect (ui->spinBox_3,SIGNAL (valueChanged(int)),ui->dial,SLOT (setValue(int)));

    connect (ui->dial,SIGNAL (valueChanged(int)),ui->spinBox_3,SLOT (setValue(int)));

    connect (ui->spinBox_5,SIGNAL (valueChanged(int)),ui->dial_2,SLOT (setValue(int)));

    connect (ui->dial_2,SIGNAL (valueChanged(int)),ui->spinBox_5,SLOT (setValue(int)));

    connect (ui->spinBox_3,SIGNAL (valueChanged(int)),this,SLOT (spinBox_hint_1 ()));
    connect (ui->spinBox_5,SIGNAL (valueChanged(int)),this,SLOT (spinBox_hint_2 ()));

    // connect (ui->spinBox_3,SIGNAL (valueChanged(int)),this,SLOT (send_lighting()));

    //connect (ui->dial,SIGNAL (valueChanged(int)),this,SLOT(send_lighting()));

    // connect (ui->spinBox_5,SIGNAL (valueChanged(int)),this,SLOT (send_lighting()));

    //connect (ui->dial_2,SIGNAL (valueChanged(int)),this,SLOT(send_lighting()));


}

void Widget::spinBox_hint_1 ()
{
   ui->label_light_hint_1->setText ("     调节中");
   ui->label_light_hint_1->show ();
}

void Widget::spinBox_hint_2 ()
{
    ui->label_light_hint_2->setText ("     调节中");
    ui->label_light_hint_2->show ();
}

void Widget::dial_hint ()//灯部转动***发送的变量Z
{
    QString value1;
    QString value2;
    value1=ui->spinBox_3->text ();
    value2=ui->spinBox_5->text ();

    int value1_int=value1.toInt ();
    int value2_int=value2.toInt ();
        value1_int=value1_int-90;
        value2_int=value2_int-90;

    value1=QString::number (value1_int);
    value2=QString::number (value2_int);

    if(value1_int<=10)
    {
        value1="0"+value1;
    }
    if(value2_int<=10)
    {
        value2="0"+value2;
    }

    timer_7->setSingleShot (true);//设定定时器7只被触发一次

    if(ui->checkBox_dial_1->checkState ()==0&&ui->checkBox_dial_2->checkState ()==0)
    {
        qDebug()<<"未被选中";
        QMessageBox::information (this,"提示","请勾选需要转动的路灯");
    }
    if(ui->checkBox_dial_1->checkState ()==2&&ui->checkBox_dial_2->checkState ()==0)
    {
            chocie="1";
            Z_1=value1;
            ui->label_light_hint_1->setText ("正在转动中...");
            ui->label_light_hint_1->show ();
            timer_7->start (2*1000);

    }
    if(ui->checkBox_dial_2->checkState ()==2&&ui->checkBox_dial_1->checkState ()==0)
    {
            chocie="2";
            Z_2=value2;
            ui->label_light_hint_2->setText ("正在转动中...");
            ui->label_light_hint_2->show ();
            timer_7->start (2*1000);
    }
    if(ui->checkBox_dial_2->checkState ()==2&&ui->checkBox_dial_1->checkState ()==2)
    {
            chocie="3";
            Z_1=value1;
            Z_2=value2;
            ui->label_light_hint_1->setText ("正在转动中...");
            ui->label_light_hint_2->setText ("正在转动中...");
            ui->label_light_hint_1->show ();
            ui->label_light_hint_2->show ();
            timer_7->start (2*1000);
    }
    send_datas ();
    //connect (timer_7,SIGNAL (timeout()),this,SLOT (dial_execute ()));
}

void Widget::dial_execute ()//转动动画执行
{
    ui->label_light_hint_1->hide ();
    ui->label_light_hint_2->hide ();
    timer_7->stop ();
    QMessageBox::information (this,"提示","转动完成");
}

同样是定时器的运用
控制界面如下:
在这里插入图片描述

三、数据库

在上位机上设置有数据库,用于存储路段的相关情况目前主要工作。光敏传感等传感器将检测到的数据反馈到上位机,上位机将数据进行存储,能够更加清晰地了解该路段所存在的情况。目前的存储信息格式为“时间—光照强度—天气情况——温度”,用户从主操作界面点击进入数据库界面,可对数据库列表数据进行更新、数量设定等操作。后期我们将新增信息搜索等功能已完善与优化数据库系统。
我在以前的博文中提到过数据库的使用,这里就不过多赘述,直接上代码:

#include "data_storeroom.h"
#include "ui_data_storeroom.h"

int sum=1440;//默认的存数据的条数

data_storeroom::data_storeroom(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::data_storeroom)
{
    ui->setupUi(this);
     this->setMaximumSize (837,592);
    ui->lineEdit_sum->setEnabled (false);
    this->setWindowTitle ("数据库");

    db=QSqlDatabase::addDatabase ("QSQLITE");
    db.setDatabaseName ("data_lighting.db");
    bool ok=db.open ();
    if(!ok)
    {
        qDebug()<<"数据库打开失败";
    }
    else
    {
        qDebug()<<"数据库打开成功";
    }

     up_data();//更新数据

    if(setting.value ("sum").toInt ()==0)
    {
        ui->lineEdit_sum->setText (QString::number (sum));
    }
    else
    {
        save_setting ();
    }
    timer->start (1000);
    QObject::connect (ui->pushButton_updata,SIGNAL (clicked()),this,SLOT (up_data()));//重塑数据模型使之更新
    QObject::connect (timer,SIGNAL (timeout()),this,SLOT (detection_data())); //数据数量检测

    //ui设定
    QPalette pa;//定义一个调色板
    QPixmap pix;
    pix=QPixmap("phono/background.jpg").scaled (this->size ());
    pa.setBrush (this->backgroundRole (),QBrush(pix));
    this->setPalette (pa);

}

data_storeroom::~data_storeroom()
{
    delete ui;
}

void data_storeroom::save_setting ()//保存设置
{
    int a;
    QString A;
    a=setting.value ("sum").toInt ();
    A=QString::number (a);
    ui->lineEdit_sum->setText (A);
    sum=ui->lineEdit_sum->text ().toInt ();

}

void data_storeroom::up_data ()//数据更新
{
    int i;
    QSqlQuery query;
    qryModel=new QSqlQueryModel(this);
    theSelection=new QItemSelectionModel(qryModel);//构建指向qryModel的选择模型
    qryModel->setQuery ("select time,lighting,weather,temperature from light order by time desc");//以倒序排列
    if(qryModel->lastError ().isValid())
    {
        QMessageBox::information (this,"错误","数据表格查询失败\n"
                +qryModel->lastError ().text (),QMessageBox::Ok,QMessageBox::NoButton);
        qDebug()<<db.lastError ();
    }
    qryModel->setHeaderData (0,Qt::Horizontal,QObject::tr ("时间"));
    qryModel->setHeaderData (1,Qt::Horizontal,QObject::tr ("光照强度"));
    qryModel->setHeaderData (2,Qt::Horizontal,QObject::tr ("天气情况"));
    qryModel->setHeaderData (3,Qt::Horizontal,QObject::tr ("温度/℃"));


    ui->tableView->setModel (qryModel);
    ui->tableView->setSelectionModel (theSelection);
    ui->tableView->setAlternatingRowColors (true);//设置颜色
   //设置列宽
    ui->tableView->setColumnWidth (0,150);//第一列的宽度
    ui->tableView->setColumnWidth (1,80);
    ui->tableView->setColumnWidth (2,80);
    ui->tableView->setColumnWidth (3,100);

    i=qryModel->rowCount ();//获取行数
    QString n,m;
    m="条(满数%1)";
    m=m.arg (sum);
    n=QString::number (i);
    ui->label_number->setText (n+m);

}

void data_storeroom::detection_data ()//自动检测数据溢出, //数据监测是否超过设定保存值
{
        int i;
        QSqlQuery query;
        i=qryModel->rowCount ();
        if(i>sum)//数据库只能保存自开启后sum条的数据
        {
            qDebug()<<"数据已到上限执行清除命令";
            QMessageBox::information (this,"提示","数据已经达到上限执行数据清除");
            bool ok_1;
            query.prepare ("delete from light");
            ok_1=query.exec ();
            if(!ok_1)
            {

                qDebug()<<"数据已满执行清空数据失败";
            }
            else
            {
               up_data();
                qDebug()<<"数据已满执行清空数据成功";
            }
         }

}

void data_storeroom::on_pushButton_clear_clicked()//清空数据
{
    bool ok_1;
    QSqlQuery query;
    query.prepare ("delete from light");
    ok_1=query.exec ();
    if(!ok_1)
    {
        qDebug()<<"数据已满执行清空数据失败";
    }
    else
    {
         up_data();
        qDebug()<<"数据已满执行清空数据成功";
    }
}

void data_storeroom::on_pushButton_setting_clicked()//更改设置按钮
{

    if(ui->pushButton_setting->text ()=="更改设置")
    {
        ui->lineEdit_sum->setEnabled (true);
        ui->pushButton_setting->setText ("确认更改");
    }
    else
    {
        sum=ui->lineEdit_sum->text ().toInt ();//保存数据
        setting.setValue ("sum",sum);
        QMessageBox::information (this,"提示","更改成功");
        ui->lineEdit_sum->setEnabled (false);
        up_data ();
        ui->pushButton_setting->setText ("更改设置");
    }
}

void data_storeroom::on_pushButton_back02_clicked()
{
   this->close ();
}

界面效果:
在这里插入图片描述

四、天气情况显示

上位机通过联网获取网站,在网站上获取天气预报信息,并解析反馈到上位机,实时更新,方便快捷地了解到当地当时的天气,作为路灯辅助控制手段之一。
天气显示,主要是通过联网获取天气网站的天气数据来实现的,难点是在如何解析获取的网络语言
JSON,各位可以去搜一下,下面附上代码:

void Widget::receive_weather ()//获取网站的天气情况
{
    //获取网络天气
    if(!ui->lineEdit_city->text ().isEmpty ())
    {
    QString local_country=ui->lineEdit_city->text ();
    char quest_array[256]="http://wthrcdn.etouch.cn/weather_mini?city=";
    QNetworkRequest quest;
    sprintf (quest_array,"%s%s",quest_array,local_country.toUtf8 ().data ());
    quest.setUrl (QUrl(quest_array));
    quest.setHeader (QNetworkRequest::UserAgentHeader,"RT-Thread ART");
    manager->get (quest);//发送get网路请求
    QObject::connect (manager,SIGNAL (finished(QNetworkReply*)),this,SLOT (getting_weather (QNetworkReply*)));
    }
    else
    {
        QMessageBox::warning (this,"错误","请输入查询的城市");
    }
}

void Widget::judge_weather ()//天气状况判断(显示对应的天气图)
{
    if(weather=="阴")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_clouds.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="多云")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_cloudy.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="晴")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_sun.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="小雨")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_rain_little.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="中雨")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_rain.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="大雨")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_rain.png"));
        ui->label_weather_map->setScaledContents (true);
    }
    if(weather=="阵雨")
    {
        ui->label_weather_map->setPixmap (QPixmap("phono/small_picture/weather/weather_rain.png"));
        ui->label_weather_map->setScaledContents (true);
    }

}
void Widget::getting_weather (QNetworkReply *reply)//用于解析收到的数据
{
    qDebug()<<"数据接收到!!!";
    QString data=reply->readAll ();
    qDebug()<<data;//将接收到的数据显示出来

    QJsonParseError err;
    QJsonDocument json=QJsonDocument::fromJson (data.toUtf8 (),&err);//解析json对象
    qDebug()<<err.error;
    if(!json.isNull ())
    {
        QJsonObject object=json.object ();
        if(object.contains ("data"))
        {
            QJsonValue value=object.value ("data");
            if(value.isObject ())
            {
                QJsonObject object_data=value.toObject ();
                if(object_data.contains ("forecast"))
                {
                    QJsonValue values=object_data.value ("forecast");
                    if(values.isArray ())
                    {
                        QJsonObject today_weather=values.toArray ().at (0).toObject ();
                        weather=today_weather.value ("type").toString ();//天气类型
                        QString low=today_weather.value ("low").toString ();
                        QString high=today_weather.value ("high").toString ();

                        temperature=low.mid (low.length ()-3,4)+"~"+high.mid (high.length ()-3,4);//高低温度显示
                        ui->label_weather->setText (weather);
                        ui->label_temperature_value->setText (temperature);
                        judge_weather ();
                    }

                }
            }

        }

    }
    else
    {
        qDebug()<<"没有接受到数据";
    }
    reply->deleteLater ();//销毁请求对象
}

出了这些外,你还需要一些图标才行,我在下面的代码包中,提供有,本系统会用的图标。
效果图如下:
在这里插入图片描述
他能在联网的情况下获取各大市级城市的天气情况。输入自己查询的地区名,点击确认即可。

五、光照强度曲线图

ZigBee控制光敏传感器实时采集光照强度,然后将所采集到的数据反馈进入上位机,形成曲线图,直观地了解路况光照信息,并存入数据库,为优化路灯收集事实基础。
这个部分还是在我以前的博文中提到过,我就不赘述了,直接上代码:

void Widget::createChart()//创建图表
{
    maxsize=31;//设置实时数据储存的量的上限为31
    max_x=300;
    max_y=150;

    splineSeries->setColor (Qt::red);

    splineSeries_2->setColor (Qt::blue);


    QChart *chart=new QChart();
    chart->addSeries (splineSeries);

    chart->addSeries (splineSeries_2);

    splineSeries->setName ("灯1检测到的光照强度");

    splineSeries_2->setName ("灯2检测的光照强度");

    chart->legend ()->setVisible (true);//显示图例
    chart->legend ()->setAlignment (Qt::AlignTop);//图例显示在上方
    chart->setTitle ("数据动态曲线");
    chart->createDefaultAxes ();//根据级数添加轴(已添加进入的级数)
    chart->axisX ()->setRange (0,max_x);
    chart->axisY ()->setRange (0,max_y);
    chart->axisX ()->setTitleText ("时间X轴单位/0.1s))");
    chart->axisY ()->setTitleText ("光照强度");
    ui->ChartView->setChart (chart);
    ui->ChartView->setRenderHint (QPainter::Antialiasing);

}

void Widget::receiveChart (int light, int light_2)//动态图表绘制
{
    list<<light;

    list_2<<light_2;

    while (list.size ()>maxsize&&list_2.size ()>maxsize)
    {
    list.removeFirst ();
    list_2.removeFirst ();
    }
    if(isVisible ())
    {
        splineSeries->clear ();
        splineSeries_2->clear();
    for(int p=0;p<list.size ();p++)
        {
        splineSeries->append (10+p*10,list.at (p));//at()用于访问容器,也可用[]
        splineSeries_2->append (10+p*10,list_2.at (p));
        }
    }

}

现在附上整体界面设计图(说实话,我也觉得丑,原谅我只是个工科生。。。。)

在这里插入图片描述
好了,主要的部分我已经发出来了,如果需要详细了解的话,就请下载下方的链接文件:
智能路灯Qt操作界面代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Zigbee的智能路灯控制系统的Qt操作界面 的相关文章

随机推荐

  • C 标准库 - 《string.h》

    原文链接 https www runoob com cprogramming c standard library string h html 简介 string h 头文件定义了一个变量类型 一个宏和各种操作字符数组的函数 库变量 下面是
  • Python进阶学习分享之循环设计

    range 在Python中 for循环后的in跟随一个序列的话 循环每次使用的序列元素 而不是序列的下标 之前我们已经使用过range 来控制for循环 现在 我们继续开发range的功能 以实现下标对循环的控制 S abcdefghij
  • python搭建HTTP服务器并外网访问 - 内网穿透

    1 前言 Python作为热度比较高的编程语言 其语法简单且语句清晰 而且python有良好的兼容性 可以轻松的和其他编程语言 比如C C 建立的模块连接起来 而且python丰富强大的库 经过封装可以轻松调用 因此深受欢迎 今天我们就尝试
  • pytorch学习笔记13-利用GPU训练

    目录 GPU训练方式1 方式1如何操作 完整代码 结果 如果电脑上没有GPU 可以使用Google的colab GPU训练方式2 方式2如何操作 完整代码 用Google colab的输出 GPU训练方式1 方式1如何操作 找到神经网络模型
  • 解决Pycharm无法使用已经安装Selenium的问题

    电脑C盘安装python27的时候也安装了selenium 但是最近刚刚使用工具Pycharm 新建工程后 然后建立 py文件后 使用语句 from selenium webdriver support wait import WebDri
  • 程序性能分析及性能测试

    这里所说的程序是指对外提供tcp ip交互协议的服务性程序 网络程序性能分析很重要 比如随着网络请求流量越来越大 我们需要知道已部署的服务能不能满足需求 这里采用对网络服务程序进行建模的方法分析影响程序性能的各要素 并计算相关性能值 它不够
  • odoo权限规则

    文章目录 odoo权限的层级划分 模型 表 级访问权限管理 记录规则权限 1 创建用户 2 新建权限组 用户组 3 创建记录规则 record rule 字段权限控制 菜单级权限管理 工作流权限管理 隐藏的常用技巧 Eval odoo权限的
  • 编译linux内核(二)

    编译linux内核 1 准备工作 1 1 下载内核文件 1 2 环境准备 1 3 内核命名规则 1 4 内核镜像 1 4 ELF 2 编译内核 2 1 升级gcc 2 2 make menuconfig其他报错 2 3 配置选项 2 4 编
  • MySQL数据库中的索引(含SQL语句)

    文章目录 为什么要用索引 索引是什么 索引的原理 优点 缺点 创建索引的原则 什么情况下需要索引 什么情况下不需要索引 索引的分类 主键索引 单值索引 唯一索引 组合索引 复合索引 全文索引 仅在MySQL8之后有 查找索引 索引的数据结构
  • cmd和dos的区别(汇总)

    你在windows操作系统里进的DOS 即输入 CMD 进命令提示符 不是纯DOS 只是为方便某些需求而建立的 而纯DOS本身就是一种操作系统 两者的区别 比如你可以在纯DOS下删除你的 windows系统 但在你所说的 命令提示符 里却不
  • Mac 让 iTerm2 记住用户名密码 expect 脚本

    刚刚用iTerm2的时候 总是要一遍遍的敲用户名 密码 我在想 能不能像Windows的软件一样 可以直接让软件记住 然后只要点击一下 就直接ssh到远程服务器上面去了 之后经过搜索 可以用expect脚本实现 usr bin expect
  • SSM学生作业管理系统-计算机毕设 附源码20912

    SSM学生作业管理系统 摘 要 随着科学技术的飞速发展 各行各业都在努力与现代先进技术接轨 通过科技手段提高自身的优势 对于学生作业管理系统当然也不能排除在外 随着网络技术的不断成熟 带动了学生作业管理系统 它彻底改变了过去传统的管理方式
  • 【webpack5】高级优化

    介绍 本章节主要介绍 Webpack 高级配置 所谓高级配置其实就是进行 Webpack 优化 让我们代码在编译 运行时性能更好 我们会从以下角度来进行优化 提升开发体验 提升打包构建速度 减少代码体积 优化代码运行性能 提升开发体验 So
  • 安装Node.js后,查看npm版本时出现警告

    执行命令 npm v 时 npm WARN config global global local are deprecated Use location global instead 修改安装的 node js 的文件架下的 npm cmd
  • sublime 自动补全

    preferences gt settings 在右边窗口最后位置添加 auto complete true 出现打过的单词 auto match enabled true 自动补全括号或引号
  • 【满分】【华为OD机试真题2023 JS】开心消消乐

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 开心消消乐 知识点编程基础深搜广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个N行M列的二维矩阵 矩阵中每个位置的数字取值为0或1 矩阵示例如 1
  • 《思考的艺术》——书评与思维导图

    抽空读了下这本书 先说说整体感觉 内容基本满意 书的布局非常不喜欢 先吐槽吧 目录太过宽泛 给人造成 只见树木不见林 的感觉 目前只列出了各章节的标题在目录中 但每个章节包含很多的小标题 各标题的字体 大小都一样 很难区分逻辑 层次关系 如
  • 银行业务系统数据库设计与实现

    银行业务系统数据库的设计与实现 1 创建数据库银行业务系统数据库 bankDB Drop database if EXISTS bankDB 删除bindDB数据库 即使没有数据库也不报错 CREATE database bankDB 创建
  • preprocessing.LabelEncoder()使用

    preprocessing LabelEncoder 使用 e g 1 from sklearn import preprocessing le preprocessing LabelEncoder arr gf 1 2 3 wom wom
  • 基于Zigbee的智能路灯控制系统的Qt操作界面

    本项目已经用于参加过比赛 在加之本人确实有点忙 所以拖到现在才发 这里只详细说明关于Qt控制界面的相关功能说明 本来是19年写的 代码量有点大 具体的地方 我自己都可能有点遗忘了 不过还是发出来供大家参考使用 因为当初时间紧迫可能代码格式不