Open Colorimeter 国内复现方案

基于 Open Colorimeter 的国内器件适配与分步复现方案,采用 ESP32-S3、TSL25911、630 nm LED 和 10 mm 比色皿,配套操作手册及国内采购物料表,覆盖暗背景校准、透射率与吸光度测量及独立仪器装配。所列验收指标为方案目标,尚非实测结果。

戴子淇

参数信息

光源中心波长
630 nm
比色皿光程
10 mm
机械重复定位 CV
<2 %
标准曲线浓度点
6 个
单次结果平均采样
10 次

复现文档

Open Colorimeter 国内复现操作手册 V1.0

Open Colorimeter 国内复现操作手册 V1.0

## 0. 器件统一编号

后面所有照片、程序、实验记录和样机统一使用以下编号

| 编号 | 器件 | 规格/用途 |

| --- | --- | --- |

| OC-CN-V1-001 | 第一台完整样机 | 后续第二台为 002 |

| CTRL-01 | ESP32-S3 | N16R8,Type-C |

| SEN-01 | TSL25911 | 光强传感器,I²C 地址 0x29 |

| LED-01 | 630 nm LED | 5 mm,正式光源 |

| LED-B01~B19 | 备用 LED | 与 LED-01 同型号 |

| RES-220 | 220 Ω | LED 第一档限流 |

| RES-150 | 150 Ω | 第二档 |

| RES-082 | 82 Ω | 第三档 |

| BRD-01 | 面包板 | 第一阶段搭电路 |

| WIR-01 | 杜邦线 | 接线 |

| USB-01 | Type-C 数据线 | 上传程序和供电 |

| CUV-01 | 10 mm PS 比色皿 | 固定作为 Blank |

| CUV-02~20 | 比色皿 | 样品和标准液 |

| HOL-01 | 比色皿 Holder | 固定 LED、CUV、SEN |

| CAP-01 | 遮光盖 | 遮挡环境光 |

| SCR-01 | M2.5 紧固件 | 安装结构件 |

| TAP-01 | 黑色遮光胶带 | 临时遮光 |

| LCD-01 | ST7735S 1.8" | 第二阶段显示屏 |

| BTN-01 | Blank 按键 | 空白校准 |

| BTN-02 | Measure 按键 | 样品测量 |

| BTN-03 | Up 按键 | 菜单向上 |

| BTN-04 | Down 按键 | 菜单向下 |

| BTN-05 | Menu/Confirm | 菜单/确认 |

| DRV-01 | LED 恒流驱动 | 目标约 16 mA |

| ENC-01 | 仪器外壳 | 第二阶段封装 |

| BAT-01 | 3.7 V 1S 电池 | 500–1000 mAh,可选 |

| SOL-01 | DI 水 | Blank/稀释 |

| DYE-01 | Brilliant Blue FCF/E133 | 标准曲线 |

| PIP-01 | P1000 移液枪 | 配液 |

| TIP-01 | 枪头 | 配液 |

| PAP-01 | 擦镜纸 | 清洁比色皿 |

## 第一阶段:完成能够正常测量的 Open Colorimeter

## 第一步:清点、编号和检查材料

把全部器件放在桌面。

按上面的编号贴标签。

选择一颗完整的 630 nm LED,标为 LED-01,其余依次标 LED-B01、B02……

选择一只无明显划痕的比色皿作为 CUV-01,以后固定作为 Blank。

检查 CTRL-01 是 ESP32-S3。

检查 SEN-01 是 TSL25911。

确认 USB-01 是可以传数据的 Type-C 线。

220 Ω、150 Ω、82 Ω 电阻分开放。

拍一张全部材料照片。

文件名:

OC-CN-V1-001\_材料验收\_001.jpg

完成后再进入下一步。

## 第二步:测试 ESP32-S3

暂时只连接:

电脑 → USB-01 → CTRL-01

安装 Arduino IDE 2。

Boards Manager 搜索并安装:

esp32 by Espressif Systems

Board 选择:

ESP32S3 Dev Module

插入 CTRL-01。

选择新出现的 Port。

上传一个简单串口测试程序。

Serial Monitor 设置:

115200

确认可以持续看到:

OC-CN-V1-001

CTRL-01 START SUCCESS

CTRL-01 running...

如果上传卡在 Connecting,按住 BOOT 后重新 Upload,开始 Writing 后松开。

