STM32智能家居控制系统教程

目录

  1. 引言
  2. 环境准备
  3. 智能家居控制系统基础
  4. 代码实现:实现智能家居控制系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化
  5. 应用场景:家居监测与优化
  6. 问题解决方案与优化
  7. 收尾与总结

1. 引言

智能家居控制系统通过STM32嵌入式系统结合各种传感器、执行器、通信模块和控制设备,实现对家居环境的实时监控、自动控制和数据传输。本文将详细介绍如何在STM32系统中实现一个智能家居控制系统,包括环境准备、系统架构、代码实现、应用场景及问题解决方案和优化方法。

2. 环境准备

硬件准备

  1. 开发板:STM32F4系列或STM32H7系列开发板
  2. 调试器:ST-LINK V2或板载调试器
  3. 传感器:如温湿度传感器、光照传感器、烟雾传感器等
  4. 执行器:如继电器模块、灯光控制模块、电动窗帘等
  5. 通信模块:如Wi-Fi模块、蓝牙模块
  6. 显示屏:如OLED显示屏
  7. 按键或旋钮:用于用户输入和设置
  8. 电源:电源适配器

软件准备

  1. 集成开发环境(IDE):STM32CubeIDE或Keil MDK
  2. 调试工具:STM32 ST-LINK Utility或GDB
  3. 库和中间件:STM32 HAL库和FreeRTOS

安装步骤

  1. 下载并安装STM32CubeMX
  2. 下载并安装STM32CubeIDE
  3. 配置STM32CubeMX项目并生成STM32CubeIDE项目
  4. 安装必要的库和驱动程序

3. 智能家居控制系统基础

控制系统架构

智能家居控制系统由以下部分组成:

  1. 数据采集模块:用于采集家居环境数据,如温湿度、光照、烟雾等
  2. 数据处理与分析模块:对采集的数据进行处理和分析
  3. 通信与网络系统:实现家居数据与服务器或其他设备的通信
  4. 显示系统:用于显示家居环境数据和系统状态
  5. 用户输入系统:通过按键或旋钮进行设置和调整
  6. 控制系统:根据数据分析结果控制家居设备

功能描述

通过各种传感器采集家居环境数据,并实时显示在OLED显示屏上。系统通过数据处理和通信模块,实现对家居环境的实时监控和自动控制。用户可以通过按键或旋钮进行设置,并通过显示屏查看当前状态。

4. 代码实现:实现智能家居控制系统

4.1 数据采集模块

配置温湿度传感器

使用STM32CubeMX配置I2C接口:

  1. 打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的I2C引脚,设置为I2C模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"
#include "i2c.h"
#include "dht22.h"I2C_HandleTypeDef hi2c1;void I2C1_Init(void) {hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;HAL_I2C_Init(&hi2c1);
}void Read_Temperature_Humidity(float* temperature, float* humidity) {DHT22_ReadAll(temperature, humidity);
}int main(void) {HAL_Init();SystemClock_Config();I2C1_Init();DHT22_Init();float temperature, humidity;while (1) {Read_Temperature_Humidity(&temperature, &humidity);HAL_Delay(1000);}
}
配置光照传感器

使用STM32CubeMX配置ADC接口:

  1. 打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的ADC引脚,设置为输入模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"ADC_HandleTypeDef hadc1;void ADC_Init(void) {__HAL_RCC_ADC1_CLK_ENABLE();ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;hadc1.Init.Resolution = ADC_RESOLUTION_12B;hadc1.Init.ScanConvMode = DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;hadc1.Init.DMAContinuousRequests = DISABLE;hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;HAL_ADC_Init(&hadc1);sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}uint32_t Read_Light_Intensity(void) {HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);return HAL_ADC_GetValue(&hadc1);
}int main(void) {HAL_Init();SystemClock_Config();ADC_Init();uint32_t light_intensity;while (1) {light_intensity = Read_Light_Intensity();HAL_Delay(1000);}
}
配置烟雾传感器

