CBE3300B-Project

SweetSpot Glucometer

Status Platform Hardware Display Enclosure Course

Team: Madeleine Stubner, Lauren Van University of Pennsylvania, Department of Chemical & Biomolecular Engineering Spring 2026

SweetSpot is a low-cost electrochemical glucometer prototype that measures glucose concentration using commercial glucose test strips paired with an IO Rodeostat potentiostat. The system applies a chronoamperometric potential step at an empirically validated voltage (0.3 V, determined via cyclic voltammetry), records the resulting current response, extracts peak current as the calibration feature, and displays the computed glucose concentration in real time on a 128×64 OLED screen mounted inside a 3D-printed enclosure.

The device demonstrates an end-to-end engineering chain: electrochemical sensing → signal processing → calibration curve application → serial communication → embedded display output. All subsystems are integrated and functional. Quantitative accuracy is limited by single-strip calibration and commercial strip variability, which are the primary targets for future refinement.


Table of Contents


1. Problem Definition & Motivation

The Clinical Gap

Diabetes is one of the most rapidly growing chronic diseases globally and locally, and access to routine glucose monitoring remains a critical unmet need.

Global landscape:

Philadelphia specifically:

The economic burden:

SweetSpot is motivated by the hypothesis that a lower-cost electrochemical sensing platform could support broader glucose awareness and improve screening access in communities where current glucometer costs are a genuine barrier.


Market Research & Competitive Analysis

The blood glucose monitoring devices market is projected to grow from approximately $12.4B (2023) to $30.2B (2033), driven by rising diabetes prevalence and demand for continuous monitoring. The largest growth is in consumables (test strips), not instruments — validating the use of commercial strips in our design.

Glucometer Market Sizing (Bottom-Up)

Scope Diabetics Addressable Market
Global 830 million $24.9 B
United States 38 million $1.14 B
Philadelphia ~150,000 $4.5 M
Our target (0.001% share) $450

Average self-service glucometer cost: ~$30/device. Our device targets this tier.

Competitor Analysis

Device Cost Accuracy Accessibility Notes
Dexcom G6 \(\) High Low Continuous monitoring; requires prescription
Walgreens A1C Test Kit $$$ High Low Lab-based; not real-time
Traditional Strip Glucometers $$ Medium Medium Requires proprietary strips + reader
SweetSpot $ Medium* High Open-architecture; targets low-resource settings

*Current prototype; accuracy is the primary future improvement target.

Competitive positioning: Existing devices prioritize accuracy but sacrifice accessibility due to cost. SweetSpot intentionally targets the middle ground — acceptable accuracy at dramatically lower cost — to serve underserved populations not currently engaged in routine monitoring.


Stakeholder Analysis

Stakeholder Benefit
Patients Earlier detection → reduced complications; lower barrier to monitoring
Healthcare Workers Fewer emergency interventions from unmanaged hyperglycemia
Community Health Clinics & FQHCs Affordable tool for screening programs
Medical Device Industry Competitive pressure toward lower-cost solutions
Insurance Companies Lower long-term costs from prevention vs. acute intervention

Target distribution pathways: community health clinics, federally qualified health centers (FQHCs), nonprofit chronic disease prevention organizations, local health departments, and university/hospital-affiliated screening initiatives.


Project Goals

The system was designed to:

  1. Run a chronoamperometric measurement on a commercial glucose test strip at an empirically optimized applied voltage
  2. Extract a meaningful electrochemical feature from the current response (peak current)
  3. Convert that feature to glucose concentration using an experimentally derived and validated calibration curve
  4. Display the computed concentration in real time on an embedded OLED screen
  5. House all components within a 3D-printed enclosure suitable for demonstration

Development proceeded in two stages:


2. Chemical Engineering Principles

Glucose Oxidase Reaction Chemistry

Commercial glucose test strips rely on glucose oxidase (GOx), an enzyme that reacts selectively with glucose. In the presence of molecular oxygen, GOx catalyzes the oxidation of D-glucose to D-gluconolactone, producing hydrogen peroxide (H₂O₂) as a byproduct:

\[\text{D-glucose} + \text{O}_2 \xrightarrow{\text{GOx}} \text{D-gluconolactone} + \text{H}_2\text{O}_2\]

The H₂O₂ produced is electroactive. When a constant potential is applied by the potentiostat, H₂O₂ is oxidized at the working electrode, releasing electrons that generate a measurable current. Because each mole of glucose produces exactly one mole of H₂O₂ (1:1 stoichiometry), the measured current is directly proportional to glucose concentration. This stoichiometric coupling provides the selectivity of the sensor — only glucose contributes to the signal, not other blood components.


Chronoamperometry and the Cottrell Equation

Chronoamperometry applies a fixed potential step and records current as a function of time. Under ideal diffusion-controlled conditions, the time-dependent current follows the Cottrell equation:

\[i(t) = \frac{nFAC\sqrt{D}}{\sqrt{\pi t}}\]

Where:

Key implication: At any fixed time point, $i \propto C$. This is the physical basis for using peak or steady-state current as a calibration feature — current linearly encodes concentration, provided the measurement window is within the diffusion-controlled regime.

The $t^{-1/2}$ decay behavior predicted by the Cottrell equation was verified experimentally:

Proof of t^-1/2 relationship between current and time

Figure 1. Chronoamperometry: current vs. time at 0.3 V applied potential. The rapid decay from peak current follows the $t^{-1/2}$ profile predicted by the Cottrell equation, confirming diffusion-limited behavior in the early time window.

Assumptions and their validity:


Cyclic Voltammetry for Operating Point Selection

Cyclic voltammetry (CV) sweeps the working electrode potential linearly between two set values while recording current — producing a full polarization curve for the electrochemical system. The anodic (positive) current peak marks H₂O₂ oxidation at the working electrode, and its potential indicates where oxidation rate is maximized.

CV was used as a diagnostic and optimization tool to replace the arbitrary 0.5 V previously assumed for chronoamperometric measurements. CV scans were run across all five glucose concentrations (2.2, 4.4, 6.6, 8.8, and 11.1 mM), sweeping from −0.6 V to +0.6 V:

Cyclic voltammetry for 4.4 mM solution showing oxidation peak at 0.3V

Figure 2. Cyclic voltammetry for 4.4 mM glucose solution. The anodic oxidation peak appears consistently near 0.3 V across all CV cycles. Peak position was independent of concentration, confirming it reflects strip electrode chemistry rather than analyte quantity. 0.3 V was adopted as the fixed applied potential for all subsequent chronoamperometric measurements.

Electrochemical regimes identified:

Regime Potential Range Governing Physics Analog in ChE
Activation-controlled Below ~0.2 V Insufficient driving force; reaction rate limited by activation energy barrier Kinetically controlled reactor operating far from equilibrium
Optimal operating point ~0.3 V Maximum signal sensitivity; transition between kinetic and transport control Peak of a rate-vs-driving-force curve
Mass-transport-limited Above ~0.35 V H₂O₂ oxidized as fast as it arrives; rate controlled by diffusion; competing reactions begin Transport-limited reactor where feed delivery is rate-limiting

Selecting 0.3 V is equivalent to choosing the optimal operating point on a reaction rate curve — maximizing conversion per unit driving force while avoiding side reactions and transport limitations on either side.


Connections to Core ChE Concepts

Mass and species balances: The enzymatic reaction converts glucose stoichiometrically to H₂O₂. The current measured is proportional to the molar flux of H₂O₂ to the electrode surface — a direct application of Faraday’s law ($Q = nFN$, where $N$ is moles reacted) combined with a steady-state species balance on the diffusion layer.

Transport phenomena: The Cottrell equation arises from solving Fick’s second law of diffusion for a semi-infinite planar electrode with a potential-step boundary condition. Current decay over time reflects depletion of the diffusion layer — a mass transport effect that governs signal shape and informs both feature extraction strategy and the measurement time window.

Reaction kinetics and operating windows: CV characterization directly mapped the activation-controlled vs. mass-transport-limited regimes for this strip system, identical to the two asymptotic limits in heterogeneous catalysis (Damköhler number analysis). Choosing 0.3 V places the operating point at the transition where sensitivity is maximized.

Nonlinear kinetics and saturation: Breakdown of linearity at high glucose concentrations reflects enzyme saturation — a Michaelis-Menten kinetic effect where the GOx reaction rate approaches $V_{\max}$ and no longer scales proportionally with substrate:

\[v = \frac{V_{\max}[S]}{K_M + [S]}\]

At low [S] (below ~11 mM in our system), $[S] \ll K_M$ and $v \approx \frac{V_{\max}}{K_M}[S]$ — linear, first-order behavior. At high [S], the rate saturates to $V_{\max}$ — zero-order behavior. This transition is identical to a first-order-to-zero-order reactor kinetic shift at high substrate concentration, a concept central to reactor design. The device’s validated operating range (2.2–11.1 mM) is bounded by this saturation on the high end.

Calibration as process modeling: The experimentally derived calibration curve functions as a process model: it maps a measured variable (peak current) to a process output (glucose concentration). Constructing, validating, and refining this model — including identifying its failure modes at high concentrations — is directly analogous to process identification and control loop tuning in process engineering.


3. Device Design

System Architecture

The SweetSpot system operates through a five-stage pipeline:

[Glucose Sample + Test Strip] 
        ↓ electrochemical signal
[IO Rodeostat Potentiostat] — applies 0.3 V chronoamperometric step, records i(t)
        ↓ current-time data (USB)
[Laptop / Jupyter Notebook] — extracts peak current, applies calibration equation
        ↓ concentration value (USB serial)
[Arduino Uno] — receives concentration string, formats display output
        ↓ SPI data
[128×64 OLED Display] — renders concentration in real time

System Architecture Diagram

Figure 3. Full system architecture showing signal flow from electrochemical measurement through Python processing, Arduino microcontroller, and OLED display output.

Device operation summary:

  1. User applies a glucose test strip to the shim-assisted strip holder and initiates measurement from the Jupyter Notebook
  2. The Rodeostat applies a 0.3 V chronoamperometric step for 29 seconds (1 s equilibration at 0 V, then 29 s at 0.3 V)
  3. Python extracts peak current by absolute magnitude across the full time series
  4. The calibration equation (C = (I − CAL_INTERCEPT) / CAL_SLOPE) converts peak current to glucose concentration in mM
  5. If the result is outside 0–50 mM (physiologically implausible), the system automatically re-runs up to 5 times
  6. On a valid result, the concentration is transmitted as a plain string over USB serial to the Arduino
  7. The Arduino sketch — running independently on the board — receives the string and renders it on the OLED in real time; no Arduino IDE is required during operation

