Qwiic Magnetometer (MLX90393) Hookup Guide

Contributors: Englandsaurus
Favorited Favorite 1


The MLX90393 is a tri-axial magnetic sensor capable of sensing very small fields while behaving as one would want and expect during saturation in larger fields (like a nearby magnet). It turns out the favorite HMC5883L and other such sensors that are intended for compass applications have a low dynamic range but also strange and undefined behavior in large fields. Ted Yapo did an incredibly extensive characterization of the sensor over on Hackaday. He published his controlled experiments testing a few sensors and found the MLX90393 to be superior.

The MLX90393 can be used as a compass sensor but also works well as a non-contact controller (joystick), flow meter (with magnetic impeller), or a linear actuator position sensor. The breakout board is also a part of SparkFun's Qwiic system, so you won't have to do any soldering to figure out what the magnetic fields look like.

SparkFun Triple Axis Magnetometer Breakout - MLX90393 (Qwiic)

SparkFun Triple Axis Magnetometer Breakout - MLX90393 (Qwiic)


In this hookup guide, we'll get going by getting some basic readings from the sensor, then look at how to configure the sensor on different I2C addresses.

Required Materials

To get started, you'll need a microcontroller to control everything in your project.

SparkFun RedBoard - Programmed with Arduino

SparkFun RedBoard - Programmed with Arduino

SparkFun ESP32 Thing

SparkFun ESP32 Thing


Particle Photon (Headers)

32 Retired

Raspberry Pi 3

92 Retired

Now, to get your microcontroller into the Qwiic ecosystem, the key will be one of the following Qwiic shields to match your preference of microcontroller:

SparkFun Qwiic HAT for Raspberry Pi

SparkFun Qwiic HAT for Raspberry Pi

SparkFun Qwiic Shield for Arduino

SparkFun Qwiic Shield for Arduino


SparkFun Qwiic Shield for Photon


You will also need a Qwiic cable to connect the shield to your magnetometer, choose a length that suits your needs.

Qwiic Cable - 50mm

Qwiic Cable - 50mm

Qwiic Cable - 100mm

Qwiic Cable - 100mm


Qwiic Cable - 500mm

1 Retired

Qwiic Cable - 200mm


Or, here's the wishlist to follow along exactly with this guide:

Suggested Reading

If you aren't familiar with the Qwiic system, we recommend reading here for an overview.

Qwiic Connect System
Qwiic Connect System

We would also recommend taking a look at the hookup guide for the Qwiic Shield if you haven't already. Brushing up on your skills in I2C is also recommended, as all Qwiic sensors are I2C.


An introduction to I2C, one of the main embedded communications protocols in use today.

Serial Terminal Basics

This tutorial will show you how to communicate with your serial devices using a variety of terminal emulator applications.

Qwiic Shield for Arduino & Photon Hookup Guide

Get started with our Qwiic ecosystem with the Qwiic shield for Arduino or Photon.

Hardware Overview

Let's look over a few characteristics of the MLX90393 so we know a bit more about how it behaves.

Operating Voltage2.2V - 3.6V
Operating Temperature-20°C - 85°C
Resolution128 Hz - 3.3 kHz
Current Consumption100 µA (Typ.)
I2C Address0xC0


The characteristics of the available pins on the magnetometer are outlined in the table below.

Pin LabelPin FunctionInput/OutputNotes
3.3VPower SupplyInputShould be between 2.2V - 3.6V
GNDGroundInput0V/common voltage.
SDAI2C Data SignalBi-directionalBi-directional data line. Voltage should not exceed power supply (e.g. 3.3V).
SCL/SCLKI2C Clock SignalInputMaster-controlled clock signal. Voltage should not exceed power supply (e.g. 3.3V).
CSChip SelectInputChip Select pin, digital input. Tied high for I2C operation, cut trace jumper and tie low for SPI.
INTInterruptOutputInterrupt pin, active high, digital output. Also configurable as a data ready pin
TRIGResetInput/OutputTrigger pin, active high, digital output. Also configurable as interrupt pin.

Optional Features

The Qwiic MLX90393 has onboard I2C pull up resistors; if multiple sensors are connected to the bus with the pull-up resistors enabled, the parallel equivalent resistance will create too strong of a pull-up for the bus to operate correctly. As a general rule of thumb, disable all but one pair of pull-up resistors if multiple devices are connected to the bus. If you need to disconnect the pull up resistors they can be removed by cutting the traces on the corresponding jumpers highlighted below.

I2C Pullup Jumper

The I2C address of the Qwiic Magnetometer can be changed using the A0 and A1 jumpers on the back of the board. Simply cut the traces connecting each pad to ground (0) and solder the other side to connect it to 3.3V (1).

