• 方案介绍
  • 相关推荐
申请入驻 产业图谱

介绍如何0基础做出单片机项目实物

07/25 11:53
1108
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

这篇文章主要介绍零基础 如何做出项目实物。

二、提供给你的资料包都包含什么内容?

2.1 项目目录

下面是部分项目列表:
在这里插入图片描述

2.2 资料包内容展示:案例1

智能婴儿床项目为例,这是资料目录:

image-20241107112038234

这是文档的内容:
在这里插入图片描述
在这里插入图片描述

2.3 资料包内容展示:案例2

老人摔倒检测报警系统为例,这是资料目录:

image-20241107113632084

这是文档的内容:
在这里插入图片描述

在这里插入图片描述

2.4 其他案例

内容布局内容都是差不多的。
在这里插入图片描述

在这里插入图片描述

三、自己如何复刻项目?

3.1 复刻概念

复刻的意思: 就是根据提供的资料,做出文档和视频里一样的单片机项目实物

很多同学担心 自己没有编程基础、担心自己做不出来实物。

有这个疑虑,主要是很多同学不理解我说的复刻是什么意思。

简单来说: 项目资料包里是提供了完整的项目源码、原理图、设计文档、有APP的也都提供的完整的APP源码,也有编译好的安装包。

大家复刻项目所做的事情就是3个步骤: 买模块、接线、下载代码。 就可以完成了。

接线的意思: 就是把传感器与单片机的IO口连接一下,接个线就行了。整个项目接好线,也就是1个小时不到的事情。不需要什么技术含量,有手就行。

3.2 如何买材料模块

自己复刻实物肯定是要买硬件模块。 很多同学担心买错型号不知道怎么买

这些完全不用担心: 设计文档里的第二章已经将需要购买的硬件模块描述了,提供了购买的淘宝链接。

具体看下图的描述:

image-20241107131532919

image-20241107131617546

image-20241107131729013

大家只需要点击链接,访问过去,直接购买就行了。 不用担心买错型号。

3.3 如何连线?

很多同学担心自己没有接触过硬件,不会接线。

目前分享的项目都支持杜邦线连接、通过杜邦线将模块的引脚与单片机的IO口连接起来就可以了,这个是没有什么技术上的难度。

整个项目接好线,也就是1个小时不到的事情。不需要什么技术含量,有手就行。

**在文档里都会描述如何接线。 ** 只要根据目录,找到STM32设计章节,硬件连线说明都在第一节描述了。

image-20241107132134400

除了有文字版本的描述,还有原理图

在资料包的目录会有一个原理图文件夹。

image-20241107132255689

里面就有原理图的文件。

image-20241107132444846

也有PDF文件可以直接打开:

image-20241107132503659

下面举个例子:如何接一个温湿度传感器模块

image-20241107134605256

image-20241107134622197

3.4 如何安装keil?

很多同学电脑上没有安装过keil软件,也不会打开工程,编译代码。

这个keil的安装包已经提供了。

在网盘里:https://pan.quark.cn/s/145a9b3f7f53

image-20241107133637084

在线看视频 https://www.bilibili.com/video/BV1UY2zY2Ews 【keil5软件安装过程(演示STM32新建工程测试)】

3.5 如何下载程序?

如果不会下载程序,这个也是有视频手把手教导, 并且在视频的项目里也是有演示,在文档里也有文字+截图的描述。

这是视频 https://www.bilibili.com/video/BV1Cw4m1e7Yc【讲解STM32如何通过串口下载程序】

设计文档里的位置:

image-20241107134021422

四、项目的价值

首先第一点:大家不要理解只是下载了一个代码,这个叫项目开发方案。这个是一套完整的开发方案。从硬件、服务器、手机APP、电脑APP,完整的一整套方案。很多人是不理解什么叫项目开放方案。
只是认为: 你这个硬件都没有,还需要自己做,资料也要几百块啊??? 这也太贵了吧?
温度、湿度、烟雾、火焰、各种气体传感器这些只是几块钱一个,一个C8T6单片机核心板是8块钱。
重点就是项目的方案设计。如何让这些硬件模块产生价值。

通过完整开发方案不仅仅是可以做出项目,还可以完整学一遍开发过程。
至于说,自己做,这个觉得很难? 各种源码都是完整提供了。 你只是接个线, 这些模块又不需要焊接,就是把传感器与单片机的IO口连接一下,接个线就行了。整个项目接好线,也就是1个小时不到的事情。不需要什么技术含量,有手就行。

分享的这些项目都提供了完善的文档,代码里的注释也是非常的齐全。

大家如果想深入学习项目,只需要将文档研读一遍,配合代码的注释,基本就可以把一个项目学会。

项目学会了,这个技术就是你自己的。学会这个技术产生的价值是无穷尽的。

提供的STM32源码,工程都很整洁,代码的注释都很详细。

