首页 > 系统相关 >STM32MP157开发板Linux+Qt项目实战:智慧家庭

STM32MP157开发板Linux+Qt项目实战:智慧家庭

时间:2023-02-07 18:05:29浏览次数:50  
标签:Qt STM32MP157 system 开发板 点击 QString root append

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux+单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器,集成2个Cortex-A7核和1个Cortex-M4 核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统。开发板搭配仿真器、显示屏、摄像头、资源扩展板等丰富的扩展模块,可拓展物联网、人工智能等相关技术学习,还可以拓展丰富的项目实战,非常贴合企业当下开发需求,是一款嵌入式Linux入门进阶必备开发板!

可学习技术:嵌入式Linux应用/系统/驱动开发、ARM裸机开发、Qt界面编程、STM32单片机、FreeRTOS、人工智能机器视觉等。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt

可实战项目:14个Linux+Qt综合项目案例,8个MP1A物联网拓展项目

公众号“华清远见V智能有料”,回复“mp157项目”,索取项目配套文档及源码。

1、Linux+Qt综合项目案例:华清远见stm32mp157开发板优势特色部分,包括音乐播放器、智慧家庭、智能工业电表、智能出行助手、智能猫眼、环境监测、智能安防、智能语音识别等10余个项目案例,涉及家居、医疗、农业多种应用方向,在案例中使用了多种物联网和嵌入式技术,包括OT开发、linux应用开发、linux驱动开发、物联网云端接入、MQTT协议、json字符串等知识点。

基于Linux+Qt的智慧家庭项目

项目简介:

智慧家庭又可称为智慧家庭服务平台,是智慧城市的最小单元,是以家庭为载体,以家庭成员之间的亲情为纽带。智慧家庭综合利用物联网、云计算、移动互联网和大数据等新一代信息技术,结合自动控制技术,将家庭设备智能控制、家庭环境感知、家人健康感知、家居安全感知以及信息交流、消费服务等家居生活有效地结合起来,创造出健康、安全、舒适、低碳、便捷、个性化和充满关爱的家庭生活方式。

开发平台:

华清远见stm32mp157开发板豪华套餐(开发板+仿真器+五寸屏+摄像头+资源扩展板+tf卡+读卡器)

项目功能展示:

Wifi 模块

点击刷新按钮,可以实时更新附近的 wifi,选择要连接的 wifi,会弹出输入密码的页面,输入密码,点击连接即可连接成功。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_02


STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_03

选择要查看天气的城市,点击获取按钮

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_04

环境监测模块

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_05

设备控制模块

选择按钮即可完成设备的控制

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_06

开启和关闭按钮控制智能监测的开启和关闭,提交按钮上的输入框输入的是智能监测触发的阈值。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_07

连接百度云模块

输入百度云连接三元组,点击获取时间戳,点击计算、连接,即可实现向云端发送环境进而转发到微信小程序,并且通过微信小程序控制设备。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_08

在微信小程序显示温湿度。并且控制开发板 led 灯

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_09

遮挡光电开关,会自动弹出门禁系统。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_10

Qt开发环境搭建

主机开发环境说明

1) 本文档主要介绍 linux 环境下的 Qt 程序开发;

2) 主机 Qt 版本为 5.14.1;

主机 Qt 环境搭建及使用

Qt Creator 安装

将 qt-creator-opensource-linux-x86_64-4.10.1.run(Qt 实验源码\工具软件) 复制到 ubuntu 主机中,可以采用共享文件夹的方式也可以使用 tfp方式将文 件存入家目录下的 Downloads 目录。我们需要在终端中赋予安装程序可执行的权限

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_11

我们可以使用图形化的文件管理器来查看

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_12

双击“qt-creator-opensource-linux-x86_64-4.10.1.run”图标运行安装程序。

出现如下界面:

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_13

等待程序验证完成后点击“Next”

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_14

这里我们需要登录或者注册一个账号,如果我们之前已经注册过直接登录就可以。如果没有注册过则需要新注册有一个账号后登录。这里笔者已经注册过账号,所以直接登录。

登录成功后出现如下界面,点击 Next

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_15

这里选择安装路径

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_16

可以直接默认,Next

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_17

这路选择安装的组件,直接默认即可

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_18

这里我们需要同意用户协议

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_19

这个界面告诉我们安装完成后需要占用的空间。点击”Install”按钮后开始安装。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_20

安装完成后出现如下界面

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_21

点击“Finish”按钮后将弹出 Qt Creator 主界面

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_22

