用STM32手搓一个体温计

前言

市面上大多额温计、测温计精度偏差太大

而水银温度计,等待时间又太久

因此就产生了用STM32自己做一个——精度高、便宜、测速快 产品级 温度仪/体温计的想法。

图片

01

这个温度仪的亮点?

1精度高,误差小于0.1度

2带有显示屏,可实时查看测温数据

3支持蓝牙传输,支持BLE和SPP

4可直接用手机或电脑接收温度数据

5可以DIY设置报警功能,方便看护儿童时,不知道什么时候又温度升高了,都不敢打个盹

6运行时间长,可以连续使用12个小时以上

7解决 儿童生病时不愿意配合量体温,以及腋下量体温时,不能实时了解发烧情况

那如何通过【硬件、外型、软件设计】实现出这样一个产品级的体温计呢?一起来看看!

02

硬件设计

图片

系统框图

图片

原理图

图片

PCB

下面就将电路拆分为5个部分,一 一分析一下电路原理。

01

电源部分

充放电芯片采用TP4057,该芯片便宜,支持升压,确保系统供电稳定。

这里通过Type-C给产品充电。

由于系统采用3.3V供电,因此用LDO进行电压转换。

图片

其锂电池采用200ma容量,规格如下:

图片

连接方式是焊接,预留了2.54排针,方便调试。

图片

Type-C选择了microUSB

图片

02主控部分

系统主控采用stm32f030c8t6

图片

该主控可实现以下功能:

  • ADC采集,也就是检测锂电池电量;

  • 串口通信,控制蓝牙芯片,进行数据发送;

  • IIC通信,控制温度传感器,配置以及初始化,最重要的是读取温度

  • IIC通信,显示电量、蓝牙连接状、实时温度、测量时长

  • 其它可扩展功能

03蓝牙部分

这里采用KT6368A设计。

该芯片支持双模,具体规格如下:

图片

PS:为了降低功耗建议使用KT6328A,但是这个只支持BLE哦。

相关原理图如下所示:

图片

04显示部分

自己采用了0.91寸的OLED模块,只有4个管脚,如下所示:

图片

我用的是白光的,我试了蓝光的也挺好的,这个看个人喜好了。

图片

05温度传感器

温度传感器在本项目中,无疑是很重要的存在。

MTS4和T117是我能找到的最具性价比的芯片,精度高且便宜。

T117参数:

图片

  • 超低温至-103℃测温!

  • 测温精度±0.1℃@+28~+43℃

  • I2C/单总线数字输出

  • 分辨率16位/0.004℃

  • 测温最快2.2ms可配置

  • 支持4路I2C通信地址;

  • 超低功耗2μA@1HZ

  • 1.8V~5.5V宽电压供电

  • 2*2*0.75mm小尺寸

  • DFN6L封装

  • 内置112bit EEPROM用户空间。

MTS4参数:

图片

  • I2C协议数字输出

  • 可同时兼容数字单总线

  • 测温精度±0.1℃@+28℃~+43℃

  • 16位输出0.004℃

  • 测温速度15.3ms/8.5ms/5.2ms/2.2ms可配置

  • 超低功耗3.1μA(AVG=16,1次测量/s)

  • 1.6x1.2x0.55mm超小尺寸

  • DFN4L封装

  • 内置112bit EEPROM用户空间

对应原理图:

图片

06PCB部分

PCB采用4层板设计,板厚1.6mm。为了能打免费PCB,整体长度设计在10cm以内。

这里的装配孔是m3,建议可以m2。

图片

03

外型设计

外型我做了3D外壳和面板。

01

外壳部分

3D外壳使用嘉立创EDA设计。

由于我是个新手,所以设计的比较简单。

图片

实物是这样子:

图片

02

面板部分

这个也是采用嘉立创EDA设计的,为了省钱。

*因为有很多位置需要计算,所以这里有个技巧,可以先导出PCB的DXF,方便定位。