image-20241107135340228

五、复刻过程中遇到问题怎么办?

这里专门写了一篇博客: https://blog.csdn.net/xiaolong1126626497/article/details/134781708

对复刻的过程,以及复刻过程中可能会遇到的问题进行了解答。

还可以直接添加我的联系方式进行技术支持 保证项目是可以完成设计。

六、为什么会有复刻的概念?

首先说明: 项目是支持按需求设计的同时也支持自己复刻

·为什么有复刻这个概念?
为什么没事做了这么多实物? 其实,这些不是没事做出来的, 这些都是 之前的其他同学定做的历史项目案例。

第一次了解,可以先里找下分享的项目列表有没有合适的项目进行自己复刻,如果没有再进行定做。

如果你没有在分享的项目列表里找到合适的项目,你就可以选择定做,定做以后,一年以后,才会将当前项目上传到CSDN博客、公众号和B站,这就是大家看到的我分享的项目,这也就是我分享项目的来源。

为啥我要分享项目出去,同时开源项目对应的完整资料下载?
因为 这就是实力的象征,不担心大家把技术学去了。

七、项目源码如何获取

可以在微信公众号《DS小龙哥嵌入式技术资讯》里获取:

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU5Mjg3NTMxOQ==&action=getalbum&album_id=3230261637572755458#wechat_redirect

image-20241107143427404

八、介绍一个STM32代码的开发过程案例

7.1 硬件连线说明

【1】 4G模块接线
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(5.0V)

【2】 0.96寸SPI接口的OLED显示屏:
VCC----------3.3V
GND----------GND
D0-SCL-------PC8
D1-SDA-------PC9
RES-RST------PC10
DC-----------PB7
CS-----------PB8
 

【3】MQ2烟雾报警检测
DO---PC0
AO---PA1
GND---GND 地
VCC---VCC 电源(5.0V)


【4】 温湿度传感器: SHT30
VCC--3.3V
GND---GND
SDA---PB12
SCL---PB13

【6】火焰检测模块
VCC----5V
GND----GND
DO-----PC2

【7】蜂鸣器模块
VCC----5V
GND----GND
IO-----PC3


【8】板载LED灯接线(这个不用接,这是开发板本身的)
LED1---PA8
LED2---PD2


【9】板载按键接线(这个不用接,这是开发板本身的)
K0---PA0 
K1---PC5 
K2---PA15

7.2 硬件原理图

image-20241108162131446

7.3 硬件组装过程

照着设计文档,买回来硬件模块。 然后照着前面章节的硬件连线说明,将模块与STM32开发板之间连接好线。

板子上的固定胶水使用的是:热熔胶。

image-20241108162025332

image-20241108162010549

7.4 KEIL工程

image-20241108162520785

7.5 代码移植需要改的地方

如果大家想要替换成自己的云服务器,STM32代码里需要将main.c代码里前面的宏定义信息替换。

注意: 如果改了这里,上位机的代码也需要改,改了之后重新生成APP。

image-20241108162222133

7.6 程序下载

打STM32的keil工程,编译代码、然后,使用USB线将开发板的左边的USB口(串口1)与电脑的USB连接,打开程序下载软件下载程序。

具体下载过程看下面图:

image-20240319223247836

打开程序下载软件:[软件就在资料包里的软件工具目录下]

image-20240120160735942

7.7 程序正常运行效果

设备运行过程中会通过串口打印调试信息,我们可以通过串口打印了解程序是否正常。

程序下载之后,可以打开串口调试助手查看程序运行的状态信息。[软件就在资料包里的软件工具目录下]

image-20240327212042050

7.8 取模软件的使用

显示屏上会显示中文,字母,数字等数据,可以使用下面的取模软件进行取模设置。

[软件就在资料包里的软件工具目录下]

image-20241024142522970

打开软件之后:

image-20241030151756012

代码里的位置:

image-20241108162344562

7.9 STM32与手机APP的交互协议

STM32硬件端与手机APP通过4G模块进行通信。每间隔一端时间,STM32就会上传当前传感器的数据到服务器。

传感器上传组合的协议如下:

//--------------------组合数据上传MQTT云端服务器----------------------------            
//组合JSON报文数据
sprintf(data_buff,"{22services22: [{22service_id22: 22stm3222,22properties22:{22DHT11_T22:%.1f,22DHT11_H22:%.1f,22flame22:%d,22MQ222:%d}}]}"
        ,Temperature1,humidity1,Flame_flag,mq2_data);

//上报主题
run_state=Air724UG_MQTT_PublishTopic(POST_TOPIC,data_buff);
if(run_state==0)
{
    printf("4G模块上云数据发送成功..rn");
}

7.10 初始化代码分析

这是项目上电执行的初始化代码:

//释放PA15  ,按键要使用
JTAG_Set(JTAG_SWD_DISABLE);