点击“Cancel”按钮后即可正常使用

Qt5.14.1 安装

复制到 qt-opensource-linux-x64-5.14.1.run(Qt 实验源码\工具软件)到 ubuntu 主机中,可以采用共享文件夹的方式也可以使用 tfp 方式将文件存入家目录下的 Downloads 目录。进入所在文件夹,先给执行权限输入命令

chmod +x ./qt-opensource-linux-x64-5.14.1.run

安装在命令行输入

./qt-opensource-linux-x64-5.14.1.run

会有可视化引导安装,一直 next 就行了

在选择安装组件的时候要是不知道选择那些就全选了 大概有 4 个 G 左右

下载 gcc 和 g++

sudo apt-get install gcc g++

下载 cmake

sudo apt-get install cmake

下载链接库

sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

Qt Creator 配置

1)配置 GCC

运行 QtCreator 后,依次点击"Tool"->"Options",出现选项对话框,在左侧点击"Kits",右 边选择"Compilers"标签。 检查有没有下图标注的 C++和 C ,一般按上面步骤执行后都会有

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_23

点击右侧"Add"按钮,弹出下拉列表后,选择"GCC"的"C"

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_24

填写信息如下,"Name"为"Auto-GCC","Compiler path"点击旁边的"Browse.."按钮选择编译器的路径,例子中的路径是 “/usr/bin/gcc”

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_25

2)配置 G++

点击右侧"Add"按钮,弹出下拉列表后,选择"GCC"的"C++",下面的文本框填写"Name" 为"Auto-G++","Compiler path"点击旁边的"Browse.."按钮选择编译器的路径,例子中的路径是" /usr/bin/g++"。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_26

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_27

填写完成后,点击"Apply"。

3)配置 qmake

选择"Qt Versions"标签,如果有下面红框中的文本,可以跳过下面步骤

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_28

如果没有,在右侧点击"Add..."

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_29

会弹出 qmake 路径选择对话框,这里以"/home/linux/Qt5.14.1/5.14.1/gcc_64/bin/qmake"为例子。 选择”qmake”文件后,击"Open"按钮

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_30

"Version name"改为" Qt %{Qt:Version} GCC"。然后点击"Apply"按钮。

4)配置 Kits

点击左侧"Kits",右侧选择"Kits"标签。检查有没有下图红框选中的文本,如果有可以跳过下面步骤

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_31

然后没有,点击 Add:

在弹出的对话框中"Name"为"Desktop","Device Type"选择"Desktop"选项, "Sysroot"选择目标设备的系统目录,"Compiler"选择之前配置的名称

"Auto-GCC"和"Auto-G++","Qt version"选择之前配 置的名称"Qt 5.14.1

GCC",其它默认即可,最后点击"Apply"和"OK"按钮

Qt Creator 新建工程

注意:工程路径最好不要包含中文、特殊字符、空格等

我们可以新建一个“qt”文件夹,该文件夹用作我们以后存放源代码。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_32

打开 Qt Creator,在欢迎页面点击 “New”按钮,来新建一个工程。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_33

在出现的新建项目窗口中,我们选则“Application”->“Qt Widgets

Application”,然后点击右下方“Choose…”按钮,来创建一个桌面 Qt 应用。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_34

我们在这里设置项目介绍和源码位置,我们这里创建一个名为

“HelloWorld”的示例项目,设置完成之后点击 next

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_35

直接点击 next

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_36

随后进行细节设置,主要设置要创建的源码文件的基本类信息,包括类名等。这里我们可以根据自己的项目特点进行设置。需要说明的一点就是基类的选择,这里基类有 QMainWindow、QWidget、QDialog 三种,它们的不同之处如下:

⚫ QMainWindow 类提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。主窗口通常提供一个大的中央窗口部件,以及周围菜单,工具条,和一个状态栏。QMainWindow 窗口经常被继承,使得封装中央部件,菜单,工具条,状态栏等都变得很容易,当用户点击它的时候,相应的槽就会被调用;

⚫ QWidget 类是所有用户界面对象的基类,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。一个窗口部件可以被他的父窗口或者是其他窗口挡住一部分;

⚫ QDialog 类是对话框窗口的基类,对话框窗口主要用于短期任务和用户进行短期通讯的顶级窗口,QDialog 可以是模态对话框或者是非模态对话框。QDialog 支持扩展并带有返回值,他们可以带有默认值;我们在这里选择 QDialog 类即可,点击 next 完成类信息设置

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_37

直接点击 next 按钮即可。