Component Selection & Rationale

All components were selected to maximize cost-effectiveness while maintaining functional adequacy for electrochemical sensing and embedded display.

Component Role Design Rationale
IO Rodeostat Potentiostat — applies controlled voltage, measures current Open-source, low-cost potentiostat ($240); enables chronoamperometry and CV; USB interface compatible with Python
True Metrix Test Strips Electrochemical transducer — GOx enzyme layer converts glucose to H₂O₂ signal Selected after comparative testing vs. OneTouch strips; more compatible electrode geometry with Rodeostat leads; procured fresh from CVS to minimize batch variability
Arduino Uno Microcontroller — receives concentration over serial, drives OLED Low-cost ($27.60); supports SPI for OLED; simple serial parsing; widely documented
128×64 OLED Display User output — renders glucose concentration SPI interface (faster than I²C); low power; compact ($19.50); readable in ambient lighting
3D-Printed Enclosure Physical housing — contains Arduino + OLED Enables demonstration-ready form factor; custom fit to component dimensions
Shim (inverted strip) Mechanical — standardizes strip contact pressure Addresses inconsistent electrode-to-strip contact resistance identified as primary reproducibility failure mode

Design trade-offs made:


Cost Analysis

Component Unit Cost
Arduino Uno $27.60
IO Rodeostat Potentiostat $240.00
128×64 OLED Graphic Display $19.50
Analyzer Cable/Probe $9.54
CVS True Metrix Glucose Strips (30 ct.) $9.99
TOTAL $306.63

The Rodeostat dominates cost and is the primary target for cost reduction in a production design. Integration of a custom analog front-end onto a single PCB could reduce instrumentation cost by an order of magnitude.


Glucose Standards Preparation

To mimic the electrolyte balance of human blood, a 140 mmol/L NaCl stock solution was prepared (standard physiological NaCl concentration):

\[\left(140 \frac{\text{mmol}}{\text{L}}\right)\left(\frac{58.44 \text{ g}}{\text{mol}}\right)\left(\frac{0.100 \text{ L}}{1}\right) = 0.818 \text{ g NaCl in 100 mL}\]

Glucose standards were prepared by dissolving known masses of glucose (MW = 180.156 g/mol) in 25 mL of stock solution:

\[C \text{ (mM)} = \frac{\text{mass (g)}}{180.156 \text{ g/mol} \times 0.025 \text{ L}} \times 1000\]

Standard concentrations and clinical context:

Glucose Level Mass Added (g) Concentration (mM) Clinical Reference
Baseline 0.000 0.00
Low 0.010 2.22 Below normal fasting
Normal 0.020 4.44 Normal fasting (~80 mg/dL)
High 0.050 11.10 Elevated (diabetic range, ~200 mg/dL)
Very High 0.070 15.54 Severely elevated

The five standards span the clinically relevant glucose range (normal fasting through moderate diabetic), enabling characterization of the linear sensing regime and definition of the validated operating range.

Glucose Standards Table


Preliminary Performance Calculations

Under ideal Cottrell behavior, the expected peak current at 5 mM glucose (normal fasting level) can be estimated as follows:

Given:

\[i = \frac{nFAC\sqrt{D}}{\sqrt{\pi t}} = \frac{2 \times 96485 \times 0.1 \times (5 \times 10^{-6}) \times \sqrt{1.4 \times 10^{-5}}}{\sqrt{\pi \times 5}} \approx 0.5 \ \mu\text{A}\]

Experimentally observed peak currents with the final protocol are in the low-to-mid µA range, consistent with this estimate when accounting for the strip’s actual electrode geometry and the higher applied potential (0.3 V drives a more complete reaction than the ideal diffusion-only Cottrell model assumes).


Schematics & Wiring

OLED Wiring (SPI Interface)

The OLED display requires SPI communication (not I²C — an early debugging finding). Wiring is as follows:

OLED Pin Arduino Pin Function
DC (Data/Command) D8 Selects data vs. command byte
RES (Reset) D9 Hardware reset line
CS (Chip Select) D10 SPI chip select
MOSI (Data) D11 SPI data line
SCK (Clock) D13 SPI clock

Electrode Lead Assignment

Lead Color Electrode Role
Red Working
Orange Reference
Yellow / Grey Counter

Consistent lead polarity and placement were critical to eliminating stray resistance at the strip-to-Rodeostat interface, identified during root cause analysis as a major noise source.

Soldered Arduino and OLED assembly

Figure 4. Soldered OLED and Arduino assembly on breadboard. All connections were soldered from loose jumper wires to eliminate intermittent contact — a hardware intervention that stabilized display communication.


Code

Arduino Sketch — OLED Display

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_DC  8
#define OLED_CS  10
#define OLED_RST 9

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &SPI, OLED_DC, OLED_RST, OLED_CS);

String incoming = "";

