STONE串口屏 项目简要介绍
不久前,我在网上购物时发现了一个心率传感器模块 MAX30100。该模块能够采集用户的血氧和心率数据,使用起来简单方便。
根据资料,我发现Arduino库文件中已有MAX30100的库文件。也就是说,如果使用STONE串口屏与MAX30100之间的通信,可以直接调用Arduino库文件,无需重新编写驱动程序文件。这非常方便,因此我购买了MAX30100模块。
我决定使用Arduino验证MAX30100的心率和血氧采集功能。搭配STONE TFT 串口屏用于血压监测。
注意:该模块默认仅支持3.3V电平MCU通信,因为其默认使用IIC引脚上拉电阻为4.7K至1.8V, 因此默认情况下无法与Arduino通信。若需与Arduino通信,需将两个4.7K的IIC引脚上拉电阻连接至VIN引脚,相关内容将在本章后半部分详细介绍。
功能分配
在开始本项目前,我考虑了以下简单功能:
- 采集心率数据和血氧数据
- 通过串口屏显示心率和血氧数据
这是仅有的两个功能,但若要实现,需要进一步规划:
- 选用哪种主控MCU?
- 选用何种LCD显示屏?
如前所述,我们选用Arduino作为MCU,但这是STONE串口屏项目,因此需选择适配的LCD显示模块。我计划使用带串口接口的LCD显示屏。我这里有一个STONE STVI070WT-01显示器,但如果Arduino需要与它通信,则需要MAX3232进行电平转换。
然后,基本电子材料确定如下:
- Arduino Mini Pro开发板
- MAX30100心率和血氧传感器模块
- STONESTVI070WT-01LCD串口显示模块
- MAX3232模块
硬件介绍
MAX30100
MAX30100 是一款集成的脉搏血氧饱和度和心率监测传感器解决方案。它集成了两个 LED、光电检测器、优化光学元件和低噪声模拟信号处理电路,用于检测脉搏血氧饱和度和心率信号。MAX30100 支持 1.8V 和 3.3V 电源供电,可通过软件实现低功耗待机模式,待机电流可忽略不计,允许电源始终连接。
应用领域
- 可穿戴设备
- 健身辅助设备
- 医疗监测设备
优势与特点
1、完整的脉搏血氧仪和心率传感器解决方案,简化设计
- 集成LED、光传感器和高性能模拟前端
- 超小型5.6mm x 2.8mm x 1.2mm 14引脚光学增强型系统级封装
2、超低功耗运行延长可穿戴设备电池寿命
- 可编程采样率和LED电流以节省功耗
- 超低关机电流(0.7µA,典型值)
3、先进功能提升测量性能
- 高信噪比(SNR)确保抗运动伪影性能优异
- 集成环境光消除功能
- 高采样率能力
- 快速数据输出能力
检测原理

只需将手指按压在传感器上,即可估算脉搏血氧饱和度(SpO2)和脉搏(相当于心跳)。
脉搏血氧仪(血氧仪)是一种小型光谱仪,利用红细胞吸收光谱的不同原理分析血液中的氧饱和度。这种实时快速的测量方法在许多临床参考中也被广泛应用。
我不会过多介绍MAX30100,因为这些资料在互联网上均可查阅。感兴趣的朋友可通过网络查阅该心率测试模块的详细信息,以深入了解其检测原理。
STVI070WT-01显示屏简介
本项目将使用STONE STVI070WT-01显示心率和血氧数据。
驱动芯片已集成于显示屏内部,并提供用户可用的软件。用户只需通过设计的UI界面添加按钮、文本框等逻辑,生成配置文件并下载至显示屏即可运行。
STVI070WT-01显示屏通过UART RS232信号与MCU通信,因此需添加MAX3232芯片将RS232信号转换为TTL信号,以便与Arduino MCU通信。
如果您不确定如何使用MAX3232,请参考以下图片:

如果您认为电平转换过于繁琐,可以选择STONE Tech的其他类型显示屏,其中部分型号可直接输出UART-TTL信号。
官方网站有详细信息和介绍:
https://www.stone-hmi.com//
如果您需要视频教程和使用指南,也可在官方网站上找到。
开发步骤
STONE显示屏开发的三步流程:
- 使用STONE TOOL软件设计显示逻辑和按钮逻辑,并将设计文件下载到显示模块。
- MCU通过串口与STONE串口屏进行通信。
- 根据步骤2获取的数据,MCU执行其他操作。
STONE TOOL软件安装
从官网下载最新版本的STONE TOOL 软件(当前版本为TOOL2019),并进行安装。
安装完成后,将打开以下界面:

点击左上角的“文件”按钮创建新项目,具体操作将在后续章节中详细说明。
STONE串口屏
Arduino 是一个开源电子原型开发平台,具有易于使用和易于学习的特点。它包括硬件部分(符合 Arduino 规范的各种开发板)和软件部分(Arduino IDE 及相关开发工具包)。
硬件部分(或开发板)由微控制器(MCU)、闪存(Flash)和一套通用输入/输出接口(GPIO)组成,可视为微型计算机主板。
软件部分主要由PC端的Arduino IDE、相关的板级支持包(BSP)以及丰富的第三方功能库组成。通过Arduino IDE,您可以轻松下载与开发板对应的BSP以及编写程序所需的库文件。
Arduino是一个开源平台。目前已衍生出众多型号和控制器,包括Arduino Uno、Arduino Nano、Arduino Yun等。此外,Arduino IDE现不仅支持Arduino系列开发板,还通过引入BSP支持了Intel Galileo和NodeMCU等热门开发板。
Arduino 通过各种传感器感知环境,控制灯光、电机等设备,以反馈并影响环境。开发板上的微控制器可使用 Arduino 编程语言进行编程,编译成二进制文件并烧录到微控制器中。Arduino 的编程实现基于 Wiring 的 Arduino 编程语言和基于 Processing 的 Arduino 开发环境。基于Arduino的项目可以仅包含Arduino,也可以包含Arduino和其他在PC上运行的软件,它们之间可以相互通信(如Flash、Processing、MaxMSP)。
Arduino串行TFT LCD显示屏项目开发环境
Arduino开发环境是Arduino IDE,可从互联网下载。
登录Arduino官方网站并下载软件
https://www.arduino.cc/en/software/
安装Arduino IDE后,打开软件将出现以下界面:

Arduino IDE默认创建两个函数:setup函数和loop函数。
互联网上有大量Arduino入门教程。若遇到不明白的地方,可自行上网查找。
STONE串口屏 项目实现过程
硬件连接
为了确保后续编写代码的顺利进行,我们必须首先确保硬件连接的可靠性。
本项目仅使用了四块硬件:
- Arduino Mini Pro 开发板
- STONE STVI070WT-01 TFT-LCD 显示屏
- MAX30100 心率和血氧传感器
- MAX3232(RS232→TTL)
Arduino Mini Pro开发板与STVI070WT-01 TFT-LCD显示屏通过UART接口连接,需通过MAX3232进行电平转换,随后Arduino Mini Pro开发板与MAX30100模块通过IIC接口连接。经过仔细规划,我们可以绘制以下接线图:
确保硬件连接无误后,继续进行下一步。

STONE串口屏用户界面设计
首先,我们需要设计一个 UI 显示图像,可使用 PhotoShop 或其他图像设计工具进行设计。设计完成后,将图像保存为 JPG 格式。
打开软件 STONE TOOL 2019 并创建一个新项目:


删除新项目中默认加载的图像,并添加我们设计的 UI 图像。
添加文本显示组件,设计显示数字和小数点,获取文本显示组件在显示器中的存储位置。
效果如下:

文本显示组件地址:
- 连接状态:0x0008
- 心率:0x0001
- 血氧:0x0005
UI 界面的主要内容如下:
- 连接状态
- 心率显示
- 血氧显示
生成配置文件

UI 设计完成后,可生成配置文件并下载至 STVI070WT-01 显示屏。
首先执行步骤1,然后将USB闪存盘插入计算机,磁盘图标将显示出来。点击“下载到U盘”将配置文件下载到USB闪存盘,随后将USB闪存盘插入STVI070WT-01完成升级。
MAX30100

MAX30100通过IIC接口进行通信。其工作原理是通过红外LED照射获取心率的ADC值。MAX30100寄存器可分为五类:状态寄存器、FIFO、控制寄存器、温度寄存器和ID寄存器。温度寄存器用于读取芯片温度值以校正温度引起的偏差。ID寄存器可读取芯片的ID号。
MAX30100 通过 IIC 通信接口与 Arduino Mini Pro 开发板连接。由于 Arduino IDE 中已提供现成的 MAX30100 库文件,无需研究 MAX30100 的寄存器即可读取心率和血氧数据。
对于对 MAX30100 寄存器感兴趣的用户,请参阅 MAX30100 数据手册。
修改 MAX30100 IIC 上拉电阻
需要注意的是,MAX30100 模块的 IIC 引脚上的 4.7k 上拉电阻连接到 1.8V,理论上这没有问题。然而,Arduino IIC引脚的通信逻辑电平为5V,因此在不修改MAX30100模块硬件的情况下无法与Arduino通信。若MCU为STM32或其他3.3V逻辑电平MCU,则可直接通信。
因此,需进行以下修改:

使用电烙铁拆除图中标记的三个4.7k电阻。然后将两个4.7k电阻焊接到SDA和SCL引脚与VIN之间,以便与Arduino通信。
Arduino串口显示屏LCD
打开Arduino IDE并找到以下按钮:

