基于STM32的智能电池管理系统

目录

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

1. 引言

智能电池管理系统(Battery Management System,BMS)通过使用STM32嵌入式系统,结合多种传感器和控制设备,实现对电池状态的实时监测和自动化管理。本文将详细介绍如何在STM32系统中实现一个智能电池管理系统,包括环境准备、系统架构、代码实现、应用场景及问题解决方案和优化方法。

2. 环境准备

硬件准备

  • 开发板:STM32F407 Discovery Kit
  • 调试器:ST-LINK V2或板载调试器
  • 电压传感器:用于检测电池电压
  • 电流传感器:如ACS712,用于检测电池电流
  • 温度传感器:如NTC热敏电阻,用于检测电池温度
  • 显示屏:如OLED显示屏
  • 按键或旋钮:用于用户输入和设置
  • 电源:12V或24V电源适配器

软件准备

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

安装步骤

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

3. 智能电池管理系统基础

控制系统架构

智能电池管理系统由以下部分组成:

  • 数据采集模块:用于采集电池电压、电流和温度数据
  • 数据处理模块:对采集的数据进行处理和分析
  • 控制系统:根据处理结果控制电池的充放电状态
  • 显示系统:用于显示电池状态和系统信息
  • 用户输入系统:通过按键或旋钮进行设置和调整

功能描述

通过电压传感器、电流传感器和温度传感器采集电池状态数据,并实时显示在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_Voltage(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 voltage_value;while (1) {voltage_value = Read_Voltage();HAL_Delay(1000);}
}

配置ACS712电流传感器
使用STM32CubeMX配置ADC接口:

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

代码实现:

初始化ACS712传感器并读取数据:

#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_Current(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 current_value;while (1) {current_value = Read_Current();HAL_Delay(1000);}
}

配置温度传感器
使用STM32CubeMX配置ADC接口:

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

代码实现:

初始化温度传感器并读取数据:

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

4.2 数据处理与分析

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

void Process_Battery_Data(uint32_t voltage_value, uint32_t current_value, uint32_t temperature_value) {// 数据处理和分析逻辑// 例如:根据电压、电流和温度数据判断电池状态
}

4.3 控制系统实现

配置电池充放电控制
使用STM32CubeMX配置GPIO:

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

代码实现:

初始化电池充放电控制引脚:

#include "stm32f4xx_hal.h"#define CHARGE_PIN GPIO_PIN_1
#define DISCHARGE_PIN GPIO_PIN_2
#define GPIO_PORT GPIOBvoid GPIO_Init(void) {__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = CHARGE_PIN | DISCHARGE_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
}void Control_Charge(uint8_t state) {HAL_GPIO_WritePin(GPIO_PORT, CHARGE_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}void Control_Discharge(uint8_t state) {HAL_GPIO_WritePin(GPIO_PORT, DISCHARGE_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}int main(void) {HAL_Init();SystemClock_Config();GPIO_Init();ADC_Init();ADC2_Init();ADC3_Init();uint32_t voltage_value;uint32_t current_value;uint32_t temperature_value;while (1) {// 读取传感器数据voltage_value = Read_Voltage();current_value = Read_Current();temperature_value = Read_Temperature();// 数据处理Process_Battery_Data(voltage_value, current_value, temperature_value);// 根据处理结果控制电池充放电if (voltage_value < 3600) { // 例子:电压低于阈值时开始充电Control_Charge(1);  // 开始充电Control_Discharge(0);  // 停止放电} else if (voltage_value > 4200) { // 例子:电压高于阈值时停止充电Control_Charge(0);  // 停止充电Control_Discharge(1);  // 开始放电}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_Battery_Data(uint32_t voltage_value, uint32_t current_value, uint32_t temperature_value) {char buffer[32];sprintf(buffer, "Voltage: %lu mV", voltage_value);OLED_ShowString(0, 0, buffer);sprintf(buffer, "Current: %lu mA", current_value);OLED_ShowString(0, 1, buffer);sprintf(buffer, "Temp: %lu C", temperature_value);OLED_ShowString(0, 2, buffer);
}

在主函数中,初始化系统并开始显示数据:

int main(void) {HAL_Init();SystemClock_Config();GPIO_Init();ADC_Init();ADC2_Init();ADC3_Init();Display_Init();uint32_t voltage_value;uint32_t current_value;uint32_t temperature_value;while (1) {// 读取传感器数据voltage_value = Read_Voltage();current_value = Read_Current();temperature_value = Read_Temperature();// 显示电池状态数据Display_Battery_Data(voltage_value, current_value, temperature_value);// 数据处理Process_Battery_Data(voltage_value, current_value, temperature_value);// 根据处理结果控制电池充放电if (voltage_value < 3600) { // 例子:电压低于阈值时开始充电Control_Charge(1);  // 开始充电Control_Discharge(0);  // 停止放电} else if (voltage_value > 4200) { // 例子:电压高于阈值时停止充电Control_Charge(0);  // 停止充电Control_Discharge(1);  // 开始放电}HAL_Delay(1000);}
}

5. 应用场景:电池管理与优化

便携设备电池管理

智能电池管理系统可以应用于便携设备,如手机、笔记本电脑和平板电脑,通过实时监测电池状态,优化充放电策略,延长电池寿命。

电动汽车电池管理

在电动汽车中,智能电池管理系统可以帮助管理电池组的状态,确保电池的安全和高效运行,提高续航里程和电池寿命。

可再生能源存储

智能电池管理系统可以用于可再生能源存储系统,如太阳能和风能,通过优化充放电过程,提高能源利用效率。

无人机电池管理

智能电池管理系统可以用于无人机,通过实时监测电池状态,确保飞行安全,优化续航能力。

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

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

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

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

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

 

6. 问题解决方案与优化

常见问题及解决方案

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

    • 解决方案:检查传感器与STM32之间的连接是否牢固,必要时重新焊接或更换连接线。同时,定期对传感器进行校准,确保数据准确。
  2. 设备响应延迟:优化控制逻辑和硬件配置,减少设备响应时间,提高系统反应速度。

    • 解决方案:优化传感器数据采集和处理流程,减少不必要的延迟。使用DMA(直接存储器访问)来提高数据传输效率,减少CPU负担。选择速度更快的处理器和传感器,提升整体系统性能。
  3. 显示屏显示异常:检查I2C通信线路,确保显示屏与MCU之间的通信正常,避免由于线路问题导致的显示异常。

    • 解决方案:检查I2C引脚的连接是否正确,确保电源供电稳定。使用示波器检测I2C总线信号,确认通信是否正常。如有必要,更换显示屏或MCU。
  4. 充放电控制不稳定:确保充放电控制模块和控制电路的连接正常,优化控制算法。

    • 解决方案:检查充放电控制模块和控制电路的连接,确保接线正确、牢固。使用更稳定的电源供电,避免电压波动影响设备运行。优化控制算法,确保充放电过程平稳过渡。
  5. 系统功耗过高:优化系统功耗设计,提高系统的能源利用效率。

    • 解决方案:使用低功耗模式(如STM32的STOP模式)降低系统功耗。选择更高效的电源管理方案,减少不必要的电源消耗。

优化建议

  1. 数据集成与分析:集成更多类型的传感器数据,使用数据分析技术进行电池状态的预测和优化。

    • 建议:增加更多电池传感器,如内阻传感器、容量传感器等。使用云端平台进行数据分析和存储,提供更全面的电池管理服务。
  2. 用户交互优化:改进用户界面设计,提供更直观的数据展示和更简洁的操作界面,增强用户体验。

    • 建议:使用高分辨率彩色显示屏,提供更丰富的视觉体验。设计简洁易懂的用户界面,让用户更容易操作。提供图形化的数据展示,如实时图表、电池状态图等。
  3. 智能化控制提升:增加智能决策支持系统,根据历史数据和实时数据自动调整电池管理策略,实现更高效的电池管理。

    • 建议:使用数据分析技术分析电池数据,提供个性化的控制建议。结合历史数据,预测可能的电池状态变化和需求,提前调整管理策略。

7. 收尾与总结

本教程详细介绍了如何在STM32嵌入式系统中实现智能电池管理系统,从硬件选择、软件实现到系统配置和应用场景都进行了全面的阐述。通过合理的技术选择和系统设计,可以构建一个高效且功能强大的智能电池管理系统。在实际应用中,还可以根据具体需求进行优化和扩展,提升系统的性能和可靠性。

总结

  1. 系统设计:结合STM32和多种传感器,实现全面的电池状态监测和管理。
  2. 用户界面:通过OLED显示屏提供直观的数据展示,提升用户体验。
  3. 优化和扩展:通过硬件和软件的优化,不断提升系统性能和可靠性。

智能电池管理系统不仅可以应用于便携设备电池管理、电动汽车电池管理和可再生能源存储,还可以用于无人机电池管理,具有广泛的应用前景。

 

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

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

相关文章

【昇思25天学习打卡营打卡指南-第十三天】ShuffleNet图像分类

ShuffleNet图像分类 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操…

GPT-5 一年半后发布,打开人工智能新世纪

关于GPT-5一年半后发布的消息&#xff0c;这一预测主要基于OpenAI首席技术官Mira Murati的采访和声明。然而&#xff0c;需要明确的是&#xff0c;这个时间点&#xff08;即2025年底或2026年初&#xff09;已经与早期传闻有所不同&#xff0c;显示了OpenAI对产品质量的重视&…

react18.x+播放文本内容

需要调接口将文字传递给后端将文字转换成音频文件&#xff0c;然后播放&#xff0c;同时每次播放不同文本时&#xff0c;当前播放的文本需要暂停&#xff0c;切换到播放新点击的文本 可以设置缓存播放过的音频&#xff0c;也可以不设置缓存&#xff1a; 设置缓存的代码如下&am…

骁龙相机拍照流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 1.deliverInputEvent 拍照点击事件处理 2.submitRequestList Camera 提交拍照请求 3.createCaptureRequest 拍照请求帧数 骁龙相机通过binder 数据传输…

idea 内存参数修改不生效问题解决 VM参数设置不生效解决

很多人配置idea 内存参数&#xff0c;怎么配置都不生效&#xff0c;主要原因是配置文件用的不是你修改的那个。 系统环境变量中的这个才是你真正要修改的配置文件。 找到并修改后保存&#xff0c;重启idea就可生效

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

人工与智能系统之间的交互方式

人工与智能系统之间的交互方式 #mermaid-svg-xSsFZWak2bsyV0un {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xSsFZWak2bsyV0un .error-icon{fill:#552222;}#mermaid-svg-xSsFZWak2bsyV0un .error-text{fill:#5522…

分词算法在自然语言处理中的基本原理与应用场景

分词算法在自然语言处理中的基本原理与应用场景 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 分词是自然语言处理&#xff08;NLP&#xff09;中的重要基础…

python脚本 限制 外部访问 linux服务器端口

注意&#xff1a;该脚本会清空linux防火墙的filter表的规则和用户自定义链路 脚本的效果是将端口限制为仅服务器内部访问&#xff0c;提高服务的安全性&#xff0c;稳定性 可以提供ip地址白名单 具体脚本&#xff1a; #!/usr/bin/python3 import argparse, subprocess, sys,…

13_网络安全

目录 网络安全协议 网络安全协议 PGP协议 网络安全技术 防火墙技术 入侵检测系统 入侵防御系统 杀毒软件 蜜罐系统 计算机病毒与木马 网络安全协议 网络安全协议 物理层主要使用物理手段隔离、屏蔽物理设备等&#xff0c;其他层都是靠协议来保证传输的安全&#xff…

美国服务器租用详细介绍与租用流程

在数字化时代&#xff0c;服务器租用已成为许多企业和个人拓展业务、存储数据的重要选择。美国作为全球科技发展的前沿阵地&#xff0c;其服务器租用服务也备受瞩目。下面&#xff0c;我们将详细介绍美国服务器租用的相关知识及租用流程。 一、美国服务器租用简介 美国服务器租…

中英双语介绍美国的州:新泽西州(New Jersey)

中文版 新泽西州&#xff08;New Jersey&#xff09;位于美国东北部&#xff0c;是美国面积较小但人口密度较高的州之一。新泽西州因其便利的地理位置、发达的经济和丰富的历史文化而闻名。以下是对新泽西州各方面的详细介绍&#xff1a; 人口 截至2020年&#xff0c;美国人…

引领汽车软件开发走向ASPICE认证之路

亚远景科技与ASPICE认证的关系可以从以下几个方面来阐述&#xff1a; (要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 行业专…

tomcat定时重启

Tomcat定时重启&#xff08;linux&#xff09; 1. 编写脚本 在tomcat的bin目录下&#xff0c;使用vim restart.sh&#xff0c;编写restart.sh脚本&#xff0c;插入一下内容&#xff0c;最后并保存&#xff01; #!/bin/bash# 初始化全局环境变量 . /etc/profilecd /usr/loca…

探索数据结构:队列的的实现与应用

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、队列的概念 队列是一个线性的数据结构&#…

windows环境下创建python虚拟环境

windows环境下创建python虚拟环境 使用virtualenv库创建虚拟环境&#xff0c;可使不同的项目处于不同的环境中 安装方法&#xff1a; pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua…

Spring Cloud Alibaba之负载均衡组件Ribbon

一、什么是负载均衡&#xff1f; &#xff08;1&#xff09;概念&#xff1a; 在基于微服务架构开发的系统里&#xff0c;为了能够提升系统应对高并发的能力&#xff0c;开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中&#xff0c;并把访问业务功能的请求均…

谈谈WebComponents | 前端开发

一、 源起 让我们以一个例子开始。 假设我们要做一个环形进度条&#xff0c;它可以&#xff1a; 1、根据进度数值的不同&#xff0c;计算出百分比&#xff0c;以渲染对应的角度值。 2、根据设置的进度不同&#xff0c;我们用不同的颜色加以区分。 3、在环的中间我们以动画递增的…

小程序、APP对接广告联盟进行广告变现有什么区别?

小程序VS APP对接广告联盟有什么区别&#xff1f; 开发完成的小程序对接广告联盟广告变现&#xff0c;开发完成的APP对接广告联盟有什么区别&#xff1f; 首先小程序对接广告联盟&#xff0c;无论是微信小程序还是抖音小程序都只支持对接单一的广告联盟接入。抖音小程序只支持…

【监控】监控平台部署 Prometheus+Grafana

在 macOS 上部署 Grafana 和 Prometheus 来监控 Java 服务是一个非常实用的操作。以下是详细的步骤&#xff0c;包括如何安装和配置 Prometheus、Grafana 以及在 Java 服务中集成 Prometheus 的客户端库来收集指标数据。 1. 安装 Prometheus 1.1 使用 Homebrew 安装 Promethe…