void showValue(String value) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  display.setTextSize(1);
  display.setCursor(18, 6);
  display.print("GLUCOSE");

  display.drawLine(0, 18, 127, 18, SSD1306_WHITE);

  display.setTextSize(3);
  display.setCursor(10, 30);
  display.print(value);

  display.setTextSize(1);
  display.setCursor(92, 52);
  display.print("mg/dL");

  display.display();
}

void setup() {
  Serial.begin(115200);
  delay(2000);
  if (!display.begin(SSD1306_SWITCHCAPVCC)) { while (1) {} }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(10, 25);
  display.print("Waiting for value...");
  display.display();
  Serial.println("OLED_READY");
}

void loop() {
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\n') {
      incoming.trim();
      if (incoming.length() > 0) {
        showValue(incoming);
        Serial.print("DISPLAYED: ");
        Serial.println(incoming);
      }
      incoming = "";
    } else {
      incoming += c;
    }
  }
}

Python Measurement & Processing Script (Jupyter Notebook)

All measurement, processing, and display communication runs from this single Jupyter Notebook script. The script connects to both USB devices (Rodeostat and Arduino) simultaneously, runs the electrochemical measurement, computes the glucose concentration, and pushes the result to the OLED — without ever opening the Arduino IDE.

from potentiostat import Potentiostat   # IO Rodeostat Python library
import matplotlib.pyplot as plt
import pandas as pd
import serial                           # pyserial — USB communication with Arduino
import serial.tools.list_ports
import time

# ── SECTION 1: PORT DISCOVERY ────────────────────────────────────────────────
# Two USB devices are connected simultaneously: the Rodeostat (potentiostat)
# and the Arduino Uno (OLED controller). They appear as separate serial ports.
# Print all available ports so the correct port names can be identified.
# On Mac, ports appear as /dev/cu.usbmodem****; on Windows as COM*.
print("Available ports:")
for p in serial.tools.list_ports.comports():
    print(" ", p.device, "-", p.description)

rodeostat_port = "/dev/cu.usbmodem101"    # IO Rodeostat potentiostat
oled_port      = "/dev/cu.usbmodem11101"  # Arduino Uno (running OLED sketch)

# ── SECTION 2: CALIBRATION CONSTANTS ────────────────────────────────────────
# Derived from final calibration dataset (April 26, True Metrix strips, 0.3 V):
#   I_peak (µA) = CAL_SLOPE × C (mM) + CAL_INTERCEPT    [forward model]
#   C (mM) = (I_peak - CAL_INTERCEPT) / CAL_SLOPE        [inverted for prediction]
# R² = 0.892 on the final calibration dataset
CAL_SLOPE     = 4.065
CAL_INTERCEPT = -3.897

# ── SECTION 3: MEASUREMENT SETTINGS ─────────────────────────────────────────
datafile   = "data.txt"        # Raw output file from Rodeostat
out_01s    = "chrono_data.xlsx"  # Processed DataFrame saved to Excel
max_retries = 5                # Maximum re-runs if concentration is out of range

# ── SECTION 4: CONNECT TO ARDUINO (OLED) ────────────────────────────────────
# Opens a serial connection to the Arduino at 115200 baud — the same baud rate
# set in the Arduino sketch. The Arduino sketch runs continuously on the board
# (uploaded once via Arduino IDE), listening on its serial port for a number
# string sent by this Python script. Python talks to it directly over USB;
# the Arduino IDE does not need to be open.
oled = serial.Serial(oled_port, 115200, timeout=1)
time.sleep(2.5)                # Wait for Arduino to finish booting/resetting
oled.reset_input_buffer()      # Clear any stale bytes in the receive buffer
oled.reset_output_buffer()     # Clear any stale bytes in the transmit buffer
print("OLED connected on", oled_port)

# ── SECTION 5: CONNECT TO RODEOSTAT ─────────────────────────────────────────
# The Potentiostat class wraps the Rodeostat's USB serial protocol.
# set_curr_range sets the analog measurement range — "1000uA" means the
# Rodeostat will measure currents up to 1000 µA with appropriate resolution.
# set_sample_period(100) sets a 100 ms interval between current measurements,
# producing ~290 data points over the 29-second chronoamperometry window.
dev = Potentiostat(rodeostat_port)
try:
    dev.set_curr_range("1000uA")   # Set current range before test
except:
    pass                           # Some firmware versions handle this automatically
dev.set_curr_range("1000uA")
dev.set_sample_period(100)         # 100 ms → ~10 samples/second

# ── SECTION 6: DEFINE CHRONOAMPEROMETRY PARAMETERS ──────────────────────────
# Chronoamperometry applies a potential step and records current vs. time.
# quietValue / quietTime: hold at 0 V for 1 s before the step to allow the
#   electrochemical system to equilibrate (no current flows at open circuit).
# step: at t=0 ms, hold 0 V; at t=0 ms step to 0.3 V and hold for 29 s.
# 0.3 V was determined by cyclic voltammetry as the H₂O₂ oxidation peak —
# the potential at which GOx-produced H₂O₂ is oxidized most efficiently.
name = "chronoamp"
test_param = {
    "quietValue": 0.0,
    "quietTime":  1000,                      # 1 s equilibration at 0 V
    "step": [(0, 0.0), (29000, 0.3)],        # Step to 0.3 V, hold 29 s
}
dev.set_param(name, test_param)

