
【STM32】max6675水温检测+OLED屏实时显示+串口有线传输+蓝牙无线传输
项目整体架构及思路
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博客
需要项目代码文件在下面,直接下载即可