//板载LED初始化
LED_Init();

//板载按键初始化  
KEY_Init();

//串口1初始化,用于打印
USART1_Init(115200);  


//环境温湿度  SHT3x
Init_SHT30_1();


//硬件初始化
hardware_init();

//ADC采集
AdcInit();

//串口2初始化: 
USART2_Init(115200);//
TIMER2_Init(72,20000); //超时时间20ms

//计时器 1秒中断一次。 运行预警算法
TIMER4_Init(7200,15000); //1000000us   1000000us


//OLED初始化
OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示;

//OLED清屏黑色
OLED_Clear(0);

这段代码展示了系统初始化部分的代码,主要完成了硬件的基础配置和必要外设的初始化,具体功能如下:

(1)释放PA15引脚供按键使用

JTAG_Set(JTAG_SWD_DISABLE);
  • 禁用JTAG的SWD模式,以释放PA15引脚供按键或其他用途使用。

(2)LED和按键初始化

LED_Init();
KEY_Init();
  • 初始化板载LED和按键,用于后续控制和状态指示。LED_Init()KEY_Init()通常会配置LED和按键的GPIO端口和方向(输入/输出)。

(3)串口1初始化

USART1_Init(115200);
  • 初始化串口1,波特率设为115200。通常用于调试打印信息,便于监控系统运行状态和调试输出。

(4)温湿度传感器初始化

Init_SHT30_1();
  • 初始化SHT30传感器,用于读取环境温湿度。Init_SHT30_1()函数一般会配置I?C通信(SHT30通常使用I?C协议)以便采集温湿度数据。

(5)硬件初始化

hardware_init();
  • hardware_init()通常会包含项目中所有硬件的初始化配置,例如引脚的模式设置、复用功能的开启等。这个函数可以整合多个硬件初始化操作。

(6)ADC初始化

AdcInit();

(7)串口2初始化和定时器2设置

USART2_Init(115200); //用于4G模块通信
TIMER2_Init(72,20000); //超时时间20ms
  • 初始化串口2,波特率设为115200。串口2用于4G模块模块4G模块的通信。
  • 初始化定时器2,用于4G模块超时检测,周期为20ms(假设TIMER2_Init函数计算为定时周期,主频72MHz)。

(8)定时器4初始化(1秒中断)

TIMER4_Init(7200,15000);
  • 定时器4初始化,设置1秒产生一次中断,用于运行火灾预警算法。TIMER4_Init(7200,15000)配置定时周期1秒,可以用于周期性数据采集和状态判断。

(9)OLED屏幕初始化

OLED_Init(0xc8,0xa1);
OLED_Clear(0);
  • OLED显示屏初始化,设置屏幕显示方向和初始显示状态。
  • OLED_Clear(0);将屏幕清空为黑色,确保在显示新内容之前屏幕内容已清除。

这段代码完成了系统硬件的初始化,包括环境传感器、LED、按键、串口、定时器、ADC模块和OLED显示屏等,使系统进入监控和数据采集的准备状态。

7.11 4G模块连接服务器的代码

下面是4G模块连接服务器的代码:

//------------------------Air724UG 4G模块  硬件初始化检测--------------------

//OLED清屏黑色
OLED_Clear(0);

OLED_ShowString(0,16*0,16,"                ");
OLED_ShowString(0,16*0,16,"Init Air724UG...");
OLED_RefreshGRAM(); //将显存里的数据刷新到OLED显示屏

//重试的次数
connect_cnt=0;

AA:
//检测Air724UG 4G模块硬件是否正常
run_state=Air724UG_Check();
if(run_state)
{
    OLED_ShowString(0,16*1,16,"                ");
    OLED_ShowString(0,16*1,16,"Air724UG ERROR..");

    sprintf(data_buff,"cnt:%d",connect_cnt++);
    OLED_ShowString(0,16*2,16,"                ");
    OLED_ShowString(0,16*2,16,data_buff);

    OLED_RefreshGRAM(); //将显存里的数据刷新到OLED显示屏
    goto AA;
}
else
{
    OLED_ShowString(0,16*1,16,"                ");
    OLED_ShowString(0,16*1,16,"Air724UG Init OK");
    OLED_RefreshGRAM(); //将显存里的数据刷新到OLED显示屏
}

A2:    
//对Air724UG 4G 模块进行初始化配置
run_state=Air724UG_Init();
if(run_state)
{
    goto A2;
}

//对Air724UG 4G 模块进行 4G网络通讯服务初始化
run_state=Air724UG_GPRS_Init();
if(run_state)
{
    goto A2;
}

A3:     
//MQTT协议初始化
run_state=Air724UG_MQTT_Init(CONNECT_SERVER_IP,MQTT_ClientID,MQTT_UserName,MQTT_PassWord);
if(run_state)
{
    goto A3;
}


