基于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.pswp.cn/web/37538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37538.shtml
英文地址,請注明出處:http://en.pswp.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…