0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32設(shè)計(jì)的爐溫溫度檢測(cè)儀

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-05-26 09:15 ? 次閱讀

一、項(xiàng)目背景

隨著工業(yè)生產(chǎn)的發(fā)展,爐溫檢測(cè)在現(xiàn)代化工、鋼鐵、電子、玻璃等行業(yè)中變得越來越重要。對(duì)于這些行業(yè),穩(wěn)定的生產(chǎn)環(huán)境和品質(zhì)穩(wěn)定的產(chǎn)品是必須的,而爐溫是影響產(chǎn)品品質(zhì)的重要因素之一。如果爐溫過高或過低,都有可能導(dǎo)致產(chǎn)品結(jié)構(gòu)改變、硬度變化、強(qiáng)度下降等質(zhì)量問題,使得產(chǎn)品不能達(dá)到預(yù)期的性能指標(biāo)。此外,爐溫不僅會(huì)影響產(chǎn)品質(zhì)量,還會(huì)影響設(shè)備的使用壽命和工作效率,有時(shí)甚至?xí)?duì)整個(gè)工廠的正常生產(chǎn)造成影響。

為了防止這些問題的發(fā)生,現(xiàn)代化工、鋼鐵、電子、玻璃等行業(yè)需要精準(zhǔn)測(cè)量爐溫并實(shí)時(shí)地監(jiān)測(cè)爐溫變化情況。而本項(xiàng)目即是為了滿足這些需求而設(shè)計(jì)的。采用STM32F103C8T6作為主控芯片,它是一款基于ARM Cortex-M3內(nèi)核的微控制器,具有豐富的外設(shè)和良好的計(jì)算能力,并且易于控制和集成到系統(tǒng)中。同時(shí),鉑電阻PT100是一種高精度、穩(wěn)定性好、線性度高的溫度傳感器,能夠提供更加準(zhǔn)確的溫度測(cè)量結(jié)果。采用0.96寸IIC接口OLED屏幕進(jìn)行顯示,操作簡(jiǎn)便、節(jié)省成本,并且具有較好的兼容性和可移植性。

image-20230525234029685

image-20230525234051359

二、設(shè)計(jì)思路

【1】硬件設(shè)計(jì)

主控芯片采用STM32F103C8T6,其內(nèi)置有多種外設(shè),可滿足該項(xiàng)目的需求。鉑電阻PT100作為測(cè)溫傳感器,能夠提供更加準(zhǔn)確的溫度測(cè)量結(jié)果。0.96寸IIC接口的OLED顯示屏幕是本項(xiàng)目的顯示工具,能夠直觀地顯示測(cè)量結(jié)果。

【2】軟件設(shè)計(jì)

軟件設(shè)計(jì)分為數(shù)據(jù)采集、數(shù)據(jù)處理和數(shù)據(jù)顯示三個(gè)部分。采用STM32的ADC進(jìn)行數(shù)據(jù)采集,通過PT100將溫度信號(hào)轉(zhuǎn)換為電阻信號(hào),再通過AD轉(zhuǎn)換器轉(zhuǎn)換成數(shù)字信號(hào)進(jìn)行處理。在數(shù)據(jù)處理中,對(duì)ADC采樣值進(jìn)行數(shù)據(jù)校準(zhǔn)、濾波處理和算法計(jì)算,得到準(zhǔn)確的溫度值。最后,通過IIC總線協(xié)議將溫度值發(fā)送給OLED屏幕進(jìn)行顯示,實(shí)現(xiàn)實(shí)時(shí)顯示檢測(cè)結(jié)果的功能。

三、代碼實(shí)現(xiàn)

【1】OLED顯示屏代碼

以下是基于STM32F103C8T6主控芯片,通過IIC接口控制0.96寸OLED顯示屏顯示數(shù)字的代碼:

#include "stm32f10x.h"
 #include "i2c.h"
 ?
 #define OLED_ADDRESS 0x78 // OLED IIC地址
 ?
 void oled_init(void) {
   OLED_Write_Command(0xAE); // 關(guān)閉顯示
   OLED_Write_Command(0xD5); // 設(shè)置時(shí)鐘分頻因子
   OLED_Write_Command(0x80); // 重要參數(shù),必須設(shè)置,不然屏幕無法上電
   OLED_Write_Command(0xA8); // 設(shè)置驅(qū)動(dòng)路數(shù)
   OLED_Write_Command(0x3F); // 默認(rèn)值
   OLED_Write_Command(0xD3); // 設(shè)置顯示偏移
   OLED_Write_Command(0x00); // 默認(rèn)值
   OLED_Write_Command(0x40); // 設(shè)置起始行
   OLED_Write_Command(0x8D); // 電荷泵設(shè)置
   OLED_Write_Command(0x14); // 開啟電荷泵
   OLED_Write_Command(0x20); // 設(shè)置內(nèi)存地址模式
   OLED_Write_Command(0x00); // 水平模式
   OLED_Write_Command(0xA1); // 段重新映射設(shè)置
   OLED_Write_Command(0xC0); // 設(shè)置COM掃描方向
   OLED_Write_Command(0xDA); // 設(shè)置COM引腳硬件配置
   OLED_Write_Command(0x12); // 默認(rèn)值
   OLED_Write_Command(0x81); // 對(duì)比度設(shè)置
   OLED_Write_Command(0xCF); // 默認(rèn)值
   OLED_Write_Command(0xd9); // 設(shè)置預(yù)充電周期
   OLED_Write_Command(0xF1); // 默認(rèn)值
   OLED_Write_Command(0xDB); // 設(shè)置VCOMH
   OLED_Write_Command(0x40); // 默認(rèn)值
   OLED_Write_Command(0xA4); // 關(guān)閉全屏點(diǎn)亮
   OLED_Write_Command(0xA6); // 設(shè)置顯示方式
   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) { // 寫數(shù)據(jù)
   I2C1_Start();
   I2C1_SendByte(OLED_ADDRESS);
   I2C1_SendByte(0x40);
   I2C1_SendByte(data);
   I2C1_Stop();
 }
 ?
 void OLED_Set_Pos(uint8_t x, uint8_t y) { // 設(shè)置光標(biāo)位置
   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) { // 在指定位置顯示數(shù)字
   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列顯示數(shù)字12345
 ?
   while (1) {
   }
 }

首先,通過oled_init()函數(shù)初始化OLED屏幕,在函數(shù)中依次寫入了一系列命令,來設(shè)置OLED的各種參數(shù),例如驅(qū)動(dòng)路數(shù)、掃描方向、預(yù)充電周期、對(duì)比度等。接著,在OLED_Show_Number()函數(shù)中,調(diào)用了OLED_Set_Pos()函數(shù)來設(shè)置數(shù)字顯示的位置,然后通過循環(huán)取余數(shù)的方法將數(shù)字逐位分離,再將其轉(zhuǎn)換為字符型并通過OLED_Write_Data()函數(shù)輸出到OLED屏幕上,最終實(shí)現(xiàn)在屏幕上顯示指定數(shù)字的功能。

【2】溫度測(cè)量代碼

以下是基于STM32F103C8T6主控芯片,通過IIC接口控制0.96寸OLED顯示屏顯示溫度,并通過串口打印溫度的代碼:

#include "stm32f10x.h"
 #include "i2c.h"
 #include "usart.h"
 ?
 #define OLED_ADDRESS 0x78 // OLED IIC地址
 ?
 // PT100溫度轉(zhuǎn)換函數(shù)
 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); // 關(guān)閉顯示
     OLED_Write_Command(0xD5); // 設(shè)置時(shí)鐘分頻因子
     OLED_Write_Command(0x80); // 重要參數(shù),必須設(shè)置,不然屏幕無法上電
     OLED_Write_Command(0xA8); // 設(shè)置驅(qū)動(dòng)路數(shù)
     OLED_Write_Command(0x3F); // 默認(rèn)值
     OLED_Write_Command(0xD3); // 設(shè)置顯示偏移
     OLED_Write_Command(0x00); // 默認(rèn)值
     OLED_Write_Command(0x40); // 設(shè)置起始行
     OLED_Write_Command(0x8D); // 電荷泵設(shè)置
     OLED_Write_Command(0x14); // 開啟電荷泵
     OLED_Write_Command(0x20); // 設(shè)置內(nèi)存地址模式
     OLED_Write_Command(0x00); // 水平模式
     OLED_Write_Command(0xA1); // 段重新映射設(shè)置
     OLED_Write_Command(0xC0); // 設(shè)置COM掃描方向
     OLED_Write_Command(0xDA); // 設(shè)置COM引腳硬件配置
     OLED_Write_Command(0x12); // 默認(rèn)值
     OLED_Write_Command(0x81); // 對(duì)比度設(shè)置
     OLED_Write_Command(0xCF); // 默認(rèn)值
     OLED_Write_Command(0xd9); // 設(shè)置預(yù)充電周期
     OLED_Write_Command(0xF1); // 默認(rèn)值
     OLED_Write_Command(0xDB); // 設(shè)置VCOMH
     OLED_Write_Command(0x40); // 默認(rèn)值
     OLED_Write_Command(0xA4); // 關(guān)閉全屏點(diǎn)亮
     OLED_Write_Command(0xA6); // 設(shè)置顯示方式
     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) { // 寫數(shù)據(jù)
     I2C1_Start();
     I2C1_SendByte(OLED_ADDRESS);
     I2C1_SendByte(0x40);
     I2C1_SendByte(data);
     I2C1_Stop();
 }
 ?
 void OLED_Set_Pos(uint8_t x, uint8_t y) { // 設(shè)置光標(biāo)位置
     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); // 延時(shí)1s
     }
 }

