当前位置: 首页 > news >正文

STM32外设应用技术博文:基于UART的温度传感器数据采集

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:STM32外设应用技术博文:基于UART的温度传感器数据采集

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

    • 引言
    • 硬件环境
      • 1. 硬件组成
        • 1.1 STM32开发板
        • 1.2 温度传感器
        • 1.3 USB转TTL模块
        • 1.4 其他配件
      • 2. 连接方式
        • 2.1 DS18B20与STM32的连接
        • 2.2 USB转TTL模块与STM32的连接
      • 3. 硬件布局示意图
      • 4. 注意事项
    • 软件环境
      • 1. 开发工具
        • 1.1 STM32CubeIDE
        • 1.2 STM32CubeMX
      • 2. 项目设置
        • 2.1 创建新项目
        • 2.2 外设配置
        • 2.3 生成代码
      • 3. 编写代码
        • 3.1 代码结构
        • 3.2 代码实现
      • 4. 调试工具
        • 4.1 串口监视器
        • 4.2 调试器
      • 5. 注意事项
    • 代码实现
      • 1. 初始化UART和GPIO
        • 1.1 包含头文件
        • 1.2 UART和GPIO初始化函数
      • 2. 温度读取函数
      • 3. 数据发送
      • 4. 完整代码示例
      • 5. 注意事项
    • 结论
      • 1. 项目总结
      • 2. 技术优势
      • 3. 应用前景
      • 4. 未来工作
      • 5. 总结

引言

随着物联网(IoT)和智能设备的快速发展,嵌入式系统在各个领域的应用越来越广泛。STM32系列微控制器因其高性能、低功耗和丰富的外设接口,成为了开发者的热门选择。STM32不仅支持多种通信协议,还具备强大的处理能力,能够满足复杂应用的需求。

在众多外设中,UART(通用异步收发传输器)是最常用的串行通信接口之一。它的简单性和灵活性使得UART在微控制器与其他设备(如传感器、模块和计算机)之间的通信中得到了广泛应用。通过UART,开发者可以轻松实现数据的发送和接收,进行实时监控和数据采集。

本博文将围绕STM32的UART外设,结合具体案例,展示如何通过UART接口实现温度传感器的数据采集。我们将使用DS18B20温度传感器作为示例,介绍其基本原理、连接方式以及如何通过STM32进行数据读取和传输。通过这个案例,读者将能够深入理解STM32外设的应用,并掌握UART通信的基本操作。

在实际应用中,温度监测是许多系统的基本功能之一,如环境监测、智能家居和工业控制等。通过STM32与温度传感器的结合,开发者可以构建出高效、可靠的温度监测系统,为后续的数据处理和分析提供基础。希望通过本博文的介绍,能够激发读者对STM32外设应用的兴趣,并为他们的项目提供实用的参考和指导。

硬件环境

在进行STM32外设应用开发时,硬件环境的选择和配置至关重要。以下是本案例中所需的硬件组件的详细阐述。

1. 硬件组成

1.1 STM32开发板
  • 型号:STM32F103C8T6
  • 特点
    • 采用ARM Cortex-M3内核,主频高达72MHz。
    • 具有64KB的闪存和20KB的SRAM,适合中小型应用。
    • 提供丰富的外设接口,包括GPIO、UART、I2C、SPI等,方便与各种传感器和模块连接。
1.2 温度传感器
  • 型号:DS18B20
  • 特点
    • 数字温度传感器,具有较高的精度(±0.5°C)。
    • 采用单总线接口,支持多点连接,多个DS18B20可以共享同一数据线。
    • 工作温度范围广,从-55°C到+125°C,适合多种环境监测应用。
1.3 USB转TTL模块
  • 型号:FTDI FT232或CP2102
  • 特点
    • 用于将STM32的UART信号转换为USB信号,方便与计算机进行通信。
    • 提供调试功能,可以通过串口监视器查看STM32发送的数据。
    • 具有简单的接线方式,通常只需连接TX、RX、GND和VCC。
1.4 其他配件
  • 跳线:用于连接各个模块和开发板,确保信号的稳定传输。
  • 面包板:用于搭建原型电路,方便进行硬件连接和调试。

2. 连接方式

2.1 DS18B20与STM32的连接
  • VCC引脚:连接到STM32的3.3V引脚,提供电源。
  • GND引脚:连接到STM32的GND引脚,形成电路的地。
  • 数据引脚:连接到STM32的某个GPIO引脚(如PA0),用于数据传输。
