QT学习开发笔记(项目实战之智能家居物联网项目1 )

news2025/1/23 4:40:37

智能家居物联网项目

本章介绍使用 Qt 开发智能家居中的一个物联应用。简单直白的说就是通过云服务器远程控
制设备(与设备通信等)。本章可以直接做毕设,是毕设物联网项目的一大福音!本章将实现远
程点亮开发板 LED 作为一个项目实例。

在生活中,我们可能使用过 WIFI 智能插座这款产品。智能家居中常用来控制电器开关。
比如远程开热水器,远程打开空调,窗帘等等。这些 WIFI 智能插座的原理就是将 WIFI 插座注
册到云服务器上,然后通过手机的 APP 来访问云服务器,然后控制 WIFI 插座。嗯,原理我们
懂了。本章就是模仿?不,或者说是直接开发这样的一个项目。包括 WIFI 连网,注册到云服
务器上,编写 Qt UI 通过网络来与云服务器通信,然后再下发指令到这个连网的设备,与之通
信。恩本章的流程就是这些,带着这个项目流程,然后一步步看笔者是如何通过 Qt 实现的吧!

本章需要读者对正点原子的 wifi 模块 ATK-ESP8266 串口转 WIFI 有一定的了解。正点原子
提供了 STM32 与 ESP8266 模块通信的例程,如果学习过 STM32 与 ESP8266 模块通信的例程
的内容,理解起来则会更容易。建议参考文档:ATK-ESP8266 WIFI 用户手册_V1.x.pdf 及原子
云平台 API 文档 V1.2.pdf。

项目硬件

必备硬件

本章需要正点原子 ATK-ESP8266 串口转 WIFI 模块(免费接入原子云)。另外还需要加上
一个 USB-TTL 模块,外加一根 T 口 USB 连接线,可接入 PC(电脑)调试。
在这里插入图片描述

T 口连接线连接 USB-TTL 模块再连接 ATK-ESP8266 模块到 PC(电脑),用于在 PC(电脑)
上直接使用串口调试/测试此模块。
在这里插入图片描述

这里可能会有部分读者会问是否可以用其他 WIFI 模块,比如正点原子 Linux USB WIFI 模
块,或者直接使用开发板联网接入到云设备呢?答案是不可以的!只有一些特定的设备,需要
刷能接入云的固件才能接入服务器。
又有读者问是否可以直接购买一些 WIFI 插座来使用呢?答案是不可以的!因为这些 WIFI

插座也是一样,也是刷了固件,而且这些设备是连接到阿里云的。需要与特定的手机 APP 结合
使用才能注册到阿里云服务器。也就是不能拿来二次开发了!

恰好我们正点原子有物联网模块 ESP8266 与 4G DTU 模块。本章主要讲解如何通过正点原
子的串口转 WIFI ESP8266 模块来开发一个物联网的项目应用!

 可选配件

本项目可以在正点原子 I.MX6U ALPHA | mini 开发板直接使用,下图为正点原子 ALPHA

开发板在底板上预留的 ATK MODULE 接口(串口接口)上的接法图。

在这里插入图片描述

特别提醒:如果反复实验不正确时,因为 ATK-MODULE 这个接口,KEY 和 LED 脚如果有其
他程序在使用,那么很可能会影响 ESP8266 模块的功能。刚好那两个脚接到了 ESP8266 的烧录
固件IO-0脚与复位RST脚上,所以我们可以用杜邦线将模块重新连接到这个座子上,只接VCC、

GND、TX 和 RX 脚即可!

测试 WIFI 模块

要实现物联网功能,需要使用正点原子的 ATK-ESP8266 WIFI 模块。首先我们先测试正点
原子的 ATK-ESP8266 WIFI 模块是否正常使用,及能否正常连接原子云服务器。ATK-ESP8266
WIFI 用户手册_V1.3.pdf 手册第 2.2.3 小节硬件连接,将 ATK-ESP8266 WIFI 模块连接到 PC(电
脑),再查阅 ATK-ESP8266 WIFI 用户手册_V1.3.pdf 手册的第 2.2.9.1 小节,注册原子云帐号后,
添加设备,然后按 2.2.9.1 小节测试连接本地 WIFI(自己的路由器发出的 WIFI,注意不要使用
中文名或者有空格的 WIFI,确保路由器的 WIFI 能上网!)。请自行完成并成功连接到原子云。

