本项目是中医展示馆展示血氧饱和度、心率测试体验,通过生物传感器获得体验者的血氧饱和度、心率值,ESP32模块将数据通过蓝牙发送给微信小程序显示,或者通过串口发送给STONE串口屏STWI101WT-01显示。
STONE串口屏的二维码部件
特别地,STONE串口屏新升级版本有二维码qr_code部件,非常方便通过二维码扫码来展示信息。官方提供的Command Set.pdf文档中也提供了专门的命令来写入二维码部件的text值。如图(1)。
图(1)二维码部件text写入命令
2. For example:
Set QR code text content:
ST<{"cmd_code":"set_text","type":"qr","widget":"qr1","text":"http://www.stoneitech.com"}>ET
在新版的stone-designer界面开发工具中,二维码部件的属性见图(2),其中text可设置初值,也可通过上面指令随时修改,二维码部件的宽高尺寸设计时很方便修改。
图(2)二维码部件的属性值
生物传感器
MAX30102生物传感器模块如图(3),可以通过板上的串口TX、RX直接读取心率、血氧饱和度,其中集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。模块供电5V,心率测量范围:20-200次/min, 血氧饱和度测量范围:50%-100%,串口输出,波特率9600。AT指令如下:
AT+HEART\r\n 读取心率值,返回:+HEART=心率值OK
AT+SPO2\r\n 读取血氧饱和度值 返回:+SPO2=血氧值OK
AT+RESET\r\n 模块复位
图(3)MAX30102生物传感器模块
MAX30102生物传感器模块可以通过电脑串口助手先行调试,确认ok再使用。板串口与电脑USB通讯,可以用STONE提供的转接板V1.2将电脑USB信号转换成串口信号,见附录图(101),MAX30102板上的TX接V1.2转接板的RX(注意不是Rout),MAX30102板上的RX接V1.2转接板TX,V1.2转接板上两个短接线都拿掉。串口助手发送AT指令时,记得末尾加上回车(\r)、换行 (\n),特别注意,串口助手波特率设置9600,如果需要自动重发,间隔时间可调整为500ms。模块就绪后,传感器红色LED亮起,表示可以开始测试了,测试时请将食指贴在传感器玻壳表面。发送AT指令,读取HEART或SPO2的值,直到稳定为止。
一切顺利,就可以开始下一步联调了!
NODEMCU-32模块
图(4)NODEMCU-32模块不仅带有wifi、蓝牙BLE功能,从图(5)可见P34、P35针脚还引出了串口U0TXD、U0RXD,从图(6)可见P16、P17针脚引出了串口U1RXD、U1TXD。特别适合本项目串口0连MAX30102生物传感器模块、串口1连接STONE串口显示屏,蓝牙连接手机微信小程序。
图(4)NODEMCU-32模块
图(5)NODEMCU-32模块串口0
图(6)NODEMCU-32模块串口1
前面我们已经通过电脑串口助手调试MAX30102生物传感器模块成功,现在有信心进一步联调与NODEMCU-32的通讯了,按照规划如图(7)连线,MAX30102供电是5V,正好NODEMCU-32有5V引脚出来可以直接提供,于是连接变得特别简单:
MAX30102生物传感器模块 NODEMCU-32模块
TX RX(34脚)
RX TX(35脚)
GND GND(38脚)
5V 5V(19脚)
图(7)NODEMCU-32模块串口0连接生物传感器模块
硬件连接好以后,我们先可以连接蓝牙,通过手机微信小程序实现:经过NODEMCU-32模块对MAX30102生物传感器模块心率(HEART)、血氧饱和度(SPO2)数值的读取与显示。在arduino1.18.3平台上,配置NODEMCU-32模块蓝牙并与MAX30102生物传感器模块串口通讯的代码如下:
/*
Video: https://www.youtube.com/watch?v=oCMOYS71NIU
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
Ported to Arduino ESP32 by Evandro Copercini
Create a BLE server that, once we receive a connection, will send periodic notifications.
The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"
The design of creating the BLE server is:
1. Create a BLE Server
2. Create a BLE Service
3. Create a BLE Characteristic on the Service
4. Create a BLE Descriptor on the characteristic
5. Start the service.
6. Start advertising.
In this example rxValue is the data received (only accessible inside that function).
And txValue is the data to be sent, in this example just a byte incremented every second.
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0; // 从蓝牙发送的 16进制 如:0x7B
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
for (int i = 0; i < rxValue.length(); i++)
Serial.print(rxValue[i]); // 从蓝牙接收的AT指令传递给MAX30102生物传感器模块
Serial.println(); //添加回车和换行
}
}
};
void setup() {
Serial.begin(9600); // SPO2 board UART is 9600!
// Create the BLE Device
BLEDevice::init("中医馆血氧板"); // 蓝牙设备的 name 别超过6个汉字,不合格名称会用ESP32代替。
// Create the BLE Server 服务器
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service 服务
BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic 特征
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);
pTxCharacteristic->addDescriptor(new BLE2902());
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);
pRxCharacteristic->setCallbacks(new MyCallbacks());
// Start the service
pService->start();
// Start advertising
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify..."); // 等一个客户端连接的通知...
}
void loop() {
// 读取串口发送的信息,并发给BLE、简单解码:
if (Serial.available() > 0)
{
if (deviceConnected) {
txValue = Serial.read(); // uint8_t txValue = 0; 从蓝牙发送的 16进制 如:0x7B
pTxCharacteristic->setValue(&txValue, 1);
pTxCharacteristic->notify();
delay(10); // bluetooth stack will go into congestion, if too many packets are sent
}
}
// disconnecting
if (!deviceConnected && oldDeviceConnected) {
delay(500); // give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // restart advertising
Serial.println("start advertising"); // 断开蓝牙连接时,开始广播
oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
oldDeviceConnected = deviceConnected;
}
}
NODEMCU-32模块的蓝牙布置妥当,就可以开始微信小程序联调了!
微信小程序
蓝牙测试的小程序界面见图(8),上面是“开始扫描”按钮,找到“中医馆血氧板”真是上面NODEMCU-32模块配置的蓝牙名称,点击后即显示蓝灰色的“已连接到中医馆血氧板”,紧跟着下面出现的按钮分别是“写数据”、“断开连接”、“测心率”、“测血氧”、“血氧复位”、“测‘血氧+心率’”,点击后在“串口收到的数据all”下方可以看到返回的心率和血氧饱和度值。
图(8)小程序界面
STONE串口屏界面
有5个界面,基于10.1寸的STONE串口触摸屏STWI101WT-01,分辨率1024*600,分别是:page0、page1、page2、page3、随机密码弹窗。其中page0中是3种显示方式的选择界面,,见图(9)。愿意公开显示的就直接选择page1,直接显示,见图(10)。需要隐私个人健康数据的,可选择page2、page3;page2通过蓝牙传输,读取检测值在个人手机上显示,见图(11)。page3通过随机密码在NODEMCU-32中编码、在手机微信小程序中输入随机密码来解码显示,见图(12)。随机密码随机产生,每次不同,见图(13)。
Page1中SPO2测量值对应部件:label11,HEART测量值对应部件:label12,开始测试按钮对应部件:button12,测试结果对应部件:label13. 显示指令在Arduino平台指令写法如下:
Serial1.println("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"label13\",\"visible\":true}>ET");
串口1显示屏上SPO2=88指令写法如下:
Serial1.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label11\",\"value\":88,\"format\":\"%d\"}>ET"); //+SPO2=88
Page2中开始测试按钮对应部件:button22.测试结束时,部件label21会亮起。
Page3中开始测试按钮对应部件:button32. 测试结束时部件label31会亮起,同时二维码部件qr1会显示加密数据的二维码。随机密码按钮:button33,按下会展示弹窗,以便得到本次测试的随机密码,见图(13)。
图(9)STONE串口屏主界面page0
图(10)STONE串口屏界面page1
界面Page1读取数据显示时,血氧饱和度通常能首先显示,心率往往会延时几秒才能稳定下来,请耐心等待......
图(11)STONE串口屏界面page2
图(12)STONE串口屏界面page3
在界面page3中,使用了图(1)的二维码set_text指令,将随机密码和测试数据混合,生成加密的数据通过二维码展示,微信小程序端再通过输入相同的随机密码来解码显示正确的测量值。
以下指令给空字符qr code部件,可以让二维码位置显示空白。
Serial1.println("ST<{\"cmd_code\":\"set_text\",\"type\":\"qr\",\"widget\":\"qr1\",\"text\":\"\"}>ET");
图(13)STONE串口屏随机密码弹窗
随机密码弹窗部件label42会随机显示4位密码,每次不同。在微信小程序中记录密码后,点击按钮“ok” (部件名:button7),关闭弹窗。
随机密码编码解码示例:
1、设定编码方式为,实际SPO2=98,加“8695”的前两位86,得184,实测HEART=71,加“8695”的后两位95,得166. 通过以下指令写入二维码部件中;
Serial1.println("ST<{\"cmd_code\":\"set_text\",\"type\":\"qr\",\"widget\":\"qr1\",\"text\":\"+SPO2=184OK+HEART=166OK\"}>ET");
2、微信小程序扫码后,按上面逆算法还原SPO2=98、HEART=71,即可。
3、 限定随机密码范围如下指令:
Long passNumber;
passNumber = random(1111,9999);
Serial1.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label42\",\"value\":");
Serial1.print(passNumber);
Serial1.println(",\"format\":\"%d\"}>ET");
注意:label42的重新赋值操作需要在dialog部件弹出显示期间才有校,所以应该先弹出对话框,再刷新数值。
系统连接图
如图(14):
STONE串口屏-------NODEMCU-32模块的串口1,波特率115200
MAX30102模块-------NODEMCU-32模块的串口0,波特率9600
手机小程序蓝牙-------NODEMCU-32模块的BLE
参见附录图(101)和图(5)、图(6):
MAX30102生物传感器模块 NODEMCU-32模块
TX RX0(34脚)
RX TX0(35脚)
GND GND(38脚)
5V 5V(19脚)
STONE转接板V1.2 NODEMCU-32模块
TX TX1(17脚)
Rout RX1(16脚)
GND GND(14脚)
另外,图(101)Tout短接线需要接上。
图(14)系统连接总图
总结:
本项目可实现无线通讯、多屏互动(STONE串口屏和手机显示之间可以通过ESP32模块实现交互),NODEMCU-32模块同时连接MAX30102生物传感器模块、手机微信小程序、STONE串口屏,充电三者之间桥梁。STONE串口屏也通过刷新二维码的方法,实现与手机之间的影像信息传递(不用蓝牙、用手机的相机)。本次代码重点是Arduino和微信小程序之间蓝牙的配置、搜索、连接、传输,所附代码都是经过测试验证的,可直接引用。以前对串口按钮信息解码有过多个项目,本次就不再重复了。
附录:
文章来源:https://www.toymoban.com/news/detail-485818.html
图(101)STONE串口屏转接板V1.2电路图草绘 文章来源地址https://www.toymoban.com/news/detail-485818.html
到了这里,关于使用STWI101WT-01串口屏的微信小程序血氧项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!