使用STM32CubeMX配置ADC接口:

  1. 打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的ADC引脚,设置为输入模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"ADC_HandleTypeDef hadc2;void ADC2_Init(void) {__HAL_RCC_ADC2_CLK_ENABLE();ADC_ChannelConfTypeDef sConfig = {0};hadc2.Instance = ADC2;hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;hadc2.Init.Resolution = ADC_RESOLUTION_12B;hadc2.Init.ScanConvMode = DISABLE;hadc2.Init.ContinuousConvMode = ENABLE;hadc2.Init.DiscontinuousConvMode = DISABLE;hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc2.Init.NbrOfConversion = 1;hadc2.Init.DMAContinuousRequests = DISABLE;hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;HAL_ADC_Init(&hadc2);sConfig.Channel = ADC_CHANNEL_1;sConfig.Rank = 1;sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;HAL_ADC_ConfigChannel(&hadc2, &sConfig);
}uint32_t Read_Smoke_Level(void) {HAL_ADC_Start(&hadc2);HAL_ADC_PollForConversion(&hadc2, HAL_MAX_DELAY);return HAL_ADC_GetValue(&hadc2);
}int main(void) {HAL_Init();SystemClock_Config();ADC2_Init();uint32_t smoke_level;while (1) {smoke_level = Read_Smoke_Level();HAL_Delay(1000);}
}

4.2 数据处理与分析模块

数据处理模块将传感器数据转换为可用于控制系统的数据,并进行必要的计算和分析。

家居环境控制算法

实现一个简单的环境控制算法,根据传感器数据生成控制信号:

void Process_Home_Data(float temperature, float humidity, uint32_t light_intensity, uint32_t smoke_level) {// 控制空调if (temperature > 28.0) {// 温度过高,开启空调HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);} else {// 温度正常,关闭空调HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);}// 控制加湿器if (humidity < 30.0) {// 湿度过低,开启加湿器HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);} else {// 湿度正常,关闭加湿器HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);}// 控制灯光if (light_intensity < 200) {// 光照强度过低,开启灯光HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);} else {// 光照强度正常,关闭灯光HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);}// 控制烟雾报警器if (smoke_level > 300) {// 烟雾浓度过高,启动烟雾报警器HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);} else {// 烟雾浓度正常,关闭烟雾报警器HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);}
}void GPIOB_Init(void) {__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}int main(void) {HAL_Init();SystemClock_Config();GPIOB_Init();I2C1_Init();ADC_Init();ADC2_Init();DHT22_Init();float temperature, humidity;uint32_t light_intensity, smoke_level;while (1) {Read_Temperature_Humidity(&temperature, &humidity);light_intensity = Read_Light_Intensity();smoke_level = Read_Smoke_Level();Process_Home_Data(temperature, humidity, light_intensity, smoke_level);HAL_Delay(1000);}
}

4.3 通信与网络系统实现

配置Wi-Fi模块

使用STM32CubeMX配置UART接口:

  1. 打打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的UART引脚,设置为UART模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

#include "stm32f4xx_hal.h"
#include "usart.h"
#include "wifi_module.h"UART_HandleTypeDef huart2;void UART2_Init(void) {huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart2);
}void Send_Home_Data_To_Server(float temperature, float humidity, uint32_t light_intensity, uint32_t smoke_level) {char buffer[128];sprintf(buffer, "Temp: %.2f, Humidity: %.2f, Light: %lu, Smoke: %lu",temperature, humidity, light_intensity, smoke_level);HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}int main(void) {HAL_Init();SystemClock_Config();UART2_Init();GPIOB_Init();I2C1_Init();ADC_Init();ADC2_Init();DHT22_Init();float temperature, humidity;uint32_t light_intensity, smoke_level;while (1) {Read_Temperature_Humidity(&temperature, &humidity);light_intensity = Read_Light_Intensity();smoke_level = Read_Smoke_Level();Process_Home_Data(temperature, humidity, light_intensity, smoke_level);Send_Home_Data_To_Server(temperature, humidity, light_intensity, smoke_level);HAL_Delay(1000);}
}