首先,利用RTD2Temperature()函數(shù)將鉑電阻的電阻值轉(zhuǎn)換為溫度值。接著,在OLED_Show_Temperature()函數(shù)中,調(diào)用了OLED_Set_Pos()函數(shù)來設(shè)置溫度顯示的位置,并將溫度值逐位分離,通過OLED_Write_Data()函數(shù)輸出到OLED屏幕上,最終實(shí)現(xiàn)在屏幕上顯示測(cè)量的溫度的功能。同時(shí),也通過串口輸出溫度值。

在主函數(shù)main()中,不斷循環(huán)讀取鉑電阻的電阻值,并通過RTD2Temperature()函數(shù)轉(zhuǎn)換為溫度值。然后,調(diào)用OLED_Show_Temperature()函數(shù)將溫度顯示在OLED屏幕上,并調(diào)用USART1_SendString()函數(shù)通過串口輸出溫度值。最后,通過delay_ms()函數(shù)延時(shí)1秒,等待下一次測(cè)量。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7467

    瀏覽量

    150882
  • 傳感器
    +關(guān)注

    關(guān)注

    2546

    文章

    50498

    瀏覽量

    751195
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6030

    文章

    44500

    瀏覽量

    632178
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10858

    瀏覽量

    354392
  • 檢測(cè)儀
    +關(guān)注

    關(guān)注

    5

    文章

    4061

    瀏覽量

    42177
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    微機(jī)燃點(diǎn)檢測(cè)儀配置簡(jiǎn)要?

    `微機(jī)燃點(diǎn)檢測(cè)儀配置簡(jiǎn)要?微機(jī)燃點(diǎn)檢測(cè)儀配置簡(jiǎn)要?【鶴壁市英特儀器儀表廠】詳詢138.3923.4904檢測(cè)燃點(diǎn)的儀器,化驗(yàn)燃點(diǎn)的設(shè)備,生物燃料燃燒測(cè)定,煤炭燃點(diǎn)
    發(fā)表于 09-10 15:56

    水分檢測(cè)儀的原理是什么?

    水分測(cè)定也叫做水分、水份測(cè)定、快速水分測(cè)定、水分計(jì)、水分檢測(cè)儀、水分測(cè)量儀、水分分析、
    發(fā)表于 10-28 09:11

    固體燃料燃點(diǎn)檢測(cè)儀 YTRD-9型

    燃點(diǎn)檢測(cè)儀,測(cè)量煤燃點(diǎn)的設(shè)備功能特點(diǎn):1、電腦與控制器雙向通訊,實(shí)行全面監(jiān)控自動(dòng)控制、顯示加熱爐的溫度自動(dòng)測(cè)定、顯示煤樣溫度自動(dòng)繪制爐溫隨時(shí)間變化曲線自動(dòng)繪制煤樣
    發(fā)表于 12-22 07:53

    高精度木材燃點(diǎn)著火點(diǎn)檢測(cè)儀 SH-6A系列

    ,測(cè)試木材著火點(diǎn)機(jī)器,檢測(cè)樹葉稻草著火點(diǎn)溫度的設(shè)備燃點(diǎn)測(cè)定功能特點(diǎn):1、電腦與控制器雙向通訊,實(shí)行監(jiān)控,自動(dòng)控制、顯示加熱爐的溫度,自動(dòng)測(cè)定、顯示樣
    發(fā)表于 12-23 08:54

    常用的木材枯草樹葉燃點(diǎn)檢測(cè)儀

    `常用的木材枯草樹葉燃點(diǎn)檢測(cè)儀 常用的木材枯草樹葉燃點(diǎn)檢測(cè)儀 全自動(dòng)木材燃點(diǎn)測(cè)定,高精度木材燃點(diǎn)分析,測(cè)試固體燃料著火點(diǎn)儀器,檢測(cè)木炭木
    發(fā)表于 02-28 14:24

    HY-9T全自動(dòng)木材燃點(diǎn)檢測(cè)儀【英特儀器】

    `HY-9T全自動(dòng)木材燃點(diǎn)檢測(cè)儀【英特儀器】 HY-9T全自動(dòng)木材燃點(diǎn)檢測(cè)儀【英特儀器】林業(yè)大學(xué)全自動(dòng)木材燃點(diǎn)測(cè)定,微機(jī)木材燃點(diǎn)分析,木材著火點(diǎn)化驗(yàn)
    發(fā)表于 04-16 07:22

    怎樣去設(shè)計(jì)基于嵌入式stm32的心率檢測(cè)儀

    資源分享:嵌入式stm32項(xiàng)目開發(fā) 心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù),STM32開發(fā)板廣泛應(yīng)
    發(fā)表于 08-03 06:11

    基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù)

    視頻教程免費(fèi)分享:嵌入式stm32項(xiàng)目開發(fā)之心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù),STM32開發(fā)
    發(fā)表于 08-03 06:44

    怎樣去設(shè)計(jì)一種STM32的心率檢測(cè)儀

    STM32是什么?怎樣去設(shè)計(jì)一種STM32的心率檢測(cè)儀?
    發(fā)表于 09-28 08:12

    怎樣去設(shè)計(jì)一種基于STM32的心率檢測(cè)儀

    怎樣去設(shè)計(jì)一種基于STM32的心率檢測(cè)儀?
    發(fā)表于 09-29 08:58

    怎樣去設(shè)計(jì)一種基于STM32的心率檢測(cè)儀

    怎樣去設(shè)計(jì)一種基于STM32的心率檢測(cè)儀?
    發(fā)表于 10-11 07:13

    如何利用STM32單片機(jī)實(shí)現(xiàn)顏色檢測(cè)儀設(shè)計(jì)

    9、基于STM32單片機(jī)的顏色檢測(cè)儀設(shè)計(jì)文章目錄9、基于STM32單片機(jī)的顏色檢測(cè)儀設(shè)計(jì)引言1、系統(tǒng)概述1.1、設(shè)計(jì)任務(wù)1.2、設(shè)計(jì)要求2、方案設(shè)計(jì)與論證2.1、芯片選擇方案2.2 、
    發(fā)表于 11-30 06:34

    便攜式低功耗溫度檢測(cè)儀設(shè)計(jì)

    便攜式低功耗溫度檢測(cè)儀主要由一體化智能溫度檢測(cè)模塊、nRF905無線數(shù)據(jù)收發(fā)模塊和LCD溫度數(shù)據(jù)顯示模塊構(gòu)成。該
    發(fā)表于 09-24 15:36 ?31次下載
    便攜式低功耗<b class='flag-5'>溫度</b><b class='flag-5'>檢測(cè)儀</b>設(shè)計(jì)

    基于STM32空氣質(zhì)量檢測(cè)儀原理圖

    STM32空氣質(zhì)量檢測(cè)儀原理圖STM32空氣質(zhì)量檢測(cè)儀原理圖STM32空氣質(zhì)量檢測(cè)儀原理圖
    發(fā)表于 10-29 18:22 ?351次下載

    基于STM32爐溫溫度檢測(cè)儀設(shè)計(jì)方案

    隨著工業(yè)生產(chǎn)的發(fā)展,爐溫檢測(cè)在現(xiàn)代化工、鋼鐵、電子、玻璃等行業(yè)中變得越來越重要。對(duì)于這些行業(yè),穩(wěn)定的生產(chǎn)環(huán)境和品質(zhì)穩(wěn)定的產(chǎn)品是必須的,而爐溫是影響產(chǎn)品品質(zhì)的重要因素之一。
    發(fā)表于 07-06 10:13 ?731次閱讀
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>爐溫</b><b class='flag-5'>溫度</b><b class='flag-5'>檢測(cè)儀</b>設(shè)計(jì)方案