第一章:血糖仪系统概述
各位同学,大家好。我是你们这门课的老朋友。今天咱们正式开篇,聊聊血糖仪这个看似简单、实则门道不少的小设备。
说实话,我入行做的第一个医疗项目就是血糖仪。那时候年轻,觉得不就是测个血糖嘛,能有多复杂?结果被现实狠狠教育了一顿。嗯,咱们今天就把这些经验掰开揉碎了讲。
1.1 血糖仪的基本工作原理
血糖仪的工作原理,说白了就是「电化学反应」四个字。
你想想看,用户把一滴指尖血滴到试纸条上,血液里的葡萄糖会和试纸条上的酶发生反应。这个反应会产生微弱的电流。电流的大小,和葡萄糖浓度成正比。我们通过测量这个电流,就能反推出血糖值。
核心公式(简化版):
电流 I ∝ 葡萄糖浓度 C
血糖值 = f(电流, 温度补偿, 试纸批次校准)
这里有个坑,我当年就踩过。电流信号非常微弱,通常是纳安级(nA)的。你想想看,一个纳安是什么概念?比蚊子翅膀扇动产生的静电还小。所以前端模拟电路的设计,是整台仪器的命门。
避坑指南:我曾经在一个项目中,因为PCB走线没处理好,导致微弱信号被电源噪声淹没了。结果测出来的血糖值忽高忽低,跟过山车似的。后来花了整整两周排查,才发现是地线回路的问题。所以,模拟信号走线一定要远离数字信号,这是铁律。
1.2 硬件组成
一台典型的血糖仪,硬件上就这几大块。我按信号流向给大家捋一遍。
| 硬件模块 | 核心作用 | 我的一点经验 |
|---|---|---|
| 传感器(试纸条接口) | 将葡萄糖浓度转换为电信号 | 试纸接口的触点镀金最好,防氧化 |
| MCU(微控制器) | 大脑,负责数据处理、逻辑控制 | 我习惯选带ADC的MCU,省一颗芯片 |
| LCD(显示屏) | 显示测量结果、时间、电量等 | 段码屏省电,但点阵屏显示信息更丰富 |
| 按键 | 用户交互,开关机、翻页、设置 | 机械按键手感好,但防水难做 |
| 电源管理 | 供电、电池管理、低功耗控制 | 一颗纽扣电池撑一个月,是基本要求 |
1.2.1 传感器与试纸条
传感器其实不在仪器本体上,而是在试纸条上。仪器只提供一个精密的接口电路。这个接口需要做到「即插即用」,用户插上试纸,仪器要能立刻识别出来。
我个人习惯在试纸检测引脚上做一个上拉电阻,配合一个中断引脚。试纸插入时,电平跳变,MCU被唤醒。这样既省电,又响应迅速。
1.2.2 MCU选型
MCU是核心。我建议选ARM Cortex-M0或M3内核的,性价比高。关键看这几点:
- ADC精度:至少12位,16位更佳。我见过用10位ADC的,那精度,说实话,惨不忍睹。
- 低功耗:休眠电流要低于1μA。否则电池撑不住。
- Flash和RAM:64KB Flash + 8KB RAM是起步。你要存历史记录、做UI动画,空间小了真不够用。
小技巧:选MCU时,记得留几个GPIO做调试用。我曾经因为引脚不够用,不得不飞线,那画面,别提多狼狈了。
1.2.3 LCD与按键
LCD我推荐用段码式液晶屏。为什么?省电啊!一个段码屏的功耗只有点阵屏的十分之一。对于血糖仪这种电池供电的设备,省电就是王道。
按键呢,一般就三个:上键、下键、确认键。有的还加一个返回键。我个人觉得,三个键就够了。按键多了,用户反而容易按错。
1.2.4 电源管理
电源管理这块,我重点说两点。
第一,电池检测。你得实时知道电池还有多少电。我一般用MCU的ADC去采样电池电压,然后通过查表法估算电量。注意,电池电压和电量不是线性关系,这个表要测准。
第二,低功耗模式。仪器大部分时间都在待机。待机时,MCU进入深度睡眠,LCD关闭,只有按键中断和试纸插入中断能唤醒。我做过一个项目,待机电流做到了0.8μA,一颗CR2032电池用了大半年。
1.3 软件功能需求
软件功能,归纳起来就四个字:测、存、传、显。
- 测量:这是核心中的核心。包括试纸检测、加样检测、倒计时、数据采集、算法计算、温度补偿。
- 存储:测量结果要存下来。一般存300-500条历史记录。每条记录包括:血糖值、测量时间、日期、测量标记(餐前/餐后)。
- 通信:现在都讲物联网。血糖仪一般通过蓝牙或USB把数据传到手机App或电脑上。我建议用蓝牙低功耗(BLE),省电且方便。
- UI显示:用户界面要简洁、清晰。大字显示血糖值,旁边有单位(mmol/L或mg/dL)、时间、电量图标。操作流程要符合直觉,别让用户翻说明书。
软件架构的核心原则:
测量任务优先级最高,不能被任何UI操作打断。我曾经见过一个产品,用户按了一下按键,测量就中断了,结果试纸条报废。这种设计,是要被骂娘的。
1.3.1 测量流程(伪代码)
// 测量主流程
void measurement_task(void)
{
while(1) {
// 1. 等待试纸插入
if (strip_inserted()) {
// 2. 唤醒系统,点亮LCD
system_wakeup();
lcd_on();
// 3. 显示"请加样"提示
ui_show("请加样");
// 4. 等待血液样本
if (sample_detected()) {
// 5. 开始倒计时(通常5秒)
start_countdown(5);
// 6. 采集电流数据
adc_value = read_adc();
// 7. 计算血糖值(含温度补偿)
glucose = calculate_glucose(adc_value, get_temperature());
// 8. 显示结果
ui_show_result(glucose);
// 9. 存储记录
save_record(glucose, get_time());
// 10. 等待用户拔除试纸
while(strip_inserted()) {
// 低功耗等待
sleep();
}
// 11. 系统进入待机
system_sleep();
}
}
}
}
这段代码看着简单,但实际项目中,每一步都有坑。比如第6步,ADC采样不是采一次就完事。我一般采16次,去掉最大值和最小值,然后取平均。这样能滤掉一些随机噪声。
1.3.2 存储管理
存储我建议用EEPROM或Flash模拟EEPROM。为什么不用SD卡?成本高、功耗大、体积大。血糖仪不需要那么大容量。
存储结构可以这样设计:
// 单条记录结构体
typedef struct {
uint16_t glucose_value; // 血糖值,单位0.1mmol/L
uint32_t timestamp; // Unix时间戳
uint8_t meal_flag; // 0: 空腹, 1: 餐后, 2: 随机
uint8_t reserved; // 保留字节
} measurement_record_t;
// 存储区管理
#define RECORD_COUNT_MAX 500
measurement_record_t records[RECORD_COUNT_MAX];
uint16_t record_index; // 当前写入位置
这里要注意,Flash有擦写寿命,一般是10万次。如果用户每天测3次,一年也就1000次。10万次够用100年。但如果你频繁擦写同一个地址,那就不行了。所以要用「循环覆盖」的方式,写满后从头开始覆盖最旧的记录。
1.3.3 通信协议
蓝牙通信这块,我建议用标准化的健康设备协议,比如IEEE 11073。这样手机App可以通用,不用每个厂家都自己搞一套私有协议。
数据包格式可以这样:
// 蓝牙数据包
| 起始符(1B) | 长度(1B) | 命令(1B) | 数据(NB) | 校验(1B) | 结束符(1B) |
| 0xAA | N+3 | 0x01 | ... | XOR校验 | 0x55 |
我个人习惯在数据包里加一个序列号,防止丢包和重传。这个细节,很多新手会忽略。
1.4 本章小结
好了,第一章就讲这么多。咱们回顾一下重点:
- 血糖仪的核心是电化学反应,信号微弱,模拟设计要小心。
- 硬件上,MCU选型、电源管理、试纸接口是三大关键。
- 软件上,测量流程要稳定可靠,不能被UI打断。
- 存储和通信,要考虑寿命和兼容性。
下一章,咱们会深入讲MCU的选型细节和低功耗设计。到时候我会分享一个我当年因为选错MCU而返工的惨痛经历。嗯,那故事可精彩了。
今天就到这儿。有问题随时交流。
公众号:蓝海资料掘金营,微信deep3321