做了很多颜色,实现3D外壳和面板自由了。

设计如下:

图片

实物如下:

图片

04

程序设计

”01

开发工具和环境

采用CubeMXKeil5结合的方式,使用C语言进行开发。

02程序设计思路

1电量采样通过timer+DMA+DAC进行数据采集,timer定时2S,为啥2秒,降低功耗。

之前1s感觉刷新有点快。

2检测蓝牙是否连接,读取PA1管脚状态,若连接显示器显示OK,否则是NO。

3每两秒读取一次温度,根据状态寄存器进行判别是否温度转换完成。

4

OLED显示2s更新一次。

效果如下图所示:

图片

03

温度传感器驱动

目前只焊接成功了T117芯片,这里给大家展示一下这个驱动的编写,如下所示。

这里是头文件

C++
#ifndef __SENSER_H#define __SENSER_H
#include "stm32f0xx_hal.h"
typedef enum{//Temp_Cmd//测温模式CONTI_CONVERT = 0x00, //连续测量温度STOP_CONVERT = 0x40, //停止测量温度SINGLE_CONVERT = 0xc0, //单次测量温度//加热模式OFF_HEATING = 0xf0, //低位清0,加热关闭ON_HEATING = 0x0A, //加热开启
//Temp_Cfg//测温频率FRE_8times = 0x00, //每秒8次FRE_4times = 0x20, //每秒4次FRE_2times = 0x40, //每秒2次FRE_1times = 0x60, //每秒1次
FRE_2s = 0x80, //每2秒1次FRE_4s = 0xa0, //每4秒1次FRE_8s = 0xc0, //每8秒1次FRE_16s = 0xe0, //每16秒1次//平均次数AVG_1 = 0xe7, //位清0,转换时间2.1msAVG_8 = 0x08, //转换时间5.2msAVG_16 = 0x10, //转换时间8.5msAVG_32 = 0x18, //转换时间15.3ms//低功耗模式OFF_PD = 0xfe, //位清0,不进入低功耗模式ON_PD = 0x01, //进入低功耗模式
//EE_CmdEE_DOWN = 0xb6, //装载EE值到寄存器EE_COPY = 0x08, //将寄存器中数值保存到EE中EE_RESET = 0x6a, //软复位,装载EE值到寄存器,与EE对应的部分,寄存器值恢复到EE保存值,不与EE对应的部分,寄存器值恢复到默认值
//Alert_Mode//报警开关OFF_ALERT = 0x00, //清0,报警关ON_ALERT = 0x80, //报警开//ModeTL_CLEAR = 0xbf, //位清0,TL为报警清除门限阈值TL_ALERT = 0x40, //TL为报警门限下阈值//极性ALERT_LO = 0xdf, //位清0,低电平有效ALERT_HI = 0x20, //高电平有效//报警端口模式选择ALERT_IO = 0xef, //位清0,用作温度报警CONVERT_FINI = 0x10, //用作测温完成标志} I2C_CMD;typedef enum{Temp_lsb = 0x00, //Temp_msb = 0x01, //Crc_temp = 0x02, //Status = 0x03, //Temp_Cmd = 0x04, //默认值0x40:停止测量,不加热Temp_Cfg = 0x05, //默认值0x69:每秒1次,AVG_8,进入低功耗Alert_Mode = 0x06, //默认值0x00:报警关,报警模式为TL解除报警,报警低电平有效,标志位表示温度报警Th_lsb = 0x07,Th_msb = 0x08,Tl_lsb = 0x09,Tl_msb = 0x0A,Crc_scratch = 0x0B,EE_Cmd = 0x17, //默认值0x00:无操作Romcode1 = 0x18,Romcode2 = 0x19,Romcode3 = 0x1A,Romcode4 = 0x1B,Romcode5 = 0x1C,Romcode6 = 0x1D,Romcode7 = 0x1E,crc_romcode = 0x1F,} REG;
void T117_Init(void);uint8_t T117_ID(void);//获取IDuint8_t T117_R_REG(uint8_t REG,uint8_t *DAT);//读寄存器uint8_t T117_W_REG(uint8_t REG,uint8_t DAT);//写寄存器uint8_t T117_R_TEMP(float *DAT); //读温度#endif

这里是C文件

​​​​​​​

C++
#include "SENSOR.h"#include "myiic.h"
#define T117_WADD 0x80#define T117_RADD 0x81
//测温指令寄存器(Temp_Cmd),地址 0x04//#define Temp_Cmd 0x04
//配置寄存器(Temp_Cfg),地址 0x05//#define Temp_Cfg 0x05
//状态寄存器(Status),地址 0x03//#define Status 0x03/*位 内容描述 默认数值7 温度高线报警跟踪 0:温度报警未触发 1:温度报警触发 ‘0’6 温度低线报警跟踪 0:温度报警未触发 1:温度报警触发 ‘0’5 温度转换状态 0:温度转换完成 1:温度转换过程中 ‘0’4 E2PROM 状态 0:未处于读写状态 1:处于读写状态 ‘0’3 加热状态 0:未处于加热状态 1:处于加热状态 ‘0’2 温度报警错误提示 0:TH 大于 TL 1:TH 小于等于 TL ‘0’1:0 预留 ‘00’*/
//报警模式寄存器(Alert_Mode),地址 0x06//#define Alert_Mode 0x06
/*位 内容描述 默认数值7 报警功能开关(Alert_en)0:关闭1:开启 ‘0’6 报警模式(IM)选择0:高于 TH 报警+低于 TL 解除报警1:高于 TH 报警+低于 TL 报警 ‘0’5 报警极性(POL)选择0:低有效1:高有效 ‘0’4 报警端口输出模式(FUNC)选择0:输出温度报警标志位1:输出测温完成标志位 ‘0’3:0 预留 ‘0000’
*/void T117_Init(void){
T117_W_REG(Temp_Cmd,0x00);//连续测温不加热
T117_W_REG(Temp_Cfg,0x99);//每秒0.5次,32次平均,进入低功耗
T117_W_REG(Alert_Mode,0x10);//不报警,输出测温完成标志位}uint8_t T117_ID(void) //获取ID{uint8_t temp=0;IIC2_Start();IIC2_Send_Byte(T117_WADD);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 1;}IIC2_Send_Byte(0x19);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 2;}
IIC2_ReStart();IIC2_Send_Byte(T117_RADD);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 3;}temp=IIC2_Read_Byte();IIC2_NAck();IIC2_Stop();return temp;}
uint8_t T117_R_REG(uint8_t REG,uint8_t *DAT) //读寄存器{uint8_t temp=0;IIC2_Start();IIC2_Send_Byte(T117_WADD);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 1;}IIC2_Send_Byte(REG);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 2;}
IIC2_ReStart();IIC2_Send_Byte(T117_RADD);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 3;}*DAT=IIC2_Read_Byte();IIC2_NAck();IIC2_Stop();return 0;}
uint8_t T117_W_REG(uint8_t REG,uint8_t DAT) //写寄存器{uint8_t temp=0;IIC2_Start();IIC2_Send_Byte(T117_WADD);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 1;}
IIC2_Send_Byte(REG);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 2;}
IIC2_Send_Byte(DAT);temp=IIC2_Wait_Ack();if(temp) {IIC2_Stop();return 3;}IIC2_Stop();return 0;
}
uint8_t T117_R_TEMP(float *DAT) //读寄存器{uint16_t rx=0;uint8_t data=0;
if(T117_R_REG(0x01,&data)) return 1;//rx = data<<8;rx = data;rx <<=8;if(T117_R_REG(0x00,&data)) return 2;rx += data;*DAT=(int16_t)rx;*DAT=25.0+(*DAT)/256.0;return 0;
}