//订阅主题
run_state=Air724UG_MQTT_SubscribeTopic(SET_TOPIC);
if(run_state)
{
    goto A3;
}

OLED_Clear(0x00); 	 //清屏	
OLED_RefreshGRAM();  //刷新数据到OLED屏幕

这段代码用于初始化和配置Air724UG 4G模块,并通过OLED显示屏实时反馈初始化过程的状态。它包括对模块的硬件检测、网络通信服务初始化、MQTT协议配置以及主题订阅的步骤。具体作用和含义如下:

代码详细介绍:

1. OLED显示初始化信息
// 清空OLED显示屏并输出初始化信息
OLED_Clear(0); // 将OLED屏幕清空为黑色背景
OLED_ShowString(0,16*0,16,"                "); // 在第1行显示空白字符串
OLED_ShowString(0,16*0,16,"Init Air724UG..."); // 在第1行显示初始化信息
OLED_RefreshGRAM(); // 刷新OLED显示内容,将显存中的数据更新到屏幕

作用:清屏并显示“Init Air724UG…”信息,提示用户正在初始化Air724UG模块。

2. 重试计数器初始化
connect_cnt = 0;

作用:初始化重试计数器,用于记录检测模块是否正常运行时的重试次数。

3. 检测Air724UG硬件是否正常
AA:
run_state = Air724UG_Check(); // 检测模块是否正常工作
if(run_state) {
    OLED_ShowString(0,16*1,16,"                "); // 清空第2行
    OLED_ShowString(0,16*1,16,"Air724UG ERROR.."); // 显示错误提示信息
    
    sprintf(data_buff,"cnt:%d",connect_cnt++); // 格式化输出重试计数器
    OLED_ShowString(0,16*2,16,"                "); // 清空第3行
    OLED_ShowString(0,16*2,16,data_buff); // 显示重试次数
    
    OLED_RefreshGRAM(); // 刷新显示内容
    goto AA; // 如果模块未能正常工作,继续重试
} else {
    OLED_ShowString(0,16*1,16,"                "); // 清空第2行
    OLED_ShowString(0,16*1,16,"Air724UG Init OK"); // 显示成功提示信息
    OLED_RefreshGRAM(); // 刷新显示内容
}

作用:通过调用Air724UG_Check()函数检测模块硬件是否正常。如果检测失败,则显示“Air724UG ERROR…”,并显示当前重试次数,重新进入检测流程。直到检测通过为止,显示“Air724UG Init OK”表示成功。

4. Air724UG模块配置初始化
A2:
run_state = Air724UG_Init(); // 初始化模块配置
if(run_state) {
    goto A2; // 如果初始化失败,则重试
}

作用:初始化Air724UG模块配置。如果初始化失败,则进入重试循环。

5. 4G网络通信服务初始化
run_state = Air724UG_GPRS_Init(); // 初始化4G网络服务
if(run_state) {
    goto A2; // 如果网络初始化失败,则重试模块配置初始化
}

作用:对4G网络通信服务进行初始化。如果失败,则重新进入模块配置初始化流程。

6. MQTT协议初始化和连接
A3:
run_state = Air724UG_MQTT_Init(CONNECT_SERVER_IP, MQTT_ClientID, MQTT_UserName, MQTT_PassWord);
if(run_state) {
    goto A3; // 如果MQTT协议初始化失败,则重试
}

作用:初始化MQTT协议,连接到服务器。如果失败,重新尝试连接。

7. 订阅主题
run_state = Air724UG_MQTT_SubscribeTopic(SET_TOPIC); // 订阅MQTT主题
if(run_state) {
    goto A3; // 如果订阅失败,则重试
}

作用:订阅MQTT主题。如果订阅失败,则重新初始化MQTT连接。

8. 清屏操作
OLED_Clear(0x00); // 清空OLED显示
OLED_RefreshGRAM(); // 刷新显示数据

作用:在初始化和配置完成后,清空OLED显示屏。

总结

  • 该代码主要用于Air724UG模块的初始化和配置,并且通过OLED实时显示状态信息。
  • 包括对模块硬件的检测、网络初始化、MQTT协议配置及订阅主题。
  • 如果任何步骤失败,都会进入相应的重试循环,确保模块的初始化过程能够正常完成。

7.12 项目主逻辑代码

下面是项目的核心逻辑代码:

