基于STM32设计的炉温温度检测仪

news2024/10/7 8:22:02

炉温检测在现代工业生产中十分重要,因为炉温过高或过低都会对产品质量产生影响,甚至影响工厂的正常运作。因此,设计一款能够精准测量炉温并显示结果的检测仪器具有很大的实用价值。
本项目采用了STM32F103C8T6作为主控芯片,该芯片拥有丰富的外设和性能较好的计算能力,能够满足该项目对计算和控制的需求。同时,铂电阻PT100作为测温传感器,能够提供更加精准的温度测量结果。

一、项目背景

随着工业生产的发展,炉温检测在现代化工、钢铁、电子、玻璃等行业中变得越来越重要。对于这些行业,稳定的生产环境和品质稳定的产品是必须的,而炉温是影响产品品质的重要因素之一。如果炉温过高或过低,都有可能导致产品结构改变、硬度变化、强度下降等质量问题,使得产品不能达到预期的性能指标。此外,炉温不仅会影响产品质量,还会影响设备的使用寿命和工作效率,有时甚至会对整个工厂的正常生产造成影响。

为了防止这些问题的发生,现代化工、钢铁、电子、玻璃等行业需要精准测量炉温并实时地监测炉温变化情况。而本项目即是为了满足这些需求而设计的。采用STM32F103C8T6作为主控芯片,它是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设和良好的计算能力,并且易于控制和集成到系统中。同时,铂电阻PT100是一种高精度、稳定性好、线性度高的温度传感器,能够提供更加准确的温度测量结果。采用0.96寸IIC接口的OLED屏幕进行显示,操作简便、节省成本,并且具有较好的兼容性和可移植性。

image-20230525234029685

image-20230525234051359

二、设计思路

【1】硬件设计

主控芯片采用STM32F103C8T6,其内置有多种外设,可满足该项目的需求。铂电阻PT100作为测温传感器,能够提供更加准确的温度测量结果。0.96寸IIC接口的OLED显示屏幕是本项目的显示工具,能够直观地显示测量结果。

【2】软件设计

软件设计分为数据采集、数据处理和数据显示三个部分。采用STM32的ADC进行数据采集,通过PT100将温度信号转换为电阻信号,再通过AD转换器转换成数字信号进行处理。在数据处理中,对ADC采样值进行数据校准、滤波处理和算法计算,得到准确的温度值。最后,通过IIC总线协议将温度值发送给OLED屏幕进行显示,实现实时显示检测结果的功能。

三、代码实现

【1】OLED显示屏代码

以下是基于STM32F103C8T6主控芯片,通过IIC接口控制0.96寸OLED显示屏显示数字的代码:

#include "stm32f10x.h"
#include "i2c.h"

#define OLED_ADDRESS 0x78 // OLED IIC地址

void oled_init(void) {
  OLED_Write_Command(0xAE); // 关闭显示
  OLED_Write_Command(0xD5); // 设置时钟分频因子
  OLED_Write_Command(0x80); // 重要参数,必须设置,不然屏幕无法上电
  OLED_Write_Command(0xA8); // 设置驱动路数
  OLED_Write_Command(0x3F); // 默认值
  OLED_Write_Command(0xD3); // 设置显示偏移
  OLED_Write_Command(0x00); // 默认值
  OLED_Write_Command(0x40); // 设置起始行
  OLED_Write_Command(0x8D); // 电荷泵设置
  OLED_Write_Command(0x14); // 开启电荷泵
  OLED_Write_Command(0x20); // 设置内存地址模式
  OLED_Write_Command(0x00); // 水平模式
  OLED_Write_Command(0xA1); // 段重新映射设置
  OLED_Write_Command(0xC0); // 设置COM扫描方向
  OLED_Write_Command(0xDA); // 设置COM引脚硬件配置
  OLED_Write_Command(0x12); // 默认值
  OLED_Write_Command(0x81); // 对比度设置
  OLED_Write_Command(0xCF); // 默认值
  OLED_Write_Command(0xd9); // 设置预充电周期
  OLED_Write_Command(0xF1); // 默认值
  OLED_Write_Command(0xDB); // 设置VCOMH
  OLED_Write_Command(0x40); // 默认值
  OLED_Write_Command(0xA4); // 关闭全屏点亮
  OLED_Write_Command(0xA6); // 设置显示方式
  OLED_Write_Command(0xAF); // 开启屏幕显示
}

void OLED_Write_Command(uint8_t cmd) {  // 写命令
  I2C1_Start();
  I2C1_SendByte(OLED_ADDRESS);
  I2C1_SendByte(0x00);
  I2C1_SendByte(cmd);
  I2C1_Stop();
}