然后进行工具选择,该页面可以选择我们创建的工程可以使用的工具,选择想要使用的编译器模块,例如下图 。点击 next

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_38

最后我们设置汇总信息,如果不需要版本控制等功能,直接点击完成finish 即可

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_39

随后我们就进入到了主界面,这时候 Qt 已经帮我们做好了一些准备工作,包括创建了一些文件,写好了一些前置代码等等。

我们可以点击左边 protect 栏,来查看我们的编译选项

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_40

我们可以在左下角选择编译 Debug 版或者 Release 版,即调试版或发行版。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_41

左下角绿色剪头是编译并运行,锤子是仅编译,我们可以直接点击绿色小箭头将我们导入的工程编译并运行起来。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_42

点击运行按钮后,我们可以看到 HelloWorld 窗口运行起来了。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_43

导入工程

我们可以将已存在的 Qt 程序项目直接打开,这里以上一章节的HelloWorld 程序为例。首先我们确定源码存在的位置,如 HelloWorld 程序源码在 /home/linux/qt/helloworld 路径下。

点击欢迎页面的“Open” 按钮可以打开已有的工程。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_44

找到我们刚才解压好的源码,选择“helloworld.pro”文件并点击打开

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_45

接下来我们就可以进入到代码编辑界面了。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_46

左上角是项目栏,点击项目名称左边的小箭头可以展开项目目录。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_47

我们可以点击左边项目栏,来查看我们的编译选项。需注意的是构建设置中的路径应与工程路径处于同级目录下。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_48

我们可以在左下角选择编译 Debug 版或者 Release 版,即调试版或发行版。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_49

左下角绿色剪头是编译并运行,锤子是仅编译,我们可以直接点击绿色小箭头将我们导入的工程编译并运行起来。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_50

点击运行按钮后,我们可以看到 HelloWorld 窗口运行起来了。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_51

文件说明

通过上面两个章节,我们学习到了 Qt 程序的新建与导入的方法,也知道了Qt 会帮我们做一些基础工作,比如帮我们建立了一些文件,那么这些文件都是干什么用的呢?我们以HelloWorld 程序来说明一下。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_52

以“.pro”为后缀名的文件,为 Qt 的项目管理文件,存储项目设置的文件;

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_53

“Qt += core gui”表示项目中加入 core gui 模块。core gui 是 Qt 用于GUI 设计的类库模块,如果创建的是控制台(console)应用程序,就不需要添加 core gui。

Qt 类库以模块的形式组织各种功能的类,根据项目涉及的功能需求,在项目中添加适当的类库模块支持。例如,如果项目中使用到了涉及数据库操作的类就需要用到 sql(数据库)模块,在 pro 文件中需要在后面加上 sql:

1 Qt += core gui sql

“greaterThan(QT_MAJOR_VERSION, 4): QT += widgets”,这是个条件执行语句,表示当 Qt 主版本大于 4 时,才加入 widgets 模块。

“TARGET = HelloWorld”表示生成的目标可执行文件的名称,即编译后生成的可执行文件是 HelloWorld.exe。

“TEMPLATE = app”表示项目使用的模板是 app,是一般的应用程序。

后面的 SOURCES、HEADERS、FORMS 记录了项目中包含的源程序文件、头文件和窗体文件(.ui 文件)的名称。这些文件列表是 Qt Creator 自动添加到项目管理文件里面的,用户不需要手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。

文件夹“Header”中,存放的是所设计的窗体类的头文件;

文件夹“Sources”中,存放着源码文件。main.cpp 是实现 main()函数的程序文件,HelloWorld.cpp 是 widget.h 里定义类的实现文件。C++中,任何窗体或界面组件都是用类封装的,一个类一般有一个头文件(.h 文件)和一个源程序文件(.cpp 文件);

文件夹“Forms”中,存放着界面设计文件,“.ui”文件是一个 XML 格式存储的窗体上的元件及其布局的文件,双击项目文件目录树中的文件 ui,会打开一个集成在 Qt Creator 中的 Qt Designer 对窗体进行可视化设计;

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_54

UI 设计器有以下一些功能区域:

组件面板:窗口左侧是界面设计组件面板,分为多个组,如 Layouts、Buttons、Display Widgets 等,界面设计的常见组件都可以在组件面板里找到。

中间主要区域是待设计的窗体。如果要将某个组件放置到窗体上时,从组件面板上拖放一个组件到窗体上即可。