# ── SECTION 7: MEASUREMENT LOOP WITH AUTOMATIC RE-RUN ───────────────────────
# Physiologically valid blood glucose is 0–50 mM. If the computed concentration
# falls outside this range, the measurement is flagged as an artifact (e.g., from
# poor strip contact, electrical noise, or a missed step) and the test re-runs.
# The loop retries up to max_retries (5) times before giving up and sending
# an error code to the OLED.
concentration  = None
df_raw         = None
curr           = None
peak_current_uA = None
peak_time      = None

for attempt in range(1, max_retries + 1):
    print(f"\nRunning test... Attempt {attempt}/{max_retries}")

    # Run the chronoamperometry test via the Rodeostat.
    # Returns three lists: time (s), voltage (V), and current (µA).
    t, volt, curr = dev.run_test(name, display="pbar", filename=datafile)

    # Build a pandas DataFrame for structured processing and export.
    df_raw = pd.DataFrame({
        "time_s":     t,
        "voltage_V":  volt,
        "current_uA": curr
    })
    df_raw = df_raw.sort_values("time_s").reset_index(drop=True)
    df_raw["time_s"] = df_raw["time_s"].round(2)

    # Save raw data to Excel for archiving and later analysis.
    df_raw.to_excel(out_01s, index=False)
    print("Saved:", out_01s)

    # Extract peak current by absolute magnitude.
    # Using abs() captures the peak regardless of polarity — important because
    # the Cottrell current can appear with a positive or negative sign depending
    # on Rodeostat lead orientation and strip electrode convention.
    peak_idx        = df_raw["current_uA"].abs().idxmax()
    peak_time       = float(df_raw.loc[peak_idx, "time_s"])
    peak_current_uA = float(df_raw.loc[peak_idx, "current_uA"])
    print(f"Peak current at {peak_time:.2f} s: {peak_current_uA:.3f} µA")

    # Apply calibration equation (inverted linear model):
    #   C (mM) = (I_peak (µA) - CAL_INTERCEPT) / CAL_SLOPE
    concentration = (peak_current_uA - CAL_INTERCEPT) / CAL_SLOPE
    print(f"Calculated concentration: {concentration:.2f} mM")

    # Quality gate: accept only physiologically plausible results (0–50 mM).
    # Values outside this range indicate a failed measurement — caused by
    # poor strip contact, a transient noise spike dominating peak extraction,
    # or electrical interference. Trigger a re-run automatically.
    if 0 <= concentration <= 50:
        print("Concentration in valid range. Accepting result.")
        break
    else:
        print("Concentration out of range (<0 or >50 mM). Re-running...")
        concentration = None
        time.sleep(1)   # Brief pause before next attempt

# ── SECTION 8: OUTPUT ────────────────────────────────────────────────────────
if concentration is None:
    # All retries exhausted — send error code to OLED
    print("\nNo valid concentration obtained after max retries.")
    oled.write(b"ERR\n")
else:
    # Plot the final valid run: voltage and current vs. time,
    # with a vertical dashed line marking the peak current time point.
    plt.figure(figsize=(9, 6))
    plt.subplot(211)
    plt.title("Chronoamperometry: Voltage and Current vs. Time")
    plt.plot(df_raw["time_s"], df_raw["voltage_V"])
    plt.ylabel("Potential (V)"); plt.grid(True)
    plt.subplot(212)
    plt.plot(df_raw["time_s"], df_raw["current_uA"])
    plt.axvline(x=peak_time, linestyle="--", label=f"Peak @ {peak_time:.2f} s")
    plt.ylabel("Current (µA)"); plt.xlabel("Time (s)")
    plt.grid(True); plt.legend()
    plt.tight_layout(); plt.show()

    print(f"Final peak current: {peak_current_uA:.3f} µA")
    print(f"Final concentration: {concentration:.2f} mM")

    # Send concentration to Arduino over USB serial as a plain string + newline.
    # The Arduino sketch listens for '\n' as the message terminator, then
    # parses the string and renders it on the OLED screen.
    # This communication happens entirely through the USB cable — no wireless,
    # no Arduino IDE required. Python writes; Arduino reads and displays.
    oled.write(f"{concentration:.1f}\n".encode())
    time.sleep(0.3)
    while oled.in_waiting:
        print("OLED:", oled.readline().decode(errors="ignore").strip())

oled.close()

3D Printed Enclosure

Reworking files provided in 3300A, the introductory course for 3300B, the files were rescaled by 1.60 times to ensure proper fit for our device. While GitHub does not support the necessary file type for including the printed files, a screenshot of the back case is shown below.Screenshot 2026-05-06 at 12 30 32 PM

Safety Considerations

SweetSpot is a prototype engineering demonstration and is not intended for medical use, diagnosis, treatment decisions, or real blood glucose monitoring. The primary safety concern is the reliability and accuracy of the glucose readings. Validation results showed significant error and trial-to-trial variability, meaning the device should not be used to guide insulin dosing, dietary decisions, emergency response, or any other health-related action.

Hardware safety was addressed by containing the soldered electrical components within a 3D-printed enclosure. This enclosure reduces direct contact with exposed wiring and soldered connections, improves mechanical stability, and makes the device safer and more reliable for classroom demonstration. The enclosure also helps protect the Arduino, OLED wiring, and soldered breadboard assembly from accidental movement or contact during operation.

