项目整体架构及思路

STM32F103ZET6系列单片机,MAX6675K系列热电偶,0.96寸基于IIC的四针OLED屏幕,加上HC-05系列主从一体的蓝牙。

1 工程文件设计

图3.工程文件

工程文件主要分为四大部分,分为oled部分,MAX6675部分,串口 SPI,IIC等通讯部分,蓝牙部分。

程序流程主要是通过热电偶检测到了原始数据,上传至STM32,进行换算成摄氏度后,通过串口发送到PC主机上,同时将数据进行字模转换使其在OLED显示屏上显示,将数据同步使用蓝牙发送至手机上。实现三端实时动态数据的显示。

图4 系统结构

2. STM32程序设计

2.1 MAX6675测温部分

这里参考了这篇文章的代码STM32驱动MAX6675读取K型热电偶温度_stm32热电偶_顶点元的博客-CSDN博客

  MAX6675.h

#ifndef __MAX6675_H
#define __MAX6675_H

#include "stm32f10x.h"

#define MAX6675_CS1_CLK   RCC_APB2Periph_GPIOA
#define MAX6675_CS1_PORT  GPIOA
#define MAX6675_CS1_PIN   GPIO_Pin_4

void max6675_init(void);			 //³初始化
uint8_t max6675_readWriteByte(uint8_t txData); //max6675
uint16_t max6675_readRawValue(void);
float max6675_readTemperature(void);


#endif

MAX6675.c

#include "max6675.h"
#include "spi.h"

void max6675_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(MAX6675_CS1_CLK, ENABLE); //PORTAʱÖÓʹÄÜ 
  GPIO_InitStructure.GPIO_Pin = MAX6675_CS1_PIN;  // PA4 ÍÆÍì 	  T_CS
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //ÍÆÍìÊä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(MAX6675_CS1_PORT, &GPIO_InitStructure);
 	GPIO_SetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN);	//	T_CS=1
  spi1_init();
} 

uint8_t max6675_readWriteByte(uint8_t txData)
{		
  return spi1_readWriteByte(txData);
}  

uint16_t max6675_readRawValue(void)
{
  uint16_t tmp;
  
  GPIO_ResetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN); //enable max6675
 
  tmp = max6675_readWriteByte(0XFF); //read MSB
  tmp <<= 8;
  tmp |= max6675_readWriteByte(0XFF); //read LSB
  
  GPIO_SetBits(MAX6675_CS1_PORT,MAX6675_CS1_PIN); //disable max6675
  if (tmp & 4) 
  {
    // thermocouple open
    tmp = 2000; //δ¼ì²âµ½Èȵçż
  }
  else 
  {
    tmp = tmp >> 3;
  }

  return tmp;
}


float max6675_readTemperature(void)
{
  return (max6675_readRawValue() * 1024.0 / 4096);
}


初始化MAX6675传感器之后,通过调用库函数max6675_readTemperature();得到转换后的温度,在头文件中max6675_readRawValue() * 1024.0 / 4096将原始值转换为摄氏度单位。

main函数中有关测温的函数和串口发送的函数

delay_init();
usart1_init(115200);
 max6675_init();
float t;
uint16_t temperature;
while(1){
     temperature = max6675_readRawValue();
    printf(":%d\n",temperature);
	  t = max6675_readTemperature();
	  printf("the temperature is:%.2f\n",t);
			 printf("\n");
	  delay_ms(500);}

串口输出结果

2.2 OLED显示部分

     硬件部分,OLED采用IIC通讯,其中VCC可接3.3V~5V,SCL接PB6,PB7;但由于我们后续设计可能涉及到的接线冲突,我们这里在软件中将IIC的引脚映射到PB10,PB11中,方便后续拓展。

图10 OLED模块

实现将得到的数据显示在OLED屏幕上需要将数据转换STR字符串型,调用字模里的字符显示,其中数字型和英文字符及数字字符可以直接调用头文件,中文字符需要使用字模软件进行转换才可以显示到屏幕上。

需要调用到的OLED头文件,在头文件里设置了我们显示屏的刷新频率,显示模式,坐标的位置设定等。以及我们转换好的字模也放置在此,方便在主程序中直接调用。

最终,我们可以在主程序中直接通过OLED_ShowCHinese将文字输出在显示屏上,也可以将我们转换好的温度数据通过OLED_ShowChar(),OLED_ShowString();进行输出

图9 OLED主函数部分

最终我们的显示结果如下图

图10 OLED屏幕显示结果

3 蓝牙部分

手机下载e调试,然后直接将蓝牙模块通过串口接入即可。

记得要使用主从一体的蓝牙最好。

4. 实验结果

图10 水温检测实验结果

可以看出水温实时显示在PC端和OLED屏幕上,实验结束。

【STM32】max6675水温检测+OLED屏实时显示+串口有线传输+蓝牙无线传输_stm32 max6675-CSDN博客

需要项目代码文件在下面,直接下载即可

【免费】STM32-max6675水温检测+OLED屏实时显示+串口有线传输+蓝牙无线传输资源-CSDN文库