Calibration Guide
Calibration Guide
Overview
Calibration is the process of establishing the relationship between colorimeter readings (absorbance) and known analyte concentrations. Accurate calibration is essential for obtaining reliable quantitative results from the OpenReef system.
Calibration Types
The OpenReef system requires three types of calibration:
- Colorimeter Calibration: Establish concentration vs. absorbance curves
- Pump Calibration: Measure accurate flow rates for volume control
- System Verification: Periodic quality control checks
Colorimeter Calibration
When to Calibrate
- Initial setup: Before first use
- After reagent replacement: New API test kit batches may vary slightly
- Monthly: Routine maintenance
- After sensor changes: If colorimeter sensor is replaced
- When results drift: If QC checks show drift > 10%
Materials Needed
For Phosphate Calibration
- Phosphate standard (1,000 ppm PO₄)
- Distilled/RO water
- Volumetric flasks (25 mL, 100 mL)
- Pipettes (1 mL, 5 mL, 10 mL)
- API Phosphate test kit
- Clean cuvettes
For Nitrate Calibration
- Nitrate standard (4,430 ppm NO₃ or 1,000 ppm N)
- Distilled/RO water
- Volumetric flasks (25 mL, 50 mL)
- Pipettes (1 mL, 5 mL, 10 mL)
- API Nitrate test kit
- Clean cuvettes
Phosphate Calibration Procedure
Step 1: Prepare Standards
From 1,000 ppm stock, prepare 37.5 ppm working stock:
- 3.75 mL of 1,000 ppm + distilled water to 100 mL
From 37.5 ppm working stock, prepare calibration series:
| Standard | Concentration (ppm) | Working Stock | Water | Total |
|---|---|---|---|---|
| S0 (Blank) | 0 | 0 mL | 25 mL | 25 mL |
| S1 | 1.0 | 0.67 mL | 24.33 mL | 25 mL |
| S2 | 2.5 | 1.67 mL | 23.33 mL | 25 mL |
| S3 | 5.0 | 3.33 mL | 21.67 mL | 25 mL |
| S4 | 10.0 | 6.67 mL | 18.33 mL | 25 mL |
| S5 | 15.0 | 10.0 mL | 15.0 mL | 25 mL |
| S6 | 20.0 | 13.33 mL | 11.67 mL | 25 mL |
| S7 | 30.0 | 20.0 mL | 5.0 mL | 25 mL |
Step 2: Run Standards Through Assay
For each standard (in order from lowest to highest):
- Load 5 mL standard into system (or manual cuvette)
- Add 6 drops Bottle #1, mix
- Add 6 drops Bottle #2, mix, start timer
- Wait 7.5 minutes
- Read absorbance at 625 nm
- Record: concentration, absorbance, time, temperature
- Clean system/cuvette before next standard
Important: Run standards in duplicate (2 measurements each)
Step 3: Calculate Calibration Curve
Plot absorbance (y) vs. concentration (x):
Absorbance = m × Concentration + b
Perform linear regression to find:
- m (slope): sensitivity
- b (y-intercept): blank absorbance
- R²: correlation coefficient (should be > 0.99)
Automated Analysis Tool: Use the Python script in tools/calibration/ to automatically calculate fit coefficients from your calibration data. See tools/calibration/README.md for usage instructions.
Step 4: Save Calibration Data
Save to phosphate_cal.json:
{
"assay": "phosphate",
"date": "2025-11-14",
"wavelength": 625,
"units": "ppm PO4",
"calibration": {
"slope": 0.0456,
"intercept": 0.012,
"r_squared": 0.9987
},
"range": {
"min": 0.0,
"max": 30.0
},
"standards": [
{"concentration": 0.0, "absorbance": 0.011, "replicate": 1},
{"concentration": 0.0, "absorbance": 0.013, "replicate": 2},
{"concentration": 1.0, "absorbance": 0.058, "replicate": 1},
{"concentration": 1.0, "absorbance": 0.056, "replicate": 2},
...
],
"reagent_lot": "API-PO4-2025-03",
"notes": "New sensor calibration"
}
Nitrate Calibration Procedure
Step 1: Prepare Standards
From 4,430 ppm (1,000 ppm N) stock:
- Prepare 1,000 ppm NO₃ working stock:
- 4.51 mL of 4,430 ppm + 15.49 mL water = 20 mL
From 1,000 ppm, prepare 250 ppm intermediate:
- 6.25 mL of 1,000 ppm + water to 25 mL
From 250 ppm, prepare calibration series:
| Standard | Concentration (ppm) | 250 ppm Stock | Water | Total |
|---|---|---|---|---|
| S0 (Blank) | 0 | 0 mL | 25 mL | 25 mL |
| S1 | 5 | 0.50 mL | 24.50 mL | 25 mL |
| S2 | 10 | 1.00 mL | 24.00 mL | 25 mL |
| S3 | 20 | 2.00 mL | 23.00 mL | 25 mL |
| S4 | 40 | 4.00 mL | 21.00 mL | 25 mL |
| S5 | 60 | 6.00 mL | 19.00 mL | 25 mL |
| S6 | 80 | 8.00 mL | 17.00 mL | 25 mL |
| S7 | 90 | 9.00 mL | 16.00 mL | 25 mL |
Step 2: Run Standards Through Assay
For each standard:
- IMPORTANT: Shake Bottle #2 vigorously for 30-60 seconds
- Load 5 mL standard into system
- Add 10 drops Bottle #1, mix
- Add 10 drops Bottle #2, mix vigorously, start timer
- Wait 5+ minutes
- Read absorbance at 528 nm
- Record data
- Clean before next standard
Run in duplicate.
Step 3: Calculate & Save
Same process as phosphate. Use the automated analysis tool in tools/calibration/ to calculate fit coefficients (see tools/calibration/README.md).
Save to nitrate_cal.json:
{
"assay": "nitrate",
"date": "2025-11-14",
"wavelength": 528,
"units": "ppm NO3",
"calibration": {
"slope": 0.0234,
"intercept": 0.008,
"r_squared": 0.9992
},
"range": {
"min": 0.0,
"max": 90.0
},
"standards": [...],
"reagent_lot": "API-NO3-2025-02",
"notes": "Vigorous shaking of Bottle #2 confirmed"
}
Pump Calibration
Why Calibrate Pumps
Peristaltic pump flow rates vary with:
- Tubing size and wear
- Voltage/power supply
- Temperature
- Back pressure
Accurate calibration ensures correct reagent volumes.
Procedure
Equipment Needed
- Graduated cylinder (10 mL or 25 mL)
- Stopwatch
- Distilled water
- Scale (optional, for gravimetric verification)
FeW Pump (Water)
Forward Direction:
- Place pump outlet in graduated cylinder
- Start with empty cylinder
- Start pump and timer simultaneously
- Run until ~20 mL collected
- Stop pump and timer
- Record volume and time
Flow rate (mL/s) = Volume (mL) / Time (s)
Repeat 3 times, average results.
Reverse Direction:
Same procedure (flow may differ slightly).
FeR Pump (Reagent)
Same as FeW pump, but use smaller volumes (10 mL) for slower reagent pump.
Drop Volume Calibration
To convert “drops” to mL:
- Dispense exactly 20 drops from reagent bottle
- Collect in graduated cylinder
- Measure volume
- Calculate:
drop_volume = total_volume / 20
Repeat for each reagent bottle.
Save Calibration
Save to pump_cal.json:
{
"date": "2025-11-14",
"FeW_pump": {
"forward": {
"flow_rate_ml_per_sec": 1.23,
"std_dev": 0.05
},
"reverse": {
"flow_rate_ml_per_sec": 1.19,
"std_dev": 0.04
}
},
"FeR_pump": {
"forward": {
"flow_rate_ml_per_sec": 0.41,
"std_dev": 0.02
},
"reverse": {
"flow_rate_ml_per_sec": 0.39,
"std_dev": 0.02
}
},
"drop_volumes": {
"phosphate_bottle_1": 0.048,
"phosphate_bottle_2": 0.050,
"nitrate_bottle_1": 0.049,
"nitrate_bottle_2": 0.051
}
}
Automated Calibration (Using PyBadge)
Calibration Wizard
The firmware includes an automated calibration wizard:
Menu > Calibration > Run Calibration
├─ Phosphate Calibration
├─ Nitrate Calibration
└─ Pump Calibration
Automated Process
- Select assay type (phosphate or nitrate)
- Enter number of standards (typically 7-8)
- For each standard:
- Prompt: “Load standard X (Y.Y ppm)”
- Wait for user confirmation
- Run automated assay sequence
- Record absorbance
- Calculate calibration curve
- Display slope, intercept, R²
- Review and save
- Show calibration plot
- Save to JSON file
Manual Entry Option
If standards were run manually, can enter data:
Menu > Calibration > Manual Entry
Enter concentration and absorbance pairs, system calculates curve.
Quality Control
QC Standards
Prepare mid-range QC standards:
- Phosphate QC: 5.0 ppm and 15.0 ppm
- Nitrate QC: 20 ppm and 60 ppm
Store in dark bottles at 4°C, stable for 2 weeks.
QC Frequency
Run QC standards:
- Daily: If running multiple samples
- Weekly: For occasional use
- Before important measurements
Acceptance Criteria
QC result must be within ±10% of expected value:
Expected: 5.0 ppm
Measured: 4.5-5.5 ppm → PASS
Measured: 3.8 ppm → FAIL (recalibrate)
QC Log
Track QC results over time:
date,assay,qc_standard,expected,measured,percent_error,status
2025-11-14,phosphate,5.0,5.0,5.1,+2%,PASS
2025-11-14,phosphate,15.0,15.0,14.7,-2%,PASS
2025-11-15,nitrate,20.0,20.0,21.5,+7.5%,PASS
Plot percent error over time to detect drift.
Calibration Verification
Independent Standard
Verify calibration using a standard from a different source than calibration standards:
- Purchase certified reference material (CRM)
- Prepare fresh standard from different lot of KH₂PO₄ or KNO₃
- Run through system
- Compare result to known value
Should agree within ±5%.
Recovery Test
Spike a known amount of analyte into a sample:
- Measure sample: C₁ = 2.0 ppm
- Add 5.0 ppm spike
- Expected: C₂ = 7.0 ppm
- Measured: C₂ = 6.8 ppm
- Recovery = (6.8 - 2.0) / 5.0 = 96% ✓
Acceptable recovery: 90-110%
Troubleshooting Calibration Issues
Poor R² (< 0.99)
Possible causes:
- Standards prepared incorrectly
- Inconsistent timing (phosphate)
- Dirty cuvette
- Temperature fluctuations
- Reagent #2 not shaken (nitrate)
Solutions:
- Prepare fresh standards carefully
- Use automated timing
- Clean/replace cuvette
- Control temperature
- Always shake Bottle #2
Non-linear Curve
Possible causes:
- Concentration range too wide
- High concentrations saturate sensor
- Chemical interference at high concentrations
Solutions:
- Use narrower concentration range
- Limit max standard to 80% of sensor range
- Check for color saturation (absorbance > 2.0)
Negative Intercept
Possible causes:
- Blank contaminated
- Baseline drift
- Sensor zero error
Solutions:
- Prepare fresh blank
- Re-zero sensor
- Check for light leaks
High Blank Absorbance
Possible causes:
- Distilled water contaminated
- Reagent contamination
- Dirty cuvette
Solutions:
- Use fresh distilled/RO water
- Replace reagents
- Clean cuvette thoroughly
Calibration Best Practices
- Use fresh reagents: Check expiration dates
- Consistent technique: Use same procedure for standards and samples
- Temperature control: Run calibration at same temp as samples (20-25°C)
- Clean glassware: Rinse with distilled water, dry thoroughly
- Duplicate measurements: Always run standards in duplicate
- Fresh standards: Prepare on day of calibration
- Record everything: Date, lot numbers, temperatures, notes
- Verify: Run QC standards immediately after calibration
Recalibration Triggers
Recalibrate if:
- QC fails (>10% error)
- Drift trend observed (QC creeping in one direction)
- New reagent lot
- Sensor replaced
- Tubing replaced (pumps)
- Results don’t make sense
-
1 month since last calibration
Data Management
Calibration File Naming
phosphate_cal_YYYY-MM-DD.json
nitrate_cal_YYYY-MM-DD.json
pump_cal_YYYY-MM-DD.json
Backup
- Keep all calibration files
- Never delete old calibrations
- Useful for tracking performance over time
Active Calibration
System uses the most recent calibration file by default. Can manually select older calibration if needed.
Example Calibration Data Analysis
Calculating Concentration from Absorbance
Given calibration:
- Slope (m) = 0.0456
- Intercept (b) = 0.012
Sample absorbance = 0.240
Concentration = (Absorbance - b) / m
Concentration = (0.240 - 0.012) / 0.0456
Concentration = 5.0 ppm PO₄
Uncertainty Estimation
Standard error of regression (Sy/x) gives uncertainty:
If Sy/x = 0.15 ppm, then:
- Measured: 5.0 ± 0.15 ppm (95% confidence)
Report as: 5.0 ppm (range: 4.85-5.15 ppm)
Next Steps
- Review Phosphate Assay Protocol
- Review Nitrate Assay Protocol
- See Firmware Documentation for automated calibration code