Omron blood pressure monitor: reading the internal EEPROM
This note explains how to read the internal EEPROM of an Omron Upper Arm Blood Pressure Monitor 3 Series (model BP710N) to achieve interoperability. You’ll be able to read your blood pressure measurements with your own microcontroller.
Hardware #
This is the hardware we’re dealing with. It sells for about $40 on Amazon in the U.S. as of 2019. There are more expensive models from the same manufacturer that have Bluetooth connectivity. Here we are dealing with the simplest model: no Bluetooth, no WiFi, no USB.
PCB #
This is a picture of the main board. We can identify some components:
- the main Toshiba processor (IC1 in the picture) is in a LQFP64 package. Markings on the chip: 1904 HAL, T5DE 1UG, 916549. I couldn’t find any datasheet.
- the small IC on the right (IC5) is an 4-kbit I2C EEPROM (markings on the chip: 4G08 82753). This is a 3.3 V EEPROM and behaves like a 24C04.
The I2C bus for the EEPROM is conveniently exposed as two through-holes vias. This is annotated in the picture. It is very easy to solder this bus to your favorite microcontroller. Your extra microcontroller can drive the EEPROM (I2C is a multi-master bus).
High-level behavior #
After the unit completes measuring your blood pressure (which takes about a minute), the microcontroller stores the whole measurement into the EEPROM. This is done without any user interaction. The EEPROM memory is large enough to store the last 14 measurements.
EEPROM memory map #
This section provides the information necessary to achieve interoperability:
- The EEPROM is 512 bytes long and holds 14 files.
- Each file is 14 bytes long and stores a single measurement.
- The first file starts at offset
0xAC
, the second one starts at0xBA
, and so on till the last file that starts at0x112
. - Each file stores:
- 1 byte for the systolic pressure, stored as (measured_systolic_mmHg - 25). For example, a systolic pressure of 125 mmHg will be stored as
0x64
. (This encoding thus can represent values from 25 mmHg to 280 mmHG.) - 1 byte for the diastolic pressure in mmHg units. For example, a diastolic pressure of 80 mmHg will be stored as
0x50
. - 1 byte for the pulse measurement in BPM “units” (min^-1). For example, a pulse of 53 bpm will be stored as
0x35
. - 5 bytes that appear to be nearly constant. In my unit these are
0E 20 04 3F 10
. - 6 more bytes that I don’t understand what they do. The two last look pretty random / uniformly distributed and could be a CRC, although I didn’t dig deeper.
- 1 byte for the systolic pressure, stored as (measured_systolic_mmHg - 25). For example, a systolic pressure of 125 mmHg will be stored as
- There are other interesting addresses:
- Address
0x60
stores the “last measurement file index”. It is a pointer to the measurement that was last written to EEPROM. The mapping “pointer value → file offset” is pretty regular with an exception for the pointer value0x00
:
mem[addr=0x60] -> file offset ----------------------------- 0x01 -> 0xAC (0xAC + 14*0) 0x02 -> 0xBA (0xAC + 14*1) 0x03 -> 0xC8 (0xAC + 14*2) 0x04 -> 0xD6 (0xAC + 14*3) ... regular ... 0x0C -> 0x146 (0xAC + 14*11) 0x0D -> 0x154 (0xAC + 14*12) 0x00 -> 0x162 (0xAC + 14*13) // last one, NB: discontinuity!
- Address
0x04
and0x05
store the total measurement count in little endian. (This is duplicated in addresses0x06-0x07
.) This counter advances even if the measurement is bad. Bad measurements aren’t written to a file.
- Address
How to figure this out for yourself. The easiest is to dump the EEPROM contents before and after a measurement and study how the contents change. You can read this EEPROM with any 24C04 driver. I had success with https://github.com/nopnop2002/esp-idf-24c . The Toshiba microcontroller talks to the EEPROM at 320 kbit/s (but of course you can talk to it at a slower bitrate). For example, after a measurement the following EEPROM contents changed:
- the pointer to last measurement (stored at
0x60
) advanced from0x09
to0x0A
- the file starting at address
0x12A
(corresponding to0x0A
) changed - the first 3 bytes of the file starting at
0x12A
are6f 45 36
which mean:0x6f
: systolic pressure of 0x6f+25 = 136 mmHg0x45
: diastolic pressure of 0x45 = 69 mmHg0x36
: pulse of 54 bpm
- the contents at
0x04
advanced by one (total number of measurements).
Other references. The unit I have has the following markings: MODEL: BP710N, REF HEM-7121-Z. As of 2024 it looks like Omron is selling an updated model BP7100. I don’t know how the BP7100 looks like inside. Chances are that it is very similar.
Warning. You are on your own. Any modification will likely void your warranty. THE INSTRUCTIONS ARE PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE INSTRUCTIONS.