火焰ST-5L5B——轮询

一、实现代码

#include "main.h"

#include "adc.h"

#include "usart.h"

#include "gpio.h"

#include "stm32f1xx_hal.h"

#include <string.h>

#include <stdio.h>

void SystemClock_Config(void);

int main(void)

{

  uint32_t adc_value;    // ADC原始值(0-4095)

  float voltage;        // 电压值(0-3.3V)

  char uart_buf[100];    // UART发送缓冲区


  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_ADC1_Init();

  MX_USART1_UART_Init();


  while (1)

  {

/* 启动ADC转换 */

        if (HAL_ADC_Start(&hadc1) == HAL_OK) {

            /* 等待转换完成(超时100ms) */

            if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK) {

                adc_value = HAL_ADC_GetValue(&hadc1);  // 读取ADC值

                voltage = (adc_value * 3.3f) / 4095.0f; // 转换为电压(3.3V参考)

                /* 格式化基础信息 */

                sprintf(uart_buf, "ST-5L5B (PC5): ADC=%d, Voltage=%.2fV | ", adc_value, voltage);

                /* 判断红外光强度(阈值需实际校准) */

                if (adc_value < 1000) {

                      strcat(uart_buf, "Weak infrared (low intensity)\r\n"); // 红外光弱

                  } else if (adc_value < 3000) {

                      strcat(uart_buf, "Moderate infrared intensity\r\n");  // 强度中等

                  } else {

                      strcat(uart_buf, "Strong infrared (high intensity)\r\n"); // 红外光强

                  }

                  /* 通过UART1发送数据 */

                  HAL_UART_Transmit(&huart1, (uint8_t*)uart_buf, strlen(uart_buf), 100);

                }

            }

            HAL_ADC_Stop(&hadc1);  // 停止ADC

            HAL_Delay(1000);        // 每500ms采集一次

      }

}

int fputc(int ch, FILE *f)

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 500);

    return ch;

}

原理图及参考手册:https://pan.baidu.com/s/1O9LNB4pi_CoMYQlFxnAu-w?pwd=xwud 提取码: xwud

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容