Compare commits

...

10 commits

Author SHA1 Message Date
Tyeth Gundry
61c0ece5b9
Update library.properties - 1.0.1
Some checks failed
Arduino Library CI / build (push) Has been cancelled
2025-08-12 10:52:42 +01:00
Liz
1c85f28cb3
add doxygen badge 2025-08-11 09:23:29 -04:00
Liz
d9e101fdff
Merge pull request #1 from ddtdanilo/fix/readme-product-link
Fix broken product link in README
2025-08-07 09:50:26 -04:00
Liz
54225f74ef add image for link 2025-08-07 09:38:35 -04:00
ddtdanilo
5aaacc7cc5 fix: use Adafruit CDN for product image
Replace local asset reference with official product image from
Adafruit CDN (https://cdn-shop.adafruit.com/970x728/6388-00.jpg)
2025-08-05 15:47:51 -05:00
ddtdanilo
5d0e82c941 fix: correct product link in README to QMC5883P page
The image link was pointing to /products/ which returns 404.
Updated to correct product page /product/6388
2025-08-05 15:43:37 -05:00
Limor Fried
dcbdcef41c Add library.properties with Adafruit BusIO dependency
Some checks failed
Arduino Library CI / build (push) Has been cancelled
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-05 15:19:47 -04:00
Limor Fried
53884e9eb4 Apply clang-format to all source files
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-05 15:17:15 -04:00
ladyada
36f04e4e4b wierd files 2025-07-20 23:01:32 -04:00
Limor "Ladyada" Fried
4c36569e86
Delete QMC5883P.pdf:Zone.Identifier 2025-07-20 23:01:00 -04:00
12 changed files with 190 additions and 140 deletions

0
.clang-format Normal file → Executable file
View file

0
.github/workflows/githubci.yml vendored Normal file → Executable file
View file

0
.gitignore vendored Normal file → Executable file
View file

151
Adafruit_QMC5883P.cpp Normal file → Executable file
View file

@ -29,7 +29,9 @@
/*!
* @brief Instantiates a new QMC5883P class
*/
Adafruit_QMC5883P::Adafruit_QMC5883P(void) { i2c_dev = NULL; }
Adafruit_QMC5883P::Adafruit_QMC5883P(void) {
i2c_dev = NULL;
}
/*!
* @brief Cleans up the QMC5883P
@ -48,7 +50,7 @@ Adafruit_QMC5883P::~Adafruit_QMC5883P(void) {
* The Wire object to be used for I2C connections.
* @return True if initialization was successful, otherwise false.
*/
bool Adafruit_QMC5883P::begin(uint8_t i2c_addr, TwoWire *wire) {
bool Adafruit_QMC5883P::begin(uint8_t i2c_addr, TwoWire* wire) {
if (i2c_dev) {
delete i2c_dev;
}
@ -60,7 +62,8 @@ bool Adafruit_QMC5883P::begin(uint8_t i2c_addr, TwoWire *wire) {
}
// Check chip ID
Adafruit_BusIO_Register chip_id_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CHIPID);
Adafruit_BusIO_Register chip_id_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CHIPID);
uint8_t chip_id = chip_id_reg.read();
if (chip_id != 0x80) {
return false;
@ -79,20 +82,21 @@ bool Adafruit_QMC5883P::begin(uint8_t i2c_addr, TwoWire *wire) {
* Pointer to store Z-axis raw data (2's complement)
* @return True if read was successful, otherwise false.
*/
bool Adafruit_QMC5883P::getRawMagnetic(int16_t *x, int16_t *y, int16_t *z) {
bool Adafruit_QMC5883P::getRawMagnetic(int16_t* x, int16_t* y, int16_t* z) {
uint8_t buffer[6];
// Read all 6 bytes (X,Y,Z LSB+MSB) starting from X LSB register
Adafruit_BusIO_Register data_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_XOUT_LSB, 6);
Adafruit_BusIO_Register data_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_XOUT_LSB, 6);
if (!data_reg.read(buffer, 6)) {
return false;
}
// Combine LSB and MSB for each axis (2's complement)
*x = (int16_t)((buffer[1] << 8) | buffer[0]); // X = MSB[1] | LSB[0]
*y = (int16_t)((buffer[3] << 8) | buffer[2]); // Y = MSB[3] | LSB[2]
*z = (int16_t)((buffer[5] << 8) | buffer[4]); // Z = MSB[5] | LSB[4]
*x = (int16_t)((buffer[1] << 8) | buffer[0]); // X = MSB[1] | LSB[0]
*y = (int16_t)((buffer[3] << 8) | buffer[2]); // Y = MSB[3] | LSB[2]
*z = (int16_t)((buffer[5] << 8) | buffer[4]); // Z = MSB[5] | LSB[4]
return true;
}
@ -106,19 +110,19 @@ bool Adafruit_QMC5883P::getRawMagnetic(int16_t *x, int16_t *y, int16_t *z) {
* Pointer to store Z-axis field in Gauss
* @return True if read was successful, otherwise false.
*/
bool Adafruit_QMC5883P::getGaussField(float *x, float *y, float *z) {
bool Adafruit_QMC5883P::getGaussField(float* x, float* y, float* z) {
int16_t raw_x, raw_y, raw_z;
// Get raw magnetic data
if (!getRawMagnetic(&raw_x, &raw_y, &raw_z)) {
return false;
}
// Get current range to determine conversion factor
qmc5883p_range_t range = getRange();
float lsb_per_gauss;
switch(range) {
switch (range) {
case QMC5883P_RANGE_30G:
lsb_per_gauss = 1000.0;
break;
@ -134,12 +138,12 @@ bool Adafruit_QMC5883P::getGaussField(float *x, float *y, float *z) {
default:
return false;
}
// Convert to Gauss
*x = (float)raw_x / lsb_per_gauss;
*y = (float)raw_y / lsb_per_gauss;
*z = (float)raw_z / lsb_per_gauss;
return true;
}
@ -148,8 +152,10 @@ bool Adafruit_QMC5883P::getGaussField(float *x, float *y, float *z) {
* @return True if new data is ready, false otherwise
*/
bool Adafruit_QMC5883P::isDataReady() {
Adafruit_BusIO_Register status_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_STATUS);
Adafruit_BusIO_RegisterBits drdy_bit = Adafruit_BusIO_RegisterBits(&status_reg, 1, 0);
Adafruit_BusIO_Register status_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_STATUS);
Adafruit_BusIO_RegisterBits drdy_bit =
Adafruit_BusIO_RegisterBits(&status_reg, 1, 0);
return drdy_bit.read();
}
@ -158,8 +164,10 @@ bool Adafruit_QMC5883P::isDataReady() {
* @return True if overflow occurred, false otherwise
*/
bool Adafruit_QMC5883P::isOverflow() {
Adafruit_BusIO_Register status_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_STATUS);
Adafruit_BusIO_RegisterBits ovfl_bit = Adafruit_BusIO_RegisterBits(&status_reg, 1, 1);
Adafruit_BusIO_Register status_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_STATUS);
Adafruit_BusIO_RegisterBits ovfl_bit =
Adafruit_BusIO_RegisterBits(&status_reg, 1, 1);
return ovfl_bit.read();
}
@ -169,8 +177,10 @@ bool Adafruit_QMC5883P::isOverflow() {
* The operating mode to set
*/
void Adafruit_QMC5883P::setMode(qmc5883p_mode_t mode) {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits mode_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 0);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits mode_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 0);
mode_bits.write(mode);
}
@ -179,8 +189,10 @@ void Adafruit_QMC5883P::setMode(qmc5883p_mode_t mode) {
* @return The current operating mode
*/
qmc5883p_mode_t Adafruit_QMC5883P::getMode() {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits mode_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 0);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits mode_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 0);
return (qmc5883p_mode_t)mode_bits.read();
}
@ -190,8 +202,10 @@ qmc5883p_mode_t Adafruit_QMC5883P::getMode() {
* The output data rate to set
*/
void Adafruit_QMC5883P::setODR(qmc5883p_odr_t odr) {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits odr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 2);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits odr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 2);
odr_bits.write(odr);
}
@ -200,8 +214,10 @@ void Adafruit_QMC5883P::setODR(qmc5883p_odr_t odr) {
* @return The current output data rate
*/
qmc5883p_odr_t Adafruit_QMC5883P::getODR() {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits odr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 2);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits odr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 2);
return (qmc5883p_odr_t)odr_bits.read();
}
@ -211,8 +227,10 @@ qmc5883p_odr_t Adafruit_QMC5883P::getODR() {
* The over sample ratio to set
*/
void Adafruit_QMC5883P::setOSR(qmc5883p_osr_t osr) {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits osr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 4);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits osr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 4);
osr_bits.write(osr);
}
@ -221,8 +239,10 @@ void Adafruit_QMC5883P::setOSR(qmc5883p_osr_t osr) {
* @return The current over sample ratio
*/
qmc5883p_osr_t Adafruit_QMC5883P::getOSR() {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits osr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 4);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits osr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 4);
return (qmc5883p_osr_t)osr_bits.read();
}
@ -232,8 +252,10 @@ qmc5883p_osr_t Adafruit_QMC5883P::getOSR() {
* The downsample ratio to set
*/
void Adafruit_QMC5883P::setDSR(qmc5883p_dsr_t dsr) {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits dsr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 6);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits dsr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 6);
dsr_bits.write(dsr);
}
@ -242,8 +264,10 @@ void Adafruit_QMC5883P::setDSR(qmc5883p_dsr_t dsr) {
* @return The current downsample ratio
*/
qmc5883p_dsr_t Adafruit_QMC5883P::getDSR() {
Adafruit_BusIO_Register ctrl1_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits dsr_bits = Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 6);
Adafruit_BusIO_Register ctrl1_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL1);
Adafruit_BusIO_RegisterBits dsr_bits =
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 2, 6);
return (qmc5883p_dsr_t)dsr_bits.read();
}
@ -252,17 +276,20 @@ qmc5883p_dsr_t Adafruit_QMC5883P::getDSR() {
* @return True if reset was successful, false otherwise
*/
bool Adafruit_QMC5883P::softReset() {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits reset_bit = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 7);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits reset_bit =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 7);
// Set reset bit
reset_bit.write(1);
// Wait for reset to complete (datasheet doesn't specify time, use 50ms)
delay(50);
// Check if chip ID is still valid after reset
Adafruit_BusIO_Register chip_id_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CHIPID);
Adafruit_BusIO_Register chip_id_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CHIPID);
uint8_t chip_id = chip_id_reg.read();
return (chip_id == 0x80);
}
@ -272,15 +299,17 @@ bool Adafruit_QMC5883P::softReset() {
* @return True if self-test passed, false otherwise
*/
bool Adafruit_QMC5883P::selfTest() {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits test_bit = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 6);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits test_bit =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 6);
// Set self-test bit
test_bit.write(1);
// Wait for self-test to complete (datasheet suggests 5ms)
delay(5);
// Check if self-test bit auto-cleared (indicates completion)
uint8_t test_status = test_bit.read();
return (test_status == 0);
@ -292,8 +321,10 @@ bool Adafruit_QMC5883P::selfTest() {
* The magnetic field range to set
*/
void Adafruit_QMC5883P::setRange(qmc5883p_range_t range) {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits range_bits = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 2);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits range_bits =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 2);
range_bits.write(range);
}
@ -302,8 +333,10 @@ void Adafruit_QMC5883P::setRange(qmc5883p_range_t range) {
* @return The current magnetic field range
*/
qmc5883p_range_t Adafruit_QMC5883P::getRange() {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits range_bits = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 2);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits range_bits =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 2);
return (qmc5883p_range_t)range_bits.read();
}
@ -313,8 +346,10 @@ qmc5883p_range_t Adafruit_QMC5883P::getRange() {
* The set/reset mode to set
*/
void Adafruit_QMC5883P::setSetResetMode(qmc5883p_setreset_t mode) {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits setreset_bits = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 0);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits setreset_bits =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 0);
setreset_bits.write(mode);
}
@ -323,7 +358,9 @@ void Adafruit_QMC5883P::setSetResetMode(qmc5883p_setreset_t mode) {
* @return The current set/reset mode
*/
qmc5883p_setreset_t Adafruit_QMC5883P::getSetResetMode() {
Adafruit_BusIO_Register ctrl2_reg = Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits setreset_bits = Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 0);
Adafruit_BusIO_Register ctrl2_reg =
Adafruit_BusIO_Register(i2c_dev, QMC5883P_REG_CONTROL2);
Adafruit_BusIO_RegisterBits setreset_bits =
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 2, 0);
return (qmc5883p_setreset_t)setreset_bits.read();
}

