1
+ /* !
2
+ * @file drvLps28dfw.h
3
+ *
4
+ * Device driver for a LPS28DFW precision pressure sensor breakout.
5
+ *
6
+ * Adafruit invests time and resources providing this open source code,
7
+ * please support Adafruit and open-source hardware by purchasing
8
+ * products from Adafruit!
9
+ *
10
+ * Copyright (c) Tyeth Gundry 2025 for Adafruit Industries.
11
+ *
12
+ * MIT license, all text here must be included in any redistribution.
13
+ *
14
+ */
15
+
16
+ #ifndef DRV_LPS28DFW_H
17
+ #define DRV_LPS28DFW_H
18
+
19
+ #include " drvBase.h"
20
+ #include < Adafruit_LPS28.h>
21
+
22
+ /* *************************************************************************/
23
+ /* !
24
+ @brief Class that provides a sensor driver for the LPS28DFW temperature
25
+ and pressure sensor.
26
+ */
27
+ /* *************************************************************************/
28
+ class drvLps28dfw : public drvBase {
29
+
30
+ public:
31
+ /* ******************************************************************************/
32
+ /* !
33
+ @brief Constructor for an LPS28DFW sensor.
34
+ @param i2c
35
+ The I2C interface.
36
+ @param sensorAddress
37
+ 7-bit device address.
38
+ @param mux_channel
39
+ The I2C multiplexer channel.
40
+ @param driver_name
41
+ The name of the driver.
42
+ */
43
+ /* ******************************************************************************/
44
+ drvLps28dfw (TwoWire *i2c, uint16_t sensorAddress, uint32_t mux_channel,
45
+ const char *driver_name)
46
+ : drvBase(i2c, sensorAddress, mux_channel, driver_name) {
47
+ // Initialization handled by drvBase constructor
48
+ }
49
+
50
+ /* ******************************************************************************/
51
+ /* !
52
+ @brief Destructor for an LPS28DFW sensor.
53
+ */
54
+ /* ******************************************************************************/
55
+ ~drvLps28dfw () { delete _lps28; }
56
+
57
+ /* ******************************************************************************/
58
+ /* !
59
+ @brief Initializes the LPS28DFW sensor and begins I2C.
60
+ @returns True if initialized successfully, False otherwise.
61
+ */
62
+ /* ******************************************************************************/
63
+ bool begin () {
64
+ _lps28 = new Adafruit_LPS28 ();
65
+ // attempt to initialize LPS28DFW
66
+ if (!_lps28->begin (_i2c, _address))
67
+ return false ;
68
+
69
+ // Set up sample rate and filter initialization
70
+ if (!_lps28->setDataRate (LPS28_ODR_ONESHOT)) {
71
+ WS_DEBUG_PRINTLN (" Failed to set data rate" );
72
+ return false ;
73
+ }
74
+ if (!_lps28->setAveraging (LPS28_AVG_512)) {
75
+ WS_DEBUG_PRINTLN (" Failed to set averaging" );
76
+ return false ;
77
+ }
78
+ if (!_lps28->setFullScaleMode (true )) {
79
+ WS_DEBUG_PRINTLN (" Failed to set 4060hPa max mode" );
80
+ return false ;
81
+ }
82
+
83
+ return true ;
84
+ }
85
+
86
+ /* ******************************************************************************/
87
+ /* !
88
+ @brief Reads the sensor and stores the data in the object.
89
+ @returns True if the sensor was read successfully, False otherwise.
90
+ */
91
+ /* ******************************************************************************/
92
+ bool readSensor () {
93
+ // grab one reading to seed the sensor
94
+ if (!_lps28->triggerOneShot ()) {
95
+ return false ;
96
+ }
97
+
98
+ // Wait (block up to 100ms) until data is ready
99
+ for (uint8_t i = 0 ; i < 100 ; i++) {
100
+ if (_lps28->getStatus () & LPS28_STATUS_PRESS_READY) {
101
+ if (_temp == NULL ) {
102
+ _temp = _lps28->getTemperatureSensor ();
103
+ }
104
+ if (_pressure == NULL ) {
105
+ _pressure = _lps28->getPressureSensor ();
106
+ }
107
+ return true ;
108
+ }
109
+ delay (1 );
110
+ }
111
+ return false ;
112
+ }
113
+
114
+ /* ******************************************************************************/
115
+ /* !
116
+ @brief Gets the LPS28DFW's current temperature.
117
+ @param tempEvent
118
+ Pointer to an Adafruit_Sensor event.
119
+ @returns True if the temperature was obtained successfully, False
120
+ otherwise.
121
+ */
122
+ /* ******************************************************************************/
123
+ bool getEventAmbientTemp (sensors_event_t *tempEvent) {
124
+ if (!readSensor ())
125
+ return false ;
126
+ _temp->getEvent (tempEvent);
127
+ return true ;
128
+ }
129
+
130
+ /* ******************************************************************************/
131
+ /* !
132
+ @brief Reads a pressure sensor and converts
133
+ the reading into the expected SI unit.
134
+ @param pressureEvent
135
+ Pointer to an Adafruit_Sensor event.
136
+ @returns True if the sensor event was obtained successfully, False
137
+ otherwise.
138
+ */
139
+ /* ******************************************************************************/
140
+ bool getEventPressure (sensors_event_t *pressureEvent) {
141
+ if (!readSensor ())
142
+ return false ;
143
+ _pressure->getEvent (pressureEvent);
144
+ return true ;
145
+ }
146
+
147
+ protected:
148
+ Adafruit_LPS28 *_lps28 = nullptr ; // /< LPS28DFW object
149
+ Adafruit_Sensor *_temp =
150
+ NULL ; // /< Ptr to an adafruit_sensor representing the temperature
151
+ Adafruit_Sensor *_pressure =
152
+ NULL ; // /< Ptr to an adafruit_sensor representing the pressure
153
+ };
154
+
155
+ #endif // DRV_LPS28DFW_H
0 commit comments