Diseño de simulación proteus de alarma de detección de concentración de humo basado en stm32 (simulación + programa + explicación)

Diseño de simulación de alarmas y detección de concentración de humo basado en STM32 (simulación + programa + explicación)


Diseño de simulación de alarmas y detección de concentración de humo basado en STM32 (simulación + programa + explicación)

Diagrama de simulación proteus 8.9

Compilador de programas: keil 5

Lenguaje de programación: lenguaje C

Número de diseño: C0085

1. Funciones principales

Función descriptiva:

1. Utilice el microcontrolador STM32 y el núcleo de control MQ-2 para diseñar la detección de concentración de humo y el diseño de alarma;

2. Muestre la concentración de humo a través de la pantalla LCD LCD1602 y la computadora host del puerto serie, MV representa el valor de detección y ALM representa el valor de alarma;

3. El valor de la alarma ALM de concentración de humo se puede configurar presionando el botón.

4. Cuando la concentración de humo monitoreada es mayor que el valor de alarma, el circuito de alarma del timbre se enciende y el timbre suena. Cuando se enciende el interruptor de palanca, el ventilador gira para ventilar.

5. La alarma sonora predeterminada se detecta cuando la concentración de humo es superior a 200 ppm.

Equipo de hardware principal: microcontrolador STM32F103

La siguiente es una visualización de esta información de diseño:

2. Simulación

Plan de diseño general

Este experimento utiliza el ADC, GPIO, temporizador y otros recursos del microcontrolador STM32 para combinar orgánicamente el software y el hardware, de modo que el sistema pueda identificar correctamente la entrada del valor AD al sensor de concentración de humo simulado, el LCD1602 pueda mostrarlo correctamente y El zumbador se puede mostrar de acuerdo con el valor de alarma de concentración de humo. Cabe señalar que Proteus no tiene sensores de concentración de humo como el MQ-2. Este diseño utiliza un reóstato deslizante para simular cambios en la concentración de humo y no se puede utilizar directamente en el diseño físico. Si es necesario, se debe depurar de acuerdo con las condiciones físicas. objeto.

Estado de ejecución de la simulación:

Después de iniciar la simulación, LCD1602 muestra la concentración de humo detectada en tiempo real y el valor medido se puede cambiar a través del reóstato deslizante. La concentración del valor de la alarma se puede configurar presionando el botón, presione el botón de configuración para ingresar al modo de configuración, aumente el valor de la alarma mediante la configuración + y disminuya el valor de la alarma mediante la configuración -. El circuito de alarma del zumbador se inicia cuando la concentración de humo es mayor que el valor de la alarma y se escucha un pitido de alarma, y ​​no se inicia cuando la concentración de humo es menor que el valor de la alarma.

Este diseño utiliza un zumbador electromagnético. El zumbador electromagnético consta de un oscilador, una bobina electromagnética, un imán, un diafragma vibratorio y una carcasa. Después de encender la alimentación, la corriente de la señal de audio generada por el oscilador pasa a través de la bobina electromagnética, lo que hace que la bobina electromagnética genere un campo magnético. El diafragma vibratorio vibra periódicamente y produce sonido bajo la interacción de la bobina electromagnética y el imán. Por lo tanto, se requiere una cierta corriente para activarlo. La salida de corriente del pin de E/S del microcontrolador es pequeña. La salida de nivel TTL del microcontrolador básicamente no puede controlar el zumbador, por lo que es necesario agregar un circuito de amplificación de corriente. El electrodo positivo del zumbador está conectado a la fuente de alimentación VCC (+5 V), y el electrodo negativo del zumbador está conectado al colector C del triodo. La base B del triodo está controlada por el pin BEEP del microcontrolador. después de pasar a través de la resistencia limitadora de corriente. Cuando la salida BEEP es baja Cuando BEEP emite un nivel alto, el triodo QS se apaga, no fluye corriente a través de la bobina y el zumbador no suena; cuando BEEP emite un nivel alto, el El triodo se enciende, de modo que la corriente del zumbador forma un bucle y emite un sonido.

La siguiente imagen muestra que la concentración de humo es de 192 ppm, que es inferior al valor de alarma de 200, y el circuito del timbre no funciona.
imagen

En la imagen de abajo, la concentración de humo detectada es 204 ppm, que es mayor o igual al valor de alarma. El transistor está encendido y el zumbador suena.imagen

3. Procedimiento

El programa se abre con la versión keil5 mdk, si hay problemas al abrirlo, verifique la versión keil. El programa está escrito en la versión de la biblioteca HAL y hay comentarios que se pueden entender junto con el video explicativo.
imagen

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 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 "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd1602.h"
#include "stdio.h"
/* 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 */
	uint16_t Tim_cnt = 0;  //定时器变量
	uint8_t set_flag = 0;
	float warming_val=200;	//报警浓度大小
/* 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 */

/* 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 */
	ADC_ChannelConfTypeDef sConfig = {
    
    0};  //建立sConfig结构体
	char str[20];  //字符串的存放数组
	uint32_t adcv; //存放ADC转换结果
	float temp;
	set_flag = 0;


  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
	sConfig.Rank = ADC_REGULAR_RANK_1;
	sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;   //采样周期为1.5个周期
  /* 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_ADC1_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();  //初始化LCD1602
	HAL_TIM_Base_Start_IT(&htim3);//开启定时器3
//	LCD_ShowString(0,0,dis_str);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
		sConfig.Channel = ADC_CHANNEL_1;   //选择通道1
		HAL_ADC_ConfigChannel(&hadc1, &sConfig);  //选择ADC1的通道道1
		HAL_ADC_Start(&hadc1);										//启动ADC1
		HAL_ADC_PollForConversion(&hadc1, 10);		//等待ADC1转换结束,超时设定为10ms
		adcv = HAL_ADC_GetValue(&hadc1);					//读取ADC1的转换结果
		
		
		temp=(float)adcv*(4.0/4095)*100;		
	
		sprintf(str,"%4.0fppm",temp);
		LCD_ShowString(0,0,"MV:");	
		LCD_ShowString(0,4,str);	
	  HAL_UART_Transmit(&huart1, (uint8_t *)&"AL=", 3, 10);  //串口1发送字符串,数组长度为12,超时10ms
		HAL_UART_Transmit(&huart1, (uint8_t *)str, 6, 10);		 //串口1发送字符串,数组长度为5,超时10ms
		HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 10); //串口1发送字符串,数组长度为2,超时10ms	
		
		if(set_flag){
    
    //设置模式
			sprintf(str,"%4.0fppm^ ",warming_val);
			LCD_ShowString(1,0,"ALM:");	
			LCD_ShowString(1,4,str);
		}else{
    
    
			sprintf(str,"%4.0fppm  ",warming_val);
			LCD_ShowString(1,0,"ALM:");	
			LCD_ShowString(1,4,str);			
		}
		
	  HAL_UART_Transmit(&huart1, (uint8_t *)&"ALM=", 4, 10);  //串口1发送字符串,数组长度为12,超时10ms
		HAL_UART_Transmit(&huart1, (uint8_t *)str, 6, 10);								//串口1发送字符串,数组长度为5,超时10ms
		HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 10);						//串口1发送字符串,数组长度为2,超时10ms	
		
		if(temp>warming_val&&!set_flag){
    
    //如果超过报警值
			HAL_GPIO_WritePin(GPIOA,BEEP_Pin, GPIO_PIN_RESET);//BEEP引脚拉低
		}else{
    
    
			HAL_GPIO_WritePin(GPIOA,BEEP_Pin, GPIO_PIN_SET);
		}

		HAL_ADC_Stop(&hadc1);											//停止ADC1
		HAL_Delay(300);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* 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};

  /** 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_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    
    
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
if (htim->Instance == htim3.Instance) 
	{
    
    
		Tim_cnt++;
		if(Tim_cnt==5)  //2.5ms进一次
		{
    
    
			Tim_cnt=0;   //请
			HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
		}
	}

}	
//中断处理
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    
    
	 UNUSED(GPIO_Pin);
	if(GPIO_Pin == KEY1_Pin)  //测到EXTI0线产生外部中断事件
	{
    
    
		if(set_flag){
    
    
				set_flag = 0;
		}else{
    
    
				set_flag = 1;
		}
	}
	else if(GPIO_Pin == KEY2_Pin) //测到EXTI1线产生外部中断事件
	{
    
    
			if(set_flag){
    
    
				if(warming_val<390){
    
    //一次+10
					warming_val+=10;			
				}
			}
	}	else if(GPIO_Pin == KEY3_Pin) //测到EXTI2线产生外部中断事件
	{
    
    
			if(set_flag){
    
    
				if(warming_val>10){
    
    //一次-10
					warming_val-=10;
				}
			}
	}
	
}


/* 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 */

4. Lista de información y enlace de descarga.

0. Problemas de uso comunes y soluciones: ¡una lectura obligada! ! ! !

1. Código de programa

2. Simulación de Proteus

3. Requisitos funcionales

4. Vídeo explicativo

Información del software de diseño Altium

nombre de archivo.bat

Información del software KEIL

MQ135-2.jpg

MQ135.jpg

Principio de funcionamiento del sensor de la serie MQ.txt

Información del software Proteo

Materiales de aprendizaje sobre microcontroladores.

Habilidades de defensa

Descripciones comunes para informes de diseño

Haga doble clic con el mouse para abrir y encontrar más Proyecto de graduación del curso de microcontrolador 51 STM32.url

imagen

Enlace de descarga de datos (en el que se puede hacer clic):

Supongo que te gusta

Origin blog.csdn.net/weixin_52733843/article/details/132612975
Recomendado
Clasificación