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模块、LoRa模块
  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. 用户输入系统:通过按键或旋钮进行设置和调整

功能描述

通过各种传感器采集工业数据,并实时显示在OLED显示屏上。系统通过数据处理和网络通信,实现对工业数据的监测和管理。用户可以通过按键或旋钮进行设置,并通过显示屏查看当前状态。

4. 代码实现:实现智能工业自动化监控系统

4.1 数据采集模块

配置温度传感器

使用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_Temperature(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 temperature_value;

    while (1) {
        temperature_value = Read_Temperature();
        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_Pressure(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 pressure_value;

    while (1) {
        pressure_value = Read_Pressure();
        HAL_Delay(1000);
    }
}
配置液位传感器

使用STM32CubeMX配置I2C接口:

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

代码实现:

#include "stm32f4xx_hal.h"
#include "i2c.h"
#include "liquid_level_sensor.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);
}

uint32_t Read_Liquid_Level(void) {
    return Liquid_Level_Sensor_Read();
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    I2C1_Init();
    Liquid_Level_Sensor_Init();

    uint32_t liquid_level;

    while (1) {
        liquid_level = Read_Liquid_Level();
        HAL_Delay(1000);
    }
}
配置加速度传感器

使用STM32CubeMX配置SPI接口:

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

代码实现:

#include "stm32f4xx_hal.h"
#include "spi.h"
#include "accelerometer.h"

SPI_HandleTypeDef hspi1;

void SPI1_Init(void) {
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 10;
    HAL_SPI_Init(&hspi1);
}

void Read_Accelerometer(float* x, float* y, float* z) {
    Accelerometer_ReadAll(x, y, z);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    SPI1_Init();
    Accelerometer_Init();

    float x, y, z;

    while (1) {
        Read_Accelerometer(&x, &y, &z);
        HAL_Delay(1000);
    }
}

4.2 数据处理与控制模块

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

工业自动化控制算法

实现一个简单的工业自动化控制算法,根据传感器数据控制电磁阀和马达:

#define TEMP_THRESHOLD 60.0
#define PRESSURE_THRESHOLD 100
#define LIQUID_LEVEL_THRESHOLD 80
#define ACCELERATION_THRESHOLD 1.5

void Process_Industrial_Data(float temperature, uint32_t pressure, uint32_t liquid_level, float x, float y, float z) {
    if (temperature > TEMP_THRESHOLD || pressure > PRESSURE_THRESHOLD || liquid_level > LIQUID_LEVEL_THRESHOLD || x > ACCELERATION_THRESHOLD || y > ACCELERATION_THRESHOLD || z > ACCELERATION_THRESHOLD) {
        // 打开电磁阀和马达
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 电磁阀
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 马达
    } else {
        // 关闭电磁阀和马达
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 电磁阀
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 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_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();
    ADC_Init();
    ADC2_Init();
    I2C1_Init();
    SPI1_Init();
    Liquid_Level_Sensor_Init();
    Accelerometer_Init();

    float temperature, x, y, z;
    uint32_t pressure, liquid_level;

    while (1) {
        temperature = Read_Temperature();
        pressure = Read_Pressure();
        liquid_level = Read_Liquid_Level();
        Read_Accelerometer(&x, &y, &z);

        Process_Industrial_Data(temperature, pressure, liquid_level, x, y, z);

        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 huart1;

void UART1_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

void Send_Industrial_Data_To_Server(float temperature, uint32_t pressure, uint32_t liquid_level, float x, float y, float z) {
    char buffer[128];
    sprintf(buffer, "Temp: %.2f, Pressure: %lu, Liquid Level: %lu, X: %.2f, Y: %.2f, Z: %.2f",
            temperature, pressure, liquid_level, x, y, z);
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    UART1_Init();
    GPIOB_Init();
    ADC_Init();
    ADC2_Init();
    I2C1_Init();
    SPI1_Init();
    Liquid_Level_Sensor_Init();
    Accelerometer_Init();

    float temperature, x, y, z;
    uint32_t pressure, liquid_level;

    while (1) {
        temperature = Read_Temperature();
        pressure = Read_Pressure();
        liquid_level = Read_Liquid_Level();
        Read_Accelerometer(&x, &y, &z);

        Send_Industrial_Data_To_Server(temperature, pressure, liquid_level, x, y, z);

        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_Data(float temperature, uint32_t pressure, uint32_t liquid_level, float x, float y, float z) {
    char buffer[32];
    sprintf(buffer, "Temp: %.2f C", temperature);
    OLED_ShowString(0, 0, buffer);
    sprintf(buffer, "Pressure: %lu", pressure);
    OLED_ShowString(0, 1, buffer);
    sprintf(buffer, "Level: %lu", liquid_level);
    OLED_ShowString(0, 2, buffer);
    sprintf(buffer, "X: %.2f", x);
    OLED_ShowString(0, 3, buffer);
    sprintf(buffer, "Y: %.2f", y);
    OLED_ShowString(0, 4, buffer);
    sprintf(buffer, "Z: %.2f", z);
    OLED_ShowString(0, 5, buffer);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    I2C1_Init();
    Display_Init();
    GPIOB_Init();
    ADC_Init();
    ADC2_Init();
    I2C1_Init();
    SPI1_Init();
    Liquid_Level_Sensor_Init();
    Accelerometer_Init();

    float temperature, x, y, z;
    uint32_t pressure, liquid_level;

    while (1) {
        temperature = Read_Temperature();
        pressure = Read_Pressure();
        liquid_level = Read_Liquid_Level();
        Read_Accelerometer(&x, &y, &z);

        // 显示工业数据
        Display_Data(temperature, pressure, liquid_level, x, y, z);

        HAL_Delay(1000);
    }
}

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

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

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

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

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

 

5. 应用场景:工业自动化与管理

智能工厂管理

智能工业自动化监控系统可以用于工厂生产管理,通过实时监测和控制生产过程,提高生产效率和质量。

工业设备监控

在工业设备中,智能工业自动化监控系统可以实现对设备的实时监控和自动管理,确保设备的正常运行和安全。

智能仓储管理

智能工业自动化监控系统可以用于智能仓储管理,通过数据采集和分析,为仓储的管理和优化提供科学依据。

预测性维护

智能工业自动化监控系统可以用于预测性维护,通过自动化控制和数据分析,提前发现和解决设备问题,减少停机时间。

6. 问题解决方案与优化

常见问题及解决方案

传感器数据不准确

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

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

工业数据处理不稳定

优化处理算法和硬件配置,减少数据处理的不稳定性,提高系统反应速度。

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

数据传输失败

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

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

显示屏显示异常

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

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

优化建议

数据集成与分析

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

建议:增加更多监测传感器,如振动传感器、噪声传感器等。使用云端平台进行数据分析和存储,提供更全面的工业监测和管理服务。

用户交互优化

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

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

智能化控制提升

增加智能决策支持系统,根据历史数据和实时数据自动调整工业管理策略,实现更高效的工业管理和控制。

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

7. 收尾与总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度人脸识别Windows C++离线sdk C#接入

百度人脸识别Windows C离线sdk C#接入 目录 说明 设计背景 • 场景特点: • 客户特点: • 核心需求: SDK 包结构 效果 代码 说明 自己根据SDK封装了动态库,然后C#调用。 功能接口 设计背景 • 场景特点: -…

【漏洞复现】深信服 行为感知系统 日志中心 c.php 远程命令执行

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

PTA - 嵌套列表求和

使用递归函数对嵌套列表求和 函数接口定义: def sumtree(L) L是输入的嵌套列表。 裁判测试程序样例: /* 请在这里填写答案 */L eval(input()) print(sumtree(L)) # 调用函数 输入样例: 在这里给出一组输入。例如: [1,[2…

PriorityQueue 阅读记录

1、前言 1、优先队列,底层通过数组来构造树(二叉树) 来实现的。 2、默认是最小堆(取出来的是最小值),可以通过传入一个比较器 comparator 来构造一个最大堆。 3、传入的参数不能为空,否则抛出NPE问题。 4、最大堆的…

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述 3.1.1 信息系统的定义3.1.1.1 信息系统3.1.1.2 信息化3.1.2 信息系统的发展3.1.2.1 初始阶段3.1.2.2 传播阶段3.1.2.3 控制阶段3.1.2.4 集成阶段3.1.2.5 数据管理阶段3.1.2.6 成熟阶段3.1.3 信息系统的分类3.…

读人工智能全传15意向立场

1. 物理立场 1.1. 可以解释一个实体行为 1.2. 在物理立场中,我们使用自然法则(物理、化学等)来预测系统的行为结果 1.3. 虽然物理立场在解释这种行为的时候非常有效,但无法应用于理解或者预测人类行为 1.3.1. …

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…

关于springboot的@DS(““)多数据源的注解无法生效的原因

对于com.baomidou.dynamic.datasource.annotation的DS注解&#xff0c;但凡有一个AOP的修改都会影响到多数据源无法生效的问题&#xff0c;本次我是添加了方法上添加了Transactional&#xff0c;例如下图&#xff1a; 在方法上写了这个注解&#xff0c;会影响到DS("db2&qu…

万字长文之分库分表里如何优化分页查询?【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 分页查询】

分库分表的一般做法 一般会使用三种算法&#xff1a; 哈希分库分表&#xff1a;根据分库分表键算出一个哈希值&#xff0c;根据这个哈希值选择一个数据库。最常见的就是数字类型的字段作为分库分表键&#xff0c;然后取余。比如在订单表里&#xff0c;可以按照买家的ID除以8的…

【PB案例学习笔记】-32制作一个简单记事本程序

大家好&#xff0c;我是晓凡。 写在前面 这是PB案例学习笔记系列文章的第32篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码…

Web3D:WebGL为什么在渲染性能上输给了WebGPU。

WebGL已经成为了web3D的标配&#xff0c;市面上有N多基于webGL的3D引擎&#xff0c;WebGPU作为挑战者&#xff0c;在渲染性能上确实改过webGL一头&#xff0c;由于起步较晚&#xff0c;想通过这个优势加持&#xff0c;赶上并超越webGL仍需时日。 贝格前端工场为大家分享一下这…

leetcode 1459 矩形面积(postgresql)

需求 表: Points ---------------------- | Column Name | Type | ---------------------- | id | int | | x_value | int | | y_value | int | ---------------------- id 是该表主键 每个点都用二维坐标 (x_value, y_value) 表示 写一个 SQL 语句&#xff0c;报告由表中任…

Redis-基础概念

目录 概念 Redis是什么 Redis 和 MySQL 的区别&#xff1f; Redis单线程有什么极端场景的瓶颈 Redis为什么快? 为什么Redis是单线程? Redis是单线程还是多线程 Redis为什么选择单线程做核心处理 Redis6.0之后引入了多线程&#xff0c;你知道为什么吗? 瓶颈是内存和I…

MySQL-事务、日志

事务 特性 原子性 是指事务开始后&#xff0c;必须成功执行完所有的操作才会结束&#xff0c;否则会回滚到事务刚开始前。 拿转账来说&#xff0c;一个成功的 A向B转账100元的过程 会涉及如下过程&#xff1a; A&#xff1a;从数据库读取A的余额&#xff1b;A的余额-100&am…

Pytorch学习笔记day1—— 安装教程

这里写自定义目录标题 Pytorch安装方式 工作需要&#xff0c;最近开始搞一点AI的事情。但是这个国产的AI框架&#xff0c;实话说对初学者不太友好 https://www.mindspore.cn/ 比如说它不支持win下的CUDA&#xff0c;可是我手里只有3070Ti和4060也不太可能自己去买昇腾就有点绷不…

C. Alternating Subsequence[双指针,贪心]

题目描述&#xff1a; 思路分析&#xff1a;题目俩要求&#xff0c;最长&#xff0c;值最大&#xff0c;异号&#xff0c;保证异号的情况是找到最长而且尽可能大&#xff0c;其实很容易想到&#xff0c;一开始先把第一个数单独放进去&#xff0c;保证不浪费任何一个元素&#…

迈克尔的44岁:时间的感悟与人生的智慧

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【JavaEE】HTTP(2)

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;下一篇文章&#xff1a;【JavaEE】HTTP协议(…

短链接day8

短链接监控 开发访问单个短链接监控统计功能 不知道是哪里复制错了&#xff0c;反正就是一顿报错&#xff0c;改了这个又改那个&#xff0c;还是报错。。暂时不管了。 记录短链接访问日志 logdo新增networt、device、local属性。 分页查询短链接访问日志 分页查询短链接今…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…