Signals 和 Slots 编辑器与 Action 编辑器是位于待设计窗体下方的两个编辑器。Signals 和 Slots 编辑器用于可视化地进行信号与槽的关联,Action 编辑器用于可视化设计 Action。

布局和界面设计工具栏:窗口上方的一个工具栏,工具栏上的按钮主要实现布局和界面设计。

对象浏览器(Object Inspector):窗口右上方是 Object Inspector,用树状视图显示窗体上各组件之间的布局包含关系,视图有两列,显示每个组件的对象名称(ObjectName)和类名称。

属性编辑器(Property Editor):窗口右下方是属性编辑器,是界面设计时最常用到的编辑器。属性编辑器显示某个选中的组件或窗体的各种属性及其取值,可以在属性编辑器里修改这些属性的值。属性编辑器的内容分为两列,左侧为属性的名称,右侧为属性的值。属性又分为多个组,实际上表示了类的继承关系,位于下方的类属性组继承自位于上方的类属性组;如果我们需要新建资源文件、源码文件等,可以在项目文件夹出点击鼠标右键,选择 Add New;如果我们有新的文件需要添加,可以在项目文件夹出点击鼠标右键,选择 Add Existing Files。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_55

帮助文档

Qt 的帮助文档是伴随我们学习 Qt 开发的好伙伴。在 Qt 开发过程中,我们会面临图形接口使用的问题,它不像 C 语言那样就那么几个函数接口,图形接口的接口数量可以用海量来形容,常用的我们可能能记住,其它的就没有必要去记了,用到什么就去帮助文档查看用法是比较方便的。我们可以按 F1 按键,或通过上方导航栏的“help->contects”来进入帮助文档。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_56

上方的前进后退按钮方便我们查看文档,如返回到上一步,返回到下一步。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_57

我们可以通过帮助文档来查看以下几个部分:

类使用的相关介绍;

查看相关类的使用介绍,我们可以先进入到帮助文档,然后在左上角选择“Search”。笔者这里以 QWidget 类为例,输入我们想要查找的类的名字,然后双击查找结果来查看说明

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_58

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_59

也可以先将鼠标移动到想要查询的类的位置,如图所示,将鼠标移动至“QWidget”处,然后按“F1”键,即可跳转到相应的帮助文档

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_60

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_61

我们可以通过再按一次“F1”键来全窗口查看帮助文档,按“Esc”键可以退出。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_62

部分常用的成员元素包括以下几项:

⚫ 公有成员函数:操作部件属性的相关函数;

⚫ 公有槽函数:Qt 类中已经定义好的槽函数,直接可与信号相连接;

⚫ 信号:软中断,如按下按钮触发 pressed() 信号等;

⚫ 保护成员函数:通常事件所对应的虚函数放在此处;

⚫ 事件:常用事件,如操作鼠标触发的鼠标事件;

滚动鼠标滚轮,向下即可看到“Qwdget Class”类的相关说明了。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_63

1) 查看所用的部件的相应成员函数。

我们可以查找到该类所用部件的相应成员函数的使用方法、功能、参数、

返回值等等,我们以“按钮”控件,即“QPushButton Class”类为例,我们通

过索引搜索的方式,来找到这个类

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_64

我们可以通过点击“Public Functions” 来查看“QPushButton”这个类中的成员函数。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_65

这里以“QPushButton(const QString &text, QWidget *parent =Q_NULLPTR)”为例,我们点击函数名字可以进入到函数详情中。我们可以看到相应的描述为:以“text”为显示内容,以“parent”为父对象,构造一个push 按钮。“text”“parent”为函数参数,由于是构造函数,所以此函数没有返回值。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_66

还有一些函数是继承自其它类的,例如“Public Functions”中有 21 个继承自“QAbstractButton”类的函数,我们点击“QAbstractButton”即可查看。

点击“QAbstractButton”即可查看。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_67

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_68

同样我们可以点击相应的函数进入查看详情。如查看“void setText(const QString &text)”。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_69

2) 查看所用的部件的信号。

我们这里还是以“PushButton”为例,我们点击“Public Slots”。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_70

可以看到“PushButton”本身有一个“void showMenu()”的信号,并且有很多继承自其他类的信号。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_71

一般来说我们用的“PushButton”的信号,最多的是用到其继承自基类“

QAbstractButton”中的几个信号,分别是点击(按下后抬起)、按压(单按下)、释放(单抬起)等。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_72

我们可以点击相应信号查看详情

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_73

3) 查看所用的部件的事件(所对应的虚函数如何编写)。部件常用事件主要在 “QWidget”中声明,选择“Events”即可查看相关说明。