04

蓝牙驱动

关于KT6368A的驱动实现,可以去梁山派的模块移植手册查看详情,具体实现我这里就不再赘述。

手册入口【建议收藏】:https://lceda001.feishu.cn/wiki/JNvYwEU5SiGldFkNcxncYXhZnZc

图片

模块移植手册-第一部

05

OLED驱动

这个0.91寸显示屏,网上有很多移植好的,这里也不再赘述,可以去梁山派的模块移植手册查看详情。

图片

06

其它串口IIC驱动

这个是老生常谈。

串口使用的是USART2,支持printf

IIC采用IO模拟方式,这样不受IO位置控制了。

具体啰嗦的代码就不这里贴了,节省空间哦,可以在开源原文里下载源文件。

07

main函数实现

这里是整个实现方式,对应前面的设计思路,这里包含一些中断回调函数的实现。

​​​​​​​

C++/* USER CODE BEGIN Header *//********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"#include "adc.h"#include "dma.h"#include "tim.h"#include "usart.h"#include "gpio.h"
/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */#include "oled.h"#include "bsp_KT6368A.h"#include "myiic.h"#include "SENSOR.h"#include "usart.h"/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD */#define VOT 3.287/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */uint16_t adc_value[4]={0};uint8_t Flag=0;float temp=0,x,y,z;uint32_t second=0;uint8_t hh,mm,ss;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/*** @brief The application entry point.* @retval int*/int main(void){/* USER CODE BEGIN 1 */uint8_t DAT;uint16_t len;uint8_t i=0;/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC_Init();MX_TIM1_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */
T117_Init();OLED_Init();
HAL_Delay(2000);
//Set_SppName();HAL_Delay(1000);//Set_BLEName();HAL_Delay(1000);//Set_Power();HAL_ADC_Start_DMA(&hadc,(uint32_t *)(&(adc_value[0])),4);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);/* USER CODE END 2 */
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */char s[20];if(Flag){Flag=0;x=adc_value[0]/4095.0*VOT*2;if(x>=4.2){sprintf(s,"99%%");}else if(x>=4.06){sprintf(s,"90%%");}else if(x>=3.98){sprintf(s,"80%%");}else if(x>=3.92){sprintf(s,"70%%");}else if(x>=3.87){sprintf(s,"60%%");}else if(x>=3.82){sprintf(s,"50%%");}else if(x>=3.79){sprintf(s,"40%%");}else if(x>=3.77){sprintf(s,"30%%");}else if(x>=3.74){sprintf(s,"20%%");}else if(x>=3.68){sprintf(s,"10%%");}else if(x>=3.45){sprintf(s," 5%%");}else if(x>=3.33){sprintf(s," 1%%");}else{sprintf(s," 0%%");}
OLED_ShowString(0,0,s,8,1);//6*8
hh=second/3600;mm=(second%3600)/60;ss=second%60;
sprintf(s,"%02d:%02d:%02d",hh,mm,ss);OLED_ShowString(0,24,s,8,1);//6*8
// temp=adc_value[2]/4095.0*VOT;// y=25+(1.43-temp)/0.0043;// sprintf(s,"%6.3f",y);// OLED_ShowString(0,18,s,12,1);//6*8}if(T117_R_REG(0x03,&DAT)==0){if((DAT&0x20)==0){// DAT=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);// printf("A4:%d\r\n",DAT);// if(!(T117_R_REG(0x00,&DAT))){printf("LSB:%x\r\n",DAT);}// if(!(T117_R_REG(0x01,&DAT))){printf("MSB:%x\r\n",DAT);}DAT=T117_R_TEMP(&z);sprintf(s,"%5.2fC",z);OLED_ShowString(0,7,s,16,1);
}}
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)){if(USART_RX_STA&0x8000){len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度HAL_UART_Transmit(&huart2,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //等待发送结束printf("\r\n\r\n");//插入换行USART_RX_STA=0;printf("\r\nLEN:%d\r\n",len);}if(DAT==0){printf("T=%5.2fC\r\n",z);}sprintf(s,"BT:OK");OLED_ShowString(18,0,s,8,1);//6*8printf("V=%6.3fV\r\n",x);printf("%02d:%02d:%02d\r\n",hh,mm,ss);}else{sprintf(s,"BT:NO");OLED_ShowString(18,0,s,8,1);//6*8}
OLED_ShowChinese(48,0,0,16,1);OLED_ShowChinese(64,0,1,16,1);OLED_ShowChinese(80,0,2,16,1);OLED_ShowChinese(96,0,3,16,1);OLED_ShowChinese(112,0,4,16,1);//OLED_ShowChinese(48,16,5,16,1);OLED_ShowChinese(64,16,6,16,1);OLED_ShowChinese(80,16,7,16,1);OLED_ShowChinese(96,16,8,16,1);OLED_ShowChinese(112,16,9,16,1);
OLED_Refresh();HAL_Delay(2000);}/* USER CODE END 3 */}
/*** @brief System Clock Configuration* @retval None*/void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}
/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}}
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){//HAL_ADC_Stop(&hadc1);//HAL_ADC_Stop_DMA(&hadc1);//HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);Flag=1;second += 2;HAL_ADC_Start_DMA(hadc,(uint32_t *)(&(adc_value[0])),4);
}
/* USER CODE END 4 */
/*** @brief This function is executed in case of error occurrence.* @retval None*/void Error_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */}
#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/void assert_failed(uint8_t *file, uint32_t line){/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif /* USE_FULL_ASSERT */

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

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