通过后记录:

CTRL-01 functional verification: PASS

## 第三步:连接 TSL25911

先拔掉 USB。

按下面接线:

| SEN-01 | CTRL-01 |

| --- | --- |

| VCC | 3V3 |

| GND | GND |

| SDA | GPIO8 |

| SCL | GPIO9 |

| INT | 不接 |

重新插 USB。

上传 I²C Scanner。

Serial Monitor 中必须能够找到:

I2C device found at address 0x29

连续扫描几次都能出现 0x29 即通过。原方案固定 SDA=GPIO8、SCL=GPIO9,SEN-01 地址为 0x29。

图 1:CTRL-01 与 SEN-01 接线示意图

![图 1:CTRL-01 与 SEN-01 接线示意图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/3be2cef411984248adb6fa6544f56473.png)## 第四步:测试 TSL25911 光强

Arduino Library Manager 安装:

Adafruit TSL2591 Library

Adafruit Unified Sensor

第一轮统一设置:

Gain = MED

Integration Time = 500 ms

程序持续显示:

FULL =

IR =

VISIBLE =

后续正式比色主要记录:

FULL

依次做三次测试:

正常室内环境;

用手或黑纸遮住 SEN-01;

用灯照向 SEN-01。

要求:

遮挡时 FULL 明显下降;

光照时 FULL 明显增加;

普通工作状态不能一直显示 65535。

如果一直 65535,把 Gain 改为 LOW。原文件也是以 FULL 作为后续 Dark、Blank、Sample 的主测量值。

通过后记录:

SEN-01 optical response verification: PASS

## 第五步:点亮 LED-01

先拔 USB。

在 BRD-01 上连接:

CTRL-01 3V3

RES-220

LED-01 阳极 +

LED-01 阴极 -

CTRL-01 GND

第一轮必须先用:

RES-220

不要直接把 LED 接到 3V3。

重新插 USB。

确认:

LED 正常发红光;

不闪烁;

不异常发热;

连续工作 5 min 正常。

通过后记录:

LED-01 light-source functional verification: PASS

图 2 :LED-01 + RES-220 接线示意图

![图 2 :LED-01 + RES-220 接线示意图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/9901bbe500e7480a9e4b2f1e6fb2b6a8.png)## 第六步:LED 与传感器联合测试

保持:

Gain = MED

Integration = 500 ms

RES-220

LED 正对 SEN-01。

两者先相距约 3–5 cm。

记录 LED OFF 时 FULL。

点亮 LED。

记录 LED ON 时 FULL。

要求:

FULL_ON &gt;&gt; FULL_OFF

并且 FULL_ON 不应长期等于 65535。

如果太亮:

增大距离;

仍然饱和,再把 Gain 改 LOW。

如果太暗:

先重新对准;

再试 RES-150;

仍然偏暗再试 RES-082。

每次换电阻前必须断电。

这一阶段只找可用范围,不锁死最终工作点。原文同样要求先从 RES-220 开始,不够再逐级降低电阻。

## 第七步:设计 HOL-01

拿游标卡尺实际测:

LED-01 外径;

CUV-01 外宽和外厚;

CUV 透明窗口中心高度;

SEN-01 PCB 长宽;

TSL25911 感光芯片相对 PCB 的位置;

SEN-01 安装孔位置。

建立直线光路:

LED-01 → CUV-01 → SEN-01

三者中心必须在同一光轴。

Holder 使用黑色不透光 SLA。

同时设计 CAP-01 遮光盖。

不要直接照抄网上 Holder 尺寸,按照手中实物尺寸建模。

## 第八步:打印并安装光学结构

打印:

HOL-01

CAP-01

然后依次安装:

LED-01;

SEN-01;

CUV-01;

CAP-01。

要求:

CUV 可以顺利插拔;

不明显晃动;

插入方向固定;

LED 中心对准比色皿;

SEN 感光芯片正对光路;

CAP 可以完全盖上。

连续将同一只 CUV-01:

插入 → 测量 → 取出 → 再插入 → 再测量。

重复至少 5 次。

计算 FULL 的 CV。

第一版目标:

CV &lt; 2%

原文的机械重复定位验收同样采用初始 CV &lt;2% 作为目标。

图 3 :LED → CUV → SEN 光学结构示意图

