下方有完整代码,谁不给谁耍流氓

目录

水:快速实现

硬件环境(接线图)

代码

代码1:adc.c

代码2:adc_flame_sensor.c

代码3:adc_flame_sensor.h

代码4:main.c

现象:

水水:介绍+原理

模块介绍(参数+原理):

电路介绍(核心):

水水水:视频教学

水:快速实现

硬件环境(接线图)

STM32F103C8T6 + 火焰传感器模块

Keil uVision5 +STM32CubeMX(Version 6.8.1)

代码

分别建立相关的.c.h,复制粘贴可用

代码都是基于Cubemx和豆包AI,0基础不会复制的直接看下方视频即可

代码1:adc.c

(CBUE生成)

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    adc.c
  * @brief   This file provides code for the configuration
  *          of the ADC instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2026 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 "adc.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

ADC_HandleTypeDef hadc1;

/* ADC1 init function */
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PB0     ------> ADC1_IN8
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{

  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspDeInit 0 */

  /* USER CODE END ADC1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ADC1_CLK_DISABLE();

    /**ADC1 GPIO Configuration
    PB0     ------> ADC1_IN8
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);

  /* USER CODE BEGIN ADC1_MspDeInit 1 */

  /* USER CODE END ADC1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

代码2:adc_flame_sensor.c

需求明确,AI生成的,视频里呈现过

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : adc_flame_sensor.c
  * @brief          : 火焰传感器ADC读取实现
  ******************************************************************************
  */
/* USER CODE END Header */

#include "adc_flame_sensor.h"

/**
 * @brief  读取火焰传感器ADC原始值
 * @note   ADC1通道8(PB0),12位分辨率(0-4095)
 * @retval ADC原始值(0-4095)
 */
uint16_t FlameSensor_Read_ADC_Value(void)
{
    uint16_t adc_value = 0;
    
    // 启动ADC转换
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
        Error_Handler(); // 转换启动失败,进入错误处理
    }
    
    // 等待转换完成(超时时间10ms)
    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
    {
        // 读取ADC转换结果
        adc_value = HAL_ADC_GetValue(&hadc1);
    }
    
    // 停止ADC转换
    HAL_ADC_Stop(&hadc1);
    
    return adc_value;
}

/**
 * @brief  读取火焰传感器多次采样平均值
 * @note   多次采样降低噪声干扰
 * @param  sample_times: 采样次数(建议10-50次)
 * @retval 采样平均值(0-4095)
 */
uint16_t FlameSensor_Read_Average_Value(uint8_t sample_times)
{
    uint32_t sum = 0;
    uint8_t i = 0;
    
    // 采样次数校验(至少1次)
    if (sample_times == 0)
    {
        sample_times = 1;
    }
    
    // 多次采样求和
    for (i = 0; i < sample_times; i++)
    {
        sum += FlameSensor_Read_ADC_Value();
        HAL_Delay(1); // 每次采样间隔1ms,避免连续采样噪声
    }
    
    // 返回平均值
    return (uint16_t)(sum / sample_times);
}

/**
 * @brief  将ADC值转换为电压值
 * @note   STM32F103 ADC参考电压默认3.3V,12位分辨率
 * @param  adc_value: ADC原始值(0-4095)
 * @retval 电压值(单位:mV,范围0-3300)
 */
uint32_t FlameSensor_ADC_To_Voltage(uint16_t adc_value)
{
    // 计算公式:电压(mV) = ADC值 * 3300 / 4095
    return (uint32_t)adc_value * 3300 / 4095;
}

代码3:adc_flame_sensor.h

需求明确,AI生成

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : adc_flame_sensor.h
  * @brief          : 火焰传感器ADC读取相关函数声明
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef __ADC_FLAME_SENSOR_H__
#define __ADC_FLAME_SENSOR_H__

#include "main.h"
#include "adc.h"

/* 函数声明 */
// 读取火焰传感器ADC原始值(0-4095)
uint16_t FlameSensor_Read_ADC_Value(void);

// 读取火焰传感器平均值(多次采样,提高稳定性)
uint16_t FlameSensor_Read_Average_Value(uint8_t sample_times);

// 将ADC值转换为电压值(单位:mV)
uint32_t FlameSensor_ADC_To_Voltage(uint16_t adc_value);

#endif /* __ADC_FLAME_SENSOR_H__ */

代码4:main.c

为了方便想快速复制粘贴的同志看,这里进行了一定删减

提速的小伙伴只需关心定义的变量和while里的内容即可

我这里用的SEGGER_RTT打印数据

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "adc_flame_sensor.h" // 引入火焰传感器头文件
#include "SEGGER_RTT.h"       // SEGGER RTT头文件
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
uint16_t flame_adc_value = 0;    // 火焰传感器ADC值
uint32_t flame_voltage = 0;      // 火焰传感器电压值

void SystemClock_Config(void);

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_ADC1_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
flame_adc_value = FlameSensor_Read_Average_Value(20);
  // 转换为电压值
flame_voltage = FlameSensor_ADC_To_Voltage(flame_adc_value);
HAL_Delay(200); // 200ms读取一次,降低CPU占用
		SEGGER_RTT_printf(0, "A:%d,B:%d mV\r\n", flame_adc_value, flame_voltage);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

现象:

我在附近点了个打火机,发现数值增大一段,符合电路的实际预期

水水:介绍+原理

火焰传感器模块

模块介绍(参数+原理):

核心参数

  • 探测范围:760nm~1100nm 红外 / 火焰光谱
  • 探测距离:最大 80cm(打火机火焰),火焰越大距离越远
  • 探测角度:约 60°
  • 工作电压:3.3V–5V
  • 输出:DO 数字开关量、AO 模拟电压
  • 灵敏度:可调精密电位器调节
  • 驱动能力:>15mA

工作原理:模块通过红外接收管采集火焰 / 红外光信号,经 LM393 比较器将模拟电压(AO)与可调阈值对比,输出干净的数字开关信号(DO),可直接驱动 LED 或连接单片机,实现火焰报警或红外感应。

电路介绍(核心):

水水水:视频教学

RTT+火焰

适合速成,没有相关参数解释,配套上方流程,

新人博主,大家的点赞和收藏都是我坚持下去的动力

您的意见和看法很重要,评论区指出,感激不尽!!!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