//轮询时间到达
if(time_cnt>200)
{
    time_cnt=0;

    LED1=!LED1;

    //-----------------------------采集MQ2烟雾浓度值-------------------------------
    mq2_data=GetAdcCH1Average(1);
    printf("MQ2烟雾-ADC值:%drn",mq2_data);
    // mq2_data = 4095 - mq2_data;
    mq2_data = (float)mq2_data / (float)4095 * 100.0;
    if(mq2_data>=100)mq2_data=100;
    printf("MQ2浓度:%d%%rn",mq2_data);


    //--------------------采集温湿度数据----------------------------
    //读取温湿度
    SHT30_1_ReadData(&humidity1,&Temperature1);
    printf("SHT30(1)前: %fC,%f%%rn",Temperature1,humidity1);

    printf("环境温度:%.1f℃rn环境湿度:%.1f%%rn",Temperature1,humidity1);    


    //--------------------数据显示----------------------------                
    //显示页面1
    if(page_cnt==0)
    {
        page1();
    }
    //显示页面2
    else if(page_cnt==1)
    {
        page2();
    }

    //--------------------自动控制----------------------------
    //如果开启了安防模式
    if(run_mode)
    {

        //烟雾检测(只要检测到烟雾,就持续10秒报警)
        //MQ2烟雾传感器有效电平为低电平,输出低电平表示检测到烟雾(可根据自己实际测试情况改)
        if(MQ2==0)
        {
            MQ2_cnt=10; //10秒的时间
        }
        //如果烟雾报警
        if(MQ2_cnt>0)
        {
            MQ2_flag=1;
        }
        else
        {
            MQ2_flag=0;
        }

        //火焰检测(只要检测到火焰,就持续10秒报警)
        //火焰传感器有效电平为低电平,输出低电平表示检测到火焰(可根据自己实际测试情况改)
        if(Flame==0)
        {
            Flame_cnt=10; //10秒的时间
        }
        //如果火焰报警
        if(Flame_cnt>0)
        {
            Flame_flag=1;
        }
        else
        {
            Flame_flag=0;
        }

        //检测是否需要报警
        if(Flame_flag||MQ2_flag)
        {
            BEEP=1;
            LED2=0;
        }
        else
        {
            BEEP=0;
            LED2=1;
        }

    }
    else  //如果关闭了安防模式
    {
        Flame_flag=0;
        MQ2_flag=0;
        BEEP=0;
    }



    //--------------------组合数据上传MQTT云端服务器----------------------------

    //--------------------组合数据上传MQTT云端服务器----------------------------            
    //组合JSON报文数据
    sprintf(data_buff,"{22services22: [{22service_id22: 22stm3222,22properties22:{22DHT11_T22:%.1f,22DHT11_H22:%.1f,22flame22:%d,22MQ222:%d}}]}"
            ,Temperature1,humidity1,Flame_flag,mq2_data);

    //上报主题
    run_state=Air724UG_MQTT_PublishTopic(POST_TOPIC,data_buff);
    if(run_state==0)
    {
        printf("4G模块上云数据发送成功..rn");
    }
}

这段代码实现了火灾感知系统的主逻辑,包括传感器数据采集、报警状态控制、显示界面切换和MQTT数据上传等功能。具体功能分析如下:

1. 轮询时间控制