4.4 用户界面与数据可视化

配置OLED显示屏

使用STM32CubeMX配置I2C接口:

  1. 打打开STM32CubeMX,选择您的STM32开发板型号。
  2. 在图形化界面中,找到需要配置的I2C引脚,设置为I2C模式。
  3. 生成代码并导入到STM32CubeIDE中。

代码实现:

首先,初始化OLED显示屏:

#include "stm32f4xx_hal.h"
#include "i2c.h"
#include "oled.h"void Display_Init(void) {OLED_Init();
}

然后实现数据展示函数,将家居环境数据展示在OLED屏幕上:

void Display_Home_Data(float temperature, float humidity, uint32_t light_intensity, uint32_t smoke_level) {char buffer[32];sprintf(buffer, "Temp: %.2f C", temperature);OLED_ShowString(0, 0, buffer);sprintf(buffer, "Humidity: %.2f %%", humidity);OLED_ShowString(0, 1, buffer);sprintf(buffer, "Light: %lu", light_intensity);OLED_ShowString(0, 2, buffer);sprintf(buffer, "Smoke: %lu", smoke_level);OLED_ShowString(0, 3, buffer);
}int main(void) {HAL_Init();SystemClock_Config();I2C1_Init();Display_Init();UART2_Init();GPIOB_Init();ADC_Init();ADC2_Init();DHT22_Init();float temperature, humidity;uint32_t light_intensity, smoke_level;while (1) {Read_Temperature_Humidity(&temperature, &humidity);light_intensity = Read_Light_Intensity();smoke_level = Read_Smoke_Level();// 显示家居环境数据Display_Home_Data(temperature, humidity, light_intensity, smoke_level);HAL_Delay(1000);}
}

5. 应用场景:家居监测与优化

智能空调控制

智能家居控制系统可以用于实时控制空调,通过监测温湿度动态调整空调运行状态,提高居住舒适度。

智能照明控制

智能家居控制系统可以用于智能照明,通过监测光照强度自动调节室内灯光,节约能源。

烟雾报警

智能家居控制系统可以用于烟雾报警,通过监测烟雾浓度及时发现火灾隐患并发出报警,保障家居安全。

环境监测

智能家居控制系统可以用于环境监测,通过监测温度、湿度、光照等环境参数,优化家居环境,提高生活质量。

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

6. 问题解决方案与优化

常见问题及解决方案

传感器数据不准确

确保传感器与STM32的连接稳定,定期校准传感器以获取准确数据。

解决方案:检查传感器与STM32之间的连接是否牢固,必要时重新焊接或更换连接线。同时,定期对传感器进行校准,确保数据准确。

家居设备控制不稳定

优化控制算法和硬件配置,减少家居设备控制的不稳定性,提高系统反应速度。

解决方案:优化控制算法,调整参数,减少振荡和超调。使用高精度传感器,提高数据采集的精度和稳定性。选择更高效的处理器,提高数据处理的响应速度。

数据传输失败

确保Wi-Fi模块与STM32的连接稳定,优化通信协议,提高数据传输的可靠性。

解决方案:检查Wi-Fi模块与STM32之间的连接是否牢固,必要时重新焊接或更换连接线。优化通信协议,减少数据传输的延迟和丢包率。选择更稳定的通信模块,提升数据传输的可靠性。

显示屏显示异常

检查I2C通信线路,确保显示屏与MCU之间的通信正常,避免由于线路问题导致的显示异常。

解决方案:检查I2C引脚的连接是否正确,确保电源供电稳定。使用示波器检测I2C总线信号,确认通信是否正常。如有必要,更换显示屏或MCU。

优化建议

数据集成与分析

集成更多类型的传感器数据,使用数据分析技术进行家居环境状态的预测和优化。

建议:增加更多家居监测传感器,如空气质量传感器、二氧化碳传感器等。使用云端平台进行数据分析和存储,提供更全面的家居环境监测和管理服务。

用户交互优化

改进用户界面设计,提供更直观的数据展示和更简洁的操作界面,增强用户体验。

建议:使用高分辨率彩色显示屏,提供更丰富的视觉体验。设计简洁易懂的用户界面,让用户更容易操作。提供图形化的数据展示,如实时环境参数图表、历史记录等。

智能化控制提升

增加智能决策支持系统,根据历史数据和实时数据自动调整家居控制策略,实现更高效的家居环境监测和控制。

建议:使用数据分析技术分析家居数据,提供个性化的控制建议。结合历史数据,预测可能的问题和需求,提前优化控制策略。

7. 收尾与总结

本教程详细介绍了如何在STM32嵌入式系统中实现智能家居控制系统,从硬件选择、软件实现到系统配置和应用场景都进行了全面的阐述。通过合理的技术选择和系统设计,可以构建一个高效且功能强大的智能家居控制系统。

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

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

相关文章

“微软蓝屏”事件暴露的网络安全问题

“微软蓝屏”事件暴露的网络安全问题 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件源于美国电脑安全技术公司“众击”提供的一个带…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法&#xff08;交换顺序&#xff09;&#xff08;1&#xff09;算法&#xff08;2&#xff09;性能分析 2.2、简单选择排序&#xff08;1&#xff09;算法&#xff08;2&#xff09…

FastAPI(七十一)实战开发《在线课程学习系统》接口开发-- 查看留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前FastAPI&#xff08;七十&#xff09;实战开发《在线课程学习系统》接口开发--留言功能开发分享了留言开发&#xff0c;这次我们分享查看留言 梳…

网络服务与应用

一、 文件传输 FTP 1、FTP采用典型的C/S架构&#xff08;即服务器端和客户端模型&#xff09;&#xff0c;客户端与服务器端建立TCP连接之后即可实现文件的上传、下载。 2、FTP传输过程 1&#xff09;、主动模式&#xff08;POST&#xff09;&#xff1a;入站连接 2&#x…

SqlSugar删除没有定义主键的实体类对应的数据库表数据

一般而言&#xff0c;使用SqlSugar的DbFirst功能创建数据库表实体类时&#xff0c;如果数据库表有主键&#xff0c;生成的实体类对应属性也会标识为主键&#xff0c;如下图所示。   但有时候生成的实体类没有自动配置主键&#xff0c;这时可以通过以下方式进行删除操作&…

【计算机网络】HTTP协议实验

一&#xff1a;实验目的 1&#xff1a;理解HTTP协议的基本工作原理。 2&#xff1a;使用Wireshark或其他抓包工具捕获并分析HTTP数据包&#xff0c;理解HTTP通信的具体过程。 3&#xff1a;通过分析抓包数据&#xff0c;识别常见的HTTP状态码及其含义。 二&#xff1a;实验仪…

光伏电站的运维经验

选择逆变器一是要看产品本身的效率和品质&#xff1b;二是要看系统的架构&#xff0c;怎么做的更简单&#xff0c;更可靠&#xff1b;三是要看场景的适应性&#xff1b;四是看服务。箱式逆变房后期运维无需协调多个厂家&#xff0c;大大提升了运维效率。相比自制土建房&#xf…

02集成开发工具配置VScode SSH连接Ubuntu20.04 - 输入密码连接

文章目录 1. running the VScode in Admin mode2. Install the plugin3. New Remote4. Enther the command at the top blanket column in VS Code5. Setup the ssh config file6. Restart VScode7. Connect to the Server8. Open the remote folder 1. running the VScode in …

Python 函数对象和函数调用

Python 函数对象和函数调用 在 Python 中&#xff0c;函数是第一类对象&#xff08;first-class objects&#xff09;。这意味着函数可以像其他对象&#xff08;如整数、字符串、列表等&#xff09;一样被传递、赋值和操作。理解函数对象和函数调用的区别是学习 Python 的关键…

简单了解反射

反射 文章目录 反射获取class对象的三种方式利用反射获取构造方法利用反射获取字段&#xff08;成员变量&#xff09;利用反射获取成员方法反射的作用 获取class对象的三种方式 ①Class.forName(“全类名”);&#xff08;源代码阶段使用&#xff09; ②类名.class&#xff08…

学习C语言之 深入了解指针1

深入了解指针 前面已了解到 1&#xff09;指针就是个变量&#xff0c;用来存放地址&#xff0c;地址是唯一的&#xff0c;可以标识一块内存空间。 2&#xff09;指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff09;。 3&#xff09;指针是有类型的&#xf…

Linux中如何用ida调试fork后的子进程

原文链接 > https://redqx.github.io/linux/2024/07/24/linux-debugfork.html 本文的一些图片引用可能有一些问题, 比如数据不对劲,但无伤大雅 自己懒得粘贴图片了 环境: wsl-kali-2024 ida-7.7 插件: Lazy_ida, 还有一个什么插件不知道什么名字, 可以把汇编转字节码 …

mac安装Whisper

Whisper 官方git https://github.com/openai/whisper?tabreadme-ov-file 基本上参考官方的安装流程 pip3 install -U openai-whisper pip3 install githttps://github.com/openai/whisper.git pip3 install --upgrade --no-deps --force-reinstall githttps://github.com/…

牛客周赛52--E小红的图上加边(联通块)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 \,\,\,\,\,\,\,\,\,\,小红有一张 nnn 个点 mmm 条边的无向图&#xff0c;每个节点的权值是 aia_iai​。           \,\,\,\,\,\,\,\,\,\,现在小红希望加边把这个图连成连通…

Elasticsearch概念及ELK安装

1、Elasticsearch是什么 它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kibana&#xff1a;用于数据可视化 整套技术栈被称为ELK&#xff0c;经常用来做日志收集…

ansible的role目录结构及用法

目录 目录结构介绍案例 目录结构介绍 可以通可以通过使用 ansible-galaxy 命令再当前目录自动生成 role 的基本目录结构。 myrole为文件名&#xff08;角色名&#xff09; ansible-galaxy init myrole如果没有安装Ansible Galaxy&#xff0c;你可以使用以下命令安装&#xff…

Python 函数的参数形式

Python 函数的参数形式 Python 函数的参数有多种形式&#xff0c;每种形式在不同的场景下使用。我们主要介绍以下几种&#xff1a; 位置参数关键字参数默认参数可变位置参数&#xff08;*args&#xff09;可变关键字参数&#xff08;**kwargs&#xff09; 1. 位置参数 位置…

python题解

宽度与对齐 输出455、-123、987654&#xff0c;宽度为5&#xff0c;分别左对齐和右对齐 格式 输入格式&#xff1a; 无 输出格式&#xff1a; 输出为整型&#xff0c;空格分隔。每个数的输出占一行 样例 1 输入&#xff1a; 无 复制 输出&#xff1a; 455 455 -123 -123 98…

Vue的SSR和预渲染:提升首屏加载速度与SEO效果

引言 在现代Web应用开发中,首屏加载速度和搜索引擎优化(SEO)是衡量应用性能的重要指标。Vue.js 作为流行的前端框架,提供了服务器端渲染(SSR)和预渲染(prerendering)两种技术来提升这些指标。本文将深入探讨如何使用 Vue 的 SSR 和预渲染技术,提供详细的代码示例和最…

FFmpeg源码:av_probe_input_format3函数分析

一、av_probe_input_format3函数的声明 av_probe_input_format3函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff09;的头文件libavformat/avformat.h中&#xff1a; /*** Guess the file format.** param is_opened Whether the file is already…