相关文章

【buuctf Reverse】[GXYCTF2019]luck_guy wp

[GXYCTF2019]luck_guy https://buuoj.cn/challenges#[GXYCTF2019]luck_guy 只有一个可执行文件&#xff0c;IDA 64位直接干 进main函数&#xff0c;F5反编译&#xff0c;看主要处理函数&#xff0c;跳转进去 在这里看到。flag是由f1和f2拼出来的&#xff0c;f1在汇编中有…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…

飞桨paddlespeech语音唤醒推理C INT8 定点实现

前面的文章&#xff08;飞桨paddlespeech语音唤醒推理C定点实现&#xff09;讲了INT16的定点实现。因为目前商用的语音唤醒方案推理几乎都是INT8的定点实现&#xff0c;于是我又做了INT8的定点实现。 实现前做了一番调研。量化主要包括权重值量化和激活值量化。权重值由于较小且…

微信活动投票小程序源码系统:自主创建活动小程序带完整的安装代码包以及搭建教程

微信小程序的日益普及&#xff0c;越来越多的企业和个人开始关注如何利用小程序进行活动推广和用户互动。在这个背景下&#xff0c;微信活动投票小程序源码系统应运而生。这款源码系统旨在帮助用户快速创建自己的活动投票小程序&#xff0c;降低技术门槛&#xff0c;提高开发效…

