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.

Omron BP170N

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).

Omron BP170N PCB

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 at 0xBA, and so on till the last file that starts at 0x112.
  • 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.
  • 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 value 0x00:
       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 and 0x05 store the total measurement count in little endian. (This is duplicated in addresses 0x06-0x07.) This counter advances even if the measurement is bad. Bad measurements aren’t written to a file.

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 from 0x09 to 0x0A
  • the file starting at address 0x12A (corresponding to 0x0A) changed
  • the first 3 bytes of the file starting at 0x12A are 6f 45 36 which mean:
    • 0x6f: systolic pressure of 0x6f+25 = 136 mmHg
    • 0x45: diastolic pressure of 0x45 = 69 mmHg
    • 0x36: 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.