
MacroController
alex1klimovich/nrf52840-macro-controller
Custom nRF52840 productivity controller for digital artists — PCB, BLE/USB firmware, OLED, haptics, RGB, and enclosure CAD.

An edge-AI system for early detection of Chemotherapy-Induced Peripheral Neuropathy (CIPN). Integrates vibration, thermal, and GSR sensing with ESP32-based on-device inference for real-time, low-cost neuropathy screening and point-of-care diagnostics.
Esd pcb design is an open-source printed circuit board by k1thhh, from the k1thhh/CIPN repository on GitHub. It is a 2-layer board of 143.9 × 88.6 mm with 18 parts on 71 nets, routed with 224 tracks and 32 vias.
It is built around the DRV2605LDGS, DS18B20 and L298N, with the MT3608 among its other parts. Its parts include 5 ICs, 3 resistors, 2 capacitors, 2 switches and 1 diode. It belongs with the ESP32 boards of this library.
Embedded Healthcare | TinyML | ESP32 | Biomedical Sensing | Edge AI
Chemo Comfort is a portable, low-cost embedded diagnostic prototype designed for the early, objective screening of Chemotherapy-Induced Peripheral Neuropathy (CIPN).
The system combines three complementary assessment methods:
The extracted features are processed directly on an ESP32-WROOM using a quantized TensorFlow Lite Micro neural network, allowing the device to classify CIPN risk without relying on cloud connectivity.
The system produces one of three risk categories:
Normal
Moderate
SevereAll processing is performed locally on the device, providing a privacy-preserving architecture suitable for potential home or outpatient applications.
⚠️ Important: Chemo Comfort is an academic/research prototype and is not a certified medical device. It is not intended for clinical diagnosis without further validation.
Chemotherapy-Induced Peripheral Neuropathy (CIPN) is a common adverse effect associated with several chemotherapy agents, including taxanes, platinum compounds, and vinca alkaloids.
Conventional assessment can involve:
The project aims to combine subjective patient-reported information with quantitative sensory measurements in a single portable embedded system.
The primary objectives are:
The system combines three input modules before performing edge inference.
┌─────────────────────┐
│ Questionnaire │
│ OLED + Buttons │
└──────────┬──────────┘
│
│
┌──────────▼──────────┐
│ Vibration Test │
│ DRV2605L ×2 │
└──────────┬──────────┘
│
│
┌──────────▼──────────┐
│ Thermal Test │
│ Peltier + Temp │
│ Sensor │
└──────────┬──────────┘
│
▼
┌─────────────────────────┐
│ ESP32-WROOM │
│ │
│ Feature Normalization │
│ Mean / Std Scaling │The five model features are:
VPT
Cold Temperature
CIPN20 Sensory
CIPN20 Motor
CIPN20 AutonomicThese features are normalized on-device using the same preprocessing parameters used during model development.
The device presents a simplified EORTC QLQ-CIPN20-based questionnaire through the OLED display.
Five push buttons are used for interaction:
The questionnaire contributes sensory, motor, and autonomic symptom features to the final model input.
The VPT test evaluates the user's ability to perceive controlled vibration stimuli.
The system uses DRV2605L haptic drivers to generate controlled vibration.
ESP32
│
▼
DRV2605L
│
▼
Increasing Vibration
│
▼
Patient Perception
│
▼
Button Response
│
▼
VPT ThresholdThe vibration intensity is progressively increased until the patient indicates that the vibration can be perceived.
The project reports VPT threshold trends of approximately:
Non-CIPN → Median 7–8
CIPN → Median 17–18The thermal test evaluates cold-temperature perception.
The system uses:
The Peltier module changes the temperature of a contact surface while the temperature sensor continuously measures the resulting temperature.
ESP32
│
▼
MOSFET H-Bridge
│
▼
Peltier Module
│
▼
Cooling Surface
│
▼
Patient Perception
│
▼
Cold Detection ThresholdThe project reports cold-detection temperatures around:
30.0 – 30.7 °CThe three assessment modules produce the five model inputs:
| Feature | Source |
|---|---|
vpt | Vibration perception test |
cold_temp | Thermal perception test |
cipn20_sensory | Questionnaire |
cipn20_motor | Questionnaire |
cipn20_autonomic | Questionnaire |
The complete feature vector is therefore:
[vpt,
cold_temp,
cipn20_sensory,
cipn20_motor,
cipn20_autonomic]The preprocessing parameters are stored in:
ml/model/preproc_params.jsonand mirrored as constants in the firmware.
The machine-learning pipeline was developed using Python, TensorFlow, and Google Colab.
Clinical / Synthetic Data
│
▼
Dataset Synthesis
│
▼
Preprocessing
│
┌─────┴─────┐
▼ ▼
Imputation Standardization
│ │
└─────┬─────┘
▼
MLP Model
│
▼
Training
│
▼
TensorFlow Lite
│
▼
INT8 QuantizationBecause a public dataset combining quantitative sensory measurements with CIPN-20 scores was not available for the project's requirements, a synthetic dataset was generated.
The dataset was constructed using statistical patterns reported in published literature, with controlled mean and standard-deviation shifts between CIPN and non-CIPN classes.
This approach allowed the embedded ML pipeline to be developed and tested while recognizing that clinical validation with real patient data remains necessary.
The ML pipeline applies two major preprocessing operations.
Missing values are handled using:
SimpleImputer
↓
Median ImputationThe features are standardized using:
StandardScalerThe resulting mean and scaling parameters are saved in:
preproc_params.jsonThe same preprocessing parameters are embedded into the ESP32 firmware to maintain consistency between training and inference.
The project uses a compact two-layer Multilayer Perceptron (MLP).
5 Input Features
│
▼
┌──────────────────┐
│ Dense Layer │
│ 16 Neurons │
│ ReLU Activation │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Dense Layer │
│ 1 Neuron │
│ Sigmoid │
└────────┬─────────┘
│
▼
CIPN Risk ScoreThe model was trained for:
Epochs = 30
Optimizer = Adam
Learning Rate = 0.001
Train/Test = 85:15After training, the model is converted into an embedded-friendly representation.
Keras Model
↓
TensorFlow Lite
↓
INT8 Post-Training Quantization
↓
C Array
↓
model.h
↓
ESP32 FirmwareThe resulting model.h file contains the TensorFlow Lite model as a C byte array that can be compiled directly into the ESP32 firmware.
One of the major features of Chemo Comfort is that inference occurs directly on the ESP32.
Patient Data
↓
Feature Extraction
↓
Normalization
↓
INT8 TinyML Model
↓
Risk Classification
↓
OLEDNo cloud server is required for inference.
This provides:
The firmware executes the model using a 32 KB tensor arena.
A 0.96-inch 128×64 I²C OLED provides the user interface.
It displays:
The final classification is displayed as:
┌──────────────────┐
│ CIPN RESULT │
│ │
│ NORMAL │
│ OR │
│ MODERATE │
│ OR │
│ SEVERE │
└──────────────────┘The main firmware is:
firmware/cipn_tinyml.inoIt integrates the complete embedded workflow.
The firmware handles:
| Component | Function |
|---|---|
| ESP32-WROOM | Main controller + TinyML inference |
| DRV2605L ×2 | Vibration stimulus generation |
| TEC1-12706 Peltier | Thermal stimulus |
| DS18B20 / TMP117 | Temperature sensing |
| MOSFET H-Bridge | Bidirectional Peltier control |
| MT3608 | Boost conversion |
| 0.96" OLED | User interface |
| 5 Push Buttons | Questionnaire and test interaction |
The ESP32-WROOM uses a dual-core Xtensa LX6 architecture operating at up to 240 MHz with 520 KB SRAM.
The prototype has an estimated total component cost of approximately:
| Component | Qty | Unit Cost | Total |
|---|---|---|---|
| ESP32-WROOM | 1 | ₹400 | ₹400 |
| DRV2605L | 2 | ₹180 | ₹360 |
| Peltier Module | 1 | ₹200 | ₹200 |
| DS18B20/TMP117 | 1 | ₹120 | ₹120 |
| MT3608 | 1 | ₹80 | ₹80 |
| OLED | 1 | ₹150 | ₹150 |
| Push Buttons | 5 | ₹10 | ₹50 |
| MOSFET H-Bridge | 1 | ₹100 | ₹100 |
| Power Supply / USB | 1 | ₹100 | ₹100 |
| Miscellaneous | — | — | ₹150 |
| Total | ≈ ₹1,710 |
ChemoComfort-CIPN-Wearable/
│
├── README.md
│
├── docs/
│ └── Chemo_Comfort_Project_Report.pdf
│
├── firmware/
│ ├── cipn_tinyml.ino
│ └── model.h
│
├── ml/
│ ├── notebooks/
│ │ └── cipn.ipynb
│ │
│ ├── data/
│ │ ├── cipn_cancer_drug_only.csv
│ │ └── taxane.csv
│ │
│ └── model/
│ └── preproc_params.json
│
└── PCB/
├── esd_pcb_design.kicad_proThe repository therefore combines embedded firmware, TinyML training artifacts, datasets, preprocessing parameters, and PCB design files in a single project structure.
The firmware uses:
Adafruit_GFX
Adafruit_SSD1306
Adafruit_DRV2605
tflm_esp32
eloquent_tinyml
WireWire is included with the Arduino/ESP32 environment.
Open:
ml/notebooks/cipn.ipynbusing Google Colab or Jupyter.
The notebook contains the dataset synthesis, preprocessing, model training, and TensorFlow Lite conversion workflow.
The PCB design can be opened using KiCad 8.x or later.
The main project file is:
PCB/esd_pcb_design.kicad_proThe repository also contains the schematic and PCB layout files.
Open:
firmware/cipn_tinyml.inoEnsure that:
model.his present in the same sketch directory.
Install the required Arduino libraries, select the appropriate ESP32 board and COM port, then upload the firmware.
START
│
▼
Questionnaire
│
▼
Sensory Scores
│
▼
VPT Measurement
│
▼
Vibration Threshold
│
▼
Thermal Measurement
│
▼
Cold Detection Temp
│
▼
┌──────────────────┐
│ 5 Feature Vector │
└────────┬─────────┘The implemented prototype demonstrates:
| Parameter | Result |
|---|---|
| Architecture | ESP32-based edge diagnostic prototype |
| Input Modalities | Questionnaire + VPT + thermal |
| ML Model | 2-layer MLP |
| Model Quantization | INT8 |
| Input Features | 5 |
| Tensor Arena | 32 KB |
| Inference Time | < 1 second |
| Reported AUC | ≈ 0.70–0.90 |
| PC-to-device parity deviation | < 2% |
| Estimated Cost | ≈ ₹1,710 |
The reported AUC varies between training runs, while the project reports less than 2% parity deviation from the PC-based Keras model and consistently sub-second ESP32 inference.
The system can be evaluated at multiple levels.
Verify:
Compare VPT and thermal measurements with expected trends.
Compare the embedded model's output against the original PC-based Keras model.
Evaluate whether INT8 conversion significantly changes model predictions.
Measure:
Verify that questionnaire responses, sensory measurements, preprocessing, inference, and OLED output work as one integrated system.
This project provides practical exposure to:
The project demonstrates how a machine-learning model can move from a Python training environment into a resource-constrained embedded device.
The complete development pipeline can be summarized as:
Data
↓
Preprocessing
↓
Model Training
↓
TensorFlow Lite
↓
INT8 Quantization
↓
C Array Conversion
↓
ESP32 Deployment
↓
On-Device Inference
↓
Risk ClassificationAt the same time, the project combines physical sensing, embedded firmware, PCB design, and machine learning into one end-to-end system.
This makes the project an example of how TinyML can be used to move AI inference closer to the point of data acquisition.
The underlying architecture could potentially be extended to:
Portable preliminary monitoring outside a hospital environment.
Repeated measurements during chemotherapy treatment.
Future wireless connectivity could allow measurements to be shared with healthcare providers.
The same sensory-measurement architecture could potentially be adapted for monitoring changes in peripheral sensory function over time.
These are potential applications of the prototype; clinical suitability would require substantial real-world validation and regulatory evaluation.
The current prototype has several important limitations.
The ML dataset was synthesized because a suitable public dataset combining the required sensory measurements and CIPN-20 scores was unavailable.
The model requires validation using real patient data before any clinical interpretation.
The reported AUC ranges from approximately 0.70–0.90 depending on the training run, so performance is not yet sufficient to establish clinical reliability.
The current thermal and vibration measurement mechanisms provide prototype-level sensory measurements rather than certified clinical measurements.
The project can be extended through:
These extensions are consistent with the project's documented future-work directions.
A future version could evolve toward:
Multi-Modal Sensing
│
┌───────┼────────┐
▼ ▼ ▼
VPT Thermal Questionnaire
│ │ │
└───────┼────────┘
▼
Feature Fusion
│
▼
Edge AI / TinyML
│
▼
Risk Estimation
│
┌───────┴────────┐
▼ ▼
Local OLED Wireless Report
│
▼
TelemonitoringKirthana S R. Gopikasree Joshitha G
Guide: Dr. V. Prakash
School of Electronics Engineering Vellore Institute of Technology, Chennai
The project was developed as part of BECE403E – Embedded System Design (November 2025).
CIPN Chemotherapy-Induced Peripheral Neuropathy TinyML Edge AI ESP32 TensorFlow Lite TensorFlow Lite Micro Biomedical Engineering Embedded Systems Healthcare AI Vibration Perception Thermal Perception Peltier DRV2605L OLED Machine Learning INT8 Quantization CIPN20 EORTC KiCad PCB Design Embedded ML On-Device Inference
Sense → Extract → Normalize → Infer → Classify
| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | 0.1uF | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C1 |
| 1 | 10k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R2 |
| 1 | 220uF | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C2 |
| 1 | 22uH | Inductor_THT:L_Axial_L6.6mm_D2.7mm_P2.54mm_Vertical_Vishay_IM-2 | L1 |
| 1 | 4.7k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R3 |
| 1 | 75k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1 |
| 1 | Conn_01x02_Pin | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | Coin_motor1 |
| 1 | Conn_01x02_Pin | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | Battery1 |
| 1 | DRV2605LDGS | Package_SO:VSSOP-10_3x3mm_P0.5mm | U2 |
| 1 | DS18B20 | Package_TO_SOT_THT:TO-92_Inline | U3 |
| 1 | D_Schottky | Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal | D1 |
| 1 | ESP32-DEVKIT-V1 | ESP32-DEVKIT-V1:MODULE_ESP32_DEVKIT_V1 | U1 |
| 1 | L298N | Package_TO_SOT_THT:TO-220-15_P2.54x5.08mm_StaggerOdd_Lead4.58mm_Vertical | U6 |
| 1 | MT3608 | Package_TO_SOT_SMD:SOT-23-6 | U7 |
| 1 | OLED-128O064D | Display:OLED-128O064D | DS1 |
| 1 | SW_Push | Button_Switch_THT:SW_PUSH_6mm | SW1 |
| 1 | SW_SPST | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical_SMD_Pin1Left | SW2 |
| 1 | Screw_Terminal_01x02 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_Horizontal | PELTIER1 |
It measures 143.9 × 88.6 mm and has 2 copper layers, 1.6 mm thick.
18 parts, built around the DRV2605LDGS, DS18B20, L298N and MT3608. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the k1thhh/CIPN repository on GitHub, at the commit this page was made from: the board is pcb design/esd_pcb_design.kicad_pcb and its schematic pcb design/esd_pcb_design.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask k1thhh before reusing the design.

alex1klimovich/nrf52840-macro-controller
Custom nRF52840 productivity controller for digital artists — PCB, BLE/USB firmware, OLED, haptics, RGB, and enclosure CAD.






