MPL3115A2_Arduino 1.0.1
This library enables the developer to evaluate NXP MPL3115A2(S) with Arduino.
Loading...
Searching...
No Matches
MPL3115A2_Arduino.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 ryraki
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
12#include <Arduino.h>
13#include <Wire.h>
14#include "MPL3115A2_Arduino.h"
15
16MPL3115A2_Arduino::MPL3115A2_Arduino() : I2C_device(I2C_address) {}
17MPL3115A2_Arduino::MPL3115A2_Arduino(uint8_t i2c_address) : I2C_device(i2c_address) {}
18MPL3115A2_Arduino::MPL3115A2_Arduino(TwoWire& wire, uint8_t i2c_address = I2C_address) : I2C_device(wire, i2c_address) {}
20
22 return init(true);
23}
24
25uint8_t MPL3115A2_Arduino::init(bool pinconfig) {
26 if (pinconfig) {
27 pinMode(SDA, INPUT);
28 pinMode(SCL, INPUT);
29 pinMode(2, INPUT);
30 pinMode(5, INPUT);
31 }
32 write_r8(MPL3115_CTRL_REG1, MPL3115_CTRL_REG1_RST_EN);
33 delay(1200);
34 return read_r8(MPL3115_WHO_AM_I);
35}
36
40
41void MPL3115A2_Arduino::start_conversion(mpl3115_mode _mode, uint8_t _oneshot, uint8_t _oversample) {
42 mode=_mode;
43 oneshot=_oneshot;
44 oversample=_oversample;
45 write_r8(MPL3115_PT_DATA_CFG, 0x07); // All enable
46 uint8_t ctrl_reg1 = mode<<MPL3115_CTRL_REG1_ALT_SHIFT | oversample<<MPL3115_CTRL_REG1_OS_SHIFT | oneshot<< MPL3115_CTRL_REG1_OST_SHIFT;
47 write_r8(MPL3115_CTRL_REG1, ctrl_reg1);
48 write_r8(MPL3115_CTRL_REG1, ctrl_reg1 | MPL3115_CTRL_REG1_SBYB_ACTIVE);
49 delay(1200);
50}
51
52void MPL3115A2_Arduino::set_interrupt(uint8_t flag, mpl3115_INT channel) {
53 bit_op8(MPL3115_CTRL_REG4, flag, ~flag);
54 bit_op8(MPL3115_CTRL_REG5, channel?0xff:0x00, ~flag);
55}
56
58 bit_op8(MPL3115_CTRL_REG4, 0x00, ~flag);
59}
60
62 return getP(MPL3115_P);
63}
64
65float MPL3115A2_Arduino::getP(mpl3115_pressure_target target) {
66 uint8_t readBuffer[6];
67 if (target==MPL3115_P) reg_r(0x00, readBuffer, 6);
68 else reg_r(target, readBuffer+MPL3115_OUT_P_MSB, 3);
69 int32_t result=((int32_t)readBuffer[1]<<12)|((int32_t)readBuffer[2]<<4)|(readBuffer[3]>>4);
70 float result_real=0;
71 if (mode==MPL3115_barometer)
72 result_real = (float)result/4000;
73 else { // altimeter
74 if (result>0x7FFFF) result = -((~result + 1)&0x7FFFF);
75 result_real = (float) result*0.0625;
76 }
77 return result_real;
78}
79
81 return getT(MPL3115_T);
82}
83
84float MPL3115A2_Arduino::getT(mpl3115_temperature_target target) {
85 uint8_t readBuffer[6];
86 if (target==MPL3115_T) reg_r(0x00, readBuffer, 6);
87 else reg_r(target, readBuffer+MPL3115_OUT_T_MSB, 2);
88 reg_r(target, readBuffer, 2);
89 int16_t result=((int16_t)readBuffer[4]<<4)|(readBuffer[5]>>4);
90 if (result>0x07FF) result = -((~result + 1)&0x7FF);
91 return (float) result*0.0625;
92}
93
97
98void MPL3115A2_Arduino::set_sealevel(float pressure) {
99 uint16_t P_value = pressure*500;
100 uint8_t register_list[2] = {P_value>>8, P_value};
101 reg_w(MPL3115_BAR_IN_MSB, register_list, 2);
102}
103
104void MPL3115A2_Arduino::set_threshold(float pressure, uint8_t temperature, float pressure_window=0, uint8_t temperature_window=0) {
105 int32_t P_target, P_window;
106 if (mode==MPL3115_barometer) {
107 P_target = pressure*500;
108 P_window = pressure_window*500;
109 }
110 else { // altimeter
111 P_target = pressure;
112 P_window = pressure_window;
113 }
114 Serial.println(P_target);
115 Serial.println(P_window);
116 uint8_t register_list[6] = {
117 P_target>>8,
118 P_target,
119 temperature,
120 P_window>>8,
121 P_window,
122 temperature_window
123 };
124 reg_w(MPL3115_P_TGT_MSB, register_list, 6);
125}
This file is header for MPL3115A2_Arduino.
void set_threshold(float pressure, uint8_t temperature, float pressure_window, uint8_t temperature_window)
Set threshold (target) for interruption.
uint8_t oversample
Selects the oversampling ratio from mpl3115_OSR enum.
float getT()
Get the temperature conversion result by reading OUT_T_xxx registers. This clears interruption.
void write_r8(uint8_t reg, uint8_t val)
void set_sealevel()
Set default sea level (101.326kPa) for altitude calculation.
uint8_t oneshot
Put 1 when oneshot mode.
void dis_interrupt(uint8_t flag)
Disable interrupt function of MPL3115A2.
void bit_op8(uint8_t reg, uint8_t mask, uint8_t value)
uint8_t init()
Initialize the device with reset with several GPIO pin configuration.
void set_interrupt(uint8_t flag, mpl3115_INT channel)
Set interrupt function of MPL3115A2.
int reg_w(uint8_t reg_adr, uint8_t *data, uint16_t size)
float getP()
Get the pressure conversion result by reading OUT_P_xxx registers. This clears interruption.
int reg_r(uint8_t reg_adr, uint8_t *data, uint16_t size)
uint8_t read_r8(uint8_t reg)
void start_conversion()
Start conversion.
mpl3115_mode mode
Selects the mode from baromter or altimeter.