基于Qt、树莓派和STM32的智能家居应用开发

        最近学会了使用Qt和树莓派,决定制作项目练练手。主要是为了真正掌握Qt开发上位机软件,于是简单做了该项目。主要讲讲自己的思路,供别人参考。

下载地址:Misriter/Qt-SmartHome (github.com)

制作软件和硬件:

1.树莓派4B

2.STM32F103

3.DHT11

4.Qt creator 6.4.3

整体展示:

 

 

 

准备工作:

        首先把需要的库加进来,本项目需要network、qmqtt、serialport、sql、charts,使用的qmqtt库是第三方库。

        然后创建一个QMainWindow取名SmartHome用来搭载页面,这里我搭载了1个滑动页,滑动又搭载了3个页面,分别为首页、连接页、数据页。


    slide = new MySlide(this);
    slide->resize(this->size());

    homepage = new HomePage(this);
    slide->addPage(homepage);

    connectpage = new Connect(this);
    slide->addPage(connectpage);

    chart = new Chart(this);
    slide->addPage(chart);

 

滑动页:

        由于我有一块官方触屏,所以可以开发一下触屏功能,这里简单讲讲滑动怎么实现。笼统地讲就是把几个页面横向塞进一个Widget里面,滑动页不够宽一次只能显示一个页面,如果横向滚动就能显示其它页面。看起来是换页面,其实它们都在同一页,只是隐藏了滚动条改成下方的点(页面指示器),模拟了类似轮播图的效果。

        先创建一个Widget,设置透明、隐藏滚动条。创建一个底部横向布局用来存放页面指示器,设置居中、透明。这里为了方便开发,触屏和鼠标左键都能触发滑动,不过要判断一下,注意如果使用投屏软件操作,记得在__arm__前取反。

MySlide::MySlide(QWidget *parent):
    QWidget(parent),
    curpageindex(0),
    pagecount(0),
    isdragging(false)

{
    pageicon.clear();
    this->setMinimumSize(400, 300);
    this->setAttribute(Qt::WA_TranslucentBackground, true);//半透明
    scrollarea = new QScrollArea(this);
    scrollarea->setAlignment(Qt::AlignCenter);
    mainwidget = new QWidget(this);
    mainwidget->setStyleSheet("backgroud:transparent"); //透明
    scrollarea->setWidget(mainwidget);
    bottomwidget = new QWidget(this);
    bottomwidget->setStyleSheet("background:transparent");
    bottomhbl = new QHBoxLayout();
    bottomhbl->setContentsMargins(0, 0, 0, 0);
    bottomhbl->setAlignment(Qt::AlignCenter);
    bottomwidget->setLayout(bottomhbl);
    scrollarea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏滚动条
    scrollarea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scroller = QScroller::scroller(scrollarea);
    //arm即平板为触摸式,PC为鼠标式
#if __arm__
    QScroller::ScrollerGestureType gesture =
            QScroller::TouchGesture;
#else
    QScroller::ScrollerGestureType gesture =
            QScroller::LeftMouseButtonGesture;
#endif
    scroller->grabGesture(scrollarea, gesture);
    QScrollerProperties properties = scroller->scrollerProperties();
    properties.setScrollMetric(QScrollerProperties::SnapTime, 0.5);//翻页时间
    properties.setScrollMetric(QScrollerProperties::MinimumVelocity, 1);
    scroller->setScrollerProperties(properties);

    mainhbl = new QHBoxLayout();
    mainhbl->setContentsMargins(0, 0, 0, 0);
    mainhbl->setSpacing(0);
    mainwidget->setLayout(mainhbl);

    timer = new QTimer(this);

    connect(scrollarea->horizontalScrollBar(), &QScrollBar::valueChanged,this, &MySlide::hScrollBarValueChanged);
    connect(scroller, &QScroller::stateChanged,this, &MySlide::onStateChanged);
    connect(timer, &QTimer::timeout,this, &MySlide::onTimerTimeOut);
    connect(this, &MySlide::curPageIndexChanged,this, &MySlide::onCurrentPageIndexChanged);
}

首页:

        我决定在首页实现一些简单的功能,很常见的显示日期、时间、天气,在上方我加入了网络连接检测,日后可以考虑加入别的检测。

         这里我使用的是七段数字显示时间,使用QLCDNumber和QDateTime相结合就可以实现。使用一个QTimer设定1000,每隔1秒更新一下LCDNumber。

        如果要获得实时天气,可以向我们的老朋友心知天气api发送请求。使用QNetworkRequest向心知天气api发送请求,可以得到一条Json字符串,使用QJson解析Json即可获得天气。切换城市的话我使用弹出框,在弹出框中操作,如果在首页上操作显得不太和谐。

        检测网络连接我使用了一个简单办法,不过不是很快,仅供参考。

void HomePage::isConnect(){
    update();
    QNetworkConfigurationManager mgr;
    if(!mgr.isOnline()){
        wifiLabel->setPixmap(QPixmap(":/icons/wifi2.png"));
    }
    else{
        wifiLabel->setPixmap(QPixmap(":/icons/wifi1.png"));
    }

}

连接页:

        连接页是用来让树莓派和STM32连接的,我设置了串口、TCP、OneNET连接,平常也都是这老三样了。设置上方左右两个文本框用来接收和发送,在三种模式中通用。接受框收到的数据如果是Json字符串,会自动解析然后控制STM32。

        如果使用OneNET连接,有两种思路。一种是上位机连接OneNET接收下发命令,然后通过串口控制下位机;另一种是下位机连接OneNET接收下发命令,然后直接控制下位机。这里我使用第一种,因为方便拓展,而且连接更加稳定。

        接收到DHT11传来的数据之后,创建SQLite数据库th.db,把数据放进去以备之后使用。

数据页:

        数据页主要是用来显示数据库信息的,左侧文本框里是数据库全部信息,拥有三种搜索方法,搜索温度、搜索湿度、搜索时间。按下右下角的按钮可以选择搜索方式,搜索结果会在右侧文本框显示。如果搜索时间,则会显示选中时间及之后的所有数据。

        搜索时间之后可以点击生成折线图,然后会弹出一个框,用QtCharts的折线图显示数据。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt 是一款跨平台的应用程序开发框架,能够用于开发各种类型的软件。上位机是指控制系统中的一个部分,负责与低级控制设备通信,实现控制和监控功能。CAN(Controller Area Network)是一种广泛应用于汽车、工业控制等领域的通信协议。现在,我们来谈一谈 Qt 上位机与 CAN 的结合应用Qt 上位机可以通过使用相应的 CAN 接口库来实现与 CAN 总线的通信。Qt 提供了丰富的网络和串口通信功能,发送和接收 CAN 消息可以通过网络通信接口或串口通信接口来完成。通过 Qt 团队或第三方开发的CAN库,我们可以轻松地在 Qt 上位机中实现与 CAN 总线的通信。 使用 Qt 上位机进行 CAN 通信的好处之一是,Qt 的跨平台特性使得我们可以在各种操作系统上运行我们的上位机应用程序。不管是在 Windows、Linux 还是 macOS 等系统上,Qt 都能提供一致性的开发体验和运行结果。 Qt 提供了易于使用且强大的界面设计工具,可以帮助我们设计出直观而美观的用户界面,用于显示和控制 CAN 总线上的数据。通过 Qt 的信号槽机制,我们可以方便地实现对 CAN 数据的处理和分发,使得上位机能够实时地获取和更新来自 CAN 总线的数据。 总之,Qt 上位机的 CAN 应用可以支持用户与 CAN 总线之间的数据交互和通信,提供了易用、跨平台和强大的界面设计能力。这使得我们能够快速开发出功能丰富且可靠的上位机应用,用于实现各种控制和监控任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值