主从数据库MySQL服务重启步骤与注意事项

主从数据库MySQL服务重启步骤与注意事项 实验环境&#xff1a; 172.20.26.34 &#xff08;主应用服务器&#xff09; 172.20.26.26 &#xff08;备应用服务器&#xff09; 172.20.26.37 &#xff08;主库服务器&#xff09; 172.20.26.38 &#xff08;从库服务器&…

迅为3588开发板Ubuntu安装Docker

在使用迅为 RK3588 开发板的时候&#xff0c;我们一般采用的是虚拟机安装 Ubuntu20.04 来编译 Android 源码或者 linux 源码&#xff0c;但是编译源码最让人头疼的是主机环境问题。假如我手上有很 多块开发板&#xff0c;每个开发板都使用不同的编译环境&#xff0c;而我本地电…

Java 类的加载流程

一、类的加载 指的是将类的.class 文件中的二进制 数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内&#xff0c;然后在堆区创 建一个 java.lang.Class 对象&#xff0c;用来封装类在方法区内的数据结构。 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内…

自己实现的小功能

小功能实现 2024/1/31 问题一&#xff1a; 将文本模式的csv文件作为表编辑之后&#xff0c;先要再变回来。找了5分钟都没找到&#xff0c;去网上搜也没搜到 解决方案 复制一份&#xff0c;对没错。 不是把表遍历一遍&#xff0c;重新将数据写入。 3.5给的答案就是重新写入…

