Introduction: Mini ICU Unit

Here is a device that can measure blood pressure, heart rate, oxygen level in blood, and body temperature. It consist of a remote unit, and a control unit. The control unit is a Raspberry Pi that triggers the measurement procedure on the remote unit, and then receives the measurement data to display it and store it in a .csv file. The remote unit is an Arduino that receives control commands from the control unit, then preform either a single measurement of all sensors, or monitor measurements for a specified time. The communication between both units is via Bluetooth.


  1. Raspberry Pi 3 Model B+.

  2. HDMI cable.Keyboard and Mouse.

  3. Raspbian OS latest version.

  4. Blueman for Raspberry Pi.

  5. Arduino Pro Mini 3.3V.

  6. Arduino IDE.

  7. MAX30100 Oximeter Module.

  8. MAX30100 Arduino library.

  9. GY-906 IR Temperature Sensor Module.

  10. Adafruit MLX90614 Arduino library.

  11. HC-05 Bluetooth Module.

  12. Wrest Blood Pressure Monitor.

  13. 2 X 1N4004 Diode.

  14. 2 X 4k7 resistors.

  15. 2N2222 Transistor.

  16. Li-Ion 18650 Battery.

  17. Li-Ion 18650 Battery Holder.

  18. 03962A Li-Ion 18650 Battery Charger.

  19. Test Board.

  20. Test Board wires.

  21. Soldering skills.

  22. Soldering tools and supplies.

Step 1: Understanding I2C Protocol

I2C Protocol is a multi device internal communication system. It's a half duplex system which means only one device should transmit data at a time. Aside from power supply lines, it uses only two lines which are SCL and SDA. In general, SCL line is nothing but a clock signal that govern the speed of data transmission. The SDA is the data line where devices transmit and receive data through according to the speed of SCL signal. Many devices can be connected to the same I2C line in a parallel manner (up to 128 devices in 7bit addressing system) but only one of them should be the master device at a time. Master device is the device that transmits the SCL signal ( controls the speed of the line) and sends instruction to the rest of the devices (remote devices).

You may read more about it on: BASICS OF THE I2C COMMUNICATION PROTOCOL .

Step 2: Choosing the Right Wrest Blood Pressure Monitor

This part is a little tricky, but not hard.

Find a cheep simple Wrest Blood Pressure Monitor that stores data in an I2C EEPROM. These kinds of devices usually consists of :

  • an MCU.
  • an air pump.
  • an air valve.
  • an I2C EEPROM
  • an LCD display.
  • a start button and maybe other

Mainly, we are concerned about the:

  • I2C EEPROM pins.
  • The valve control pin.
  • The start button control pin.

Now let's reengineer it!!

  1. Unscrew the device. Careful not to cut any wires!!
  2. Locate the EEPROM.
  3. Determine it's pinouts by reading it's datasheet.
  4. Locate the valve's control pin.
  5. Locate the start button pin.

The start button and the valve are usually active low, so make sure if they are or not.

* You may find a detailed YouTube tutorial playlist in the resources about how to do it.

Step 3: Preform Necessary Fixes

Make sure that you didn't receive a MAX30100 with design problems. You can follow this tutorial to confirm or fix the one you got.

Step 4: Soldering Pins

  1. Start by soldering the pins of the Arduino, MAX30100, and the GY-906. and put them aside.
  2. In the Blood Pressure Monitor, solder wires on the SDA and SCL pins of the EEPROM.
  3. Also, solder wires on the valve pin and the start pin.
  4. Solder wires on the battery pins of the Blood Pressure Monitor ( the + and - ).
  5. Make sure you connected the right pins of the start button and the valve by shorting each pin to ground if they are active low.
  6. Label all wires so you wont forget which one is which.

Step 5: Wiring on the Test Board

Connect all components on the test board according to the schematic. Notice that it's assumed start pin and valve pin are active low in this schematic.

