C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求:

设备自检功能:

设备上电自检(检查传感器采集是否正常, DHT11有存在响应, 可以自检使用, )自检通过后,由串口打印设备状态信息。

自动控制功能:

进入自动控制模式, LCD显示温湿度信息 加热片制冷片风机状态。与上位机通信( 串口助手), 每2s发送设备状态信(温湿度值,风机状态,制冷片状态,加热片状态)到上位机 。

阈值设置功能:

可以通过五向按键选择并调整温湿度的阈值大小。

可以通过上位机发送命令设定温湿度的阈值大小。

二、功能概述

模块

功能

LCD显示屏

显示温湿度, 风机开关情况 ,制冷片开关情况, 加热片开关情况, 温湿

度上下阈值

LED

三个灯分别模拟风机 、制冷片, 加热片 。( 灯亮表示开, 灯灭表示关)

PA0

电池电压采集(选做)

串口

数据接收及下发数据控制

低温加热

当环境温度低于设置的阈值时, 加热片启动 。加热到温度阈值5度以上停止工作

高温降温

当环境温度高于设置的阈值时,制冷片启动 。降温到温度阈值5度以下停止工作

除湿

当环境湿度高于设置的阈值时, 风机和制冷片,加热片启动 。湿度低于设置的阈值停止。

三、除湿器项目设计说明

  湿度高于阈值,加热片、制冷片、风机同时工作

  温度也高于某一阈值,制冷片工作

四、项目实验

1.打开stm32cube max,创建新的工程,以STM32G030C8Tx芯片建立工程,配置相关引脚。

2.完成相关配置,生成hal库函数的标准代码

3.分别将Lcd和DHT11的驱动.c文件和头文件放到生成文件中的code的Src和Inc文件中

4.完成相关代码的编写,然后完成相关实验

五、代码解析

1.延时函数

        滴答计时器是向下计数的,told是获取的计数器的初值,tnow是在每次循环的开始重新获取计数器的数值;如果told大于tnow代表计数器正常运行,tcnt就加一,如果全程没有错误,等到tcnt大于计数器初值的时候退出,计数结束;

         如果中途出现told小于tnow时,就代表着循环了一圈了,用重载值减去tnow现在的值,再加上tnow,还是相当于tcnt就加一,等到tcnt大于计数器初值的时候退出,计数结束,实现延时功能。

static uint32_t fac_us = 0; //us延时倍乘数void delay_init(uint8_t SYSCLK)
{fac_us = SYSCLK;
}void delay_us(uint32_t nus)//100  6800
{uint32_t ticks;uint32_t told, tnow, tcnt = 0;uint32_t reload = SysTick->LOAD; //LOAD的值ticks = nus * fac_us;            //需要的节拍数told = SysTick->VAL;             // 24  刚进入时的计数器值while (1){tnow = SysTick->VAL;//22  20  0if (tnow != told){if (tnow < told)tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.elsetcnt += reload - tnow + told;told = tnow;if (tcnt >= ticks)break; //时间超过/等于要延迟的时间,则退出.}};
}
void delay_ms(uint16_t nms)
{uint32_t i;for (i = 0; i < nms; i++)delay_us(1000);
}

2.定义全局变量和主函数

初始化LCD和DHT11,开始时检验DHT11是否正常,无论是否正常都反馈;如果DHT11正常的话,读取温湿度数据。