if(time_cnt>200)
{
    time_cnt=0;
    LED1=!LED1;
  • 该部分是一个时间计数器,当 time_cnt 超过200时,执行一次主逻辑(定时轮询)。每次轮询会闪烁 LED1,表示系统在正常工作。

2. 采集烟雾传感器 (MQ2) 数据

mq2_data=GetAdcCH1Average(1);
printf("MQ2烟雾-ADC值:%drn",mq2_data);
mq2_data = (float)mq2_data / (float)4095 * 100.0;
if(mq2_data>=100)mq2_data=100;
printf("MQ2浓度:%d%%rn",mq2_data);
  • 使用 GetAdcCH1Average 采集MQ2烟雾传感器的ADC值。
  • 将原始ADC值转化为百分比浓度(0-100%),方便后续判断烟雾浓度水平。
  • 如果浓度超过100%,则强制设为100%,并打印当前烟雾浓度。

3. 采集温湿度传感器 (SHT30) 数据

SHT30_1_ReadData(&humidity1,&Temperature1);
printf("SHT30(1)前: %fC,%f%%rn",Temperature1,humidity1);
printf("环境温度:%.1f℃rn环境湿度:%.1f%%rn",Temperature1,humidity1);
  • 通过 SHT30_1_ReadData 读取环境温湿度数据。
  • 打印温湿度值,便于实时监控温湿度情况。

4. 显示页面切换

if(page_cnt==0)
{
    page1();
}
else if(page_cnt==1)
{
    page2();
}
  • 该部分根据 page_cnt 的值在不同显示页面之间切换,提供多页面显示支持。

5. 自动报警控制逻辑

if(run_mode)
{
    if(MQ2==0)
    {
        MQ2_cnt=10;
    }
    if(MQ2_cnt>0)
    {
        MQ2_flag=1;
    }
    else
    {
        MQ2_flag=0;
    }

    if(Flame==0)
    {
        Flame_cnt=10;
    }
    if(Flame_cnt>0)
    {
        Flame_flag=1;
    }
    else
    {
        Flame_flag=0;
    }
    
    if(Flame_flag||MQ2_flag)
    {
        BEEP=1;
        LED2=0;
    }
    else
    {
        BEEP=0;
        LED2=1;
    }
}
else
{
    Flame_flag=0;
    MQ2_flag=0;
    BEEP=0;
}
  • 仅在 run_mode 开启时执行安防检测逻辑,关闭时清除所有报警状态。
  • 烟雾检测:检测到烟雾时将 MQ2_cnt 置为10秒,并设置 MQ2_flag=1 表示烟雾报警状态。
  • 火焰检测:检测到火焰时将 Flame_cnt 置为10秒,并设置 Flame_flag=1 表示火焰报警状态。
  • 报警执行:如果 MQ2_flagFlame_flag 为1,蜂鸣器(BEEP)和 LED2 指示灯将激活报警状态,否则保持静音和熄灭。

6. 数据上传至MQTT云服务器

//--------------------组合数据上传MQTT云端服务器----------------------------            
//组合JSON报文数据
sprintf(data_buff,"{22services22: [{22service_id22: 22stm3222,22properties22:{22DHT11_T22:%.1f,22DHT11_H22:%.1f,22flame22:%d,22MQ222:%d}}]}"
        ,Temperature1,humidity1,Flame_flag,mq2_data);

//上报主题
run_state=Air724UG_MQTT_PublishTopic(POST_TOPIC,data_buff);
if(run_state==0)
{
    printf("4G模块上云数据发送成功..rn");
}
  • 网络连接正常的情况下,系统将传感器数据组合成JSON格式的报文。
  • 使用 MQTT_PublishData 将数据上传到MQTT服务器,便于远程监控

该代码的主逻辑负责通过定时轮询来执行传感器数据采集、显示界面切换、自动报警和云端数据上传,确保系统实时监控环境中的火灾或烟雾变化,并提供本地和远程的报警与监控服务。

九、介绍一个上位机APP的开发案例

9.1 Qt是什么?

Qt 是一个功能强大、跨平台的应用程序开发框架,主要用于创建图形用户界面(GUI)应用程序,但它不仅仅局限于GUI编程。它由挪威的奇趣科技(TrollTech)最初于1991年开发,并在后续的发展历程中经历了多次所有权变更,包括诺基亚和Digia等公司接手,现在Qt属于The Qt Company所有。

Qt 主要特点和优势包括:

(1)跨平台:Qt 支持多种操作系统,开发者可以使用同一份源代码在不同平台上编译运行,如Windows、Linux、macOS、Android以及各种嵌入式系统(如RTOS),实现“一次编写,到处编译”。

(2)C++ 开发:Qt 的核心是基于C++编程语言构建,提供了一套丰富的类库,通过面向对象的设计方式简化了开发过程。

(3)图形用户界面:Qt 提供了完整的GUI组件集,包含窗口、按钮、标签、文本框等各种标准控件,以及布局管理器、样式表等功能,使得开发者能够高效地创建美观且功能完善的桌面应用或移动应用界面。

(4)工具链完整:Qt 包含一系列集成开发环境(IDE)和辅助工具,例如Qt Creator是一个全能的跨平台IDE,Qt Designer用于可视化拖拽设计UI界面,Qt Linguist支持国际化资源文件的翻译,还有Qt Assistant和大量文档资源方便开发者的使用。

(5)非GUI功能丰富:除了GUI功能外,Qt 还提供了众多非图形化功能模块,如网络通信、数据库访问、XML处理、多媒体处理(音频视频)、文件I/O、线程与并发处理、OpenGL和3D图形渲染等。

(6)元对象系统:Qt 使用元对象系统(Meta-Object System, MOC)实现了信号与槽机制(Signals and Slots),这是一种高级事件处理机制,允许在不同对象之间安全地进行异步通信

(7)可扩展性与灵活性:Qt 架构高度灵活,支持插件体系结构,开发者可以根据需要自定义组件并轻松地集成到Qt应用中。

Qt 以其强大的跨平台能力和全面的功能集合成为许多企业和个人开发者选择用来开发高性能、高稳定性的应用程序的重要工具之一,被广泛应用于各类桌面软件、嵌入式设备、移动应用以及服务器端组件等领域。

9.2 Qt版本介绍

在Qt发行版本中将要涉及两个版本:Qt商业授权和Qt开源授权。

(1)Qt商业授权是设计商业软件的开发环境,这些商业软件使用了传统的商业来发布,它包含了一些更新的功能、技术上的支持和大量的解决方案,开发了使用于行业的一些特定的组件,有一些特殊的功能只在商业用户中使用。

(2)Qt开源授权是用来开发开源的软件,它提供了一些免费的支持,并遵循QPL协议。

开放源代码是免费的软件,不牵涉用户的某些权益。任何人都有使用开源软件和参与它的修改的机会,这就意味着其他的人同样可获得你开发的代码。目前 Qt 的开源授权有两种,一种是 GPL 授权,另一种是 LGPL 授权。

9.3 Qt开发环境安装

Qt的中文官网: https://www.qt.io/zh-cn/image-20221207160550486

image-20221207160606892

QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6

打开下载链接后选择下面的版本进行下载:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

软件安装时断网安装,否则会提示输入账户。

安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。

image-20221203151742653

选择MinGW 32-bit 编译器:

image-20221203151750344

9.4 开发第一个QT程序

在QT开发过程中,可以手动编写代码也可以使用UI设计师直接拖拽控件的方式编写界面和布局,在实际的开发过程中一般是两种方式结合使用,提高开发效率。

本小节用一个简单的 “Hello QT” 程序介绍一下使用QtCreator新建工程的步骤

(1)打开QtCreator软件,选择New Project,新建一个工程。

image-20240304134953164

(2)项目模板选择QT Widgets Application

image-20240304135416497

(3)设置项目名称和存放路径

注意:QT项目路径和名称不能出现中文字符。

image-20240304135504345

(4)编译工具套件选择

编译工具套件可以后面自己增加,比如增加Android的。套件是指 Qt 程序从编译链接到运行环境的全部工具和 Qt 类库的集合。

image-20240304135535341

(5)设置生成的类信息

在类信息设置界面选择基类,目前有三种基类:QMainWindow,QWidget,QDialog。在基类里选择QMainWindow,类名和文件名会根据基类自动修改,一般不需要修改,默认即可。

image-20240304135630942

(6)项目管理

在项目管理界面可以设置作为子项目,以及加入版本控制系统。这两个功能暂时用不到,都用默认的 ,然后点击 “完成”。

image-20240304135652922

(7)创建完成

image-20240304135728165

(8) 编辑代码

展开main.cpp文件,添加内容如下:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QLabel>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    QLabel *label =new QLabel("Hello Qt!");
    label->setGeometry(400,100,100,20);
    label->show();
    return a.exec();
}