Additional safety mitigation measures include automatic re-running of measurements when calculated concentrations fall outside the physiologically plausible range of 0–50 mM. However, this quality gate only catches obvious outliers and does not make the device clinically reliable. SweetSpot should therefore be treated strictly as an educational prototype that demonstrates electrochemical sensing, calibration, and embedded display integration, not as a validated medical device.

4. Calibration: Iteration History & Challenges

Calibration required four distinct iterations over three months. Each failure was diagnosed and addressed through targeted hardware or methodological intervention — a systematic engineering process that ultimately produced the functional final prototype.


Iteration 1 — OneTouch Strips, Peak Current (March 5)

Method: Peak (maximum) current from chronoamperometry at 0.5 V; four concentrations, one measurement each.

Result: \(\text{Glucose (mM)} = 1.1978 \times I_{\text{peak}} (\mu\text{A}) - 0.4567 \quad (R^2 = 0.9998)\)

Initial calibration curve March 5 with misleading R² = 0.9998

Figure 5. Initial calibration curve (March 5). R² = 0.9998 on training data — a misleading result from fitting exactly 4 points with one measurement per concentration (effectively interpolation, not regression). Subsequent validation produced predictions ranging from −10 to >50 mM.

Failure analysis: The extremely high R² was an artifact of interpolation rather than genuine model fit. With only four calibration points and no within-concentration replication, the model captured zero measurement variability. Predictions on new strips completely failed, confirming that the model did not generalize.


Iteration 2 — Steady-State Current (March 25)

Method: Shifted from peak current to steady-state current at fixed time points (10 s and 20 s), where the Cottrell transient has decayed and the signal is more stable.

Result:

Calibration curve comparison for steady-state at 10s and 20s

Figure 6. Calibration curves using steady-state current at 10 s (left) and 20 s (right) for OneTouch strips. R² values near zero; no usable concentration-dependent trend. Measurements scattered without correlation across replicate strips.

Failure analysis: Reproducibility failed across both feature types (peak and steady-state), pointing to a systemic physical cause rather than an algorithmic one. Strip-to-strip variability and inconsistent mechanical contact were identified as root causes requiring hardware intervention — no signal processing approach could compensate for uncontrolled physical variables.


Iteration 3 — DI Water Normalization (March 25)

Method: Baseline normalization — each strip’s response in DI water was subtracted from the sample response to correct for inter-strip offset.

Result:

Normalization corrected for inter-strip baseline offset but could not correct for differences in sensitivity (slope) between strips. Calibration remained inconsistent.

Engineering interpretation: Normalization is equivalent to subtracting a systematic additive bias. If the true variability is multiplicative (i.e., slope varies between strips, not just intercept), baseline subtraction is insufficient. A ratiometric approach or strip-by-strip calibration would be required — both demanding more measurements than the current protocol allows.


Root Cause Analysis & Hardware Intervention (April 16)

Persistent failure across all signal features — peak current, steady-state current, normalized current — indicated that no calibration methodology could succeed until the underlying physical sources of variability were controlled. Two primary causes were identified and addressed:

Cause 1: Strip batch variability

Cause 2: Inconsistent mechanical contact

Failed chronoamperometry from poor strip contact showing flat/distorted traces

Figure 7. Failed chronoamperometry measurements from poor strip contact (2.2 mM, no shim). Flat or severely distorted traces indicate intermittent electrode connection — indistinguishable from a zero-concentration sample in the absence of a quality check.

Additional hardware improvements:

Summary of root cause analysis and resolutions:

Issue Encountered Root Cause Identified Resolution Implemented
Non-reproducible calibration Strip batch variability Fresh CVS True Metrix strips
Signal dropout / flat traces Inconsistent mechanical contact pressure Shim added to strip holder
Non-optimal applied voltage Arbitrary voltage selection (0.5 V) CV-guided 0.3 V selection
Noisy electrode connection Incorrect polarity and loose leads Connection rework with defined lead assignment
Calibration nonlinearity at high [C] GOx enzyme saturation (Michaelis-Menten) Validated operating range limited to ≤ 11.1 mM

Iteration 4 (Final) — True Metrix Strips (April 26)

Method: Peak current at 0.3 V applied potential (CV-determined); new True Metrix strips with shim; one strip per concentration.

Improvements over prior iterations:

Final calibration curve April 26 with True Metrix strips

Figure 8. Final calibration curve (April 26). True Metrix strips at 0.3 V applied potential. R² = 0.935 across the 2.2–11.1 mM range. Error bars reflect within-measurement noise. Deviation at 8.8 and 11.1 mM reflects onset of GOx enzyme saturation.


5. Performance Data & Validation

Final Calibration Results

Final calibration dataset:

Glucose Concentration (mM) Peak Current (µA)
2.2 4.42
4.4 11.21
6.6 13.80
8.8 31.40
11.1 35.82

Calibration equation (forward — current from concentration):

\[I_{\text{peak}} \ (\mu\text{A}) = 3.7379 \times C_{\text{glucose}} \ (\text{mM}) - 5.415 \quad (R^2 = 0.935)\]

Inverted for real-time concentration prediction:

\[\boxed{C_{\text{glucose}} \ (\text{mM}) = \frac{I_{\text{peak}} \ (\mu\text{A}) + 5.415}{3.7379}}\]

Calibration summary:

Parameter Value
Applied potential 0.3 V (CV-determined)
Calibration feature Peak current (µA), ignoring first 1 s
Calibration equation C (mM) = (I + 5.415) / 3.7379
0.935
Validated range 2.2–11.1 mM (40–200 mg/dL)
Strip type True Metrix self-monitoring glucose test strips

The R² of 0.935, though lower than the original four-point training fit (0.9998), is substantially more honest — it reflects a properly constructed calibration with real measurement variability present, rather than a four-point interpolation. The deviation at high concentrations is physically consistent with the Michaelis-Menten saturation behavior identified analytically.


End-to-End Screen Validation

Known glucose standards were measured and predictions displayed on the OLED — testing the full pipeline (electrochemical acquisition → processing → serial transmission → display):

Actual Concentration (mM) Screen Output Trial 1 (mM) Screen Output Trial 2 (mM)
2.2 11.7 2.7
4.4 3.42 14.5
6.6 7.9 33.2
8.8 42.5 47.9
11.1 48.8 35.0

These results confirm the full sensing-to-display pipeline is functional end-to-end. Quantitative accuracy varies significantly between trials at the same concentration — driven by strip-to-strip variability that a single-strip calibration cannot capture. The pipeline itself (acquire → process → transmit → display) operates correctly for every measurement.

See the device in action: https://github.com/user-attachments/assets/cb9e7f55-9fd3-4ae5-9c2e-26083d2b7484

Full function video! https://drive.google.com/file/d/17529kVom23vIuxYyKV71NutiktK6czey/view?usp=sharing


Error Analysis

Validation was performed by testing known glucose standards against the device’s screen output. This assessment evaluates real-world prototype performance — not model construction.

Error Metric Value
Mean Absolute Error (MAE) 20.27 mM
Root Mean Squared Error (RMSE) 23.57 mM
Mean Absolute Percent Error (MAPE) 328.7%
Average bias +19.68 mM (systematic overprediction)

Error analysis figure 1

Error analysis figure 2

Error analysis figure 3 percent error by concentration

Figures 9–11. Error analysis: predicted vs. actual glucose concentration (parity plot), absolute error by concentration, and percent error by concentration. Error increases sharply at higher concentrations (>6.6 mM), consistent with the onset of enzyme saturation and amplified peak current artifacts.

Error contributors (ranked by likely impact):

  1. Single-strip calibration — one measurement per concentration provides no inter-strip variability estimate; the calibration slope and intercept are highly sensitive to individual strip behavior
  2. Inconsistent strip seating — residual mechanical contact variability despite shim intervention
  3. Contact resistance — variable resistance at the strip electrode-to-Rodeostat-lead interface introduces noise directly into the current signal
  4. Strip manufacturing variation — batch-to-batch and strip-to-strip variation in GOx enzyme layer deposition and electrode geometry
  5. Nonlinear enzymatic response — GOx saturation above ~8 mM produces accelerating nonlinearity not captured by the linear calibration model
  6. Electrical noise — Rodeostat signal noise at the low current magnitudes measured (<50 µA)

Mitigation implemented: If a reading is <0 or >50 mM, the system automatically re-runs the measurement up to 5 times — a real-time quality gate that catches obvious outliers.

Engineering interpretation: The quantitative error, while large, is a known and bounded limitation of a single-strip, single-measurement calibration. The path to improvement is clear: triplicate calibration measurements per concentration would provide uncertainty bounds, enable outlier rejection, and yield a more robust regression. This is the highest-priority future work item.


Nonlinear Kinetics & Operating Limit

Actual glucose concentration vs screen output showing nonlinear overprediction

Figure 12. Actual vs. screen output glucose concentration. Ideal performance would follow the dashed diagonal. Screen output diverges dramatically above ~6.6 mM, consistent with the onset of GOx enzyme saturation (Michaelis-Menten regime transition) combined with peak-current artifacts at higher concentration.

The theoretical expectation at saturation is a plateau in current (Michaelis-Menten zero-order regime). The observed behavior of increasing overprediction suggests that peak-current artifacts (e.g., transient noise spikes that are disproportionately large at higher concentrations) are amplified by the single-strip calibration rather than saturating. This is a compound failure: enzyme saturation breaks the linear Cottrell assumption, and the peak-current extraction method becomes less reliable as the true signal shape deviates from the ideal Cottrell decay.


System Limitations

Category Limitation
Measurement & Signal Peak current sensitive to transient noise spikes; signal affected by electrode contact variability
Chemical GOx enzyme saturation limits linear range to ≤ ~11 mM; strip chemistry introduces non-ideal electrochemical behavior at higher concentrations
Hardware Precision limited by Rodeostat’s low-cost analog front end; manual strip insertion introduces inconsistent alignment and contact
Calibration Linear model valid only in 2.2–11.1 mM range; single-strip calibration provides no uncertainty quantification
Operation Computer-dependent (Jupyter Notebook required for measurement and processing)

6. Progress Log

A chronological record of key development milestones, engineering decisions, and findings.

February 12, 2026 — Initial Hardware Setup and Signal Verification

