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  0
    if (tnow != told)
    {
      if (tnow < told)
        tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
      else
        tcnt += 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);//根据频率确定参数 此时16MHZ
	FS_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  0
    if (tnow != told)
    {
      if (tnow < told)
        tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
      else
        tcnt += 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);//根据频率确定参数 此时16MHZ
	FS_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****/

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

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

相关文章

python连接FTP服务器:[WinError 10054] 远程主机强迫关闭了一个现有连接

一、原始报错信息 pythonProcess finished with exit code -1073740791 (0xC0000409) 这个报错信息&#xff0c;太过于笼统&#xff0c;是分析不出代码出了什么问题的。 二、打印详细报错信息 在服务器相关可能报错的地方&#xff0c;进行报错信息追踪&#xff1a; import …

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用&#xff0c;智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中&#xff0c;智能小车需要在复杂的环境中自主导航和决策&#xff0c;这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

SpringBoot搭建OAuth2

背景 前几天自己从零开始的搭建了CAS 服务器&#xff0c;结果差强人意&#xff08;反正是成功了&#xff09;。这几天&#xff0c;我躁动的心又开始压抑不住了&#xff0c;没错&#xff0c;我盯上OAuth2了&#xff0c;大佬们都说OAuth2比CAS牛批&#xff0c;我就想知道它有多牛…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch&#xff0c;没有遇到什么问题。今天在现有JDK上安装&#xff0c;遇到的问题记录一下&#xff1a; 1. JDK的环境变量配置与我原有的不一致报如下错误&#xff1a; [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

SSL函数01-数组函数Array Functions

一、数组的初始化 SSL中&#xff0c;数组下标从1开始&#xff01; 1-1、不知道数组的长度 :DECLARE a6; a6 : {}; Aadd(a6,a); Aadd(a6,b); Aadd(a6,c); 当用a : {}创建一个数组的时候&#xff0c;不可以用a[1] 值&#xff0c;来赋值&#xff01; 1-2、知道数组的长度 方式一…

【录用案例】2天录用!提交可录,沾边即可!

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;录用友好&#xff09; EI • 计算机工程生物医学等&#xff08;2天录用&#xff09; CNKI • 3天内初审录用&#xff0c;随即出版&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#x…

数据链路层 + NAT技术

数据链路层&#xff1a;负责设备之间的数据帧的传送和识别。 一、以太网 以太网的帧格式 如何分离报头和有效数据&#xff1f; 报头是固定长度的 如何将数据交给上层协议&#xff1f; 通过类型&#xff0c;如果是0800&#xff0c;则交给IP协议&#xff0c;如果是0806&#xf…

JavaScript正则表达式

一、介绍 正则表达式是用于匹配字符串中字符组合的模式。在javascript中&#xff0c;正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本&#xff0c;许多语言都支持正则表达式。 正则表达式的作用&#xff1a; 表单验证&#xff08;匹配&#xff09;、过滤敏感…

筛斗数据提取:解锁信息宝藏的关键步骤

在数字化时代&#xff0c;数据已成为推动社会进步和企业发展的关键要素。然而&#xff0c;数据本身并不直接产生价值&#xff0c;其价值在于我们如何从中提取有用的信息。数据提取&#xff0c;作为解锁信息宝藏的关键步骤&#xff0c;对于任何希望从海量数据中获取洞察力和竞争…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心&#xff08;上篇&#xff09; 热身tops&#xff1a;选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式&#xff0c;开发模式他会跟你提示代码出现错误的地方以及出错原因&#xff0c;而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

人脸识别——筛选与删除重复或近似重复数据提高人脸识别的精确度

1. 概述 人脸识别研究通常使用从网上收集的人脸图像数据集&#xff0c;但这些数据集可能包含重复的人脸图像。为了解决这个问题&#xff0c;我们需要一种方法来检测人脸图像数据集中的重复图像&#xff0c;并提高其质量。本文介绍了一种检测人脸图像数据集中重复图像的方法。该…

有趣的css - 双开门按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个双开门的按钮&#xff0c;交互效果比较强&#xff0c;但是实现很简单&#xff0c;快学起来吧。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码cs…

充电宝哪家好用推荐?买什么充电宝性价比高?2024年充电宝排行榜

说实话&#xff0c;我其实是个手机重度使用者&#xff0c;买过的充电宝也有无数款了&#xff0c;每次手机没电的时候插座都离得不是特别近&#xff0c;不是要下床充电就是要固定在一个位置充电感觉怪麻烦的&#xff0c;但是有了充电宝后可以在床上玩手机都不用担心手机没电&…

惯性测量单元M-G366PDG提供低误差系数的解决方案

人形机器人、自动驾驶的快速发展&#xff0c;促成了惯性测量单元(IMU)的爆火市场。据相关研究报告统计&#xff0c;IMU全球市场规模从2018年的99.94亿美元增加至2021年的135.95亿美元预计2027年将达到222.53亿美元&#xff0c;2021年至2027年复合增长率达8.56%。而由于智能技术…

VUE3+TS+elementplus创建table,纯前端的table

一、前言 开始学习前端&#xff0c;直接从VUE3开始&#xff0c;从简单的创建表格开始。因为自己不是专业的程序员&#xff0c;编程主要是为了辅助自己的工作&#xff0c;提高工作效率&#xff0c;VUE的基础知识并不牢固&#xff0c;主要是为了快速上手&#xff0c;能够做出一些…

免费,Python蓝桥杯等级考试真题--第13级(含答案解析和代码)

Python蓝桥杯等级考试真题–第13级 一、 选择题 答案&#xff1a;C 解析&#xff1a;正向下标由0开始&#xff0c;下标3代表第四个元素&#xff0c;故答案为C。 答案&#xff1a;A 解析&#xff1a;range&#xff08;0,4&#xff09;的取前不取后&#xff0c;元组的符号是小括…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

Transformer模型的简单学习

前言 Transformer 来源于一篇论文&#xff1a;Attention is all you need TRM在做一件什么事情呢&#xff1f;其实一开始它是被用于机器翻译的&#xff1a; 更详细的&#xff1a; 更详细的&#xff1a; 从上图可以看出&#xff0c;一个Encoders 下面包含了 n 个 Encoder&…

triton之paged attention

一 原理 图解大模型计算加速系列之&#xff1a;vLLM核心技术PagedAttention原理 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/691038809 二 源码分析 1 测试参数设置 test_paged_attention(num_seqs32,num_heads(64, 64),head_size64,block_size16,dtypetorch.float16,…

【ARM+Codesys案例】RK3568 +Codesys 软PLC方案在电镀生产线的应用

1 电镀生产简介 电镀是一种比较重要的工艺&#xff0c;产品经过电镀工艺处理后&#xff0c;不仅产品质量获得提高&#xff0c;产品性能也会大幅度提高&#xff0c;同时延长了产品的使用时间。电镀生产线是指按一定的电镀生产工艺要求,将有关的各种电镀处理槽、电镀行车运动装置…