WIFI 模块连接原子云

请先测试个人的 ATK-ESP8266 模块是否正常使用,及正常连接云。原子云的设备需要先分
好组,各个设备命名如下。注意需要和笔者命名的名字一样,也就是至少有一个分组及一个名
字为“客厅灯”的设备,并记住编号及密码(密码由云生成,默认“12345678”)。
在这里插入图片描述
源码路径 4/01_smarthome/esp8266/esp8266.cpp,内容如下。默认使用的 WIFI 模块串口通
信波特率为 115200。在 Ubuntu 上设试 WIFI 模块时,一般串口名称为“ttyUSB0”,默认是没有
权限访问这个/dev/ttyUSB0 设备的。所以我们需要使用下面的指令修改权限。(注意:本例适用
于 I.MX6U Linux 开发板与 Ubuntu,Windows 不作测试!)。
sudo chmod 777 /dev/ttyUSB0

修改完成后查看源码内容如下。先看源码,不要急着运行!

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName esp8266 
 * @brief esp8266.cpp 
 * @author Deng Zhimao 
 * @email 1252699831@qq.com 
 * @net www.openedv.com 
 * @date 2021-05-27 
 *******************************************************************/ 

1 #include "esp8266.h" 

2 #include <unistd.h> 

3 #include <QDebug> 

4 

5 Esp82266::Esp82266(QWidget *parent) 

6 { 

7 Q_UNUSED(parent) 

8 /* 串口对象,用于与 Esp8266 模块通信 */ 

9 serialPort = new QSerialPort(this); 

10 

11 /* 定时器对象,用于定时发送设备在线的心跳包 */ 

12 timer = new QTimer(); 

13 
14 /* led 对象,用于串口接收到云发过来的数据,然后控制板子的 LED */ 

15 led = new Led(this); 

16 

17 /* 设置串口名 */ 

18 #if __arm__ 

19 serialPort->setPortName("ttymxc2"); 

20 #else 

21 serialPort->setPortName("ttyUSB0"); 

22 #endif 

23 

24 /* 设置波特率 */ 

25 serialPort->setBaudRate(115200); 

26 

27 /* 设置数据位数 */ 

28 serialPort->setDataBits(QSerialPort::Data8); 

29 

30 /* 设置奇偶校验 */ 

31 serialPort->setParity(QSerialPort::NoParity); 

32 

33 /* 设置停止位 */ 

34 serialPort->setStopBits(QSerialPort::OneStop); 

35 

36 /* 设置流控制 */ 

37 serialPort->setFlowControl(QSerialPort::NoFlowControl); 

38 

39 if (!serialPort->open(QIODevice::ReadWrite)) 

40 qDebug()<<"串口无法打开!可能正在被使用!"<<endl; 

41 else { 

42 qDebug()<<"串口打开成功!"<<endl; 

43 } 

44 

45 /* 开始连接云 */ 

46 connectToClound(); 

47 

48 connect(serialPort, SIGNAL(readyRead()), 

49 this, SLOT(serialPortReadyRead())); 

50 

51 connect(timer, SIGNAL(timeout()), 

52 this, SLOT(onTimerTimeOut())); 

53 } 

54 

55 void Esp82266::serialPortReadyRead() 

56 {

57 /* 接收缓冲区中读取数据 */ 

58 QByteArray buf = serialPort->readAll(); 

59 

60 QString temp = QString(buf); 

61 readData.append(temp); 

62 qDebug()<<temp<<endl; 

63 

64 if (readData.contains("ready")) { 

65 /* 如果复位成功 */ 

66 sendCmdToEsp8266("AT+CWMODE=1"); 

67 readData.clear(); 

68 } 

69 

70 if (readData.contains("OK") && readData.contains("AT+CWMODE")) { 

71 qDebug()<<"设置 STA 模式成功"<<endl; 

72 sendCmdToEsp8266("AT+CWJAP=\"ALIENTEK-YF\",\"15902020353\""); 

73 qDebug()<<"开始连接 WIFI"<<endl; 

74 readData.clear(); 

75 } 

76 

77 if (temp.contains("WIFI GOT IP")) { 

78 qDebug()<<"连接 WIFI 成功"<<endl; 

79 sleep(2); 

80 /* 原子云的设备号及密码 */ 

81 
sendCmdToEsp8266("AT+ATKCLDSTA=\"02314701717851074890\",\"12345678\""); 

82 qDebug()<<"开始连接原子云请等待"<<endl; 

83 } 

84 

85 if (temp.contains("CLOUD CONNECTED")) { 

86 qDebug()<<"连接原子云成功"<<endl; 

87 sleep(2); 

88 /* 15s 就发送一次心跳包 */ 

89 timer->start(15000); 

90 } 

91 

92 if (temp == "开") 

93 led->setLedState(true); 

94 else if (temp == "关") 

95 led->setLedState(false); 

96 

97 } 