![图 3 :LED → CUV → SEN 光学结构示意图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/3d806c755c494f4db82ad1224a25998d.png)## 第九步:正式测 Dark、Blank 和 Sample

从这一步开始,固定:

LED;

电阻;

Gain;

Integration Time;

Holder;

SEN 位置;

CUV 插入方向;

CAP 状态。

9.1 Dark

关闭 LED。

连续读取 FULL 10 次。

计算平均值:

I_dark

9.2 Blank

CUV-01 加入 DI 水 SOL-01。

擦干透明面。

固定方向插入 HOL-01。

盖 CAP-01。

连续读取 FULL 10 次。

得到:

I_blank

9.3 Sample

CUV-02 加入较浅的蓝色 DYE-01 溶液。

同样插入 Holder。

读取 10 次。

得到:

I_sample

计算:

T = (I_sample − I_dark) / (I_blank − I_dark);A = −log10(T)

Excel 中可直接写:

=(B4-B2)/(B3-B2)

=-LOG10(B5)

原文件的 Dark 修正、透射率和吸光度计算也是这套公式。

正常情况下蓝色样品应满足:

I_dark &lt; I_sample &lt; I_blank

通过后记录:

OC-CN-V1-001 basic colorimetric measurement: PASS

图 4 :Dark → Blank → Sample 测量流程图

![图 4 :Dark → Blank → Sample 测量流程图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/2ba263f5a161406a9be1bad058e93aae.png)## 第十步:做 Beer–Lambert 标准曲线

准备同一份 Brilliant Blue FCF / E133 Stock。

配置:

| 编号 | Stock | DI 水 | 相对浓度 |

| --- | --- | --- | --- |

| STD-00 | 0 mL | 10 mL | 0% |

| STD-01 | 1 mL | 9 mL | 10% |

| STD-02 | 2 mL | 8 mL | 20% |

| STD-03 | 3 mL | 7 mL | 30% |

| STD-04 | 4 mL | 6 mL | 40% |

| STD-05 | 5 mL | 5 mL | 50% |

这也是你现有文档确定的第一轮浓度梯度。

按照:

STD-00

STD-01

STD-02

STD-03

STD-04

STD-05

依次测量。

每个浓度:

做 3 个 replicate;

每个 replicate 连续读取 10 次 FULL;

求平均;

计算 A。

也就是每个浓度最终得到:

A1

A2

A3

Mean A

SD

原文明确采用每个浓度 n=3、每个 replicate 内读取 10 次。

Excel:

X 轴:

Relative concentration

Y 轴:

Absorbance A

做线性拟合:

A = k c + b

保存:

方程;

R²;

原始数据;

标准曲线图。

要求首先满足:

浓度增加时 A 整体增加;

数据基本呈线性;

高浓度点不能已经接近 Dark。

完成后记录:

OC-CN-V1-001 Beer–Lambert response verification: PASS

至此,第一阶段功能复现完成。原文件也是以第十步 Beer–Lambert 验证作为第一阶段功能复现终点。

## 第二阶段:把实验样机做成独立仪器

## 第十一步:把电阻供电改为恒流驱动

## 第一阶段已经确定 LED 可以正常工作。

现在断电。

拆掉:

RES-220 / RES-150 / RES-082

正式安装:

DRV-01

将 LED 恒流设为约:

16 mA

重新上电。

连续读取 Blank 约 1–2 min。

确认:

LED 不闪烁;

无异常发热;

FULL 不饱和;

光强稳定。

重新执行一次:

Dark → Blank → Sample

旧的 Dark 和 Blank 不再继续使用。

## 第十二步:安装 LCD-01

LCD-01 使用:

ST7735S 1.8" 128×160 SPI

在 Arduino IDE 安装:

Adafruit GFX Library

Adafruit ST7735 and ST7789 Library

这一版统一建议固定一套 SPI GPIO,后续程序和 PCB 都不要再变。

例如:

| LCD | ESP32-S3 |

| --- | --- |

| VCC | 3V3 |

| GND | GND |

| SCK | GPIO12 |

| SDA/MOSI | GPIO11 |

| CS | GPIO10 |

| DC | GPIO14 |

| RST | GPIO13 |

先上传 LCD Test。

屏幕能够正常显示:

OC-CN-V1-001

Open Colorimeter

System Ready

再继续下一步。