C#小结:ScottPlot 5.0在VS2022桌面开发的应用(以winform为例)

目录 一、官网文档地址 二、在VS2022中安装Scottplot 三、拖动Scottplot 四、使用Scottplot 五、效果图 一、官网文档地址 官网地址&#xff1a;ScottPlot 5.0 食谱 本文内容来自于官网&#xff0c;选取了官网的一些比较好用的功能展示&#xff0c;如需学习更多功能&a…

深度学习(9)--pydot库和graphviz库安装流程详解

目录 一.pydot库安装 二.graphviz库安装 一.pydot库安装 pydot的安装可直接在编译器安装相关包&#xff0c;以PyCharm举例&#xff1a; 如果搜索可用软件包显示为空&#xff0c;记得在此处把使用Conda软件包管理器”点亮 二.graphviz库安装 点击链接下载安装包graphviz-2.38…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 &#xff08;1&#xff09;规则序列 &#xff08;2&#xff09; 注入序列 4.触发源 5. 转换时间 &#xff08;1&#xff09; ADC时钟 &#xff08;2&#xff09; 采样时间 6. 数据寄存器 &am…

抗体亲和力成熟制备高亲和力抗体-泰克生物

1.什么是抗体亲和力&#xff1f; 抗体亲和力是指抗体与抗原表位或抗原决定簇的结合强度&#xff0c;其实质是一种包含氨基酸间结合力——氢键、疏水性作用力等的非共价作用力。抗体亲和力的强弱取决于抗体与所用抗原表位的配合程度&#xff0c;其决定因素包括接触面积的大小、亲…

Linux实验记录:使用firewalld

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的d…

【buuctf Reverse】Java逆向解密wp

Java逆向解密 https://buuoj.cn/challenges#Java%E9%80%86%E5%90%91%E8%A7%A3%E5%AF%86 附件只有一个Reverse.class 用IntelliJ打开就能看到JAVA源码 这里就是生成flag的地方 int result arr[i] 64 ^ 32; 这个运算的逆运算难搞 注意运算的优先级&#xff0c;先运算在^ 代码…

图书管理系统(ArrayList和LinkedList)--versions3.0

目录 一、项目要求&#xff1a; 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0&#xff1a; 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次&#xff0c;点赞29次&#xff0c;收藏17次。本文使用…

5G智慧钢铁厂数字孪生三维可视化,推进钢铁新型工业化数字化转型

5G智慧钢铁厂数字孪生三维可视化&#xff0c;推进钢铁新型工业化数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为钢铁企业转型升级的必经之路。而5G技术的广泛应用&#xff0c;为钢铁企业数字化转型提供了新的机遇。其中&#xff0c;5G智慧钢铁厂数字孪生三维可…

cpu到达100%问题排查

0、背景 首先定位到mysql 的cpu使用率较高 原因是任务域的作业实例补偿定时任务相关sql查询问题&#xff0c;该sql 2min执行一次&#xff0c;一次查询两次&#xff0c;导致cpu飙升&#xff0c;可考虑优化sql&#xff0c;添加以下索引 ALTER TABLE scheduler.tbl_simba_os_sc…

StarRocks-3.1.0 单节点部署

1. 相关环境准备 FE&#xff1a; /opt/starrocks BE&#xff1a; /opt/starrocks 安装包下载 wget https://releases.starrocks.io/starrocks/StarRocks-3.1.0.tar.gz解压缩 tar -zxvf StarRocks-3.1.0.tar.gz 安装jdk (v2.5 及以上版本建议安装 JDK 11&#xff0c;我们使用…