Skip to main content

Prekid spremnosti podataka

Što ovaj primjer prikazuje​

Očitavanje polja samo kada BMM350 javi da je spreman novi rezultat mjerenja. Senzor šalje impuls na pinu INT za svako novo očitanje, a vaš kontroler čita podatke kad primi impuls, umjesto da ih traži preko I2C-a.

Osim preko Qwiic konektora ili I2C pinova headera, spojite pin INT pločice na digitalni pin 2 na kontroleru ili u skici promijenite interruptPin na pin koji koristite. Pin mora podržavati prekide.

INT je signal od 1,8 V izravno sa senzora. Pin kontrolera mora očitati 1,8 V kao logičku jedinicu.

Primjer koda​

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");
}
}
}

Ovaj primjer koristi i attachInterrupt() i digitalPinToInterrupt() (Arduino referenca), koji dolaze s Arduino jezgrom i nisu dio biblioteke BMM350, kao ni Wire, Serial i delay(). delay() pauzira skicu na zadani broj milisekundi: delay(1000) čeka jednu sekundu između pokušaja povezivanja.

Očekivani rezultat, pri 115200 baud:

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

Nakon ova dva retka slijedi po jedan redak za svaki prekid: X:, Y: i Z:, svaki u uT s dvije decimale, odvojeni tabulatorima. begin() postavlja senzor na 100 Hz, pa je novo očitanje spremno otprilike svakih 10 ms.

Korištene funkcije​

Soldered_BMM350()returns Soldered_BMM350

Konstruktor. Stvara objekt senzora; ništa se ne šalje senzoru do poziva begin().

ReturnsObjekt senzora.

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

Inicijalizira senzor preko I2C-a, zatim postavlja izlaznu brzinu podataka od 100 Hz s usrednjavanjem 4 uzorka, uključuje osi X, Y i Z te pokreće normalni način rada.

ReturnsBMM350_OK (0) u slučaju uspjeha, inače kôd pogreške.

Parametri

TipNazivOpis
uint8_taddressI2C adresa. Zadano je 0x14; koristite 0x15 kada se JP5 premjesti.
TwoWire &wirePortI2C sabirnica koja se koristi. Zadano je Wire.
int8_t configureInterrupt(enum bmm350_intr_latch latching, enum bmm350_intr_polarity polarity, enum bmm350_intr_drive drive, bool mapToPin)returns int8_t

Konfigurira ponašanje pina INT senzora. Ne uključuje sam prekid; za to pozovite enableInterrupt().

ReturnsBMM350_OK (0) u slučaju uspjeha, inače kôd pogreške.

Parametri

TipNazivOpis
enum bmm350_intr_latchlatchingBMM350_PULSED ili BMM350_LATCHED.
enum bmm350_intr_polaritypolarityBMM350_ACTIVE_LOW ili BMM350_ACTIVE_HIGH.
enum bmm350_intr_drivedriveBMM350_INTR_OPEN_DRAIN ili BMM350_INTR_PUSH_PULL.
boolmapToPintrue za usmjeravanje prekida spremnosti podataka na pin INT, false za njegovo uklanjanje.
int8_t enableInterrupt(bool enable)returns int8_t

Uključuje ili isključuje prekid spremnosti podataka.

ReturnsBMM350_OK (0) u slučaju uspjeha, inače kôd pogreške.

Parametri

TipNazivOpis
boolenabletrue za uključivanje, false za isključivanje.
int8_t getSensorData()returns int8_t

Čita kompenzirane podatke magnetometra i temperature te ih sprema u članove magX, magY i magZ (µT) i člana temperature (°C).

ReturnsBMM350_OK (0) u slučaju uspjeha, inače kôd pogreške.

Sve zajedno​

configureInterrupt() postavlja INT kao impulsni push-pull izlaz s aktivnom visokom razinom i na njega usmjerava prekid spremnosti podataka, a enableInterrupt(true) uključuje prekid. attachInterrupt() zatim poziva bmm350InterruptHandler() na svakom rastućem bridu signala INT. Rukovatelj samo postavlja zastavicu; loop() uoči zastavicu, briše je i čita podatke pomoću getSensorData().