上面这组 LCD GPIO 是这份精简实施版新增的统一建议值,不是原 294 页文档已经确定的引脚;以后如果你准备做 PCB,就固定这一套,不要在不同版本里来回改。

## 第十三步:安装五个按键

建议统一:

| 按键 | 功能 | GPIO |

| --- | --- | --- |

| BTN-01 | Blank | GPIO4 |

| BTN-02 | Measure | GPIO5 |

| BTN-03 | Up | GPIO6 |

| BTN-04 | Down | GPIO7 |

| BTN-05 | Menu/Confirm | GPIO15 |

程序使用:

INPUT_PULLUP

所以每个按键:

GPIO

按键

GND

逐个测试。

Serial Monitor 按下时分别显示:

BLANK

MEASURE

UP

DOWN

MENU

五个全部正常以后再进入整合程序。

图 5 :第二阶段 LCD + 五按键接线图

![图 5 :第二阶段 LCD + 五按键接线图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/3d7f0380082d47b486537986e21f8bf0.png)## 第十四步:上传第二阶段完整程序

完整程序只保留三个主要页面。

页面 1:Ready

显示:

Open Colorimeter

630 nm

Ready

页面 2:Blank

按:

BTN-01

仪器自动:

连续读取 10 次;

取平均;

保存为 I_blank;

屏幕显示:

Blank OK

I0 = xxxxx

页面 3:Measure

放入 Sample。

按:

BTN-02

仪器自动读取 10 次,并计算:

I

T

A

屏幕显示例如:

I = 18432

T = 0.612

A = 0.213

BTN-03、BTN-04 用于切换页面或参数。

BTN-05 用于确认。

Dark 建议在开机初始化或菜单中的 Dark Calibration 单独执行一次。

最终程序中所有吸光度仍统一采用:

T = (I − I_dark) / (I_blank − I_dark);A = −log10(T)

## 第十五步:装入 ENC-01

ENC-01 最终至少固定:

CTRL-01;

LCD-01;

BTN-01~BTN-05;

DRV-01;

HOL-01;

CAP-01。

外壳保持黑色、不透光。

正面建议布局:

┌─────────────────┐

│ LCD-01 │

│ │

│ Blank Measure │

│ ↑ ↓ │

│ Menu / Confirm │

│ │

│ Cuvette Slot │

└─────────────────┘

USB Type-C 接口必须留在外壳外侧,方便:

供电;

上传程序;

调试。

BAT-01 暂时作为可选配置。

如果加入电池,完成 USB 和电池两种供电状态下的完整测试。

图 6 :ENC-01 完整仪器外观及内部布局图

![图 6 :ENC-01 完整仪器外观及内部布局图](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/f42b6d62-89d4-4b5d-9f9b-6ff109f21dea/files/image/9fca98b275254ec28735a33390421bfe.png)## 第十六步:完整仪器最终验收

整机编号:

OC-CN-V1-001

关机后重新开机。

按照真正用户使用顺序操作一次:

1\. 开机

LCD 显示:

Open Colorimeter

System Ready

2\. Dark Calibration

保持光路遮光或按程序要求关闭 LED。

保存 I_dark。

3\. Blank

加入 CUV-01 + DI 水。

按:

Blank

屏幕显示:

Blank OK

4\. Sample

换成样品。

按:

Measure

屏幕直接得到:

T = xxx

A = xxx

5\. 重复测试

同一样品连续插拔测量 5 次。

结果不应出现明显跳变。

6\. 标准液复测

任选:

STD-00

STD-02

STD-04

重新测一次。

必须保持:

A_STD00 &lt; A_STD02 &lt; A_STD04

7\. 最终记录

填写:

Sample ID: OC-CN-V1-001

CTRL: ESP32-S3 N16R8

Sensor: TSL25911

Light source: 630 nm

LED driver: DRV-01

Cuvette path: 10 mm

Display: ST7735S

Dark calibration: PASS

Blank calibration: PASS

Sample measurement: PASS

Beer–Lambert verification: PASS

Standalone UI: PASS

Final result: PASS

至此:

OC-CN-V1-001 复现完成

最终系统结构就是:

┌── LCD-01

BTN-01~05 ─────── CTRL-01

┌─────┴─────┐

│ │

DRV-01 SEN-01

│ │

LED-01 → CUV → TSL25911

HOL-01

CAP-01