Connected the IO Rodeostat to a laptop and conducted an initial chronoamperometry test using a commercial glucose test strip and legacy connector leads. Emphasis was on confirming that the hardware and software pipeline could generate and capture an electrochemical signal.

First chronoamperometry run February 12 showing noisy signal

Figure 13. First chronoamperometry run (February 12). Signal present but highly noisy with no discernible concentration-dependent feature. Confirmed hardware connectivity and established the measurement pipeline as a foundation for all subsequent work.

Engineering significance: Feasibility verification — before a sensor can be evaluated quantitatively, the acquisition chain must be shown to produce a usable signal. This confirmed the end-to-end pathway: strip → Rodeostat → USB → Python → plot.


February 26, 2026 — Calibration Data Collection and Pipeline Improvement

Prepared a full set of standard glucose solutions for calibration and improved the data pipeline. The updated Python workflow exported raw data to CSV/Excel files, making measurements reproducible and analysis-ready. First full datasets for high and very high glucose concentrations were collected.


March 4, 2026 — Full Concentration Dataset Complete

All initial concentration measurements across the five glucose standards were completed. First time the system had enough data to attempt a calibration model.


March 5, 2026 — Initial Calibration Curve

First calibration model constructed using peak current. R² = 0.9998 on training data (see Calibration Section for failure analysis). The high apparent linearity was a four-point interpolation artifact. Breakdown at high concentrations also observed and attributed to enzyme saturation.


March 25, 2026 — Validation Testing and Failure Analysis

Extensive validation testing across peak current, steady-state current at 10 s and 20 s, and DI water normalization. All methods failed validation. Root cause analysis concluded the failures were physical — strip variability and mechanical contact — not algorithmic.


April 2, 2026 — Arduino Serial Communication and OLED Display

After identifying that the display required SPI (not I²C) communication, the OLED was successfully initialized and validated on a breadboard. Python-to-Arduino serial communication pipeline was designed and tested end-to-end.

Initial OLED wiring setup on breadboard April 2

Figure 14. Initial OLED wiring on breadboard (April 2). SPI connection established after diagnosing and correcting an I²C initialization failure. Full serial communication from Python to Arduino and display verified.


April 8, 2026 — Hardware Integration and Soldering

Moved from loose jumper wires to a soldered assembly. OLED and all Arduino connections were soldered to a breadboard, producing mechanically stable joints. Full pipeline (measure → process → display) verified end-to-end from a single Jupyter Notebook.


April 16, 2026 — New Strips, Shim, CV, and Electrode Rework

Systematic hardware intervention to address the two root causes identified March 25:

Chronoamperometry results after shim addition 6.6 mM

Figure 15. Chronoamperometry at 6.6 mM post-shim (one of several results). After repositioning and consistent shim placement, more reliable Cottrell-like decay profiles began to emerge.


April 26, 2026 — Final Calibration, Enclosure, and Prototype Completion

Final calibration performed with all hardware improvements in place. 3D-printed enclosure assembled with Arduino Uno and OLED display mounted and secured. End-to-end validation runs performed across all five concentrations.


7. SWOT Analysis

  Strengths Weaknesses
Internal Strong medical relevance; real-time OLED output; low-cost component selection; modular architecture enabling independent subsystem development; CV-guided voltage selection demonstrates principled experimental design; complete end-to-end pipeline Quantitative accuracy not yet at clinical-grade; computer-dependent operation; single-strip calibration with no uncertainty quantification; performance degrades above ~11 mM
  Opportunities Threats
External Rising diabetes prevalence increases urgency for affordable tools; future PCB integration could reduce cost by 10×; strong potential for community health and screening applications; embedded processing migration would enable full portability Competition from established commercial glucometers with regulatory approval; regulatory barriers for clinical deployment; liability concerns with inaccurate predictions; possible fundamental incompatibility between commercial strip chemistry and non-proprietary instrumentation at high concentrations

8. Future Work

Immediate (Next Semester)

  1. Triplicate measurements per concentration — provides calibration uncertainty bounds, enables outlier rejection, and produces a statistically valid regression. This is the single highest-impact improvement.
  2. Automated re-run logic — automated quality flagging for out-of-range or low-quality signals (e.g., Cottrell $t^{-1/2}$ linearity check as a per-measurement flag)
  3. Reference glucometer validation — compare device output against a commercial glucometer on matched samples to establish relative accuracy
  4. Larger calibration dataset — more concentrations and more replicates to better characterize the nonlinear regime

Hardware

Longer-Term


Repository Contents

sweetspot/
├── notebooks/          # Jupyter Notebooks — chronoamperometry, calibration, serial communication
├── data/               # CSV/Excel exports of raw current-time data for each glucose standard
│   └── calibrationdata.xlsx
├── arduino/            # Arduino sketch — OLED display and serial communication
├── docs/               # Design reports, presentations, GANTT chart
└── README.md

All Calibration Data

All calibration data collected over the semester: calibrationdata.xlsx

Reports and Presentations


Current Project Status

The system is a fully functional final prototype. The sensing, calibration, display, and enclosure are all complete and integrated. The device demonstrates the full engineering chain from electrochemical signal to displayed concentration reading and meets the core design objectives established at project inception. Quantitative accuracy is the primary target for next-semester refinement.

What Is Working

What Remains for Further Refinement