Zum Hauptinhalt springen

Interrupt bei bereitgestellten Daten

Was dieses Beispiel zeigt​

Das Feld 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 Controller liest die Daten, sobald er den Impuls erkennt, anstatt per I2C nachzufragen.

Verbinden Sie neben Qwiic oder den I2C-Header-Pins den INT-Pin des Breakout mit dem digitalen Pin 2 Ihres Controllers, oder ändern Sie interruptPin im Sketch auf den Pin, den Sie verwenden. Der Pin muss Interrupts unterstützen.

INT ist ein 1,8-V-Signal direkt vom Sensor. Der Pin des Controllers muss 1,8 V als logisch High erkennen.

Der Beispielcode​

Select Board
dataReadyInterrupt.ino
/**
**************************************************
*
* @file dataReadyInterrupt.ino
*
* @brief Example showing how to use the BMM350's physical interrupt
* pin to know when a new magnetometer reading is ready,
* instead of polling the interrupt status register
*
* @link solde.red/333359 : Soldered BMM350 Geomagnetic Sensor breakout
*
* @authors Soldered Electronics
***************************************************/
#include <BMM350-SOLDERED.h>

// Create an instance of the BMM350 sensor
Soldered_BMM350 magSensor;

// Pin connected to the sensor's INT pin, change to match your wiring
int interruptPin = 2;

// Flag to know when an interrupt occurs
volatile bool interruptOccurred = false;

void bmm350InterruptHandler()
{
interruptOccurred = true;
}

void setup()
{
// Initialize serial for output
Serial.begin(115200);
Serial.println("BMM350 Example - Data Ready Interrupt");

// Initialize I2C bus
Wire.begin();

// Check if sensor is connected and initialize it.
// Address is optional, defaults to 0x14 (ADSEL tied low on this breakout)
while (magSensor.begin() != BMM350_OK)
{
Serial.println("Error: BMM350 not connected, check wiring and I2C address!");
delay(1000);
}

Serial.println("BMM350 connected!");

// Configure the interrupt pin as push/pull, active high, pulsed and
// mapped to the physical pin
magSensor.configureInterrupt(BMM350_PULSED, BMM350_ACTIVE_HIGH, BMM350_INTR_PUSH_PULL, true);

// Enable the data-ready interrupt
magSensor.enableInterrupt(true);

// Attach the interrupt handler to the microcontroller pin wired to INT
attachInterrupt(digitalPinToInterrupt(interruptPin), bmm350InterruptHandler, RISING);
}

void loop()
{
if (interruptOccurred)
{
interruptOccurred = false;

if (magSensor.getSensorData() == BMM350_OK)
{
Serial.print("X: ");
Serial.print(magSensor.magX, 2);
Serial.print(" uT\t");
Serial.print("Y: ");
Serial.print(magSensor.magY, 2);
Serial.print(" uT\t");
Serial.print("Z: ");
Serial.print(magSensor.magZ, 2);
Serial.println(" uT");
}
}
}

Dieses Beispiel verwendet außerdem attachInterrupt() und digitalPinToInterrupt() (Arduino-Referenz), die zum Arduino-Core gehören und nicht Teil der BMM350-Bibliothek sind, ebenso wie Wire, Serial und delay(). delay() hält den Sketch für die angegebene Anzahl an Millisekunden an: delay(1000) wartet eine Sekunde zwischen den Verbindungsversuchen.

Erwartetes Ergebnis bei 115200 Baud:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
BMM350 Example - Data Ready Interrupt
BMM350 connected!

Nach diesen beiden Zeilen folgt bei jedem Interrupt eine Zeile: X:, Y: und Z:, jeweils in uT mit zwei Nachkommastellen, durch Tabulatoren getrennt. begin() stellt den Sensor auf 100 Hz ein, sodass etwa alle 10 ms ein neuer Messwert bereitsteht.

Verwendete Funktionen​

Soldered_BMM350()returns Soldered_BMM350

Konstruktor. Erstellt das Sensorobjekt; bis zum Aufruf von begin() wird nichts an den Sensor gesendet.

ReturnsDas Sensorobjekt.

int8_t begin(uint8_t address = 0x14, TwoWire &wirePort = Wire)returns int8_t

Initialisiert den Sensor über I2C, stellt dann eine Ausgabedatenrate von 100 Hz mit 4-fach-Mittelung ein, aktiviert die X-, Y- und Z-Achse und startet den Normalbetrieb.

ReturnsBMM350_OK (0) bei Erfolg, andernfalls ein Fehlercode.

Parameter

TypNameBeschreibung
uint8_taddressI2C-Adresse. Standardmäßig 0x14; verwenden Sie 0x15, wenn JP5 umgesetzt wird.
TwoWire &wirePortZu verwendender I2C-Bus. Standardmäßig Wire.
int8_t configureInterrupt(enum bmm350_intr_latch latching, enum bmm350_intr_polarity polarity, enum bmm350_intr_drive drive, bool mapToPin)returns int8_t

Konfiguriert das Verhalten des INT-Pins des Sensors. Der Interrupt selbst wird dadurch nicht aktiviert; rufen Sie dazu enableInterrupt() auf.

ReturnsBMM350_OK (0) bei Erfolg, andernfalls ein Fehlercode.

Parameter

TypNameBeschreibung
enum bmm350_intr_latchlatchingBMM350_PULSED oder BMM350_LATCHED.
enum bmm350_intr_polaritypolarityBMM350_ACTIVE_LOW oder BMM350_ACTIVE_HIGH.
enum bmm350_intr_drivedriveBMM350_INTR_OPEN_DRAIN oder BMM350_INTR_PUSH_PULL.
boolmapToPintrue, um den Data-Ready-Interrupt auf den INT-Pin zu leiten, false, um ihn zu entfernen.
int8_t enableInterrupt(bool enable)returns int8_t

Aktiviert oder deaktiviert den Data-Ready-Interrupt.

ReturnsBMM350_OK (0) bei Erfolg, andernfalls ein Fehlercode.

Parameter

TypNameBeschreibung
boolenabletrue zum Aktivieren, false zum Deaktivieren.
int8_t getSensorData()returns int8_t

Liest kompensierte Magnetometer- und Temperaturdaten und speichert sie in den Membern magX, magY und magZ (µT) sowie im Member temperature (°C).

ReturnsBMM350_OK (0) bei Erfolg, andernfalls ein Fehlercode.

Zusammenfassung​

configureInterrupt() stellt INT als gepulsten, High-aktiven Push-Pull-Ausgang ein und leitet den Data-Ready-Interrupt darauf, und enableInterrupt(true) schaltet den Interrupt ein. attachInterrupt() ruft dann bei jeder steigenden Flanke von INT bmm350InterruptHandler() auf. Der Handler setzt nur ein Flag; loop() erkennt das Flag, setzt es zurück und liest die Daten mit getSensorData().