每个事件都对应着事件函数。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_74

点击事件函数可查看详情

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_75

微信小程序开发环境搭建

微信小程序开发工具简介

微信小程序是小程序中的一种,英文名 Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。全面开放申请后,主体类型为企业、政府、媒体、其他组织或个人的开发者,均可申请注册小程序。微信小程序、微信订阅号、微信服务号、微信企业号是并行的体系。以下是小程序所涉及的技术概括:

⚫ JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是基于 ECMAScript(w3c 制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人的阅读和编写,同时也易于机器解析和生成,并有效提升网络传输效率。

⚫ XML

XML(Extensible Markup Language),中文名为可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

⚫ CSS

层叠样式表(Cascading Style Sheets)是一种用来表现 HTML(标准通用标记语言的一个应用)或 XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS 不仅可以静态的修饰网页,还可以配合各种脚本语言动态的对网页各元素进行格式化。

⚫ JavaScript

JavaScript,是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为 JavaScript 引擎,是浏览器的一部分,广泛用于客户端的脚本语言。

申请微信小程序

登录微信公众平台,注册账号,选择小程序。https://mp.weixin.qq.com/

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_76

按照步骤依次注册,输入邮箱,密码,验证码等,同意协议进行注册。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_77

然后登录自己的邮箱,查阅邮件,点击链接进行激活。进入步骤 3,信息登记,按照网页要求,依次输入信息,身份信息,管理员微信信息,即可激活成功。

返回微信公众平台,输入刚刚注册的账户密码,会需要用管理员微信扫码登录,登录后,下载普通小程序开发者工具。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_78

点击开发,选择开发设置,获取小程序 ID,以备后续开发需求。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_79

微信小程序开发工具下载完成后,进行默认安装即可

创建新项目工程

打开微信小程序开发者工具,点击创建新工程,填写自己的 APPID,选择默认模板,语言选择 JavaScript,点击新建。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_80

新建工程完成为如下界面:

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_81

基本环境配置

打开主界面的右上角的详情按钮,找到本地设置,将“增强编译”和“不校验合法域名”这两个选项进行勾选,因为在小程序的开发阶段,尽量把这两勾选上。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_82

编译、调试

打开 app.json 文件,可以更改微信小程序的标题,改为“工程 demo”。然后按下 Ctrl + S 快捷键进行保存,即可完成编译,调试输出。查看现象。

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_83

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_84

项目总体设计介绍

总体框架

智慧家庭系统的设计基于物联网的思想,物联网是新一代信息技术的重要组成部分,其英文名称是“The Internet of things”。其基本思想是以互联网为媒介,实现远程监督、控制。它在各个领域有着非常广泛的应用。

总体框架如下:

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_85

该项目分为 WIFI 连接模块、智能门禁模块、数据采集模块、智能检测模块、设备控制模块、天气预报模块、与百度云交互模块:下面具体介绍几个模块的功能。

WIFI 连接模块

该模块实现的原理是使用 wpa_supplicant 工具对无线网络进行管理和控制的功能。wpa_supplicant 是一个开源项目,已经被移植到 Linux,Windows 以及很多嵌入式系统上。它是 WPA 的应用层认证客户端,负责完成认证相关的登录、加密等工作。

wpa_supplicant 工具包含 wpa_supplicant 和 wpa_cli 这 2 个程序,其中wpa_supplicant 程序作为服务端在后台运行,服务 wpa_cli 客户端的请求,从而实现 WiFi 的配置连接。下面是通过 shell 命令去进行 WIFI 的配置及连接。

1.打开 wlan0 接口:

root@fsmp1c:~# ifconfig wlan0 up

2.启动 wpa_supplicant 进程并在后台运行

root@fsmp1c:~# wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf-B

3.扫描周边 WiFi 热点:

wpa_cli -i wlan0 scan

4.查看扫描结果:

root@fsmp1c:~# wpa_cli -i wlan0 scan_results

5.添加一个网络连接

root@fsmp1c:~# wpa_cli -i wlan0 add_network

6.配置 WiFi 热点的名称 ssid:

root@fsmp1c:~# wpa_cli -i wlan0 set_network 1 ssid '"FARSIGHT"'

7.配置 WiFi 热点的密码 psk:

root@fsmp1c:~# wpa_cli -i wlan0 set_network 1 psk '"fs123456"'

8.列举所有保存的连接

root@fsmp1c:~# wpa_cli -i wlan0 list_network

9.连接第 1 个保存的连接

root@fsmp1c:~# wpa_cli -i wlan0 select_network 1

10.启动 wpa_supplicant 应用

root@fsmp1c:~#wpa_supplicant -B -c wifi.conf -i wlan0

11.使用 udhcpc 命令动态获取 IP

root@fsmp1c:~#udhcpc -i wlan0

智能门禁模块

该模块是根据关电开关智能识别有没有人来,当有人触发光电开关,会自动弹出登陆界面,输入用户名和密码,程序会自动匹配数据库,如果用户名密码错误超过三次,会自动报警;如果输入正确,则开门。

数据采集模块

另开一个线程,实时去读取温湿度驱动设备文件的数据,进行计算得出温湿度的数值同样的方式得到光照的数值,通过信号传参的方式传给主线程,将数据设置到 ui 界面上。

智能检测模块

开启智能检测后,程序会根据你设定的阈值进行检测,假如温度超过你设定的温度阈值,会自动开启风扇;或者当光照低于你设定的阈值,会开灯提高照明的亮度。

设备控制模块

通过 ui 界面的按键去开关灯或者风扇,以及蜂鸣器。

天气预报模块

连接 WIFI 之后,通过 get 方法从网上获取信息,得到 Json 类型的数据,对这个数据进行解析,将解析到的数据设置到 ui 界面上面。

百度云交互模块

在 ui 界面输入在百度云创建设备时的 IoTCoreld、DeviceKey、DeviceSecret(三元组)通过组合生成 addr 和用户名,使用 MD5 加密算法计算得到密码,用于连接,连接成功后开启定时器,自动向指定好的 topic 发布采集到的温度湿度和光照,并且订阅云端控制设备的 topic,用户向云端发布json 数据,开发板接收到云端转发的 json 数据会做出响应。如{“led1”,1},开发板收到数据后 led1 会亮

源码分析

WIFI 连接模块

在 Qt 程序里使用 system 函数来执行 5.2 的命令来实现 WIFI 的配置

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_86

建立刷新按钮信号槽连接,实现点击刷新按钮界面显示附近 wifi。实现原理是启动 wpa_supplicant 进程并在后台运行,扫描周边 WiFi 热点;

使用wpa_cli -i wlan0 scan_results 命令查看扫描结果,并将扫描结果重定向到wifilist 文件中,对 wifilist 文件进行读操作,将读到的数据直接显示到 ui界面上面。核心代码如下

……

system("wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -

B");

system("wpa_cli -i wlan0 scan");

system("wpa_cli -i wlan0 scan_results > ./wifilist");

usleep(50000);

QString fileName = "./wifilist";

QFile file(fileName);

int f = 0;

j = 0;

if(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

QMessageBox::warning(this,"Warnning","can't

open",QMessageBox::Yes);

}

QTextStream in(&file);

QString str;

while (!((str = in.readLine()).isEmpty ()))

……

选中刷新后显示的 wifi 名后,点击连接会进入二级界面。二级界面输入密码正确后点击连接,等待几 s 后即可完成连接。这里输入框使用自定义类MylineEdit,继承自 QlineEdit,增加了鼠标点击事件,当触摸屏点击输入框的时候,会弹出软键盘,用来输入密码

STM32MP157开发板Linux+Qt项目实战:智慧家庭_开发板_87

这里连接 wifi 的核心代码如下:

……

sprintf(set_ssid,"wpa_cli -i wlan0 set_network %d ssid

'\"%s\"'",i,wifiName.toLatin1().data());

sprintf(set_password, "wpa_cli -i wlan0 set_network %d psk '\"%s\"' >

TorF.ini",i,password_edit->text().toLatin1().data());

sprintf(select_wlan, "wpa_cli -i wlan0 select_network %d ",i);

system(set_ssid);

system(set_password);

system("wpa_cli -i wlan0 list_network");

system(select_wlan);

system("wpa_supplicant -B -c wifi.conf -i wlan0");

qDebug()<< get_TorF().data()->toUpper();

if(get_TorF().data()->toUpper()=="F")

{

QMessageBox::warning(this,tr("Connect information"), tr("密码

错误"));

return ;

}

system("udhcpc -i wlan0 -B");

char echo_1[64];

char echo_2[64];

sprintf(echo_1,"echo \"nameserver 114.114.114.114\" >

/etc/resolv.conf");

system(echo_1);

sprintf(echo_2,"echo \"nameserver 8.8.8.8\" > /etc/resolv.conf");

system(echo_2);

close();

QMessageBox::information(this,tr("Connect information"), tr("连接成

功"));

}

……

智能门禁模块

STM32MP157开发板Linux+Qt项目实战:智慧家庭_微信小程序_88

PanGu 开发板有多个 GPIO 组,查看 GPIO 组信息,可以使用 gpiodetect 命令。

# gpiodetect

gpiochip0 [GPIOA] (16 lines)

gpiochip1 [GPIOB] (16 lines)

gpiochip10 [GPIOK] (16 lines)

gpiochip11 [GPIOZ] (16 lines)

gpiochip2 [GPIOC] (16 lines)

gpiochip3 [GPIOD] (16 lines)

gpiochip4 [GPIOE] (16 lines)

gpiochip5 [GPIOF] (16 lines)

gpiochip6 [GPIOG] (16 lines)

gpiochip7 [GPIOH] (16 lines)

gpiochip8 [GPIOI] (16 lines)

gpiochip9 [GPIOJ] (16 lines)

通过查扩展板的原理图可以看到 :光电开关的 GPIO 管脚是 PE15

读取 PE15 的状态

# gpioget gpiochip4 15

当有东西遮挡光电开关时,执行以上命令得到的是 0;没有东西遮挡。得

到的是 1.

所以我们开一个线程让它一直去读取光 PE15 的状态,当读到为 0 时,说明

有人,发送信号给主线程,使主线程开启登陆界面。

void ReadPE15Thread::run()

{

system("touch pe15.txt");

system("gpioget gpiochip4 15 > pe15.txt");

int fd;

char buf[32];

while (1) {

fd = open("./pe15.txt",O_RDONLY);

system("gpioget gpiochip4 15 > pe15.txt");

read(fd,buf,sizeof(buf));

if(strcmp(buf,"1\n")==0)

{

qDebug()<<tr("login !!");

emit pesig();

}

sleep(1);

close(fd);

}

}

建立信号槽连接

void MainWindow::loginSlot()

{

disconnect(&pe15thread,SIGNAL(pesig()),this,SLOT(loginSlot()));

login->show();

connect(login,SIGNAL(loginsuccess()),this,SLOT(loginsuccessSlot()));

connect(login,SIGNAL(loginfailed()),this,SLOT(loginfailedSlot()));

connect(login,SIGNAL(loginclose()),this,SLOT(logincloseSlot()));

}

登陆界面的编写

编译 UI 界面。

创建 usr.db 数据库文件

# sqlit3 usr.db

创建表

sqlite> CREATE TABLE usr(

usrname TEXT PRIMARY KEY ,

password NOT NULL

);

向数据库中添加用户名和密码

sqlite> INSERT INTO usr values(“usr”,“123”);

login.cpp

打开数据库 验证密码

bool Login::openDb()

{

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName("usr.db");

if(!db.open())

{

QMessageBox::warning(0, tr("Warning"), db.lastError().text());

return false;

}

QSqlQuery query(db);

if(!query.exec("select usrname,password from usr"))

{

db.close();

return false;

}

while(query.next())

{

QString UserName = query.value(0).toString();

QString Password = query.value(1).toString();

// qDebug()<< UserName;

// qDebug()<< Password;

if(UserName == usr_edit->text() &&Password ==password_edit->text())

return true;

}

db.close();

return false;

}

登陆成功发送成功信号,登陆失败发送失败信号

void MainWindow::loginSlot()

{

disconnect(&pe15thread,SIGNAL(pesig()),this,SLOT(loginSlot()));

login->show();

connect(login,SIGNAL(loginsuccess()),this,SLOT(loginsuccessSlot()));

connect(login,SIGNAL(loginfailed()),this,SLOT(loginfailedSlot()));

connect(login,SIGNAL(loginclose()),this,SLOT(logincloseSlot()));

}

void MainWindow::loginsuccessSlot()

{

QMessageBox::information(this, tr("information"),"密码正确,门锁已打开");

// 重置错误次数

Numberoferrors =3;

login->close();

beepunring();

connect(&pe15thread,SIGNAL(pesig()),this,SLOT(loginSlot()));

}

void MainWindow::loginfailedSlot()

{

QString info;

Numberoferrors--;

switch(Numberoferrors)

{

case 2:

info ="密码错误,还有 3 次机会";

break;

case 1:

info ="密码错误,还有 2 次机会";

break;

case 0:

info ="密码错误,还有 1 次机会";

break;

default:

info ="即将报警";

break;

}

QMessageBox::warning(this, tr("warning"),info);

if(Numberoferrors <0)

{

qDebug() << Numberoferrors;

beepring();

}

}

验证密码错误三次后蜂鸣器报警

数据采集和智能检测模块

系统启动后可以查看目录/sys/bus/iio/devices/

root@fsmp1c:~# ls /sys/bus/iio/devices/ iio:device0

如果系统中有多个 iio 设备,这里可能会有很多个 iio 目录,确定哪个

目录是我们的设备对应目录,可以通过查看

/sys/bus/iio/devices/iio\:device0/name 信息确认:

root@fsmp1c:~# cat /sys/bus/iio/devices/iio\:device0/name

0-0040

由显示信息每个驱动对应设备可能有所不同,当前显示内容为设备的物理

地址,与设备树中地址一致,可以确认 iio:device0 是当前设备对应目录查看

当目录下内容:

root@fsmp1c:~# ls -l /sys/bus/iio/devices/iio\:device0/

total 0

-r--r--r-- 1 root root 4096 Feb 7 15:51 dev

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_offset

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_raw

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_humidityrelative_scale

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_offset

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_raw

-rw-r--r-- 1 root root 4096 Feb 7 15:51 in_temp_scale

-r--r--r-- 1 root root 4096 Feb 7 15:51 name

drwxr-xr-x 2 root root 0 Feb 7 15:51 power

lrwxrwxrwx 1 root root 0 Feb 7 15:50 subsystem -> ../../../../../../../bus/iio

-rw-r--r-- 1 root root 4096 Feb 7 15:50 uevent

文件说明:

文件 in_ temp_scale 为温度标尺,计算公式如下,公式来自与驱动对应代码:

STM32MP157开发板Linux+Qt项目实战:智慧家庭_Qt_89

标签:Qt,STM32MP157,system,开发板,点击,QString,root,append
From: https://blog.51cto.com/u_15343919/6042564

相关文章

  • 整合MQTT
    1、步骤(1)dependencecom.google.code.gsongsonorg.springframework.integrationspring-integration-streamorg.springframework.integrationspring-integration......
  • Qt::WA_TransparentForMouseEvents
    (一)Qt::WA_TransparentForMouseEvents实现鼠标穿透功能,类似“隔空取物、隔山打牛”的效果。//qwidget.hvoidsetAttribute(Qt::WidgetAttribute,boolon=true);启......
  • QT中的类
    1.QChar表示一个字符的类,包含于QtCore判断:boolisDigit()const;//判断是否是十进制数字('0'-'9')boolisLetter()const;//判断是否是字母boolisNumber()const;//判......
  • PyQt 打开子窗口
    实现功能在MainWindow点击按钮“OpenNewWindow”打开SubWindow在SubWindow点击按钮“ClosetheWindow”关闭SubWindow有QtDesigner设计两个窗口,转化为main_ui.py......
  • 【嵌入式】微芯旺KungFu32A156MQT使用TM1638和TIMER实现流水灯和时钟
    TM1638代码如下#ifndefTM1638_H_#defineTM1638_H_#include"system_init.h"#include"MYGPIO.h"#defineDIO_GPIO_SFRGPIOA_SFR#defineDIO_GPIO_PIN_MAS......
  • Yocto系统使用Gstarwmra迅为i.MX8M开发板VP8解码
    我们解码并播放VP8视频文件,输入以下命令gst-launch-1.0filesrclocation=/gstreamer/video/1080p_30fps_vp8.webmtypefind=true!\video/x-matroska!aiurdemux!que......
  • Qt 项目架构之四:实战项目
    下面实现一个最基本的架构项目。一、程序的代码目录管理代码目录,就是你存放源码的目录,一般程序都划分为各种模块来实现,所以为每个模块单独创建一个目录来存放,是比较推荐......
  • Qt 项目架构之一:全局类说明
    这里讲解一些全局类,一般都放在Util这个文件夹内。Util是工具的意思,一般来说,常常用来描述和业务逻辑没有关系的数据处理。一、全局配置文件全局配置文件管理类AppConf......
  • Qt 项目架构之二:架构设计
    除了极小的微型demo级别项目外,其余项目建议用pri分门别类不同文件夹存放代码文件,方便统一管理和查找。同类型功能的类建议统一放在一起,如果该目录下代码文件数量过多,也......
  • MQTT协议详解
    MQTT协议详解 MQTT是基于Publish/Subscribe(发布订阅)模式的物联网通信协议特点:简单易实现支持Qos(服务质量)报文小MQTT协议构建于TCP/IP协议之上发布订阅模式:......