Zum Hauptinhalt springen

Data-Ready-Interrupt

Was dieses Beispiel zeigt​

Das Magnetfeld wird nur dann gelesen, wenn der BMM350 meldet, dass eine neue Messung bereitsteht. Der Sensor gibt bei jedem neuen Messwert einen Impuls auf seinem INT-Pin aus, und Ihr Board liest die Daten, sobald es den Impuls erkennt.

Das Beispiel erzeugt den I2C-Bus 0 mit SCL auf GPIO 9 und SDA auf GPIO 8 und erwartet den INT-Pin des Breakout auf GPIO 5 (INT_PIN). Ändern Sie diese Pins auf die Pins, die Sie verdrahtet haben.

INT ist ein 1,8-V-Signal direkt vom Sensor. Der Pin an Ihrem Board muss 1,8 V als logisch High lesen.

Der Beispielcode​

# FILE: bmm350-dataReadyInterrupt.py
# AUTHOR: Soldered Electronics
# BRIEF: Uses the BMM350's physical interrupt pin to know when a new
# magnetometer reading is ready, instead of polling the interrupt
# status register
# WORKS WITH: BMM350 Geomagnetic Sensor breakout: www.solde.red/333359
# LAST UPDATED: 2026-09-22

from bmm350 import BMM350, BMM350_OK, BMM350_PULSED, BMM350_ACTIVE_HIGH, BMM350_INTR_PUSH_PULL
from machine import I2C, Pin

# Hardware setup: connect the breakout board's INT pin to INT_PIN below
INT_PIN = 5

data_ready = False


def int_callback(pin):
global data_ready
data_ready = True


# Change these to match how your board wires I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8))
sensor = BMM350(i2c)

if sensor.status != BMM350_OK:
raise Exception("Failed to initialize BMM350: " + sensor.status_string())

print("BMM350 connected!")

# Configure the interrupt pin as push/pull, active high, pulsed and mapped
# to the physical pin
sensor.configure_interrupt(BMM350_PULSED, BMM350_ACTIVE_HIGH, BMM350_INTR_PUSH_PULL, True)

# Enable the data-ready interrupt
sensor.enable_interrupt(True)

interrupt_pin = Pin(INT_PIN, Pin.IN)
interrupt_pin.irq(trigger=Pin.IRQ_RISING, handler=int_callback)

while True:
if data_ready:
data_ready = False
status = sensor.get_interrupt_status()
if status:
if sensor.get_sensor_data() == BMM350_OK:
print(
"X: {:.2f} uT\tY: {:.2f} uT\tZ: {:.2f} uT".format(
sensor.data.mag_x, sensor.data.mag_y, sensor.data.mag_z
)
)
else:
print("Failed to read sensor data:", sensor.status_string())

🔗Vollständiges Beispiel öffnen

bmm350-dataReadyInterrupt.py bei Commit 0995e8d

→

Dieses Beispiel verwendet außerdem machine.I2C (MicroPython-Referenz) und machine.Pin mit Pin.irq() (MicroPython-Referenz), die zur MicroPython-Firmware gehören und nicht Teil des Moduls bmm350 sind.

Erwartetes Ergebnis: BMM350 connected!, danach eine Zeile für jeden Interrupt: X:, Y: und Z:, jeweils in uT mit zwei Dezimalstellen, durch Tabulatoren getrennt.

ShellMicroPython
BMM350 connected!
X: 12.47 uT Y: -23.81 uT Z: -38.92 uT
X: 12.52 uT Y: -23.74 uT Z: -38.85 uT
X: 12.39 uT Y: -23.90 uT Z: -39.03 uT
X: 12.58 uT Y: -23.69 uT Z: -38.88 uT

Verwendete Funktionen​

BMM350(i2c=None, address=BMM350_I2C_ADSEL_SET_LOW)returns BMM350

Konstruktor. Setzt den Sensor zurück, prüft seine Chip-ID, lädt seine Kalibrierdaten, stellt 100 Hz mit 4-fach-Mittelung ein, aktiviert alle Achsen und startet den Normalbetrieb. Löst eine Exception aus, wenn der Sensor nicht antwortet oder ein anderer Chip antwortet. Ohne ein i2c-Objekt verwendet er I2C(0, scl=Pin(22), sda=Pin(21)), wenn die Firmware sich als esp32, esp8266 oder als der eigene Firmware-Name eines Soldered-Boards meldet, und löst auf jedem anderen Board eine Exception aus.

ReturnsDas Sensorobjekt.

Parameter

TypNameBeschreibung
I2Ci2cEin initialisiertes machine.I2C-Objekt. Nur auf den Boards optional, die das Modul erkennt (siehe den Konstruktor oben).
intaddressI2C-Adresse. BMM350_I2C_ADSEL_SET_LOW (0x14, der Standardwert) oder BMM350_I2C_ADSEL_SET_HIGH (0x15).
configure_interrupt(latching, polarity, drive, map_to_pin)returns None

Konfiguriert das Verhalten des INT-Pins des Sensors. Der Interrupt selbst wird dadurch nicht aktiviert; rufen Sie dafür enable_interrupt() auf.

ReturnsDas Ergebnis wird in sensor.status gespeichert.

Parameter

TypNameBeschreibung
intlatchingBMM350_PULSED oder BMM350_LATCHED.
intpolarityBMM350_ACTIVE_LOW oder BMM350_ACTIVE_HIGH.
intdriveBMM350_INTR_OPEN_DRAIN oder BMM350_INTR_PUSH_PULL.
boolmap_to_pinTrue, um den Data-Ready-Interrupt auf den INT-Pin zu legen, False, um ihn zu entfernen.
enable_interrupt(enable)returns None

Aktiviert oder deaktiviert den Data-Ready-Interrupt.

ReturnsDas Ergebnis wird in sensor.status gespeichert.

Parameter

TypNameBeschreibung
boolenableTrue zum Aktivieren, False zum Deaktivieren.
get_interrupt_status()returns int

Liest den Status des Data-Ready-Interrupts.

Returns1, wenn neue Daten bereitstehen, 0, wenn nicht, None bei einem I2C-Fehler.

get_sensor_data()returns int

Liest eine neue kompensierte Messung in sensor.data.mag_x, sensor.data.mag_y und sensor.data.mag_z (µT) sowie sensor.data.temperature (°C).

ReturnsBMM350_OK (0) bei Erfolg, sonst ein Fehlercode.

status_string()returns str

Beschreibt den aktuellen Code von sensor.status.

ReturnsDie Beschreibung oder ein leerer String, wenn der Status BMM350_OK ist.

Zusammenspiel​

configure_interrupt() stellt INT als gepulsten, active-high, Push-Pull-Ausgang ein und legt den Data-Ready-Interrupt darauf, und enable_interrupt(True) schaltet den Interrupt ein. Pin.irq() ruft int_callback() bei jeder steigenden Flanke von INT auf, und der Callback setzt nur ein Flag. Die Schleife erkennt das Flag, prüft get_interrupt_status() und liest die Daten mit get_sensor_data().