98 

99 Esp82266::~Esp82266() 

100 { 

101 serialPort->close(); 

102 delete timer; 

103 timer = nullptr; 

104 } 

105 

106 void Esp82266::sendCmdToEsp8266(QString cmd) 

107 { 

108 cmd = cmd + "\r\n"; 

109 

110 QByteArray data = cmd.toUtf8(); 

111 serialPort->write(data); 

112 } 

113 

114 void Esp82266::connectToClound() 

115 { 

116 /* 重启模块,注意若已经连接上原子云, 
117 * 需要重新上电或者短接 RST 脚来复位模块 */ 

118 sendCmdToEsp8266("AT+RST"); 

119 } 

120 

121 void Esp82266::sleep(int second) 

122 { 

123 usleep(second * 1000000); 

124 } 

125 

126 void Esp82266::sendTextMessage(QString message) 

127 { 

128 serialPort->write(message.toLatin1()); 

129 } 

130 

131 void Esp82266::onTimerTimeOut() 

132 { 

133 sendTextMessage("online"); 

134 qDebug()<<"发送设备在线心跳包"<<endl; 

135 } 

查看源码,我们可以知道以下重要内容。
第 72 行,“ALIENTEK-YF”是笔者处的路由器发出的 WIFI 热点名称,密码是“15902020353”。

请修改为自己的 WIFI 名称及连接密码!没有路由器,用手机开热点也可以。

第 81 行,是原子云上的“客厅灯”设备的编号“02314701717851074890”,及密码“12345678”,
请填写自己的设备编号,及密码,注意这个设备需要命名为“客厅灯”,后面程序需要使用到它!
按照上面的程序就容易地可以连接上原子云了。也无需熟读 ATK-ESP8266 WIFI 用户手册

_V1.3.pdf 手册。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor和RequestMappingHandlerMapping推荐使用第二个方案简单 明了 方便 快捷方案一第一步定义TurboFilter第二步配置logback方案二 直接配置logback的配置XML推荐使用第二个方案简单 明…

Insomnia 简单使用方法

文章目录1. 新建工程2. 新建若干文件夹3. 设置环境变量4. 授权以及进行请求的链式调用 (chaining requests)4. 1 解决办法 14. 2 解决办法 2Insomnia 同 Postman&#xff0c; 用于测试后端 endpoint&#xff0c;很容易使用。使用步骤如下&#xff1a;1. 新建工程 2. 新建若干文…

字节跳动软件测试面试过了,起薪20k

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…

四十五、docker之nginx手动部署前端项目

nginx的作用&#xff1a; 一、静态文件服务器和反向代理django服务 django框架中的静态文件服务只在开发调试时提供服务&#xff0c;当以生产模式运行时需要将静态文件部署到静态文件服务器上。 1. 收集django项目中的静态文件 在配置文件中配置STATIC_ROOT 我们在我的项目…

如何在低代码平台上构建ERP软件?

ERP软件是企业管理日常运营需求的关键组件。然而&#xff0c;对于许多企业&#xff0c;尤其是资源有限的企业来说&#xff0c;尝试构建和管理ERP平台可能要担负较高的成本的。幸运的是&#xff0c;低代码平台可以使这个过程变得容易得多。今天我们来解释如何在低代码平台上构建…

细粒度软件缺陷预测模型构建方法

在软件缺陷预测领域&#xff0c;粒度指的是缺陷库中每条样本的项目粒度.其中可以分为类粒度、文件粒度或者包粒度等。不同的开发语言有不同的层级的模块粒度&#xff0c;在软件缺陷预测领域&#xff0c;一般来说&#xff0c;在预测效果能够满足要求的情况下&#xff0c;粒度越小…

map容器(重要)