/* USER CODE BEGIN PFP */
uint8_t humiH;
uint8_t humiL;
uint8_t tempH;
uint8_t tempL;
int tempmax=30;
int tempmin=26;
int humimax=65;
float temp;
char lcdtem[16]="";
char lcdhum[16]="";
char humiset[16]="";
char tmaxset[16]="";
char tminset[16]="";
char devh[32]="devhot: off";
char devc[32]="devcold:off";
char fun[32]="fun:    off";
char set[32]="";
char md[3]="CS";
int setmode=0;
int high=0;
int low=0;
int mode=0;
int color0=BLUE;
int color1=BLUE;
int color2=BLUE; 
/* USER CODE END PFP */
int main(void)
{/* USER CODE BEGIN 1 *//* 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_USART1_UART_Init();MX_TIM16_Init();MX_ADC1_Init();/* USER CODE BEGIN 2 */Lcd_Init();Lcd_Clear(BLUE);delay_init(16);//根据频率确定参数 此时16MHZFS_DHT11_Init();//自检初始化函数 检测能否正常通信 只关心起始信号的正确性 不关心后面的数据HAL_Delay(500);if(!FS_DHT11_Init()) //根据0或1的返回值 由子函数可知 0自检成功 1表示失败{printf("check ok\n");Gui_DrawFont_GBK16(15,40,YELLOW,BLUE,"check ok   ");}Lcd_Clear(BLUE);HAL_TIM_Base_Start_IT(&htim16);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */DHT11_Read_Data(&humiH,&humiL,&tempH,&tempL);temp = tempH + tempL*0.1;HAL_UART_Receive_IT(&huart1,set,10);dev_control();send_lcd();HAL_ADC_Start(&hadc1);//启动ADC转化HAL_ADC_PollForConversion(&hadc1,1000);//等待转换完成,多通道不可用uint32_t key = HAL_ADC_GetValue(&hadc1);//获取ADC转化值HAL_ADC_Stop(&hadc1);//停止ADC转化HAL_Delay(300);}/* USER CODE END 3 */
}

3.控制函数

将控制模式分为两种,模式1控制除湿,如果湿度大于阈值,进行除湿;模式2控制升温和降温,如果大于高温阈值,就进行降温;如果小于低温阈值,就进行升温。

void dev_control()
{if(mode==1){strcpy(md,"CS");if(humiH>humimax)//除湿{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,0);strcpy(devh,"devhot:  on");strcpy(devc,"devcold: on");strcpy(fun,"fun:     on");}else{strcpy(devh,"devhot: off");strcpy(devc,"devcold:off");strcpy(fun,"fun:    off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,1);}}if(mode==0){strcpy(md,"KW");if(temp>tempmax)//高温 降温{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_2,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,0);strcpy(devh,"devhot: off");strcpy(devc,"devcold: on");strcpy(fun,"fun:    off");}else if(temp<(tempmax-5)){strcpy(devc,"devcold:off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,1);}if(temp<tempmin)//低温 加热{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1 | GPIO_PIN_2,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);strcpy(devh,"devhot:  on");strcpy(devc,"devcold:off");strcpy(fun,"fun:    off");}else if(temp>(tempmin+5)){strcpy(devh,"devhot: off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);}}
}

4.LCD数据显示

将temp等数值在屏幕中显示出来。

void send_lcd()
{sprintf(lcdtem,"Temp:%.2fC",temp);sprintf(lcdhum,"Humi:%d%%",humiH);sprintf(humiset,"HumiMax:%d%%",humimax);sprintf(tmaxset,"TempMax:%dC",tempmax);sprintf(tminset,"TempMin:%dC",tempmin);Gui_DrawFont_GBK16(5,5,YELLOW,BLUE,lcdtem);Gui_DrawFont_GBK16(100,5,WHITE,BLACK,md);Gui_DrawFont_GBK16(5,20,YELLOW,BLUE,lcdhum);Gui_DrawFont_GBK16(5,35,YELLOW,BLUE,devh);Gui_DrawFont_GBK16(5,50,YELLOW,BLUE,devc);Gui_DrawFont_GBK16(5,65,YELLOW,BLUE,fun);Gui_DrawFont_GBK16(5,80,YELLOW,color0,humiset);Gui_DrawFont_GBK16(5,95,YELLOW,color1,tmaxset);Gui_DrawFont_GBK16(5,110,YELLOW,color2,tminset);
}

5.按键控制

根据五向按键每个方向都可以产生不同参数,然后根据相应参数,进行控制阈值的改变

//上 2100-2000
//下 500-600
//左1500-1600
//右2900-3000
//中2500-2600
void change_data(int key)
{if((key>1900)&&(key<2200))//增加温度{if(low==1){tempmin++;}else if(high==1){tempmax++;}}else if((key>400)&&(key<700))//减小温度{if(low==1){tempmin--;}else if(high==1){tempmax--;}}else if((key>1400)&&(key<1700))//减小湿度{color0=BLACK;color1=BLUE;color2=BLUE;humimax--;}else if((key>2800)&&(key<3100))//增大湿度{color0=BLACK;color1=BLUE;color2=BLUE;humimax++;}else if((key>2400)&&(key<2700))//进入或退出调节模式{if(setmode == 0){setmode=1;high=1;low=0;color0=BLUE;color1=BLACK;color2=BLUE;}else if(setmode == 1){low=1;high=0;setmode=2;color0=BLUE;color1=BLUE;color2=BLACK;}else{setmode=0;color0=BLUE;color1=BLUE;color2=BLUE;}}
}
/* USER CODE END 4 */

6.输出重定向

int fputc(int ch,FILE *p)
{while(!(USART1->ISR &(1<<7)));USART1->TDR = ch;return ch;
}

7.ADC中断

void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{HAL_ADC_Start(&hadc1);//启动ADC转化HAL_ADC_PollForConversion(&hadc1,1000);//等待转换完成,多通道不可用uint32_t key = HAL_ADC_GetValue(&hadc1);//获取ADC转化值HAL_ADC_Stop(&hadc1);//停止ADC转化change_data(key);
}

8.串口响应中断

 查找到相关数据,并将收到的数据转化成字符串,然后向串口发送

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim==&htim16){printf("temp = %.2fC  humi = %d%%\n %s %s %s ",temp,humiH,devh,devc,fun);}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(strstr(set,"tempmax:")){sscanf(set,"tempmax:%d",&tempmax);printf("recvdata=%s",set);}else if(strstr(set,"tempmin:")){sscanf(set,"tempmin:%d",&tempmin);printf("recvdata=%s",set);}else if(strstr(set,"humimax:")){sscanf(set,"humimax:%d",&humimax);printf("recvdata=%s",set);}else if(strstr(set,"modeset==")){sscanf(set,"modeset==%d",&mode);printf("recvdata=%s",set);}
}