搜索“MAX30100”以找到两个MAX30100库,然后点击下载并安装。

安装完成后,可在STONE串口屏的LIB库文件夹中找到MAX30100的示例程序:

双击文件打开。

该示例可直接测试。若硬件连接无误,可将代码编译后烧录至Arduino开发板,并在串口调试工具中查看MAX30100的数据。
完整代码如下:
/*
Arduino-MAX30100 血氧/心率集成传感器库
*/
#include
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
// PulseOximeter is the higher level interface to the sensor
// it offers:
// * beat detection reporting
// * heart rate calculation
// * SpO2 (oxidation level) calculation
PulseOximeter pox;
uint32_t tsLastReport = 0;
// Callback (registered below) fired when a pulse is detected
void onBeatDetected()
{
Serial.println("Beat!");
}
void setup()
{
Serial.begin(115200);
Serial.print("Initializing pulse oximeter..");
// Initialize the PulseOximeter instance
// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
// The default current for the IR LED is 50mA and it could be changed
// by uncommenting the following line. Check MAX30100_Registers.h for all the
// available options.
// pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
// Make sure to call update as fast as possible
pox.update();
// Asynchronously dump heart rate and oxidation levels to the serial
// For both, a value of 0 means "invalid"
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");
tsLastReport = millis();
}
}

本程序为自由软件:您可以重新分发它和/或修改
它,但须遵守GNU通用公共许可证的条款,该许可证由
自由软件基金会发布,版本为3,或
(由您选择)任何后续版本。
本程序以希望其对您有所帮助为目的进行分发,
但不提供任何形式的保证,包括但不限于
对适销性或适用于特定目的的默示保证。请参阅
GNU通用公共许可证以获取更多详细信息。
您应已随本程序获得GNU通用公共许可证的副本。
如未获得,请参阅。
/*
Arduino-MAX30100 oximetry / heart rate integrated sensor library
Copyright (C) 2016 OXullo Intersecans<x@brainrapers.org style="box-sizing: border-box; -webkit-tap-highlight-color: transparent;"></x@brainrapers.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see.
*/
#include
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
#define Heart_dis_addr 0x01
#define Sop2_dis_addr 0x05
#define connect_sta_addr 0x08
unsigned char heart_rate_send[8]= {0xA5, 0x5A, 0x05, 0x82,\
0x00, Heart_dis_addr, 0x00, 0x00};
unsigned char Sop2_send[8]= {0xA5, 0x5A, 0x05, 0x82, 0x00, \
Sop2_dis_addr, 0x00, 0x00};
unsigned char connect_sta_send[8]={0xA5, 0x5A, 0x05, 0x82, 0x00, \
connect_sta_addr,0x00, 0x00};
// PulseOximeter is the higher level interface to the sensor
// it offers:
// * beat detection reporting
// * heart rate calculation
// * SpO2 (oxidation level) calculation
PulseOximeter pox;
uint32_t tsLastReport = 0;
// Callback (registered below) fired when a pulse is detected
void onBeatDetected()
{
// Serial.println("Beat!");
}
void setup()
{
Serial.begin(115200);
// Serial.print("Initializing pulse oximeter..");
// Initialize the PulseOximeter instance
// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!pox.begin()) {
// Serial.println("FAILED");
// connect_sta_send[7]=0x00;
// Serial.write(connect_sta_send,8);
for(;;);
} else {
connect_sta_send[7]=0x01;
Serial.write(connect_sta_send,8);
// Serial.println("SUCCESS");
}
// The default current for the IR LED is 50mA and it could be changed
// by uncommenting the following line. Check MAX30100_Registers.h for all the
// available options.
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
// Make sure to call update as fast as possible
pox.update();
// Asynchronously dump heart rate and oxidation levels to the serial
// For both, a value of 0 means "invalid"
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
// Serial.print("Heart rate:");
// Serial.print(pox.getHeartRate());
// Serial.print("bpm / SpO2:");
// Serial.print(pox.getSpO2());
// Serial.println("%");
heart_rate_send[7]=(uint32_t)pox.getHeartRate();
Serial.write(heart_rate_send,8);
Sop2_send[7]=pox.getSpO2();
Serial.write(Sop2_send,8);
tsLastReport = millis();
}
}
这段代码非常简单,我相信你一眼就能看懂。我不得不说,Arduino的模块化编程非常方便,甚至不需要理解Uart和IIC驱动程序的具体实现。
当然,上述代码是官方示例,我仍然需要进行一些修改才能将数据显示到STONE的显示屏上。
通过Arduino LCD将数据显示到STONE显示屏
编译代码,将其下载到Arduino串口显示屏开发板,即可开始测试。
我们可以发现,当手指离开MAX30100时,心率和血氧值显示为0。将手指放在MAX30100的传感器上,即可实时查看心率和血氧水平。
STONE STONE串口屏项目效果如图所示。