代码解析:

1)	#include <QApplication>和 #include <QLabel>是QT的类声明头文件,对于每个QT类都有一个与该类同名的头文件,在这个头文件包含了对该类的定义。
2)	main(int argc, char *argv[]) :main函数的标准写法。
3)	QApplication a(argc, argv):创建一个QApplication对象,用于管理应用程序的资源,QApplication类的构造函数需要两个参数。
4)	QLabel *label =new QLabel("Hello Qt!") :创建QLabel窗口部件,QLabel是一个Qt提供的窗口部件,可以用来显示一行文本。
5)	label->setGeometry(400,100,100,20) : 设置控件显示的位置。
6)	label->show():使Qlabel创建的窗口可见,就是显示设置的文本。
7)	return a.exec():应用程序将控制权传递给QT,让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。

image-20240304135908750

(9)行程序

运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。

image-20240304135938848

9.5 调试输出

QT中使用QDebug类输出调试信息。主要用于调试代码,类似于std::cout的替代品,支持QT的数据类型。使用前需要包含头文件。

调试输出的分类

qDebug 调试信息提示
qWarning 一般的警告提示
qCritical 严重错误提示
qFatal 致命错误提示

示例代码:

qDebug("调试信息输出");
qWarning("一般警告信息输出");
qCritical("严重错误输出");
qFatal("致命错误输出");

qDebug输出的信息会打印到QT软件下边的输出面板。

在上节的HelloQt工程上加上调试输出代码,增加的main.cpp代码如下:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //MainWindow w;
    //w.show();
    qDebug()<<"QT调试信息输出";
    int data_int=8888;
    qDebug()<<data_int;
    float data_float=123.888;
    qDebug()<<data_float;
    return a.exec();
}

运行程序,观察输出的调试信息:

image-20240304140142790

9.6 QT Creator常用的快捷键

掌握一些适用的快捷键,可以提高程序开发的效率。

(1)F1 键,快速切换光标选中的函数或者类的帮助信息,按一次半屏显示,按下两次全屏显示。

(2)F2 键,快速切换到光标选中的函数或者类的源码定义处。

(3)F4键,快速在源文件和头文件之间切换。

(4)Ctrl(按住)+ Tab,快速切换已打开的文件

(5)Ctrl+ I ,缩进光标选中行代码(自动与上层代码对齐)。

(6)Ctrl + / ,快速注释或者取消注释光标选中行。

(7)快速修改全局变量名

鼠标光标选中变量名,按下Ctrl+Shift+R,当变量名称出现红色框表示已经激活全局修改功能。修改一处,整个工程对应变量名称全部会修改。修改完毕之后,光标移开,再按下Ctrl+Shift+R保存修改。

image-20240304140242113

(8)快速修改全局函数名

快捷方式与变量修改一样按下Ctrl+Shift+R,一处修改整个工程对应的函数名称也会跟着改。选中函数后,按下Ctrl+Shift+R后整个工程的对应的函数名会高亮,并且在软件下方弹出修改框。

