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
/**
**************************************************
*
* @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:
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_BMM350Konstruktor. 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_tInitialisiert 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
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | address | I2C-Adresse. Standardmäßig 0x14; verwenden Sie 0x15, wenn JP5 umgesetzt wird. |
TwoWire & | wirePort | Zu 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_tKonfiguriert 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
| Typ | Name | Beschreibung |
|---|---|---|
enum bmm350_intr_latch | latching | BMM350_PULSED oder BMM350_LATCHED. |
enum bmm350_intr_polarity | polarity | BMM350_ACTIVE_LOW oder BMM350_ACTIVE_HIGH. |
enum bmm350_intr_drive | drive | BMM350_INTR_OPEN_DRAIN oder BMM350_INTR_PUSH_PULL. |
bool | mapToPin | true, um den Data-Ready-Interrupt auf den INT-Pin zu leiten, false, um ihn zu entfernen. |
int8_t enableInterrupt(bool enable)returns int8_tAktiviert oder deaktiviert den Data-Ready-Interrupt.
ReturnsBMM350_OK (0) bei Erfolg, andernfalls ein Fehlercode.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
bool | enable | true zum Aktivieren, false zum Deaktivieren. |
int8_t getSensorData()returns int8_tLiest 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().