void OLED_Write_Data(uint8_t data) { // 写数据
  I2C1_Start();
  I2C1_SendByte(OLED_ADDRESS);
  I2C1_SendByte(0x40);
  I2C1_SendByte(data);
  I2C1_Stop();
}

void OLED_Set_Pos(uint8_t x, uint8_t y) { // 设置光标位置
  OLED_Write_Command(0xb0+y);
  OLED_Write_Command(((x&0xf0)>>4)|0x10);
  OLED_Write_Command(x&0x0f);
}

void OLED_Show_Number(uint8_t x, uint8_t y, uint32_t num) { // 在指定位置显示数字
  OLED_Set_Pos(x, y);
  while (num) {
    uint8_t temp = num % 10;
    OLED_Write_Data(temp + '0');
    num /= 10;
  }
}

int main(void) {
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  I2C1_Init();

  oled_init();

  OLED_Show_Number(0, 0, 12345); //在第1行第1列显示数字12345

  while (1) {
  }
}

首先,通过oled_init()函数初始化OLED屏幕,在函数中依次写入了一系列命令,来设置OLED的各种参数,例如驱动路数、扫描方向、预充电周期、对比度等。接着,在OLED_Show_Number()函数中,调用了OLED_Set_Pos()函数来设置数字显示的位置,然后通过循环取余数的方法将数字逐位分离,再将其转换为字符型并通过OLED_Write_Data()函数输出到OLED屏幕上,最终实现在屏幕上显示指定数字的功能。

【2】温度测量代码

以下是基于STM32F103C8T6主控芯片,通过IIC接口控制0.96寸OLED显示屏显示温度,并通过串口打印温度的代码:

#include "stm32f10x.h"
#include "i2c.h"
#include "usart.h"

#define OLED_ADDRESS 0x78 // OLED IIC地址

// PT100温度转换函数
float RTD2Temperature(float R) {
    float temperature = 0;
    float RTD_A = 3.9083e-003f;
    float RTD_B = -5.775e-007f;

    temperature = (-RTD_A + sqrtf(RTD_A * RTD_A - 4 * RTD_B * (1 - R / 100))) / (2 * RTD_B);
    return temperature;
}

void oled_init(void) {
    OLED_Write_Command(0xAE); // 关闭显示
    OLED_Write_Command(0xD5); // 设置时钟分频因子
    OLED_Write_Command(0x80); // 重要参数,必须设置,不然屏幕无法上电
    OLED_Write_Command(0xA8); // 设置驱动路数
    OLED_Write_Command(0x3F); // 默认值
    OLED_Write_Command(0xD3); // 设置显示偏移
    OLED_Write_Command(0x00); // 默认值
    OLED_Write_Command(0x40); // 设置起始行
    OLED_Write_Command(0x8D); // 电荷泵设置
    OLED_Write_Command(0x14); // 开启电荷泵
    OLED_Write_Command(0x20); // 设置内存地址模式
    OLED_Write_Command(0x00); // 水平模式
    OLED_Write_Command(0xA1); // 段重新映射设置
    OLED_Write_Command(0xC0); // 设置COM扫描方向
    OLED_Write_Command(0xDA); // 设置COM引脚硬件配置
    OLED_Write_Command(0x12); // 默认值
    OLED_Write_Command(0x81); // 对比度设置
    OLED_Write_Command(0xCF); // 默认值
    OLED_Write_Command(0xd9); // 设置预充电周期
    OLED_Write_Command(0xF1); // 默认值
    OLED_Write_Command(0xDB); // 设置VCOMH
    OLED_Write_Command(0x40); // 默认值
    OLED_Write_Command(0xA4); // 关闭全屏点亮
    OLED_Write_Command(0xA6); // 设置显示方式
    OLED_Write_Command(0xAF); // 开启屏幕显示
}

void OLED_Write_Command(uint8_t cmd) {  // 写命令
    I2C1_Start();
    I2C1_SendByte(OLED_ADDRESS);
    I2C1_SendByte(0x00);
    I2C1_SendByte(cmd);
    I2C1_Stop();
}

void OLED_Write_Data(uint8_t data) { // 写数据
    I2C1_Start();
    I2C1_SendByte(OLED_ADDRESS);
    I2C1_SendByte(0x40);
    I2C1_SendByte(data);
    I2C1_Stop();
}

void OLED_Set_Pos(uint8_t x, uint8_t y) { // 设置光标位置
    OLED_Write_Command(0xb0+y);
    OLED_Write_Command(((x&0xf0)>>4)|0x10);
    OLED_Write_Command(x&0x0f);
}