image-20240304140311742

9.7 QT帮助文档

Qt 帮助文档太多,难以全部翻译成中文,即使翻译了一部分,翻译花的时间太多,翻译更新的时效性也难以保证,最终还是得看英文帮助,QtCreator 集成了帮助系统,查找非常方便。

打开QtCreator,选择菜单栏的最左边的帮助选项,界面如下:

image-20240304140337833

(1)查看Qlabel控件的帮助信息:

image-20240304140357011

9.8 UI设计师使用

上节的Hello QT程序使用纯C++代码编写,这一节使用QT界面设计模式实现与上一节Hello QT程序一样的功能。仿照着上节新创建一个工程。双击打开mainwindow.ui文件,进入到UI设计界面。

(1)拖一个Label控件到编辑区,双击Label控件可以修改文本内容。

image-20240304140517858

(2)运行程序可以点击左下角的三角形符号或者按下快捷键Ctrl+R。

image-20240304140600717

(3)UI设计师界面功能介绍

image-20240304140615717

9.9 按钮控件组

QT Creator UI设计师界面的按钮组截图如下:

image-20240304140809093

以下是对按钮组控件的一些功能介绍:

(1)Push Button按压按钮:最普通的按钮,按(点击)按钮命令计算机执行一些动作,或者回答问题,比如windows开始菜单里的重启,注销,关机等按钮。

(2)Tool Button工具按钮:工具按钮通常是一个集合,一般集成在工具栏里。比如打开,保存,复制,粘贴,剪切等常用的操作。

(3)Radio Button单选按钮:单选按钮通常是两个以上的形式出现在一块,按钮之间有互斥关系,每次只能选中一个。比如:一个人的性别只能选择一个,不能同时是男性又是女性。

(4)Check Box复选框:复选框与单选按钮概念相反,复选框通常表示多个可以同时存在的选项,比如一个人可以同时拥有多个爱好,比如读书、看电影、爬山、游泳等。

(5)Command Link Button命令链接按钮:一般用来打开的窗口或者网页链接。

(6)Dialog Button Box标准按钮盒:标准按钮盒通常用于对话框程序;比如:常见的确认对话框有 “确定”“取消”等标准按钮,Qt 将这些典型的按钮做成标准按钮盒,并将相应的信号加以封装,方便程序员使用。

9.10 布局控件组

开发一个图形界面应用程序,界面的布局影响到界面的美观。前面的程序中都是使用UI界面拖控件,如果有多个按钮,会出现大小难调整、位置难对齐等问题。Qt 提供的“布局管理“就很好的解决了控件摆放的问题。

以下是UI设计师界面的布局相关控件组:

image-20240304140914361

功能介绍:

(1)Vertical Layout:垂直布局

(2)Horizontal Layout:水平布局

(3)Grid Layout:网格布局

(4)Form Layout:窗体中布局

(5)Horizontal Spacers:水平空格,在布局中用来占位。

(6)Vertical Spacer:垂直空格,在布局中用来占位。

image-20240304140956243

9.11 基本布局控件

在UI设计界面添加一个布局控件,然后将需要布局的其他控件放入布局控件中即可完成布局,布局控件可以互相嵌套使用。(本节只介绍基本布局控件的使用)

以下是4种布局控件的效果:

image-20240304141035428

9.12 UI设计师的布局功能

在UI设计界面的左上角有一排快捷的布局选项,使用时选中两个以上的控件,点击其中一种布局方式就可以切换布局。

以下为布局的简单示例图:

image-20240304141115657

(1)为布局的选项。

(2)控件层次图,可以看到控件的布局摆放层次。

如果想要控制某个控件的固定大小,不随着布局改变大小,可以限定最大最小尺寸。选中控件鼠标右键–>大小限定->设置大小。

image-20240304141311256

水平布局与垂直布局:

image-20240304141335977

image-20240304141347209

水平布局将控件按照水平方式摆放,垂直布局将控件按照垂直方式摆放。鼠标拖动红色布局框上的黑色方点,可以调整布局框的大小。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。

分裂器水平布局与垂直布局:

image-20240304141412287

image-20240304141426088

分裂器方式布局,包含控件的高度和宽度都会随着布局框的拉伸而改变。选中其中一个控件然后鼠标右键>点击大小限定,可以限定控件的最大和最小尺寸。

窗体中布局与栅格布局:

image-20240304141449390

栅格(网格)布局器的基本单元是单元格,而窗体中布局(表单)的基本单元是行。随着布局框的尺寸变化,包含的控件高度不会变化,宽度会随着布局框变化。

设置主窗体布局方式:

设置主窗体的布局方式后,包含在主窗体内的控件会随着窗体的拉伸自动调整大小。

image-20240304141518067

image-20240304141529003

相关推荐