Source code for micropython_mmr902.mmr902

# SPDX-FileCopyrightText: Copyright (c) 2023 Jose D. Montoya
#
# SPDX-License-Identifier: MIT
"""
`mmr902`
================================================================================

MicroPython Driver fro the Mitsumi MMR902 Micro Pressure Sensor


* Author(s): Jose D. Montoya


"""
import time
from micropython import const


__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/jposada202020/MicroPython_MMR902.git"


MODE1 = const(0xA0)
MODE2 = const(0xA2)
MODE3 = const(0xA4)
MODE4 = const(0xA6)
operation_mode_values = (MODE1, MODE2, MODE3, MODE4)
_temp_waiting_values = {MODE1: 0.034, MODE2: 0.021, MODE3: 0.014, MODE4: 0.439}
_press_waiting_values = {MODE1: 0.016, MODE2: 0.08, MODE3: 0.004, MODE4: 0.256}


[docs] class MMR902: """Driver for the MMR902 Sensor connected over I2C. :param ~machine.I2C i2c: The I2C bus the MMR902 is connected to. :param int address: The I2C device address. Defaults to :const:`0x65` :raises RuntimeError: if the sensor is not found **Quickstart: Importing and using the device** Here is an example of using the :class:`MMR902` class. First you will need to import the libraries to use the sensor .. code-block:: python from machine import Pin, I2C from micropython_mmr902 import mmr902 Once this is done you can define your `machine.I2C` object and define your sensor object .. code-block:: python i2c = I2C(1, sda=Pin(2), scl=Pin(3)) mmr = mmr902.MMR902(i2c) Now you have access to the attributes .. code-block:: python temp = mmr.temperature """ def __init__(self, i2c, address: int = 0x65) -> None: self._i2c = i2c self._address = address self._temp_waiting = None self._press_waiting = None self.operation_mode = MODE1 @property def pressure(self) -> float: """ Pressure in mmHg """ data = bytearray(3) self._i2c.writeto(self._address, bytes([0xC0])) time.sleep(self._press_waiting) self._i2c.readfrom_into(self._address, data) result = data[0] << 16 | data[1] << 8 | data[2] return self._twos_comp(result, 24) / 1000.0 @property def temperature(self) -> float: """ Temperature in Celsius """ data = bytearray(3) self._i2c.writeto(self._address, bytes([0xC2])) time.sleep(self._temp_waiting) self._i2c.readfrom_into(self._address, data) result = data[0] << 16 | data[1] << 8 | data[2] return self._twos_comp(result, 24) / 2**16.0 @staticmethod def _twos_comp(val: int, bits: int) -> int: if val & (1 << (bits - 1)) != 0: return val - (1 << bits) return val @property def operation_mode(self) -> str: """ Sensor operation_mode +--------------------------+------------------+ | Mode | Value | +==========================+==================+ | :py:const:`mmr902.MODE1` | :py:const:`0XA0` | +--------------------------+------------------+ | :py:const:`mmr902.MODE2` | :py:const:`0XA2` | +--------------------------+------------------+ | :py:const:`mmr902.MODE3` | :py:const:`0XA4` | +--------------------------+------------------+ | :py:const:`mmr902.MODE4` | :py:const:`0XA6` | +--------------------------+------------------+ """ values = {MODE1: "MODE1", MODE2: "MODE2", MODE3: "MODE3", MODE4: "MODE4"} return values[self._command] @operation_mode.setter def operation_mode(self, value: int) -> None: if value not in operation_mode_values: raise ValueError("Value must be a valid operation_mode setting") self._command = value self._temp_waiting = _temp_waiting_values[value] self._press_waiting = _press_waiting_values[value] self._i2c.writeto(self._address, bytes([self._command]))