void OLED_Show_Temperature(uint8_t x, uint8_t y, float temperature) { // 在指定位置显示温度
    OLED_Set_Pos(x, y);
    int temp = (int)(temperature * 10);
    for (int i = 0; i < 5; i++) {
        if (i == 2) {
            OLED_Write_Data('.');
        } else {
            OLED_Write_Data(temp % 10 + '0');
            temp /= 10;
        }
    }
    OLED_Write_Data('C');
}

int main(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    I2C1_Init();

    oled_init();

    USART1_Init();

    while (1) {
        float resistance = 100; // 铂电阻的电阻值
        float temperature = RTD2Temperature(resistance); // 算出温度值

        // OLED显示温度
        OLED_Show_Temperature(0, 0, temperature);

        // 串口输出温度
        char str[32];
        sprintf(str, "Temperature: %.1f C\r\n", temperature);
        USART1_SendString(str);

        delay_ms(1000); // 延时1s
    }
}

利用RTD2Temperature()函数将铂电阻的电阻值转换为温度值。接着,在OLED_Show_Temperature()函数中,调用了OLED_Set_Pos()函数来设置温度显示的位置,并将温度值逐位分离,通过OLED_Write_Data()函数输出到OLED屏幕上,最终实现在屏幕上显示测量的温度的功能。同时,也通过串口输出温度值。

在主函数main()中,不断循环读取铂电阻的电阻值,并通过RTD2Temperature()函数转换为温度值。然后,调用OLED_Show_Temperature()函数将温度显示在OLED屏幕上,并调用USART1_SendString()函数通过串口输出温度值。最后,通过delay_ms()函数延时1秒,等待下一次测量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CoreNLP server的开启与使用方法

Ubuntu20.04.2使用CoreNLP JDK安装 Ubuntu20.04.2系统本身不含有JDK&#xff0c;而CoreNLP需要依赖JDK进行运行&#xff0c;所以需要先安装好JDK&#xff0c;可以输入java&#xff0c;然后系统会自动提示没有安装JDK&#xff0c;并会推荐安装的版本&#xff0c;如下图所示&am…

第二十四章手写Spring框架

文章目录 Spring 使用回顾Bean 概述Spring IOC 相关接口BeanFactory 接口BeanDefinition 接口BeanDefinitionReader 接口BeanDefinitionRegistry 接口创建容器 手写模拟Spring IOC核心功能定义 Bean 相关的 POJOPropertyValue 类MutablePropertyValues 类BeanDefinition 类 定义…

2023 中国城市商业魅力排行榜:探索西安商业活力与无限机遇【探索中国城市商业魅力排行榜】

文章目录 探索中国城市商业魅力排行榜评估指标价值和意义 结语 探索中国城市商业魅力排行榜 随着中国经济的迅速崛起&#xff0c;中国各个城市商业中心纷纷崭露头角&#xff0c;展现出令人瞩目的商业魅力。为了揭示这些城市商业的繁荣程度、创新力和吸引力&#xff0c;我们荣幸…

什么是devos勒索病毒,devos勒索病毒加密数据的方式

随着技术和互联网的发展&#xff0c;网络安全成为了重要的关注点。而devos勒索病毒可能是我们需要重点关注的一种恶意软件类型。因此&#xff0c;我们了解devos勒索病毒是什么以及它是如何加密数据的将有助于我们企业提升网络安全意识。 什么是devos勒索病毒&#xff1f; Devos…

Lombok源码