2.2 USB转TTL模块与STM32的连接
  • TX引脚:连接到STM32的RX引脚,接收STM32发送的数据。
  • RX引脚:连接到STM32的TX引脚,发送数据到STM32。
  • GND引脚:连接到STM32的GND引脚,确保信号的共地。
  • VCC引脚:可选,连接到STM32的3.3V引脚,为USB转TTL模块供电。

3. 硬件布局示意图

在实际搭建过程中,可以参考以下连接示意图(请根据具体硬件调整):

STM32F103C8T6          DS18B20
-----------------      ----------------
|               |      |              |
|   VCC ------->|----->| VCC          |
|   GND ------->|----->| GND          |
|   PA0 ------->|----->| Data         |
|               |      |              |
-----------------      ----------------STM32F103C8T6          USB转TTL模块
-----------------      ----------------
|               |      |              |
|   TX -------> |----->| RX           |
|   RX <------- |<-----| TX           |
|   GND ------->|----->| GND          |
|               |      |              |
-----------------      ----------------

4. 注意事项

  • 电源电压:确保DS18B20和STM32的供电电压一致,通常为3.3V,避免损坏组件。
  • 数据线拉高:在DS18B20的数据引脚上添加一个4.7kΩ的上拉电阻,以确保数据传输的稳定性。
  • 接线牢固:在面包板上连接时,确保所有连接牢固,避免因接触不良导致的通信失败。

软件环境

在进行STM32外设应用开发时,软件环境的配置和选择同样重要。以下是本案例中所需的软件工具和配置的详细阐述。

1. 开发工具

1.1 STM32CubeIDE
  • 简介:STM32CubeIDE是STMicroelectronics提供的集成开发环境,基于Eclipse平台,支持STM32系列微控制器的开发。
  • 特点
    • 提供代码编辑、编译、调试等一体化功能,简化开发流程。
    • 集成了STM32CubeMX,方便进行外设配置和代码生成。
    • 支持多种编译器,如GCC和IAR,适合不同开发需求。
1.2 STM32CubeMX
  • 简介:STM32CubeMX是一个图形化配置工具,帮助开发者快速配置STM32微控制器的外设和时钟。
  • 特点
    • 通过图形界面配置GPIO、UART、I2C等外设,生成初始化代码。
    • 支持时钟树配置,确保系统时钟的稳定性。
    • 提供中间件支持,如FreeRTOS、USB等,方便开发复杂应用。

2. 项目设置

2.1 创建新项目
  1. 打开STM32CubeMX,选择“新建项目”。
  2. 选择目标微控制器,如STM32F103C8T6,点击“下一步”。
  3. 配置引脚
    • 在“Pinout & Configuration”中,选择UART1并配置为“异步模式”。
    • 配置PA0为GPIO,用于连接DS18B20的数据引脚。
2.2 外设配置
  1. UART配置

    • 在“Configuration”选项中,设置UART的波特率为115200,数据位为8位,停止位为1位,无奇偶校验。
    • 启用中断(可选),以便在接收数据时触发中断处理。
  2. GPIO配置

    • 配置PA0为推挽输出,确保与DS18B20的数据引脚连接稳定。
2.3 生成代码
  • 点击“Project”菜单,设置项目名称和保存路径,选择“STM32CubeIDE”作为工具链。
  • 点击“生成代码”,STM32CubeMX将自动生成初始化代码和项目结构。

3. 编写代码

3.1 代码结构

在STM32CubeIDE中,生成的项目结构通常包括以下几个重要文件:

  • main.c:主程序文件,包含主循环和外设初始化代码。
  • stm32f1xx_hal_conf.h:HAL库配置文件,包含外设的初始化和配置函数。
  • stm32f1xx_it.c:中断处理函数文件(如果启用中断)。
3.2 代码实现

main.c中,添加初始化UART和GPIO的代码,并实现温度读取和数据发送的逻辑。具体代码实现可参考前文中的代码示例。

4. 调试工具

4.1 串口监视器
  • 工具:可以使用如PuTTY、Tera Term或Arduino Serial Monitor等串口监视器。
  • 功能:用于接收STM32通过UART发送的数据,方便调试和验证程序的正确性。
  • 设置:确保串口监视器的波特率与STM32的UART配置一致(如115200),并选择正确的COM端口。
4.2 调试器
  • 工具:ST-LINK/V2或其他兼容的调试器。
  • 功能:用于单步调试、设置断点和查看变量值,帮助开发者快速定位问题。
  • 设置:在STM32CubeIDE中配置调试器,确保与开发板连接正常。