Address Jumper

To operate the Qwiic Magnetometer in SPI mode, cut the chip select trace jumper (labeled below) and ensure that the CS pin is then connected to ground.

Chip Select Jumper

Hardware Assembly

If you haven't yet assembled your Qwiic Shield, now would be the time to head on over to that tutorial.

With the shield assembled, SparkFun's new Qwiic environment means that connecting the sensor could not be easier. Just plug one end of the Qwiic cable into the Magnetometer breakout, the other into the Qwiic Shield of your choice and you'll be ready to upload a sketch and figure out what the magnetic fields look like. It seems like it's too easy to use, but that's why we made it that way!

Connected Magnetometer

Example Code

Before we get into programming our Magnetometer, we'll need to download and install the magnetometer library. Ted Yapo has written a library to control the Qwiic Magnetometer. You can obtain the .zip for this library using the below button. Never installed a library before? That's ok! Checkout our tutorial on installing Arduino Libraries.

Note: This example assumes you are using the latest version of the Arduino IDE on your desktop. If this is your first time using Arduino, please review our tutorial on installing the Arduino IDE. If you have not previously installed an Arduino library, please check out our installation guide.

Since this isn't a SparkFun library, the example sketches are not included, so you'll have to download those separately from the GitHub page by clicking the below button. The example sketches are located in software

Go ahead and unzip these examples to a location of your choosing and open Example 1 - Basic Readings.

Example 1 - Basic Readings

Once we have our first example opened up, let's look at how things are structured as we set up our sensor. First we create our sensor, and then an array of floats to contain our data.

MLX90393 mlx;
MLX90393::txyz data; //Create a structure, called data, of four floats (t, x, y, and z)

Then in our setup loop, we must initialize our sensor, notice the delay afterwards, this gives the sensor time to initialize before we start attempting to talk to it.

mlx.begin(); //Assumes I2C jumpers are GND. No DRDY pin used.
delay(1000); //Allow the sensor to initialize.

Once the sensor is initialized, our void loop() will read the data from our sensor into data, the array of floats we created earlier, and print it over serial to our serial monitor. Opening up your serial monitor to a baud rate of 9600 should display output similar to that shown below. The numbers are in units of µT.

Basic Sensor Readings

Example 2 - Configure Sensor

Go ahead and open Example 2 from the location you saved it in. The only differences between this example and the previous one are in the setup() function. Notice how we now call the begin() function with 3 arguments, which are the value of the A0 jumper, the value of the A1 jumper, and the pin that we've connected to INT. The below code assumes that the A0 jumper has been cut from ground and soldered to 3.3V and that A3 is connected to the INT pin (sometimes referred to in the datasheet as the DRDY or data ready pin).

byte status = mlx.begin(1, 0, A3);

If we must change the address of our magnetometer due to overlapping addresses, ensure that the values we pass into begin() match up with the values of our address jumpers. The MLX90393 also has a ton of different ways to change the sensor behavior. You can set the gain, resolution of the x, y and z channels, oversampling rates, and even offsets of your x, y, and z channels. In this example however, we set the gain to 1 and the resolution of our x, y, and z channels to their finest setting, 0.

mlx.setResolution(0, 0, 0);

A table showing the different possible resolutions of the sensor for the X and Y axes is shown below. These can be selected using the setGainSel(uint8_t gain) and setResolution(uint8_t x, uint8_t y, uint8_t z) functions. All resolutions are in units of µT/LSB.

XY Axis:

GainRes = 0Res = 1Res = 2Res = 3

Shown below is the table containing the possible combinations for resolutions on the Z axis. Once again, units are in µT/LSB

Z Axis:

GainRes = 0Res = 1Res = 2Res = 3

Since we are simply connecting our magnetometer on a different address, our output should be similar to the one in the first example.

Resources and Going Further

For more information, check out the resources below:

Need some inspiration for your next project? Check out some of these related tutorials:

Qwiic Real Time Clock Module (RV-1805) Hookup Guide

Find out what time it is, even after the power's been out on your project for a while with the Qwiic Real Time Clock (RTC) module.

Qwiic UV Sensor (VEML6075) Hookup Guide

Learn how to connect your VEML6075 UV Sensor and figure out just when you should put some sunscreen on.

SparkFun Qwiic Shield for Teensy Hookup Guide

A short guide for assembling and using the SparkFun Qwiic Shield for Teensy and Qwiic Shield for Teensy Extended.

Measuring Height with Atmospheric Pressure

Measure height using atmospheric pressure with your Qwiic MicroPressure breakout board!

Or check out this blog post about using a magnetometer as a compass: