ZhangScope is an easy to replicate Oximeter with a substantial accuracy increase compared to the lower part of the home-use oximeter market.

This is inspired by the current event of the COVID-19 pandemic, which saw the rise of interest in Oximeter products in the market, ZhangScope aims to offer a cheaper, but accurate platform to measure SpO2 concentration – together with a mobile application as a proof-of-concept.

DISCLAIMER: This is part of an academic project, thus – it may not be perfect, but we hope that this repository and its content would at the very least provide a working example of an Arduino-based Pulse Oximeter with a complimentary mobile application.

This repository contains two codebases:

  1. ZhangScope Oximeter (C++ / Arduino)
  2. ZhangScope Application (Dart / Flutter)

Installation: Arduino

Requires PlatformIO (VSCode) and its prerequisites.

  • Clone this repository
    git clone https://github.com/razyoboy/ZhangScope.git
  • In PlatformIO Home, go to the Projects tab
  • Add Existing Project
  • Navigate to zhangscope-arduino
  • Open and Upload through PIO

Installation: Mobile Application

Currently, the application only supports Android, as iOS uses BLE technologies and are not backward compatible with Classic Bluetooth.


The prepackaged release contains both app bundle and APKs format.

  • Download the release package here
  • Deploy to your devices

Build from Source

Requires Flutter and its prerequisites.

  • Clone this repository
    git clone https://github.com/razyoboy/ZhangScope.git
  • Navigate to zhangscope-app-master through the terminal
  • Build the application
  • Deploy either through app bundle or APKs

Usage: Arduino


Once uploaded to the Arduino, assemble a circuit as shown below – this can be changed up to your standards and /or considerations. One imporant thing is that A4 and A5 must be the SCA and SCL port, respectively – and that the TX/RX of the Arduino and the Bluetooth Module must be connected properly.

Bigger version here

Part List

  • I2C 128×96 OLED Screen
  • MAX30102 Pulse Oximetry Sensor
  • Bluetooth HC-05 Module
  • NCP1400 Voltage Step-Up Module
  • Arduino Nano (Rev 3.0) (ISCP)
  • Generic On/Off Button
  • TP4056 Li/Po Charging Module
  • Li/Po-1000 mAh Battery

Note that these parts are interchangable, except for the MAX30102 and the Bluetooth HC-05 Module

Usage: Mobile Application

PSA: This application is extremely barebones, it can show the wireless information transfered from the bluetooth module to the application, which it will then tell the user a simple explaination of how to intepret the result, and thats really about it.


  • Enable Bluetooth on your device
  • Pair with the HC-05 module
  • Once paired, return back to the home page
  • Tap Record Now
  • Once done, tap back

Known Issues


  • HR data is extremely sensitive, thus it is ommited from the sensor
  • In rare occasions, the SpO2 data may be distorted due to dirt or oil residue at the user’s fingertip.
  • After prolonged usage, the buffer will be overflowed and it would stop working, to remedy this – it must be turned off and on again.


  • The Battery Level and Health DOES NOT work
  • The Menu button serves as a debug button to access a test recording page using a preset value
  • The Search Icon DOES NOT do anything meaningful
  • The code responsible for coding and storing SpO2 data is as some would say “archaic”, thus it may produce memory leaks after a prolonged usage (more than an hour per reading)


View Github