5. 注意事项

  • 库文件:确保在项目中包含STM32 HAL库,以便使用HAL函数进行外设操作。
  • 中断优先级:如果使用中断,合理设置中断优先级,避免数据丢失。
  • 编译选项:根据项目需求,选择合适的编译选项,确保代码的优化和稳定性。

代码实现

在本节中,我们将详细阐述如何在STM32上实现温度传感器数据采集的代码。代码实现包括外设初始化、温度读取、数据发送等步骤。我们将逐步分析每个部分的功能和实现方式。

1. 初始化UART和GPIO

首先,我们需要在main.c中初始化UART和GPIO,以便与DS18B20温度传感器进行通信。

1.1 包含头文件

在文件开头,确保包含必要的头文件:

#include "main.h"
#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <string.h>
1.2 UART和GPIO初始化函数

main.c中,添加UART和GPIO的初始化函数:

UART_HandleTypeDef huart1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);int main(void) {HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置系统时钟MX_GPIO_Init(); // 初始化GPIOMX_USART1_UART_Init(); // 初始化UARTwhile (1) {// 主循环}
}static void MX_USART1_UART_Init(void) {huart1.Instance = USART1;huart1.Init.BaudRate = 115200; // 设置波特率huart1.Init.WordLength = UART_WORDLENGTH_8B; // 数据位huart1.Init.StopBits = UART_STOPBITS_1; // 停止位huart1.Init.Parity = UART_PARITY_NONE; // 无奇偶校验huart1.Init.Mode = UART_MODE_TX_RX; // 发送和接收模式huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控制huart1.Init.OverSampling = UART_OVERSAMPLING_16; // 过采样HAL_UART_Init(&huart1); // 初始化UART
}static void MX_GPIO_Init(void) {__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_0; // DS18B20数据引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上拉或下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIO
}

2. 温度读取函数

接下来,我们需要实现一个函数来读取DS18B20的温度数据。由于DS18B20使用单总线协议,具体的读取逻辑较为复杂,以下是一个简化的示例:

float Read_Temperature(void) {// 这里添加DS18B20的读取逻辑// 假设返回一个模拟的温度值return 25.0; // 示例温度
}

在实际应用中,您需要实现DS18B20的单总线协议,包括初始化、发送命令、读取数据等步骤。可以参考相关的库或文档来实现这一部分。

3. 数据发送

在主循环中,我们将定期读取温度并通过UART发送数据。以下是实现代码:

while (1) {float temperature = Read_Temperature(); // 读取温度char buffer[50]; // 数据缓冲区snprintf(buffer, sizeof(buffer), "Temperature: %.2f C\r\n", temperature); // 格式化字符串HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY); // 发送数据HAL_Delay(1000); // 每秒发送一次
}

4. 完整代码示例

将上述代码整合,完整的main.c文件如下:

#include "main.h"
#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <string.h>UART_HandleTypeDef huart1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
float Read_Temperature(void);int main(void) {HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置系统时钟MX_GPIO_Init(); // 初始化GPIOMX_USART1_UART_Init(); // 初始化UARTwhile (1) {float temperature = Read_Temperature(); // 读取温度char buffer[50]; // 数据缓冲区snprintf(buffer, sizeof(buffer), "Temperature: %.2f C\r\n", temperature); // 格式化字符串HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY); // 发送数据HAL_Delay(1000); // 每秒发送一次}
}static void MX_USART1_UART_Init(void) {huart1.Instance = USART1;huart1.Init.BaudRate = 115200; // 设置波特率huart1.Init.WordLength = UART_WORDLENGTH_8B; // 数据位huart1.Init.StopBits = UART_STOPBITS_1; // 停止位huart1.Init.Parity = UART_PARITY_NONE; // 无奇偶校验huart1.Init.Mode = UART_MODE_TX_RX; // 发送和接收模式huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控制huart1.Init.OverSampling = UART_OVERSAMPLING_16; // 过采样HAL_UART_Init(&huart1); // 初始化UART
}static void MX_GPIO_Init(void) {__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_0; // DS18B20数据引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上拉或下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIO
}float Read_Temperature(void) {// 这里添加DS18B20的读取逻辑return 25.0; // 示例温度
}

