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.
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 BMM350Konstruktor. 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
| Typ | Name | Beschreibung |
|---|---|---|
I2C | i2c | Ein initialisiertes machine.I2C-Objekt. Nur auf den Boards optional, die das Modul erkennt (siehe den Konstruktor oben). |
int | address | I2C-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 NoneKonfiguriert 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
| Typ | Name | Beschreibung |
|---|---|---|
int | latching | BMM350_PULSED oder BMM350_LATCHED. |
int | polarity | BMM350_ACTIVE_LOW oder BMM350_ACTIVE_HIGH. |
int | drive | BMM350_INTR_OPEN_DRAIN oder BMM350_INTR_PUSH_PULL. |
bool | map_to_pin | True, um den Data-Ready-Interrupt auf den INT-Pin zu legen, False, um ihn zu entfernen. |
enable_interrupt(enable)returns NoneAktiviert oder deaktiviert den Data-Ready-Interrupt.
ReturnsDas Ergebnis wird in sensor.status gespeichert.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
bool | enable | True zum Aktivieren, False zum Deaktivieren. |
get_interrupt_status()returns intLiest den Status des Data-Ready-Interrupts.
Returns1, wenn neue Daten bereitstehen, 0, wenn nicht, None bei einem I2C-Fehler.
get_sensor_data()returns intLiest 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 strBeschreibt 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().