Some remarks in the design:

  1. R1 and R2 are pull-up resistors for the I2C bus as we removed the ones on the MAX30100 board.
  2. D1 and D2 are used to block the acknowledgement of the Arduino from reaching the MCU of the Blood Pressure Monitor.
  3. Make sure you don't connect the negative side of the battery with the ground signal of the circuit. just connect it to it's corresponding pins on the charger board.
  4. When you place the Arduino on the test board, make sure that A4 and A5 are not shorted with any other Arduino pins, as they are located behind A2, A3, and VCC.
  5. Make sure to connect all ground pins ( labeled "GND") together.

Step 6: Arduino Code

Code Summary:

Looking at Void loop() :

  1. The code will start by waiting for serial commands which are going to be received via Bluetooth.
  2. If the received command was "sao", the measure all command will be preformed.

Measure All Command:

First, body temperature will be measured and stored. Then, Oxygen level and Heart rate will be measured repeatedly until valid measurements are read and stored. After that, the collected data will be sent on serial. Following that, the blood pressure will measured, and the measurements will be sent over serial. Lastly, a new line character will be sent on serial to indicate the end of the data line.

3. If the received command was "mon", the monitor command will be preformed.

Monitor Command:

In this section, the temperature, Oxygen level ,and Heart rate will be repeatedly measured and sent over serial followed by a new line character to indicate the end of the data line. In the same time, it will wait for serial commands to either to start the blood pressure measurement and it's data transmission ("BP"), or to stop the monitoring procedure ("close").

Step 7: Raspberry Pi Python Code

Code Summary:

The code is a GUI made with Tkinter in Python3, and instructions to analyze data, display them in the GUI, and store them in a csv file format.

When the user presses on the Measure All button, "sao" command will be sent to Arduino. Then, it stores received serial data until it reaches a new line character. The data is then splatted by the indication of a comma sign ( , ). After that, data are displayed on the GUI and stored in the csv file according to their related index.

If the user wants to use the monitoring feature, a specified time and number of blood pressure measurements should be mentioned and the sec and BP buttons should be pressed to initialize the procedure. After that, the Monitor button should be pressed.

When the user presses on the Monitor button, "mao" command will be sent on serial, and the specified time will start counting. The received data will be updated on the GUI and stored in the csv file as soon as the data splitting ends, until the blood pressure measurement interval is reached. A "BP" command will be sent over serial to start the blood pressure measurement. When the measurement data arrive, it will be spilt , displayed on the GUI, and stored in the csv file. This procedure will keep repeating until the time is up, and that's when a "close" command will be sent on serial.

Step 8: PCB and Schematic in Eagle Cad

Step 9: Running

Step 10: Resources:

Here are all the resources we used for more details:

1- Max30100 pulse Oximeter Arduino Code, circuit, How to measure Blood Oxygen & Heart rate BPM:

2- #316 Pulse Oximeter test, function, and usage:


4- Using the Pulse Oximeter. Tutorial 2 – Advanced

5- COVID-19: Pulse oximeters in the spotlight. by: Frederic Michard,corresponding author, Kirk Shelley, and Erwan L’Her.

6- I2C with Arduino and Raspberry Pi - Two Methods.

7- Arduino + GY-906 MLX90614 | Non-Contact Temperature Sensor GY-906 MLX90614 with Arduino Uno


8- Arduino Bluetooth Basic Tutorial

9- Pulse Oximeter MAX30100/MAX30102 – how to fix wrong board

10- Interfacing MAX30100 Pulse Oximeter Sensor with Arduino

11- BASICS OF THE I2C COMMUNICATION PROTOCOL,always%20controlled%20by%20the%20master.

12- Multiple IR Temperature Sensors - MLX90614

13- How to Use the MAX30100 as Arduino Heart Rate Sensor

14- Implementing pulse oximeter using MAX30100

15- GY-906 MLX90614 Non-Contact Precision Thermometer Module

16- Blood Pressure Monitor By: LunesCuatro

17- I2C non-intrusive slave monitoring an existing address.

18- How To Build Custom Android App for your Arduino Project using MIT App Inventor

19- How to Install 3.5 Inch LCD on Raspberry Pi - Super Easy Way (In 3 Minutes) TricK i Know