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.
Raspberry Pi 3 Model B+.
HDMI cable.Keyboard and Mouse.
Raspbian OS latest version.
Blueman for Raspberry Pi.
Arduino Pro Mini 3.3V.
MAX30100 Oximeter Module.
MAX30100 Arduino library.
GY-906 IR Temperature Sensor Module.
Adafruit MLX90614 Arduino library.
HC-05 Bluetooth Module.
Wrest Blood Pressure Monitor.
2 X 1N4004 Diode.
2 X 4k7 resistors.
Li-Ion 18650 Battery.
Li-Ion 18650 Battery Holder.
03962A Li-Ion 18650 Battery Charger.
Test Board wires.
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!!
- Unscrew the device. Careful not to cut any wires!!
- Locate the EEPROM.
- Determine it's pinouts by reading it's datasheet.
- Locate the valve's control pin.
- 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
- Start by soldering the pins of the Arduino, MAX30100, and the GY-906. and put them aside.
- In the Blood Pressure Monitor, solder wires on the SDA and SCL pins of the EEPROM.
- Also, solder wires on the valve pin and the start pin.
- Solder wires on the battery pins of the Blood Pressure Monitor ( the + and - ).
- 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.
- 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:
- R1 and R2 are pull-up resistors for the I2C bus as we removed the ones on the MAX30100 board.
- D1 and D2 are used to block the acknowledgement of the Arduino from reaching the MCU of the Blood Pressure Monitor.
- 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.
- 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.
- Make sure to connect all ground pins ( labeled "GND") together.
Step 6: Arduino Code
Looking at Void loop() :
- The code will start by waiting for serial commands which are going to be received via Bluetooth.
- 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.
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
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:
3- ARDUINO BLOOD PRESSURE COMPLETE VIDEO SERIES PLAYLIST
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
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