基于 Open Colorimeter 的国内器件适配与分步复现方案,采用 ESP32-S3、TSL25911、630 nm LED 和 10 mm 比色皿,配套操作手册及国内采购物料表,覆盖暗背景校准、透射率与吸光度测量及独立仪器装配。所列验收指标为方案目标,尚非实测结果。
戴子淇
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 接线示意图
## 第四步:测试 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 接线示意图
## 第六步:LED 与传感器联合测试
保持:
Gain = MED
Integration = 500 ms
RES-220
LED 正对 SEN-01。
两者先相距约 3–5 cm。
记录 LED OFF 时 FULL。
点亮 LED。
记录 LED ON 时 FULL。
要求:
FULL_ON >> 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 < 2%
原文的机械重复定位验收同样采用初始 CV <2% 作为目标。
图 3 :LED → CUV → SEN 光学结构示意图
## 第九步:正式测 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 < I_sample < I_blank
通过后记录:
OC-CN-V1-001 basic colorimetric measurement: PASS
图 4 :Dark → Blank → Sample 测量流程图
## 第十步:做 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 + 五按键接线图
## 第十四步:上传第二阶段完整程序
完整程序只保留三个主要页面。
页面 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 完整仪器外观及内部布局图
## 第十六步:完整仪器最终验收
整机编号:
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 < A_STD02 < 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