1、map容器简介 Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair&#xff0c;pair的简介 同时拥有实值和键值&#xff0c;而前面的 set 只是拥有 键值&#xff0c;pair 中的 第一个元素是键值&#xff0c;而第二个值是 实值。Map 中是不允许有两…

Maven的进阶操作

系列文章目录 Maven进阶操作的学习 文章目录系列文章目录前言一、分模块开发与设计二、依赖管理1.依赖传递2.可选依赖3.排除依赖三、继承与聚合1.聚合2.继承四、属性1.属性2.版本管理五、多环境配置与应用1.多环境开发2.跳过测试六、私服1.私服简介2.私服仓库分类3.资源上传与…

IDEA的基本使用

IDEA的基本使用IDEA的基本使用1 IDEA概述2 IDEA的下载和安装2.1 下载2.2 安装3 IDEA中层级结构介绍3.1 结构分类3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09;3…

C#基础学习--委托

委托 什么是委托 可以认为委托是持有一个或多个方法的对象。 委托和类一样&#xff0c;是一种用户自定义的类型。但类表示的是数据和方法的集合&#xff0c;而委托则持有一个或多个方法&#xff0c;以及一系列预定操作。 可以通过一下擦欧总来使用委托&#xff1a; 可以把d…

度量,我们如何以终为始,以始为终?

你好&#xff0c;我是黄俊彬。 很多时候在研发过程中&#xff0c;我们都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题&#xff0c;但是却不知如何去找出根因&#xff0c;真正…

14、MyBatis-Plus入门到进阶

1、Mybatis的问题 【简介】&#xff1a; 每个实体类对应一个实体类,对应一个mapper接口,对应一个mapper.xml文件,每个mapper接口都有重复的crud方法,每一个mapper.xml都有重复的crud的sql配置。 2、Mybatis-plus简介 1、官网 Mybatis-plusMybatis-plus 2、MyBatis是什么&a…

JS常用字符串方法

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录移除字符串首尾空白符trim()trimStart()trimEnd()获取字符串指定位置的值ch…

记2023第十四届蓝桥杯感受

弱校ACM队员&#xff0c;曾获CB国二&#xff0c;CG国优第六。&#xff08;我是fw&#xff09; ------------------------------------------------------------------------分割线 2023.04.09 今年再次参加CG组&#xff0c;估计g了&#xff0c;盲猜一波省二前排&#xff0c;出…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测&#xff08;固定事务数量&#xff09;TPC-C压测&#xff08;固定时长&#xff09;生成测试…

C++轻量级Web服务器TinyWebServer源码分析之http篇

文章目录http篇简介一、服务器接收http请求和http报文解析解析报文整体流程从状态机逻辑主状态机逻辑二、服务器响应请求报文http篇简介 http类这篇个人觉得是最难同时也是最繁琐的一篇&#xff0c;本篇在基础知识方面&#xff0c;包括epoll、HTTP报文格式、状态码和有限状态机…

Python 小型项目大全 71~75

七十一、声音模拟 原文&#xff1a;http://inventwithpython.com/bigbookpython/project71.html 类似于西蒙电子玩具&#xff0c;这款识记游戏使用第三方playsound模块&#xff0c;播放四种不同的声音&#xff0c;分别对应键盘上的A、S、D、F键。当你成功地重复游戏给你的图案时…

驱动保护 -- 通过PID保护指定进程

一、设计界面 1、添加一个编辑框输入要保护的进程PID&#xff0c;并添加两个按钮&#xff0c;一个保护进程&#xff0c;一个解除保护 2、右击编辑框&#xff0c;添加变量 二、驱动层代码实现 1、声明一个受保护的进程PID数组 static UINT32 受保护的进程PID[256] { 0 }; 2…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已&#xff0c;所携带的cookie往往都不止一个&#xff0c;而是一堆&#xff0c;甚至特别特别长&#xff0c;postman文档提供的cookie操作是全局的&#xff0c;但需要一个一个打&#xff08;折磨&#xff09;&#xff0c;唯一的优点就是作用域…

tocbot生成文章目录

学习链接 github上的tocbot npmjs上的tocbot 效果图 使用步骤 1. 安装tocbot npm install tocbot --save2. vue组件中使用引入tocbot 只需要引入tocbot&#xff0c;然后调用tocbot.init(…)&#xff0c;指定提取的文章内容所在的dom&#xff0c;以及要把生成的目录放到哪个…