目录儿 jar包结构MainSpiLoadUtilfindServices()readServicesFromUrl()META-INF/services/lombok.core.LombokApp ShadowClassLoaderAgentlombok.core.AgentLauncher Handler jar包结构 Main 这应该是Lombok的入口函数 class Main {private static ShadowClassLoader classLo…

vue3 使用的 Pinia

文章目录 一、Pinia API与Vuex s4 有很大不同二、使用步骤1.安装2.使用3、组件中应用案例 官网&#xff1a;https://pinia.web3doc.top/ 一、Pinia API与Vuex s4 有很大不同 没有 mutations。mutations 被认为是非常几长的。最初带来了 devtools 集成&#xff0c;但这不再是问…

成功解决windows下将.pyx文件编译成.pyd文件

在linux上正常跑通的算法&#xff0c;搬到windows下使用就报错了 原来是其中涉及到.pyx文件的编译 在linux下.pyx会被编译成.so的文件&#xff0c;但是在windows下是无法使用.so文件的 需要重新编译成windows下的.pyd格式的才可以直接将python模块成功导入到算法中 所以需要解…

vue3到vue2组件重构方法笔记

这两天的任务是把一批做好的vue3组件放在vue2项目中使用&#xff0c;将组合式api分散开有一些零散的技巧&#xff0c;所以写一篇转化笔记以供大家参考 先上vue3一个组件的示例代码 <template><div ref"GForms" :style"{background: props.background…

27 # node 基本概念

node 基本概念 1、node 是什么&#xff1f; node.js 是一个基于 chrome v8 引擎的 JavaScript 运行环境&#xff08;runtime&#xff09;&#xff0c;node 不是一门语言&#xff0c;是让 js 运行在后端的运行时&#xff0c; 并且不包括 JavaScript 全集&#xff0c;因为在服务…

Collections工具类(java)

Collections工具类 java.util.Collections; 是集合的工具类作用&#xff1a;Collections不是集合&#xff0c;而是集合的工具类 Collections常用的API 方法名称说明public static <T> boolean addAll(Collection<T> c,T... elements)批量添加元素public static …

MySQL秘籍:让你的表操作炉火纯青

&#x1f495;每个人都有自己的一生&#xff0c;不要和别人去比较。比较只会让你感到沮丧和不满足。关注自己的成长和进步&#xff0c;并享受属于自己的旅程。 &#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;MySQL学习…

【LeetCode】11,盛最多水的容器。 难度等级:中等。双指针解法值得深入学习。

文章目录 一、题目二、我的解法&#xff1a;双重for循环&#xff0c;超出时间限制三、最优解法&#xff1a;双指针从两侧开始遍历 【LeetCode】11&#xff0c;盛最多水的容器。 难度等级&#xff1a;中等。 一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#x…

小米、华为、海尔竞争中,全屋智能「崛起」2023

智能家居进入下半场&#xff0c;互联网大厂凭借着自身的流量红利收割了一部分市场份额&#xff1b;家电企业在向家装企业转型的过程中&#xff0c;也有其自带的流量优势和渠道优势&#xff1b;通信厂商借着“链接”优势&#xff0c;三大阵营在智能家居行业都各占鳌头。 作者|思…

NPM 制作命令行工具 - 进阶辅助库

一、简介 通过 NPM 制作命令行工具 - 入门案例 已经基本知道如何制作命令行工具了&#xff0c;现在就是内部命令处理。 如果不使用第三方插件辅助&#xff0c;那就只能对传入的参数进行一个一个判断处理&#xff0c;添加注释&#xff0c;这是很麻烦的&#xff0c;所以&#xf…

移动端开发之基础知识:视口、三倍图、移动端开发选择、移动端技术解决方案、移动端常见布局

移动端开发之流式布局 移动端基础浏览器现状手机屏幕现状移动端调试方法 视口布局视口视觉视口理想视口总结&#xff1a; meta视口标签标准的viewport设置 三倍图物理像素&物理像素比多倍图背景缩放 background-size背景图三倍图 多倍图切图 cutterman 移动端开发选择移动端…

基于JavaWeb的私人牙科诊所管理系统

目录 1、项目背景 2、项目目标 3、项目功能 4、系统架构 5、项目源码 6、论文目录&#xff08;16000字&#xff09; 1、项目背景 在当前社会医疗水平的高速发展下&#xff0c;口腔方面的医疗在社会上不断发展壮大。私人化牙科诊所呈现蓬勃发展的趋势&#xff0c;各方面的…

【JavaSE】方法的使用--05

目录 一、方法的概念与使用 1.1 什么是方法 1.2 方法的定义 1.3 方法调用的执行过程 1.4 实参和形参的关系&#xff08;重要&#xff09; 1.5 有无返回值的方法 二、方法的重载 2.1 方法重载的概念 2.2 方法重载的要求 2.3 方法签名 前言&#xff1a; 之前很久没写这…

python基础----01-----环境搭建

一 python介绍 1.1 Python 特点 Python 是完全面向对象的语言。函数、模块、数宁、宁符串都是对象&#xff0c;在 Python 中一切皆对象。完全支持继承、重载、多重继承。支持重载运算符&#xff0c;也支持泛型设计。Python 拥有一个强大的标准库&#xff0c;Python 语言的核心…

谷云科技受邀出席2023华南CIO大会-应用与数据集成专家

2023年6月10-11日&#xff0c;我们将于中国珠海国际会展中心迎来第6届 S-CIO 2023华南CIO大会暨信息技术交易会 。大会将邀请近1000位来自广东、广西、福建、海南等地的企业IT高管及行业专家深入探讨企业数字化运营的关键问题&#xff0c;以“ 千人论坛-生态展区-专业分论坛-华…

2023年成人高考标准拿证流程(入学前入学后)

很多小伙伴对成人高考“报名→学习→毕业”的流程还是很陌生哈&#xff0c;下面给大家整理了一份详细的报考流程和攻略。 大家可以收藏起来&#xff0c;仔细看看。 成考全流程—入学前 5月—8月 联系报名机构老师预报名&#xff0c;选定自己要报考院校专业&#xff0c;了解报…