六、主函数完整代码

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2024 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "dht11.h"
#include <stdio.h>
#include "lcd.h"
#include "string.h"
static uint32_t fac_us = 0; //us延时倍乘数void delay_init(uint8_t SYSCLK)
{fac_us = SYSCLK;
}void delay_us(uint32_t nus)//100  6800
{uint32_t ticks;uint32_t told, tnow, tcnt = 0;uint32_t reload = SysTick->LOAD; //LOAD的值ticks = nus * fac_us;            //需要的节拍数told = SysTick->VAL;             // 24  刚进入时的计数器值while (1){tnow = SysTick->VAL;//22  20  0if (tnow != told){if (tnow < told)tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.elsetcnt += reload - tnow + told;told = tnow;if (tcnt >= ticks)break; //时间超过/等于要延迟的时间,则退出.}};
}
void delay_ms(uint16_t nms)
{uint32_t i;for (i = 0; i < nms; i++)delay_us(1000);
}/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint8_t humiH;
uint8_t humiL;
uint8_t tempH;
uint8_t tempL;
int tempmax=30;
int tempmin=26;
int humimax=65;
float temp;
char lcdtem[16]="";
char lcdhum[16]="";
char humiset[16]="";
char tmaxset[16]="";
char tminset[16]="";
char devh[32]="devhot: off";
char devc[32]="devcold:off";
char fun[32]="fun:    off";
char set[32]="";
char md[3]="CS";
int setmode=0;
int high=0;
int low=0;
int mode=0;
int color0=BLUE;
int color1=BLUE;
int color2=BLUE; 
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void dev_control();
void send_lcd();
void change_data(int key);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim==&htim16){printf("temp = %.2fC  humi = %d%%\n %s %s %s ",temp,humiH,devh,devc,fun);}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(strstr(set,"tempmax:")){sscanf(set,"tempmax:%d",&tempmax);printf("recvdata=%s",set);}else if(strstr(set,"tempmin:")){sscanf(set,"tempmin:%d",&tempmin);printf("recvdata=%s",set);}else if(strstr(set,"humimax:")){sscanf(set,"humimax:%d",&humimax);printf("recvdata=%s",set);}else if(strstr(set,"modeset==")){sscanf(set,"modeset==%d",&mode);printf("recvdata=%s",set);}
}
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{HAL_ADC_Start(&hadc1);//启动ADC转化HAL_ADC_PollForConversion(&hadc1,1000);//等待转换完成,多通道不可用uint32_t key = HAL_ADC_GetValue(&hadc1);//获取ADC转化值HAL_ADC_Stop(&hadc1);//停止ADC转化change_data(key);
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 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_USART1_UART_Init();MX_TIM16_Init();MX_ADC1_Init();/* USER CODE BEGIN 2 */Lcd_Init();Lcd_Clear(BLUE);delay_init(16);//根据频率确定参数 此时16MHZFS_DHT11_Init();//自检初始化函数 检测能否正常通信 只关心起始信号的正确性 不关心后面的数据HAL_Delay(500);if(!FS_DHT11_Init()) //根据0或1的返回值 由子函数可知 0自检成功 1表示失败{printf("check ok\n");Gui_DrawFont_GBK16(15,40,YELLOW,BLUE,"check ok   ");}Lcd_Clear(BLUE);HAL_TIM_Base_Start_IT(&htim16);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */DHT11_Read_Data(&humiH,&humiL,&tempH,&tempL);temp = tempH + tempL*0.1;HAL_UART_Receive_IT(&huart1,set,10);dev_control();send_lcd();HAL_ADC_Start(&hadc1);//启动ADC转化HAL_ADC_PollForConversion(&hadc1,1000);//等待转换完成,多通道不可用uint32_t key = HAL_ADC_GetValue(&hadc1);//获取ADC转化值HAL_ADC_Stop(&hadc1);//停止ADC转化HAL_Delay(300);}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage*/HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);/** 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.HSIDiv = RCC_HSI_DIV1;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_2) != HAL_OK){Error_Handler();}/** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *p)
{while(!(USART1->ISR &(1<<7)));USART1->TDR = ch;return ch;
}//PB0 蒸发器
//PB1 制冷片
//PB2 风机
void dev_control()
{if(mode==1){strcpy(md,"CS");if(humiH>humimax)//除湿{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,0);strcpy(devh,"devhot:  on");strcpy(devc,"devcold: on");strcpy(fun,"fun:     on");}else{strcpy(devh,"devhot: off");strcpy(devc,"devcold:off");strcpy(fun,"fun:    off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,1);}}if(mode==0){strcpy(md,"KW");if(temp>tempmax)//高温 降温{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 | GPIO_PIN_2,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,0);strcpy(devh,"devhot: off");strcpy(devc,"devcold: on");strcpy(fun,"fun:    off");}else if(temp<(tempmax-5)){strcpy(devc,"devcold:off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,1);}if(temp<tempmin)//低温 加热{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1 | GPIO_PIN_2,1);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);strcpy(devh,"devhot:  on");strcpy(devc,"devcold:off");strcpy(fun,"fun:    off");}else if(temp>(tempmin+5)){strcpy(devh,"devhot: off");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);}}
}
void send_lcd()
{sprintf(lcdtem,"Temp:%.2fC",temp);sprintf(lcdhum,"Humi:%d%%",humiH);sprintf(humiset,"HumiMax:%d%%",humimax);sprintf(tmaxset,"TempMax:%dC",tempmax);sprintf(tminset,"TempMin:%dC",tempmin);Gui_DrawFont_GBK16(5,5,YELLOW,BLUE,lcdtem);Gui_DrawFont_GBK16(100,5,WHITE,BLACK,md);Gui_DrawFont_GBK16(5,20,YELLOW,BLUE,lcdhum);Gui_DrawFont_GBK16(5,35,YELLOW,BLUE,devh);Gui_DrawFont_GBK16(5,50,YELLOW,BLUE,devc);Gui_DrawFont_GBK16(5,65,YELLOW,BLUE,fun);Gui_DrawFont_GBK16(5,80,YELLOW,color0,humiset);Gui_DrawFont_GBK16(5,95,YELLOW,color1,tmaxset);Gui_DrawFont_GBK16(5,110,YELLOW,color2,tminset);
}
//上 2100-2000
//下 500-600
//左1500-1600
//右2900-3000
//中2500-2600
void change_data(int key)
{if((key>1900)&&(key<2200))//增加温度{if(low==1){tempmin++;}else if(high==1){tempmax++;}}else if((key>400)&&(key<700))//减小温度{if(low==1){tempmin--;}else if(high==1){tempmax--;}}else if((key>1400)&&(key<1700))//减小湿度{color0=BLACK;color1=BLUE;color2=BLUE;humimax--;}else if((key>2800)&&(key<3100))//增大湿度{color0=BLACK;color1=BLUE;color2=BLUE;humimax++;}else if((key>2400)&&(key<2700))//进入或退出调节模式{if(setmode == 0){setmode=1;high=1;low=0;color0=BLUE;color1=BLACK;color2=BLUE;}else if(setmode == 1){low=1;high=0;setmode=2;color0=BLUE;color1=BLUE;color2=BLACK;}else{setmode=0;color0=BLUE;color1=BLUE;color2=BLUE;}}
}
/* 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 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

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

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

相关文章

Clickhouse MergeTree 存储引擎架构总结——Clickhouse 架构篇(二)

文章目录 前言MergeTree存储引擎的三大特点MergeTree 的数据组织MergeTree的文件组织数据文件、元数据文件、索引文件和其他文件分区数据库和表 索引与事务数据库存储引擎的对比存储引擎如何影响查询速度MergeTree存储引擎的工作过程 前言 存储引擎是ClickHouse非常重要的一个…

小易大数据:大数据报告查询领域的黑马,这些优势让你无法忽视!

随着大数据技术被运用到各行各业&#xff0c;风控领域也不例外&#xff0c;形成了基于大数据技术的大数据信用&#xff0c;也就是我们常说的大数据报告或者网贷大数据&#xff0c;在众多的查询平台中&#xff0c;小易大数据平台在市面上是比较受欢迎的&#xff0c;那在小易平台…

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术&#xff0c;将磁盘文件&#xff0c;通过映射对象&#xff08;存储在物理内存&#xff09;关联&#xff0c;映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…

C-数据结构-树状存储基本概念

‘’’ 树状存储基本概念 深度&#xff08;层数&#xff09; 度&#xff08;子树个数&#xff09; 叶子 孩子 兄弟 堂兄弟 二叉树&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 存储&#xff1a;顺序&#xff0c;链式 树的遍历&#xff1a;按层遍历&#xff0…

Kibana(一张图片胜过千万行日志)

Kibana&#xff08;一张图片胜过千万行日志&#xff09; Kibana是一个开源的分析和可视化平台&#xff0c;设计用于和Elasticsearch一起工作。 你用Kibana来搜索&#xff0c;查看&#xff0c;并和存储在Elasticsearch索引中的数据进行交互。 你可以轻松地执行高级数据分析&a…

LangChain 0.2 - 基于 SQL 数据构建问答系统

本文翻译整理自&#xff1a;Build a Question/Answering system over SQL data https://python.langchain.com/v0.2/docs/tutorials/sql_qa/ 文章目录 一、项目说明⚠️ 安全说明⚠️架构 二、设置三、Chains1、将问题转换为 SQL查询2、执行 SQL查询3、回答问题 四、Agents1、S…

TiDB学习3:TiKV

目录 1. TiKV架构和作用 2. RocksDB 2.1 写入 2.2 查询 2.3 Column Families列簇 3. 分布式事务 3.1 事务流程 3.2 分布式事务流程 3.3 MVCC 4. Raft与Multi Raft 4.1 Raft日志复制 4.2 Raft Leader选举 5. TiKV- 读写 5.1 数据的写入 5.2 数据的读取ReadIndex …

夏日防晒笔记

1 防晒霜 使用方法&#xff1a;使用前上下摇晃瓶身4至5次&#xff0c;在距离肌肤10至15cm处均匀喷上。如在面部使用&#xff0c;请先喷在掌心再均匀涂抹于面部。排汗量较多时或擦拭肌肤后&#xff0c;请重复涂抹以确保防晒效果。卸除时使用普通洁肤产品洗净即可。

leetcode-主持人调度(二)-110

题目要求 思路 1.先将开始时间和结束时间拆分放到两个数组中进行排序 2.如果开始的时间小于结束时间&#xff0c;说明目前没有空闲的人&#xff0c;需要增加人&#xff0c;如果大于等于&#xff0c;说明有人刚结束了主持&#xff0c;可以进行新的主持了&#xff0c;变更到下一…

深度学习-序列模型

深度学习-序列模型 1. 定义2. 应用领域3. 典型模型4. 技术细节5. 总结 序列模型是一种处理序列数据的机器学习模型&#xff0c;其输入和/或输出通常为序列形式的数据。以下是关于序列模型的详细解释&#xff1a; 1. 定义 序列模型是输入输出均为序列数据的模型&#xff0c;它…

【Django】开发个人博客系统【1】

使用Django开发个人博客系统&#xff0c;博客系统包括用户&#xff08;博主&#xff09;注册和登录、博主资料信息、图片墙功能、留言板功能、文章列表、文章正文内容和Admin后台系统。 1. 项目架构设计 下一步将上述设置写入Django的配置文件settings.py&#xff0c;当Django…

R可视化:另类的柱状图

介绍 方格状态的柱状图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

【代码随想录——回溯算法——三周目】

1. 子集2 这题需要先进行排序&#xff0c;和候选人那题类似。防止出现重复的子集。 func subsetsWithDup(nums []int) [][]int {path : make([]int, 0)res : make([][]int, 0)sort.Ints(nums)var dfs func(nums []int, start int)dfs func(nums []int, start int) {res app…

保留两位小数不四舍五入,10000.55变成10000.54的坑

正解 function moneyFormat(num){ let money num "";//隐式转换为字符串和toString()效果一样//没有小数补齐这个0if(money.indexOf(".")"-1"){moneymoney".00";}else{//有小数截取前二位小数moneymoney.substring(0,money.inde…

多线程基本常识

多线程的状态 在Java中&#xff0c;一个线程的生命周期有以下几种状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;当线程对象被创建时&#xff0c;线程处于新建状态。此时线程对象存在&#xff0c;但还没有调用start()方法启动线程。 运行&#xff08;Runnable…

逆向基础:软件手动脱壳技术入门

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过的程序可以直接运行&#xff0c;但是不能查看源代码…

基于多源数据的微服务系统失败测试用例诊断

简介 本文介绍由南开大学、华为云及清华大学共同合作的论文:基于多源数据的微服务系统失败测试用例诊断。该论文已被FSE 2024&#xff08;The ACM International Conference on the Foundations of Software Engineering&#xff09; 会议录用&#xff0c;论文标题为: Fault D…

【MySQL】库的操作+表的操作

库的操作表的操作 1.库的操作1.1创建数据库1.2删除数据库1.3查找数据库1.4修改数据库1.5数据库备份和恢复1.6查看连接情况 2.库的操作2.1创建表2.2查看表结构2.3修改表2.4删除表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; …

[数据集][目标检测]红外车辆检测数据集VOC+YOLO格式13979张类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;13979 标注数量(xml文件个数)&#xff1a;13979 标注数量(txt文件个数)&#xff1a;13979 标…

网络流量探针与流量分析系统:全面指南

目录 什么是网络流量探针&#xff1f; 流量分析系统的功能与重要性 流量分析系统的主要功能 流量分析系统的重要性 AnaTraf 网络流量分析仪 如何选择合适的网络流量探针与流量分析系统&#xff1f; 1. 性能与扩展性 2. 易用性与部署 3. 数据可视化与报告 4. 安全性与…