79
Adafruit_QMC5883P.h Normal file → Executable file
View file

@ -19,10 +19,11 @@
#ifndef _ADAFRUIT_QMC5883P_H_
#define _ADAFRUIT_QMC5883P_H_
#include "Arduino.h"
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include "Arduino.h"
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
@ -32,16 +33,16 @@
/*=========================================================================
REGISTERS
-----------------------------------------------------------------------*/
#define QMC5883P_REG_CHIPID 0x00 ///< Chip ID register
#define QMC5883P_REG_XOUT_LSB 0x01 ///< X-axis output LSB register
#define QMC5883P_REG_XOUT_MSB 0x02 ///< X-axis output MSB register
#define QMC5883P_REG_YOUT_LSB 0x03 ///< Y-axis output LSB register
#define QMC5883P_REG_YOUT_MSB 0x04 ///< Y-axis output MSB register
#define QMC5883P_REG_ZOUT_LSB 0x05 ///< Z-axis output LSB register
#define QMC5883P_REG_ZOUT_MSB 0x06 ///< Z-axis output MSB register
#define QMC5883P_REG_STATUS 0x09 ///< Status register
#define QMC5883P_REG_CONTROL1 0x0A ///< Control register 1
#define QMC5883P_REG_CONTROL2 0x0B ///< Control register 2
#define QMC5883P_REG_CHIPID 0x00 ///< Chip ID register
#define QMC5883P_REG_XOUT_LSB 0x01 ///< X-axis output LSB register
#define QMC5883P_REG_XOUT_MSB 0x02 ///< X-axis output MSB register
#define QMC5883P_REG_YOUT_LSB 0x03 ///< Y-axis output LSB register
#define QMC5883P_REG_YOUT_MSB 0x04 ///< Y-axis output MSB register
#define QMC5883P_REG_ZOUT_LSB 0x05 ///< Z-axis output LSB register
#define QMC5883P_REG_ZOUT_MSB 0x06 ///< Z-axis output MSB register
#define QMC5883P_REG_STATUS 0x09 ///< Status register
#define QMC5883P_REG_CONTROL1 0x0A ///< Control register 1
#define QMC5883P_REG_CONTROL2 0x0B ///< Control register 2
/*=========================================================================*/
/*=========================================================================
@ -51,40 +52,40 @@
* @brief Operating mode options
*/
typedef enum {
QMC5883P_MODE_SUSPEND = 0x00, ///< Suspend mode
QMC5883P_MODE_NORMAL = 0x01, ///< Normal mode
QMC5883P_MODE_SINGLE = 0x02, ///< Single measurement mode
QMC5883P_MODE_CONTINUOUS = 0x03 ///< Continuous mode
QMC5883P_MODE_SUSPEND = 0x00, ///< Suspend mode
QMC5883P_MODE_NORMAL = 0x01, ///< Normal mode
QMC5883P_MODE_SINGLE = 0x02, ///< Single measurement mode
QMC5883P_MODE_CONTINUOUS = 0x03 ///< Continuous mode
} qmc5883p_mode_t;
/*!
* @brief Output data rate options
*/
typedef enum {
QMC5883P_ODR_10HZ = 0x00, ///< 10 Hz output data rate
QMC5883P_ODR_50HZ = 0x01, ///< 50 Hz output data rate
QMC5883P_ODR_100HZ = 0x02, ///< 100 Hz output data rate
QMC5883P_ODR_200HZ = 0x03 ///< 200 Hz output data rate
QMC5883P_ODR_10HZ = 0x00, ///< 10 Hz output data rate
QMC5883P_ODR_50HZ = 0x01, ///< 50 Hz output data rate
QMC5883P_ODR_100HZ = 0x02, ///< 100 Hz output data rate
QMC5883P_ODR_200HZ = 0x03 ///< 200 Hz output data rate
} qmc5883p_odr_t;
/*!
* @brief Over sample ratio options
*/
typedef enum {
QMC5883P_OSR_8 = 0x00, ///< Over sample ratio = 8
QMC5883P_OSR_4 = 0x01, ///< Over sample ratio = 4
QMC5883P_OSR_2 = 0x02, ///< Over sample ratio = 2
QMC5883P_OSR_1 = 0x03 ///< Over sample ratio = 1
QMC5883P_OSR_8 = 0x00, ///< Over sample ratio = 8
QMC5883P_OSR_4 = 0x01, ///< Over sample ratio = 4
QMC5883P_OSR_2 = 0x02, ///< Over sample ratio = 2
QMC5883P_OSR_1 = 0x03 ///< Over sample ratio = 1
} qmc5883p_osr_t;
/*!
* @brief Downsample ratio options
*/
typedef enum {
QMC5883P_DSR_1 = 0x00, ///< Downsample ratio = 1
QMC5883P_DSR_2 = 0x01, ///< Downsample ratio = 2
QMC5883P_DSR_4 = 0x02, ///< Downsample ratio = 4
QMC5883P_DSR_8 = 0x03 ///< Downsample ratio = 8
QMC5883P_DSR_1 = 0x00, ///< Downsample ratio = 1
QMC5883P_DSR_2 = 0x01, ///< Downsample ratio = 2
QMC5883P_DSR_4 = 0x02, ///< Downsample ratio = 4
QMC5883P_DSR_8 = 0x03 ///< Downsample ratio = 8
} qmc5883p_dsr_t;
/*=========================================================================*/
@ -95,19 +96,19 @@ typedef enum {
* @brief Field range options
*/
typedef enum {
QMC5883P_RANGE_30G = 0x00, ///< ±30 Gauss range
QMC5883P_RANGE_12G = 0x01, ///< ±12 Gauss range
QMC5883P_RANGE_8G = 0x02, ///< ±8 Gauss range
QMC5883P_RANGE_2G = 0x03 ///< ±2 Gauss range
QMC5883P_RANGE_30G = 0x00, ///< ±30 Gauss range
QMC5883P_RANGE_12G = 0x01, ///< ±12 Gauss range
QMC5883P_RANGE_8G = 0x02, ///< ±8 Gauss range
QMC5883P_RANGE_2G = 0x03 ///< ±2 Gauss range
} qmc5883p_range_t;
/*!
* @brief Set/Reset mode options
*/
typedef enum {
QMC5883P_SETRESET_ON = 0x00, ///< Set and reset on
QMC5883P_SETRESET_ON = 0x00, ///< Set and reset on
QMC5883P_SETRESET_SETONLY = 0x01, ///< Set only on
QMC5883P_SETRESET_OFF = 0x02 ///< Set and reset off
QMC5883P_SETRESET_OFF = 0x02 ///< Set and reset off
} qmc5883p_setreset_t;
/*=========================================================================*/
@ -115,13 +116,13 @@ typedef enum {
* @brief Class for hardware interfacing with the QMC5883P 3-axis magnetometer
*/
class Adafruit_QMC5883P {
public:
public:
Adafruit_QMC5883P(void);
~Adafruit_QMC5883P(void);
bool begin(uint8_t i2c_addr = QMC5883P_DEFAULT_ADDR, TwoWire *wire = &Wire);
bool getRawMagnetic(int16_t *x, int16_t *y, int16_t *z);
bool getGaussField(float *x, float *y, float *z);
bool begin(uint8_t i2c_addr = QMC5883P_DEFAULT_ADDR, TwoWire* wire = &Wire);
bool getRawMagnetic(int16_t* x, int16_t* y, int16_t* z);
bool getGaussField(float* x, float* y, float* z);
bool isDataReady();
bool isOverflow();
void setMode(qmc5883p_mode_t mode);
@ -139,8 +140,8 @@ public:
void setSetResetMode(qmc5883p_setreset_t mode);
qmc5883p_setreset_t getSetResetMode();
private:
Adafruit_I2CDevice *i2c_dev; ///< Pointer to I2C bus interface
private:
Adafruit_I2CDevice* i2c_dev; ///< Pointer to I2C bus interface
};
#endif

6
README.md Normal file → Executable file
View file

@ -1,6 +1,6 @@
# Adafruit QMC5883P Library [![Build Status](https://github.com/adafruit/Adafruit_QMC5883P/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_QMC5883P/actions)
# Adafruit QMC5883P Library [![Build Status](https://github.com/adafruit/Adafruit_QMC5883P/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_QMC5883P/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit_QMC5883P/html/index.html)
<a href="https://www.adafruit.com/products/"><img src="assets/board.jpg?raw=true" width="500px"><br/></a>
<a href="https://www.adafruit.com/product/6388"><img src="assets/board.jpg?raw=true" width="500px"><br/></a>
This is a library for the QMC5883P 3-axis magnetometer
@ -31,4 +31,4 @@ Contributions are welcome! Please read our [Code of Conduct](https://github.com/
## License
MIT license, all text above must be included in any redistribution. See license.txt for more information.
MIT license, all text above must be included in any redistribution. See license.txt for more information.

BIN
assets/board.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

77
examples/test_QMC5883P/test_QMC5883P.ino Normal file → Executable file
View file

@ -1,6 +1,6 @@
/*
* QMC5883P Test Sketch
*
*
* Basic test for the QMC5883P 3-axis magnetometer
*/
@ -10,23 +10,25 @@ Adafruit_QMC5883P qmc;
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
while (!Serial)
delay(10);
Serial.println("QMC5883P Test");
if (!qmc.begin()) {
Serial.println("Failed to find QMC5883P chip");
while (1) delay(10);
while (1)
delay(10);
}
Serial.println("QMC5883P Found!");
// Set to normal mode
qmc.setMode(QMC5883P_MODE_NORMAL);
qmc5883p_mode_t currentMode = qmc.getMode();
Serial.print("Mode: ");
switch(currentMode) {
switch (currentMode) {
case QMC5883P_MODE_SUSPEND:
Serial.println("Suspend");
break;
@ -43,12 +45,12 @@ void setup() {
Serial.println("Unknown");
break;
}
// Set ODR (Output Data Rate) to 50Hz
qmc.setODR(QMC5883P_ODR_50HZ);
qmc5883p_odr_t currentODR = qmc.getODR();
Serial.print("ODR (Output Data Rate): ");
switch(currentODR) {
switch (currentODR) {
case QMC5883P_ODR_10HZ:
Serial.println("10Hz");
break;
@ -65,12 +67,12 @@ void setup() {
Serial.println("Unknown");
break;
}
// Set OSR (Over Sample Ratio) to 4
qmc.setOSR(QMC5883P_OSR_4);
qmc5883p_osr_t currentOSR = qmc.getOSR();
Serial.print("OSR (Over Sample Ratio): ");
switch(currentOSR) {
switch (currentOSR) {
case QMC5883P_OSR_8:
Serial.println("8");
break;
@ -87,12 +89,12 @@ void setup() {
Serial.println("Unknown");
break;
}
// Set DSR (Downsample Ratio) to 2
qmc.setDSR(QMC5883P_DSR_2);
qmc5883p_dsr_t currentDSR = qmc.getDSR();
Serial.print("DSR (Downsample Ratio): ");
switch(currentDSR) {
switch (currentDSR) {
case QMC5883P_DSR_1:
Serial.println("1");
break;
@ -109,12 +111,12 @@ void setup() {
Serial.println("Unknown");
break;
}
// Set Range to 8G
qmc.setRange(QMC5883P_RANGE_8G);
qmc5883p_range_t currentRange = qmc.getRange();
Serial.print("Range: ");
switch(currentRange) {
switch (currentRange) {
case QMC5883P_RANGE_30G:
Serial.println("±30G");
break;
@ -131,12 +133,12 @@ void setup() {
Serial.println("Unknown");
break;
}
// Set SetReset mode to On
qmc.setSetResetMode(QMC5883P_SETRESET_ON);
qmc5883p_setreset_t currentSetReset = qmc.getSetResetMode();
Serial.print("Set/Reset Mode: ");
switch(currentSetReset) {
switch (currentSetReset) {
case QMC5883P_SETRESET_ON:
Serial.println("Set and Reset On");
break;
@ -155,38 +157,45 @@ void setup() {
void loop() {
static int range_counter = 0;
static unsigned long last_range_change = 0;
// Change range every 3 seconds
if (millis() - last_range_change > 3000) {
qmc5883p_range_t ranges[] = {QMC5883P_RANGE_2G, QMC5883P_RANGE_8G, QMC5883P_RANGE_12G, QMC5883P_RANGE_30G};
qmc5883p_range_t ranges[] = {QMC5883P_RANGE_2G, QMC5883P_RANGE_8G,
QMC5883P_RANGE_12G, QMC5883P_RANGE_30G};
const char* range_names[] = {"±2G", "±8G", "±12G", "±30G"};
qmc.setRange(ranges[range_counter]);
Serial.print("*** Changed to range: ");
Serial.println(range_names[range_counter]);
range_counter = (range_counter + 1) % 4;
last_range_change = millis();
delay(100); // Let range change settle
}
if (qmc.isDataReady()) {
int16_t x, y, z;
float gx, gy, gz;
if (qmc.getRawMagnetic(&x, &y, &z)) {
Serial.print("Raw - X: "); Serial.print(x);
Serial.print(" Y: "); Serial.print(y);
Serial.print(" Z: "); Serial.print(z);
Serial.print("Raw - X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Z: ");
Serial.print(z);
if (qmc.getGaussField(&gx, &gy, &gz)) {
Serial.print(" | Gauss - X: "); Serial.print(gx, 3);
Serial.print(" Y: "); Serial.print(gy, 3);
Serial.print(" Z: "); Serial.println(gz, 3);
Serial.print(" | Gauss - X: ");
Serial.print(gx, 3);
Serial.print(" Y: ");
Serial.print(gy, 3);
Serial.print(" Z: ");
Serial.println(gz, 3);
} else {
Serial.println(" | Failed to convert to Gauss");
}
if (qmc.isOverflow()) {
Serial.println("WARNING: Data overflow detected!");
}
@ -194,6 +203,6 @@ void loop() {
Serial.println("Failed to read magnetic data");
}
}
delay(200);
}

10
library.properties Executable file
View file

@ -0,0 +1,10 @@
name=Adafruit QMC5883P Library
version=1.0.1
author=Adafruit
maintainer=Adafruit <info@adafruit.com>
sentence=Arduino library for QMC5883P 3-axis magnetometer
paragraph=This library provides support for the QMC5883P 3-axis magnetometer with I2C interface, including configuration of range, output data rate, and measurement modes.
category=Sensors
url=https://github.com/adafruit/Adafruit_QMC5883P
architectures=*
depends=Adafruit BusIO

6
package-lock.json generated
View file

@ -1,6 +0,0 @@
{
"name": "Adafruit_QMC5883P",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}

View file

@ -1 +0,0 @@
{}