SCL3300 sensor 3-axis inclinometer with angle output and digital SPI interface
Diff: SCL3300.h
- Revision:
- 0:e8ba98a758d0
- Child:
- 1:52b1117c65ea
diff -r 000000000000 -r e8ba98a758d0 SCL3300.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SCL3300.h Mon Aug 15 19:17:10 2022 +0000 @@ -0,0 +1,164 @@ +/****************************************************************************** +SCL3300.h +SCL3300 Arduino Library Header File +David Armstrong +Version 3.2.0 - September 3, 2021 +https://github.com/DavidArmstrong/SCL3300 + +Resources: +Uses SPI.h for SPI operation + +Development environment specifics: +Arduino IDE 1.8.9, 1.8.11, 1.8.12, 1.8.13, 1.8.15 + +This code is released under the [MIT License](http://opensource.org/licenses/MIT). +Please review the LICENSE.md file included with this example. +Distributed as-is; no warranty is given. + +This file prototypes the SCL3300 class, as implemented in SCL3300.cpp + +******************************************************************************/ + +// ensure this library description is only included once +#ifndef __SCL3300_h +#define __SCL3300_h + +// Uncomment the following line for debugging output +//#define debug_scl3300 + +// Need the following define for SAMD processors +#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL) + #define Serial_SCL SERIAL_PORT_USBVIRTUAL +#else + #define Serial_SCL Serial +#endif + +#include <stdint.h> + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include <SPI.h> // SPI library is used for...SPI. + +#ifndef SCL3300_SPI_CLOCK +#ifdef ARDUINO_ARCH_ESP32 +#define SCL3300_SPI_CLOCK 4000000 +#else +#define SCL3300_SPI_CLOCK 4000000 +#endif +#endif + +#ifndef SCL3300_SPI_MODE +#define SCL3300_SPI_MODE SPI_MODE0 +#endif + +//Define allowed commands to SCL3300 inclinometer +#define RdAccX 0x040000f7 +#define RdAccY 0x080000fd +#define RdAccZ 0x0c0000fb +#define RdSTO 0x100000e9 +#define EnaAngOut 0xb0001f6f +#define RdAngX 0x240000c7 +#define RdAngY 0x280000cd +#define RdAngZ 0x2c0000cb +#define RdTemp 0x140000ef +#define RdStatSum 0x180000e5 +#define RdErrFlg1 0x1c0000e3 +#define RdErrFlg2 0x200000c1 +#define RdCMD 0x340000df +#define ChgMode1 0xb400001f +#define ChgMode2 0xb4000102 +#define ChgMode3 0xb4000225 +#define ChgMode4 0xb4000338 +#define SetPwrDwn 0xb400046b +#define WakeUp 0xb400001f +#define SWreset 0xb4002098 +#define RdWHOAMI 0x40000091 +#define RdSer1 0x640000a7 +#define RdSer2 0x680000AD +#define RdCurBank 0x7c0000b3 +#define SwtchBnk0 0xfc000073 +#define SwtchBnk1 0xfc00016e + +// Structure to hold raw sensor data +// We need to populate all this every time we read a set of data +struct SCL3300data { + public: + int16_t AccX; + int16_t AccY; + int16_t AccZ; + int16_t STO; + int16_t TEMP; + int16_t AngX; + int16_t AngY; + int16_t AngZ; + uint16_t StatusSum; + uint16_t WHOAMI; +}; + +// SCL3300 library interface description +class SCL3300 { + // user-accessible "public" interface + public: + SPISettings spiSettings{SCL3300_SPI_CLOCK, MSBFIRST, SCL3300_SPI_MODE}; + + SCL3300data sclData; + boolean setMode(int mode); + boolean begin(void); + boolean begin(uint8_t csPin); + boolean begin(SPIClass &spiPort, uint8_t csPin); + //Functions to retrieve sensor data + boolean isConnected(); + boolean available(void); + void setFastReadMode(); + void stopFastReadMode(); + double getCalculatedAngleX(void); + double getCalculatedAngleY(void); + double getCalculatedAngleZ(void); + double getTiltLevelOffsetAngleX(void); + double getTiltLevelOffsetAngleY(void); + double getTiltLevelOffsetAngleZ(void); + double getCalculatedAccelerometerX(void); + double getCalculatedAccelerometerY(void); + double getCalculatedAccelerometerZ(void); + uint16_t getErrFlag1(void); + uint16_t getErrFlag2(void); + unsigned long getSerialNumber(void); + double getCalculatedTemperatureCelsius(void); + double getCalculatedTemperatureFarenheit(void); + double angle(int16_t SCL3300_ANG); //two's complement value expected + double acceleration(int16_t SCL3300_ACC); + bool crcerr, statuserr; + uint16_t powerDownMode(void); + uint16_t WakeMeUp(void); + uint16_t reset(void); + + // library-accessible "private" interface + private: + SPIClass *_spiPort = NULL; //The generic connection to user's chosen spi hardware + + uint8_t scl3300_csPin = 10; // Default SPI chip select pin + uint8_t scl3300_mode = 4; // Default inclinometer mode + uint8_t SCL3300_CMD, SCL3300_CRC; + uint16_t SCL3300_DATA; + double Temperature, X_angle, Y_angle, Z_angle; + bool setFastRead = false; + + void initSPI(); + void beginTransmission(); + void endTransmission(); + uint8_t CalculateCRC(uint32_t Data); + uint8_t CRC8(uint8_t BitValue, uint8_t SCL3300_CRC); + unsigned long transfer(unsigned long value); + + union FourByte { + unsigned long bit32; + unsigned int bit16[2]; + unsigned char bit8[4]; + }; + unsigned long modeCMD[5] = { 0, ChgMode1, ChgMode2, ChgMode3, ChgMode4 }; +}; +#endif