0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-26 09:15 次阅读

一、项目背景

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

为了防止这些问题的发生,现代化工、钢铁、电子、玻璃等行业需要精准测量炉温并实时地监测炉温变化情况。而本项目即是为了满足这些需求而设计的。采用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列显示数字12345while (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秒,等待下一次测量。
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6813

    浏览量

    147672
  • 传感器
    +关注

    关注

    2525

    文章

    48137

    浏览量

    740246
  • 单片机
    +关注

    关注

    6002

    文章

    43990

    浏览量

    620954
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348872
  • 检测仪
    +关注

    关注

    5

    文章

    3904

    浏览量

    41498
收藏 人收藏

    评论

    相关推荐

    【Thunderboard Sense试用申请】手持环境检测仪

    项目名称:手持环境检测仪试用计划:项目:手持环境检测仪利用此开发板的轻便与低功耗特性,开发低功耗手持环境检测仪。采集环境数据,设计键盘与OLED人机交互界面等功能。6 轴惯性传感器
    发表于 05-25 18:14

    微机燃点检测仪配置简要?

    `微机燃点检测仪配置简要?微机燃点检测仪配置简要?【鹤壁市英特仪器仪表厂】详询138.3923.4904检测燃点的仪器,化验燃点的设备,生物燃料燃烧测定,煤炭燃点
    发表于 09-10 15:56

    水分检测仪的原理是什么?

    水分测定也叫做水分、水份测定、快速水分测定、水分计、水分检测仪、水分测量仪、水分分析
    发表于 10-28 09:11

    固体燃料燃点检测仪 YTRD-9型

    燃点检测仪,测量煤燃点的设备功能特点:1、电脑与控制器双向通讯,实行全面监控自动控制、显示加热炉的温度自动测定、显示煤样温度自动绘制炉温随时间变化曲线自动绘制煤样
    发表于 12-22 07:53

    高精度木材燃点着火点检测仪 SH-6A系列

    ,测试木材着火点机器,检测树叶稻草着火点温度的设备燃点测定功能特点:1、电脑与控制器双向通讯,实行监控,自动控制、显示加热炉的温度,自动测定、显示样
    发表于 12-23 08:54

    常用的木材枯草树叶燃点检测仪

    `常用的木材枯草树叶燃点检测仪 常用的木材枯草树叶燃点检测仪 全自动木材燃点测定,高精度木材燃点分析,测试固体燃料着火点仪器,检测木炭木
    发表于 02-28 14:24

    HY-9T全自动木材燃点检测仪【英特仪器】

    `HY-9T全自动木材燃点检测仪【英特仪器】 HY-9T全自动木材燃点检测仪【英特仪器】林业大学全自动木材燃点测定,微机木材燃点分析,木材着火点化验
    发表于 04-16 07:22

    怎样去设计基于嵌入式stm32的心率检测仪

    资源分享:嵌入式stm32项目开发 心率检测仪的设计与实现本课程主要基于心率检测仪的设计与实现讲解STM32开发技术,STM32开发板广泛应
    发表于 08-03 06:11

    基于心率检测仪的设计与实现讲解STM32开发技术

    视频教程免费分享:嵌入式stm32项目开发之心率检测仪的设计与实现本课程主要基于心率检测仪的设计与实现讲解STM32开发技术,STM32开发
    发表于 08-03 06:44

    怎样去设计一种STM32的心率检测仪

    STM32是什么?怎样去设计一种STM32的心率检测仪
    发表于 09-28 08:12

    怎样去设计一种基于STM32的心率检测仪

    怎样去设计一种基于STM32的心率检测仪
    发表于 09-29 08:58

    怎样去设计一种基于STM32的心率检测仪

    怎样去设计一种基于STM32的心率检测仪
    发表于 10-11 07:13

    如何利用STM32单片机实现颜色检测仪设计

    9、基于STM32单片机的颜色检测仪设计文章目录9、基于STM32单片机的颜色检测仪设计引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2 、
    发表于 11-30 06:34

    如何快速设计红外体温检测仪

    、PWM输出等模块,成为了红外体温检测仪厂商的不二之选。配合TI提供的丰富的线上软硬件设计资源,使得开发人员可以大大简化设计流程,快速开发红外体温检测仪原型机,同时节省电路板空间从而降低成本。下图提供了基于MSP430单片机和TI电源管理、放大器及
    发表于 11-08 07:44

    基于STM32炉温温度检测仪设计方案

    随着工业生产的发展,炉温检测在现代化工、钢铁、电子、玻璃等行业中变得越来越重要。对于这些行业,稳定的生产环境和品质稳定的产品是必须的,而炉温是影响产品品质的重要因素之一。
    发表于 07-06 10:13 467次阅读
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>炉温</b><b class='flag-5'>温度</b><b class='flag-5'>检测仪</b>设计方案