5. 注意事项

  • 温度读取逻辑:实际的温度读取逻辑需要实现DS18B20的单总线协议,确保正确读取温度数据。
  • 数据格式:确保发送的数据格式符合接收端的解析要求。
  • 延时设置:根据实际需求调整发送数据的频率,避免过于频繁的发送导致数据丢失。

通过以上详细的代码实现,读者可以清晰地理解如何在STM32上实现温度传感器的数据采集和UART通信。这为后续的项目开发和功能扩展提供了基础。

结论

通过本博文,我们深入探讨了如何利用STM32微控制器和UART外设实现温度传感器的数据采集。以下是对整个过程的总结和未来展望。

1. 项目总结

在本案例中,我们使用了STM32F103C8T6开发板和DS18B20温度传感器,成功实现了以下功能:

  • 外设初始化:通过STM32CubeMX配置UART和GPIO,生成初始化代码,确保硬件能够正常工作。
  • 温度读取:实现了一个简化的温度读取函数,尽管在实际应用中需要更复杂的单总线协议,但我们提供了一个基础框架。
  • 数据传输:通过UART将温度数据发送到PC,利用串口监视器进行实时监控,验证了数据传输的正确性。

2. 技术优势

  • 高效性:STM32的高性能处理能力和丰富的外设接口,使得数据采集和处理变得高效且灵活。
  • 易于扩展:通过UART接口,系统可以轻松与其他设备(如Wi-Fi模块、蓝牙模块等)进行通信,扩展功能。
  • 实时性:温度数据的实时采集和传输,使得系统能够快速响应环境变化,适用于智能家居、工业监控等应用场景。

3. 应用前景

随着物联网和智能设备的普及,温度监测系统的需求日益增长。基于STM32的温度监测解决方案可以广泛应用于以下领域:

  • 环境监测:实时监测室内外温度,提供数据支持,帮助用户优化环境条件。
  • 智能家居:集成到智能家居系统中,实现自动调节空调、暖气等设备的功能。
  • 工业控制:在工业设备中监测温度,确保设备在安全范围内运行,防止过热等故障。

4. 未来工作

尽管本案例提供了一个基础的温度监测系统,但仍有许多方面可以进一步改进和扩展:

  • 完善温度读取逻辑:实现完整的DS18B20单总线协议,确保准确读取温度数据。
  • 数据存储:将温度数据存储到SD卡或EEPROM中,以便后续分析和记录。
  • 网络功能:通过Wi-Fi或蓝牙模块,将数据上传到云端,实现远程监控和管理。
  • 用户界面:开发图形化用户界面(GUI),使用户能够更直观地查看和分析温度数据。

5. 总结

本博文展示了STM32外设应用的基本思路,通过具体的案例和代码实现,帮助读者理解如何利用STM32进行温度传感器的数据采集。希望这篇文章能够激发读者的兴趣,鼓励他们在嵌入式系统开发中探索更多的可能性。通过不断学习和实践,读者将能够构建出更复杂、更智能的系统,为物联网的发展贡献力量。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述


http://www.mrgr.cn/news/54945.html

相关文章:

  • Vue 3集成海康Web插件实现视频监控
  • 价值投资(Value Investing)
  • 案例分享-优秀蓝色系UI界面赏析
  • 设计模式,面试级别的详解(持续更新中)
  • 【机器学习】任务七:聚类算法 (K-means 算法、层次聚类、密度聚类对鸢尾花(Iris)数据进行聚类)
  • 若依前后端分离版,部署到服务器CentOS7.5
  • CSS进阶-布局(三)
  • 深入vue2[更新中]
  • 【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
  • [0xGame 2024] week2
  • Maple :一款强大的计算软件,广泛应用于数学、工程、物理和其他科学领域
  • OpneCV与dlib-换脸
  • 搭建LeNet-5神经网络,并搭建自己的图像分类训练和测试的模板,模板通用!!!均有详细注释。
  • SOD-YOLOv8 - 增强YOLOv8以在交通场景中检测小目标
  • 线程的同步
  • 二、Linux 入门教程:开启大数据领域的神奇之旅
  • 【Linux】从多线程同步到生产者消费者模型:多线程编程实践
  • Qml-Item的Id生效范围
  • Java集合剖析2】Java集合底层常用数据结构
  • 利士策分享,财富多少,才是恰到好处?
  • 推荐一款多功能理科计算器:Math Resource Studio Pro
  • WPF入门_03路由事件
  • 数据结构(C语言):顺序表
  • WPF 回到主线程
  • Egg.js 项目的合理 ESLint 配置文件模板
  • 锁的原理以及使用