STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
Adafruit_LIS3DH.cpp
Go to the documentation of this file.
1/*!
2 * @file Adafruit_LIS3DH.cpp
3 *
4 * @mainpage Adafruit LIS3DH breakout board
5 *
6 * @section intro_sec Introduction
7 *
8 * This is a library for the Adafruit LIS3DH Accel breakout board
9 *
10 * Designed specifically to work with the Adafruit LIS3DH Accel breakout board.
11 *
12 * Pick one up today in the adafruit shop!
13 * ------> https://www.adafruit.com/product/2809
14 *
15 * This sensor communicates over I2C or SPI (our library code supports both) so
16 * you can share it with a bunch of other sensors on the same I2C bus.
17 *
18 * Adafruit invests time and resources providing this open source code,
19 * please support Adafruit andopen-source hardware by purchasing products
20 * from Adafruit!
21 *
22 * @section author Author
23 *
24 * K. Townsend / Limor Fried (Adafruit Industries)
25 *
26 * @section license License
27 *
28 * BSD license, all text above must be included in any redistribution
29 */
30
31#include "Arduino.h"
32
33#include <Adafruit_LIS3DH.h>
34#include <Wire.h>
35
36/*!
37 * @brief Instantiates a new LIS3DH class in I2C
38 * @param Wi
39 * optional wire object
40 */
42 : _cs(-1), _mosi(-1), _miso(-1), _sck(-1), _sensorID(-1) {
43 I2Cinterface = Wi;
44}
45
46/*!
47 * @brief Instantiates a new LIS3DH class using hardware SPI
48 * @param cspin
49 * number of CSPIN (Chip Select)
50 * @param *theSPI
51 * optional parameter contains spi object
52 * @param frequency
53 * frequency of the SPI interface
54 */
55Adafruit_LIS3DH::Adafruit_LIS3DH(int8_t cspin, SPIClass *theSPI,
56 uint32_t frequency) {
57 _cs = cspin;
58 _mosi = -1;
59 _miso = -1;
60 _sck = -1;
61 _sensorID = -1;
62 SPIinterface = theSPI;
63 _frequency = frequency;
64}
65
66/*!
67 * @brief Instantiates a new LIS3DH class using software SPI
68 * @param cspin
69 * number of CSPIN (Chip Select)
70 * @param mosipin
71 * number of pin used for MOSI (Master Out Slave In))
72 * @param misopin
73 * number of pin used for MISO (Master In Slave Out)
74 * @param sckpin
75 * number of pin used for CLK (clock pin)
76 * @param frequency
77 * frequency of the SPI interface
78 */
79Adafruit_LIS3DH::Adafruit_LIS3DH(int8_t cspin, int8_t mosipin, int8_t misopin,
80 int8_t sckpin, uint32_t frequency) {
81 _cs = cspin;
82 _mosi = mosipin;
83 _miso = misopin;
84 _sck = sckpin;
85 _sensorID = -1;
86 _frequency = frequency;
87}
88
89/*!
90 * @brief Setups the HW (reads coefficients values, etc.)
91 * @param i2caddr
92 * i2c address (optional, fallback to default)
93 * @param nWAI
94 * Who Am I register value - defaults to 0x33 (LIS3DH)
95 * @return true if successful
96 */
97bool Adafruit_LIS3DH::begin(uint8_t i2caddr, uint8_t nWAI) {
98 _i2caddr = i2caddr;
99 _wai = nWAI;
100 if (I2Cinterface) {
101 i2c_dev = new Adafruit_I2CDevice(_i2caddr, I2Cinterface);
102
103 if (!i2c_dev->begin()) {
104 return false;
105 }
106 } else if (_cs != -1) {
107
108 // SPIinterface->beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
109 if (_sck == -1) {
110 spi_dev = new Adafruit_SPIDevice(_cs,
111 _frequency, // frequency
112 SPI_BITORDER_MSBFIRST, // bit order
113 SPI_MODE0, // data mode
115 } else {
116 spi_dev = new Adafruit_SPIDevice(_cs, _sck, _miso, _mosi,
117 _frequency, // frequency
118 SPI_BITORDER_MSBFIRST, // bit order
119 SPI_MODE0); // data mode
120 }
121
122 if (!spi_dev->begin()) {
123 return false;
124 }
125 }
126
127 /* Check connection */
128 if (getDeviceID() != _wai) {
129 /* No LIS3DH detected ... return false */
130 // Serial.println(deviceid, HEX);
131 return false;
132 }
133 Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
134 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL1, 1);
135 _ctrl1.write(0x07); // enable all axes, normal mode
136
137 // 400Hz rate
139
140 Adafruit_BusIO_Register _ctrl4 = Adafruit_BusIO_Register(
141 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL4, 1);
142 _ctrl4.write(0x88); // High res & BDU enabled
143
144 enableDRDY(true, 1);
145
146 // Turn on orientation config
147
148 Adafruit_BusIO_Register _tmp_cfg = Adafruit_BusIO_Register(
149 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_TEMPCFG, 1);
150 _tmp_cfg.write(0x80); // enable adcs
151
152 return true;
153}
154
155/*!
156 * @brief Get Device ID from LIS3DH_REG_WHOAMI
157 * @return WHO AM I value
158 */
160 Adafruit_BusIO_Register _chip_id = Adafruit_BusIO_Register(
161 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_WHOAMI, 1);
162
163 return _chip_id.read();
164}
165/*!
166 * @brief Check to see if new data available
167 * @return true if there is new data available, false otherwise
168 */
170 Adafruit_BusIO_Register status_2 = Adafruit_BusIO_Register(
171 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_STATUS2, 1);
172 Adafruit_BusIO_RegisterBits zyx_data_available =
173 Adafruit_BusIO_RegisterBits(&status_2, 1, 3);
174 return zyx_data_available.read();
175}
176
177/*!
178 * @brief Reads x y z values at once
179 */
181
182 uint8_t register_address = LIS3DH_REG_OUT_X_L;
183 if (i2c_dev) {
184 register_address |= 0x80; // set [7] for auto-increment
185 } else {
186 register_address |= 0x40; // set [6] for auto-increment
187 register_address |= 0x80; // set [7] for read
188 }
189
190 Adafruit_BusIO_Register xl_data = Adafruit_BusIO_Register(
191 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, register_address, 6);
192
193 uint8_t buffer[6];
194 xl_data.read(buffer, 6);
195
196 x = buffer[0];
197 x |= ((uint16_t)buffer[1]) << 8;
198 y = buffer[2];
199 y |= ((uint16_t)buffer[3]) << 8;
200 z = buffer[4];
201 z |= ((uint16_t)buffer[5]) << 8;
202
203 uint8_t range = getRange();
204 uint8_t mode = getPerformanceMode();
205
206 // this scaling process accounts for the shift due to actually being 10 bits
207 // (normal mode) as well as the lsb=> mg conversion and the mg=> g conversion
208 // final value is raw_lsb => 10-bit lsb -> milli-gs -> gs
209
210 // depending on the range, we'll always convert the value to 8/10/12 bits and
211 // g's so we'll divide by LIS3DH_LSB16_TO_KILO_LSB10 (16000), _LSB8 or _LSB12:
212
213 // then we can then multiply the resulting value by the lsb value to get the
214 // value in g's
215
216 uint8_t lsb_value = 1;
217 if (range == LIS3DH_RANGE_2_G)
218 lsb_value = 4;
219 if (range == LIS3DH_RANGE_4_G)
220 lsb_value = 8;
221 if (range == LIS3DH_RANGE_8_G)
222 lsb_value = 16;
223 if (range == LIS3DH_RANGE_16_G)
224 lsb_value = 48;
225
226 float convert_from_LSB16 = 64000.0;
227 if (mode == LIS3DH_MODE_HIGH_RESOLUTION) {
228 lsb_value = lsb_value / 4; // 1 at 2G, 2 at 4G, 4 at 8G, 12 at 16G
229 convert_from_LSB16 = LIS3DH_LSB16_TO_KILO_LSB12;
230 } else if (mode == LIS3DH_MODE_NORMAL) {
231 convert_from_LSB16 = LIS3DH_LSB16_TO_KILO_LSB10;
232 } else if (mode == LIS3DH_MODE_LOW_POWER) {
233 lsb_value = lsb_value * 4; // 16 at 2G, 32 at 4G, 64 at 8G, 192 at 16G
234 convert_from_LSB16 = LIS3DH_LSB16_TO_KILO_LSB8;
235 }
236 x_g = lsb_value * ((float)x / convert_from_LSB16);
237 y_g = lsb_value * ((float)y / convert_from_LSB16);
238 z_g = lsb_value * ((float)z / convert_from_LSB16);
239}
240
241/*!
242 * @brief Read the auxilary ADC
243 * @param adc
244 * adc index. possible values (1, 2, 3).
245 * @return auxilary ADC value
246 */
248 if ((adc < 1) || (adc > 3))
249 return 0;
250 adc--; // switch to 0 indexed
251
252 uint16_t value;
253 uint8_t reg = LIS3DH_REG_OUTADC1_L + (adc * 2);
254
255 if (i2c_dev) {
256 reg |= 0x80; // set [7] for auto-increment
257 } else {
258 reg |= 0x40; // set [6] for auto-increment
259 reg |= 0x80; // set [7] for read
260 }
261
262 uint8_t buffer[2];
263 Adafruit_BusIO_Register adc_data =
264 Adafruit_BusIO_Register(i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, reg, 2);
265
266 adc_data.read(buffer, 2);
267
268 value = buffer[0];
269 value |= ((uint16_t)buffer[1]) << 8;
270
271 return value;
272}
273
274/*!
275 * @brief Set INT to output for single or double click
276 * @param c
277 * 0 = turn off I1_CLICK
278 * 1 = turn on all axes & singletap
279 * 2 = turn on all axes & doubletap
280 * @param clickthresh
281 * CLICK threshold value
282 * @param timelimit
283 * sets time limit (default 10)
284 * @param timelatency
285 * sets time latency (default 20)
286 * @param timewindow
287 * sets time window (default 255)
288 */
289
290void Adafruit_LIS3DH::setClick(uint8_t c, uint8_t clickthresh,
291 uint8_t timelimit, uint8_t timelatency,
292 uint8_t timewindow) {
293
294 Adafruit_BusIO_Register ctrl3 = Adafruit_BusIO_Register(
295 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL3, 1);
296 Adafruit_BusIO_RegisterBits i1_click =
297 Adafruit_BusIO_RegisterBits(&ctrl3, 1, 7);
298
299 Adafruit_BusIO_Register click_cfg = Adafruit_BusIO_Register(
300 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CLICKCFG, 1);
301
302 if (!c) {
303 // disable int
304 i1_click.write(0); // disable i1 click
305 click_cfg.write(0);
306 return;
307 }
308 // else...
309
310 i1_click.write(1); // enable i1 click
311
312 Adafruit_BusIO_Register ctrl5 = Adafruit_BusIO_Register(
313 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL5, 1);
314
315 Adafruit_BusIO_RegisterBits int1_latch_bit =
316 Adafruit_BusIO_RegisterBits(&ctrl5, 1, 3);
317 int1_latch_bit.write(true);
318
319 if (c == 1)
320 click_cfg.write(0x15); // turn on all axes & singletap
321 if (c == 2)
322 click_cfg.write(0x2A); // turn on all axes & doubletap
323
324 Adafruit_BusIO_Register click_ths = Adafruit_BusIO_Register(
325 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CLICKTHS, 1);
326 click_ths.write(clickthresh); // arbitrary
327
328 Adafruit_BusIO_Register time_limit = Adafruit_BusIO_Register(
329 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_TIMELIMIT, 1);
330 time_limit.write(timelimit); // arbitrary
331
332 Adafruit_BusIO_Register time_latency = Adafruit_BusIO_Register(
333 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_TIMELATENCY, 1);
334 time_latency.write(timelatency); // arbitrary
335
336 Adafruit_BusIO_Register time_window = Adafruit_BusIO_Register(
337 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_TIMEWINDOW, 1);
338 time_window.write(timewindow); // arbitrary
339}
340
341/*!
342 * @brief Get uint8_t for single or double click
343 * @return register LIS3DH_REG_CLICKSRC
344 */
346 Adafruit_BusIO_Register click_reg = Adafruit_BusIO_Register(
347 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CLICKSRC, 1);
348
349 return click_reg.read();
350}
351
352/*!
353 * @brief Configure INT1 for high-G threshold interrupt with high-pass filter.
354 *
355 * Sets up CTRL_REG2 (HPF for INT1), performs the mandatory REFERENCE dummy
356 * read to zero the HPF baseline (prevents spurious interrupt at startup),
357 * programs INT1_CFG for high-event detection on all three axes (OR mode),
358 * writes threshold and duration registers, routes IA1 to the INT1 pin via
359 * CTRL_REG3, and latches the interrupt in CTRL_REG5 until INT1_SRC is read.
360 *
361 * @param ths INT1_THS value (7-bit). LSB size depends on full-scale range:
362 * ±2g=16mg, ±4g=32mg, ±8g=62mg, ±16g=186mg per datasheet.
363 * @param dur INT1_DUR value (7-bit). Each count = 1/ODR.
364 */
365void Adafruit_LIS3DH::configureHighGInterrupt(uint8_t ths, uint8_t dur) {
366 // CTRL_REG2: HPM=00 (normal, reset by REFERENCE read), HP_IA1=1
367 // Explicit value avoids relying on reset state.
368 Adafruit_BusIO_Register ctrl2 = Adafruit_BusIO_Register(
369 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL2, 1);
370 ctrl2.write(0x01);
371
372 // Dummy read of REFERENCE resets HPF to current acceleration baseline,
373 // preventing a spurious interrupt while the filter settles at startup.
374 Adafruit_BusIO_Register ref = Adafruit_BusIO_Register(
375 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_REFERENCE, 1);
376 ref.read();
377
378 // INT1_CFG: enable high event on X, Y, Z axes (OR combination)
379 // XHIE=0x02, YHIE=0x08, ZHIE=0x20
380 Adafruit_BusIO_Register int1_cfg = Adafruit_BusIO_Register(
381 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_INT1CFG, 1);
382 int1_cfg.write(0x2A);
383
384 // Threshold and duration
385 Adafruit_BusIO_Register int1_ths = Adafruit_BusIO_Register(
386 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_INT1THS, 1);
387 int1_ths.write(ths & 0x7F);
388
389 Adafruit_BusIO_Register int1_dur = Adafruit_BusIO_Register(
390 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_INT1DUR, 1);
391 int1_dur.write(dur & 0x7F);
392
393 // CTRL_REG3: route IA1 to INT1 physical pin (bit 6 = I1_IA1)
394 Adafruit_BusIO_Register ctrl3 = Adafruit_BusIO_Register(
395 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL3, 1);
396 ctrl3.write(0x40);
397
398 // CTRL_REG5: latch INT1 until INT1_SRC is read (bit 3 = LIR_INT1)
399 Adafruit_BusIO_Register ctrl5 = Adafruit_BusIO_Register(
400 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL5, 1);
401 ctrl5.write(0x08);
402}
403
404/*!
405 * @brief Get uint8_t for INT1 source and clear interrupt
406 * @return register LIS3DH_REG_INT1SRC
407 */
409 Adafruit_BusIO_Register int_reg = Adafruit_BusIO_Register(
410 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_INT1SRC, 1);
411
412 return int_reg.read();
413}
414
415/**
416 * @brief Enable or disable the Data Ready interupt
417 *
418 * @param enable_drdy true to enable the given Data Ready interrupt on INT1,
419 * false to disable it
420 * @param int_pin which DRDY interrupt to enable; 1 for DRDY1, 2 for DRDY2
421 * @return true: success false: failure
422 */
423bool Adafruit_LIS3DH::enableDRDY(bool enable_drdy, uint8_t int_pin) {
424 Adafruit_BusIO_Register _ctrl3 = Adafruit_BusIO_Register(
425 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL3, 1);
426 Adafruit_BusIO_RegisterBits _drdy1_int_enable =
427 Adafruit_BusIO_RegisterBits(&_ctrl3, 1, 4);
428 Adafruit_BusIO_RegisterBits _drdy2_int_enable =
429 Adafruit_BusIO_RegisterBits(&_ctrl3, 1, 3);
430
431 if (int_pin == 1) {
432 return _drdy1_int_enable.write(enable_drdy);
433 } else if (int_pin == 2) {
434 return _drdy2_int_enable.write(enable_drdy);
435 } else {
436 return false;
437 }
438}
439
440/*!
441 * @brief Sets the performance mode for the LIS3DH.
442 *
443 * The turn-on time to transition to 12-bit mode (high resolution) is set at
444 * 7ms, or swtch to 10-bit mode (normal) or to 8-bit mode (low power) is 1ms
445 *
446 * @param mode
447 * mode - low power, normal, high resolution e.g. LIS3DH_MODE_LOW_POWER
448 */
450 // low power bit is in CTRL1, 4th bit from right
451 Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
452 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL1, 1);
453 Adafruit_BusIO_RegisterBits ctrl1_mode_bits =
454 Adafruit_BusIO_RegisterBits(&_ctrl1, 1, 3);
455 // high res bit is in CTRL4, 4th bit from right
456 Adafruit_BusIO_Register _ctrl4 = Adafruit_BusIO_Register(
457 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL4, 1);
458 Adafruit_BusIO_RegisterBits ctrl4_mode_bits =
459 Adafruit_BusIO_RegisterBits(&_ctrl4, 1, 3);
460 switch (mode) {
462 // set HR bit low (CTRL4) and LP bit high (CTRL1)
463 ctrl4_mode_bits.write(0);
464 ctrl1_mode_bits.write(1);
465 delay(1); // turn-on transition time (worst case)
466 break;
468 // set HR bit low (CTRL4) and LP bit low (CTRL1)
469 ctrl1_mode_bits.write(0);
470 ctrl4_mode_bits.write(0);
471 delay(1); // turn-on transition time (worst case)
472 break;
474 // set HR bit high (CTRL4) and LP bit low (CTRL1)
475 ctrl1_mode_bits.write(0);
476 ctrl4_mode_bits.write(1);
477 delay(7); // turn-on transition time (worst case)
478 break;
479 }
480}
481
482/*!
483 * @brief Gets the performance mode for the LIS3DH
484 * @return Returns performance mode value
485 */
487 // low power bit is in CTRL1, 4th bit from right
488 Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
489 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL1, 1);
490 Adafruit_BusIO_RegisterBits ctrl1_mode_bits =
491 Adafruit_BusIO_RegisterBits(&_ctrl1, 1, 3);
492 // high res bit is in CTRL4, 4th bit from right
493 Adafruit_BusIO_Register _ctrl4 = Adafruit_BusIO_Register(
494 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL4, 1);
495 Adafruit_BusIO_RegisterBits ctrl4_mode_bits =
496 Adafruit_BusIO_RegisterBits(&_ctrl4, 1, 3);
497
498 bool lp = ctrl1_mode_bits.read() == 1;
499 bool hr = ctrl4_mode_bits.read() == 1;
500 if (!lp && !hr) {
501 return LIS3DH_MODE_NORMAL;
502 } else if (lp && !hr) {
504 }
506}
507
508/*!
509 * @brief Sets the g range for the accelerometer
510 * @param range
511 * range value
512 */
514
515 Adafruit_BusIO_Register _ctrl4 = Adafruit_BusIO_Register(
516 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL4, 1);
517
518 Adafruit_BusIO_RegisterBits range_bits =
519 Adafruit_BusIO_RegisterBits(&_ctrl4, 2, 4);
520 range_bits.write(range);
521 delay(15); // delay to let new setting settle
522}
523
524/*!
525 * @brief Gets the g range for the accelerometer
526 * @return Returns g range value
527 */
529 Adafruit_BusIO_Register _ctrl4 = Adafruit_BusIO_Register(
530 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL4, 1);
531
532 Adafruit_BusIO_RegisterBits range_bits =
533 Adafruit_BusIO_RegisterBits(&_ctrl4, 2, 4);
534 return (lis3dh_range_t)range_bits.read();
535}
536
537/*!
538 * @brief Sets the data rate for the LIS3DH (controls power consumption)
539 * @param dataRate
540 * data rate value
541 */
543 Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
544 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL1, 1);
545 Adafruit_BusIO_RegisterBits data_rate_bits =
546 Adafruit_BusIO_RegisterBits(&_ctrl1, 4, 4);
547
548 data_rate_bits.write(dataRate);
549}
550
551/*!
552 * @brief Gets the data rate for the LIS3DH (controls power consumption)
553 * @return Returns Data Rate value
554 */
556 Adafruit_BusIO_Register _ctrl1 = Adafruit_BusIO_Register(
557 i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, LIS3DH_REG_CTRL1, 1);
558 Adafruit_BusIO_RegisterBits data_rate_bits =
559 Adafruit_BusIO_RegisterBits(&_ctrl1, 4, 4);
560
561 return (lis3dh_dataRate_t)data_rate_bits.read();
562}
563
564/*!
565 * @brief Gets the most recent sensor event
566 * @param *event
567 * sensor event that we want to read
568 * @return true if successful
569 */
570bool Adafruit_LIS3DH::getEvent(sensors_event_t *event) {
571 /* Clear the event */
572 memset(event, 0, sizeof(sensors_event_t));
573
574 event->version = sizeof(sensors_event_t);
575 event->sensor_id = _sensorID;
576 event->type = SENSOR_TYPE_ACCELEROMETER;
577 event->timestamp = 0;
578
579 read();
580
581 event->acceleration.x = x_g * SENSORS_GRAVITY_STANDARD;
582 event->acceleration.y = y_g * SENSORS_GRAVITY_STANDARD;
583 event->acceleration.z = z_g * SENSORS_GRAVITY_STANDARD;
584
585 return true;
586}
587
588/*!
589 * @brief Gets the sensor_t data
590 * @param *sensor
591 * sensor that we want to write data into
592 */
593void Adafruit_LIS3DH::getSensor(sensor_t *sensor) {
594 /* Clear the sensor_t object */
595 memset(sensor, 0, sizeof(sensor_t));
596
597 /* Insert the sensor name in the fixed length char array */
598 strncpy(sensor->name, "LIS3DH", sizeof(sensor->name) - 1);
599 sensor->name[sizeof(sensor->name) - 1] = 0;
600 sensor->version = 1;
601 sensor->sensor_id = _sensorID;
602 sensor->type = SENSOR_TYPE_ACCELEROMETER;
603 sensor->min_delay = 0;
604 sensor->max_value = 0;
605 sensor->min_value = 0;
606 sensor->resolution = 0;
607}
This is a library for the Adafruit LIS3DH Accel breakout board.
#define LIS3DH_REG_INT1DUR
INT1_DURATION [0, D6, D5, D4, D3, D2, D1, D0].
lis3dh_range_t
A structure to represent scales.
@ LIS3DH_RANGE_16_G
@ LIS3DH_RANGE_8_G
@ LIS3DH_RANGE_2_G
@ LIS3DH_RANGE_4_G
#define LIS3DH_REG_WHOAMI
Device identification register.
#define LIS3DH_REG_CTRL3
CTRL_REG3 [I1_CLICK, I1_AOI1, I1_AOI2, I1_DRDY1, I1_DRDY2, I1_WTM, I1_OVERRUN, –] I1_CLICK CLICK inte...
#define LIS3DH_LSB16_TO_KILO_LSB12
Scalar to convert from 16-bit lsb to 12-bit and divide by 1k to convert from milli-gs to gs.
#define LIS3DH_REG_TEMPCFG
TEMP_CFG_REG Temperature configuration register.
#define LIS3DH_REG_OUT_X_L
X-axis acceleration data.
lis3dh_dataRate_t
Data rate selection Used with register 0x2A (LIS3DH_REG_CTRL_REG1) to set bandwidth.
@ LIS3DH_DATARATE_400_HZ
#define LIS3DH_LSB16_TO_KILO_LSB8
Scalar to convert from 16-bit lsb to 8-bit and divide by 1k to convert from milli-gs to gs.
#define LIS3DH_REG_CLICKCFG
CLICK_CFG [–, –, ZD, ZS, YD, YS, XD, XS] ZD Enable interrupt double CLICK-CLICK on Z axis.
#define LIS3DH_REG_INT1THS
INT1_THS register [0, THS6, THS5, THS4, THS3, THS1, THS0].
#define LIS3DH_REG_CLICKTHS
CLICK_THS [-, Ths6, Ths5, Ths4, Ths3, Ths2, Ths1, Ths0] Ths6-Ths0 CLICK-CLICK threshold.
#define LIS3DH_REG_REFERENCE
REFERENCE/DATACAPTURE.
#define LIS3DH_REG_CLICKSRC
CLICK_SRC [-, IA, DCLICK, SCLICK, Sign, Z, Y, X] IA Interrupt active.
#define LIS3DH_REG_STATUS2
STATUS_REG [ZYXOR, ZOR, YOR, XOR, ZYXDA, ZDA, YDA, XDA] ZYXOR X, Y and Z axis data overrun.
#define LIS3DH_LSB16_TO_KILO_LSB10
Scalar to convert from 16-bit lsb to 10-bit and divide by 1k to convert from milli-gs to gs.
#define LIS3DH_REG_CTRL2
CTRL_REG2 [HPM1, HPM0, HPCF2, HPCF1, FDS, HPCLICK, HPIS2, HPIS1] HPM1-0 High pass filter mode selecti...
#define LIS3DH_REG_TIMELIMIT
TIME_LIMIT [-, TLI6, TLI5, TLI4, TLI3, TLI2, TLI1, TLI0] TLI7-TLI0 CLICK-CLICK Time Limit.
#define LIS3DH_REG_CTRL1
CTRL_REG1 [ODR3, ODR2, ODR1, ODR0, LPen, Zen, Yen, Xen] ODR3-0 Data rate selection.
#define LIS3DH_REG_TIMELATENCY
TIME_LATANCY [-, TLA6, TLIA5, TLA4, TLA3, TLA2, TLA1, TLA0] TLA7-TLA0 CLICK-CLICK Time Latency.
#define LIS3DH_REG_CTRL5
CTRL_REG5 [BOOT, FIFO_EN, –, –, LIR_INT1, D4D_INT1, 0, 0] BOOT Reboot memory content.
#define LIS3DH_REG_OUTADC1_L
1-axis acceleration data.
#define LIS3DH_REG_INT1SRC
INT1_SRC [0, IA, ZH, ZL, YH, YL, XH, XL] IA Interrupt active.
#define LIS3DH_REG_TIMEWINDOW
TIME_WINDOW [TW7, TW6, TW5, TW4, TW3, TW2, TW1, TW0] TW7-TW0 CLICK-CLICK Time window.
#define LIS3DH_REG_CTRL4
CTRL_REG4 [BDU, BLE, FS1, FS0, HR, ST1, ST0, SIM] BDU Block data update.
lis3dh_mode_t
Operational / performance modes.
@ LIS3DH_MODE_HIGH_RESOLUTION
@ LIS3DH_MODE_LOW_POWER
@ LIS3DH_MODE_NORMAL
#define LIS3DH_REG_INT1CFG
INT1_CFG [AOI, 6D, ZHIE/ZUPE, ZLIE/ZDOWNE, YHIE/YUPE, XHIE/XUPE, XLIE/XDOWNE] AOI And/Or combination ...
void delay(int ms)
float z_g
z_g axis value (calculated by selected range)
lis3dh_mode_t getPerformanceMode(void)
Gets the performance mode for the LIS3DH.
SPIClass * SPIinterface
bool begin(uint8_t addr=LIS3DH_DEFAULT_ADDRESS, uint8_t nWAI=0x33)
Setups the HW (reads coefficients values, etc.).
Adafruit_LIS3DH(TwoWire *Wi=&Wire)
Instantiates a new LIS3DH class in I2C.
lis3dh_dataRate_t getDataRate(void)
Gets the data rate for the LIS3DH (controls power consumption).
bool getEvent(sensors_event_t *event)
Gets the most recent sensor event.
void getSensor(sensor_t *sensor)
Gets the sensor_t data.
int16_t z
z axis value
void setPerformanceMode(lis3dh_mode_t mode)
Sets the performance mode for the LIS3DH.
Adafruit_SPIDevice * spi_dev
Pointer to SPI bus interface.
void read(void)
Reads x y z values at once.
Adafruit_I2CDevice * i2c_dev
Pointer to I2C bus interface.
int16_t x
x axis value
float x_g
x_g axis value (calculated by selected range)
int16_t y
y axis value
lis3dh_range_t getRange(void)
Gets the g range for the accelerometer.
uint8_t readAndClearInterrupt(void)
Get uint8_t for INT1 source and clear interrupt.
void configureHighGInterrupt(uint8_t ths, uint8_t dur)
Configure INT1 for high-G threshold interrupt with high-pass filter.
uint8_t getDeviceID(void)
Get Device ID from LIS3DH_REG_WHOAMI.
int16_t readADC(uint8_t a)
Read the auxilary ADC.
void setRange(lis3dh_range_t range)
Sets the g range for the accelerometer.
bool haveNewData(void)
Check to see if new data available.
bool enableDRDY(bool enable_drdy=true, uint8_t int_pin=1)
Enable or disable the Data Ready interupt.
void setDataRate(lis3dh_dataRate_t dataRate)
Sets the data rate for the LIS3DH (controls power consumption).
void setClick(uint8_t c, uint8_t clickthresh, uint8_t timelimit=10, uint8_t timelatency=20, uint8_t timewindow=255)
Set INT to output for single or double click.
uint8_t getClick(void)
Get uint8_t for single or double click.
float y_g
y_g axis value (calculated by selected range)
uint8_t reg
static STAR_MCP3201 adc(MCP3201_CS_PIN, &mcp_spi)