SCL3300 sensor 3-axis inclinometer with angle output and digital SPI interface

Committer:
sameera0824
Date:
Mon Aug 15 19:17:10 2022 +0000
Revision:
0:e8ba98a758d0
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sameera0824 0:e8ba98a758d0 1 /******************************************************************************
sameera0824 0:e8ba98a758d0 2 SCL3300.h
sameera0824 0:e8ba98a758d0 3 SCL3300 Arduino Library Header File
sameera0824 0:e8ba98a758d0 4 David Armstrong
sameera0824 0:e8ba98a758d0 5 Version 3.2.0 - September 3, 2021
sameera0824 0:e8ba98a758d0 6 https://github.com/DavidArmstrong/SCL3300
sameera0824 0:e8ba98a758d0 7
sameera0824 0:e8ba98a758d0 8 Resources:
sameera0824 0:e8ba98a758d0 9 Uses SPI.h for SPI operation
sameera0824 0:e8ba98a758d0 10
sameera0824 0:e8ba98a758d0 11 Development environment specifics:
sameera0824 0:e8ba98a758d0 12 Arduino IDE 1.8.9, 1.8.11, 1.8.12, 1.8.13, 1.8.15
sameera0824 0:e8ba98a758d0 13
sameera0824 0:e8ba98a758d0 14 This code is released under the [MIT License](http://opensource.org/licenses/MIT).
sameera0824 0:e8ba98a758d0 15 Please review the LICENSE.md file included with this example.
sameera0824 0:e8ba98a758d0 16 Distributed as-is; no warranty is given.
sameera0824 0:e8ba98a758d0 17
sameera0824 0:e8ba98a758d0 18 This file prototypes the SCL3300 class, as implemented in SCL3300.cpp
sameera0824 0:e8ba98a758d0 19
sameera0824 0:e8ba98a758d0 20 ******************************************************************************/
sameera0824 0:e8ba98a758d0 21
sameera0824 0:e8ba98a758d0 22 // ensure this library description is only included once
sameera0824 0:e8ba98a758d0 23 #ifndef __SCL3300_h
sameera0824 0:e8ba98a758d0 24 #define __SCL3300_h
sameera0824 0:e8ba98a758d0 25
sameera0824 0:e8ba98a758d0 26 // Uncomment the following line for debugging output
sameera0824 0:e8ba98a758d0 27 //#define debug_scl3300
sameera0824 0:e8ba98a758d0 28
sameera0824 0:e8ba98a758d0 29 // Need the following define for SAMD processors
sameera0824 0:e8ba98a758d0 30 #if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
sameera0824 0:e8ba98a758d0 31 #define Serial_SCL SERIAL_PORT_USBVIRTUAL
sameera0824 0:e8ba98a758d0 32 #else
sameera0824 0:e8ba98a758d0 33 #define Serial_SCL Serial
sameera0824 0:e8ba98a758d0 34 #endif
sameera0824 0:e8ba98a758d0 35
sameera0824 0:e8ba98a758d0 36 #include <stdint.h>
sameera0824 0:e8ba98a758d0 37
sameera0824 0:e8ba98a758d0 38 #if defined(ARDUINO) && ARDUINO >= 100
sameera0824 0:e8ba98a758d0 39 #include "Arduino.h"
sameera0824 0:e8ba98a758d0 40 #else
sameera0824 0:e8ba98a758d0 41 #include "WProgram.h"
sameera0824 0:e8ba98a758d0 42 #endif
sameera0824 0:e8ba98a758d0 43
sameera0824 0:e8ba98a758d0 44 #include <SPI.h> // SPI library is used for...SPI.
sameera0824 0:e8ba98a758d0 45
sameera0824 0:e8ba98a758d0 46 #ifndef SCL3300_SPI_CLOCK
sameera0824 0:e8ba98a758d0 47 #ifdef ARDUINO_ARCH_ESP32
sameera0824 0:e8ba98a758d0 48 #define SCL3300_SPI_CLOCK 4000000
sameera0824 0:e8ba98a758d0 49 #else
sameera0824 0:e8ba98a758d0 50 #define SCL3300_SPI_CLOCK 4000000
sameera0824 0:e8ba98a758d0 51 #endif
sameera0824 0:e8ba98a758d0 52 #endif
sameera0824 0:e8ba98a758d0 53
sameera0824 0:e8ba98a758d0 54 #ifndef SCL3300_SPI_MODE
sameera0824 0:e8ba98a758d0 55 #define SCL3300_SPI_MODE SPI_MODE0
sameera0824 0:e8ba98a758d0 56 #endif
sameera0824 0:e8ba98a758d0 57
sameera0824 0:e8ba98a758d0 58 //Define allowed commands to SCL3300 inclinometer
sameera0824 0:e8ba98a758d0 59 #define RdAccX 0x040000f7
sameera0824 0:e8ba98a758d0 60 #define RdAccY 0x080000fd
sameera0824 0:e8ba98a758d0 61 #define RdAccZ 0x0c0000fb
sameera0824 0:e8ba98a758d0 62 #define RdSTO 0x100000e9
sameera0824 0:e8ba98a758d0 63 #define EnaAngOut 0xb0001f6f
sameera0824 0:e8ba98a758d0 64 #define RdAngX 0x240000c7
sameera0824 0:e8ba98a758d0 65 #define RdAngY 0x280000cd
sameera0824 0:e8ba98a758d0 66 #define RdAngZ 0x2c0000cb
sameera0824 0:e8ba98a758d0 67 #define RdTemp 0x140000ef
sameera0824 0:e8ba98a758d0 68 #define RdStatSum 0x180000e5
sameera0824 0:e8ba98a758d0 69 #define RdErrFlg1 0x1c0000e3
sameera0824 0:e8ba98a758d0 70 #define RdErrFlg2 0x200000c1
sameera0824 0:e8ba98a758d0 71 #define RdCMD 0x340000df
sameera0824 0:e8ba98a758d0 72 #define ChgMode1 0xb400001f
sameera0824 0:e8ba98a758d0 73 #define ChgMode2 0xb4000102
sameera0824 0:e8ba98a758d0 74 #define ChgMode3 0xb4000225
sameera0824 0:e8ba98a758d0 75 #define ChgMode4 0xb4000338
sameera0824 0:e8ba98a758d0 76 #define SetPwrDwn 0xb400046b
sameera0824 0:e8ba98a758d0 77 #define WakeUp 0xb400001f
sameera0824 0:e8ba98a758d0 78 #define SWreset 0xb4002098
sameera0824 0:e8ba98a758d0 79 #define RdWHOAMI 0x40000091
sameera0824 0:e8ba98a758d0 80 #define RdSer1 0x640000a7
sameera0824 0:e8ba98a758d0 81 #define RdSer2 0x680000AD
sameera0824 0:e8ba98a758d0 82 #define RdCurBank 0x7c0000b3
sameera0824 0:e8ba98a758d0 83 #define SwtchBnk0 0xfc000073
sameera0824 0:e8ba98a758d0 84 #define SwtchBnk1 0xfc00016e
sameera0824 0:e8ba98a758d0 85
sameera0824 0:e8ba98a758d0 86 // Structure to hold raw sensor data
sameera0824 0:e8ba98a758d0 87 // We need to populate all this every time we read a set of data
sameera0824 0:e8ba98a758d0 88 struct SCL3300data {
sameera0824 0:e8ba98a758d0 89 public:
sameera0824 0:e8ba98a758d0 90 int16_t AccX;
sameera0824 0:e8ba98a758d0 91 int16_t AccY;
sameera0824 0:e8ba98a758d0 92 int16_t AccZ;
sameera0824 0:e8ba98a758d0 93 int16_t STO;
sameera0824 0:e8ba98a758d0 94 int16_t TEMP;
sameera0824 0:e8ba98a758d0 95 int16_t AngX;
sameera0824 0:e8ba98a758d0 96 int16_t AngY;
sameera0824 0:e8ba98a758d0 97 int16_t AngZ;
sameera0824 0:e8ba98a758d0 98 uint16_t StatusSum;
sameera0824 0:e8ba98a758d0 99 uint16_t WHOAMI;
sameera0824 0:e8ba98a758d0 100 };
sameera0824 0:e8ba98a758d0 101
sameera0824 0:e8ba98a758d0 102 // SCL3300 library interface description
sameera0824 0:e8ba98a758d0 103 class SCL3300 {
sameera0824 0:e8ba98a758d0 104 // user-accessible "public" interface
sameera0824 0:e8ba98a758d0 105 public:
sameera0824 0:e8ba98a758d0 106 SPISettings spiSettings{SCL3300_SPI_CLOCK, MSBFIRST, SCL3300_SPI_MODE};
sameera0824 0:e8ba98a758d0 107
sameera0824 0:e8ba98a758d0 108 SCL3300data sclData;
sameera0824 0:e8ba98a758d0 109 boolean setMode(int mode);
sameera0824 0:e8ba98a758d0 110 boolean begin(void);
sameera0824 0:e8ba98a758d0 111 boolean begin(uint8_t csPin);
sameera0824 0:e8ba98a758d0 112 boolean begin(SPIClass &spiPort, uint8_t csPin);
sameera0824 0:e8ba98a758d0 113 //Functions to retrieve sensor data
sameera0824 0:e8ba98a758d0 114 boolean isConnected();
sameera0824 0:e8ba98a758d0 115 boolean available(void);
sameera0824 0:e8ba98a758d0 116 void setFastReadMode();
sameera0824 0:e8ba98a758d0 117 void stopFastReadMode();
sameera0824 0:e8ba98a758d0 118 double getCalculatedAngleX(void);
sameera0824 0:e8ba98a758d0 119 double getCalculatedAngleY(void);
sameera0824 0:e8ba98a758d0 120 double getCalculatedAngleZ(void);
sameera0824 0:e8ba98a758d0 121 double getTiltLevelOffsetAngleX(void);
sameera0824 0:e8ba98a758d0 122 double getTiltLevelOffsetAngleY(void);
sameera0824 0:e8ba98a758d0 123 double getTiltLevelOffsetAngleZ(void);
sameera0824 0:e8ba98a758d0 124 double getCalculatedAccelerometerX(void);
sameera0824 0:e8ba98a758d0 125 double getCalculatedAccelerometerY(void);
sameera0824 0:e8ba98a758d0 126 double getCalculatedAccelerometerZ(void);
sameera0824 0:e8ba98a758d0 127 uint16_t getErrFlag1(void);
sameera0824 0:e8ba98a758d0 128 uint16_t getErrFlag2(void);
sameera0824 0:e8ba98a758d0 129 unsigned long getSerialNumber(void);
sameera0824 0:e8ba98a758d0 130 double getCalculatedTemperatureCelsius(void);
sameera0824 0:e8ba98a758d0 131 double getCalculatedTemperatureFarenheit(void);
sameera0824 0:e8ba98a758d0 132 double angle(int16_t SCL3300_ANG); //two's complement value expected
sameera0824 0:e8ba98a758d0 133 double acceleration(int16_t SCL3300_ACC);
sameera0824 0:e8ba98a758d0 134 bool crcerr, statuserr;
sameera0824 0:e8ba98a758d0 135 uint16_t powerDownMode(void);
sameera0824 0:e8ba98a758d0 136 uint16_t WakeMeUp(void);
sameera0824 0:e8ba98a758d0 137 uint16_t reset(void);
sameera0824 0:e8ba98a758d0 138
sameera0824 0:e8ba98a758d0 139 // library-accessible "private" interface
sameera0824 0:e8ba98a758d0 140 private:
sameera0824 0:e8ba98a758d0 141 SPIClass *_spiPort = NULL; //The generic connection to user's chosen spi hardware
sameera0824 0:e8ba98a758d0 142
sameera0824 0:e8ba98a758d0 143 uint8_t scl3300_csPin = 10; // Default SPI chip select pin
sameera0824 0:e8ba98a758d0 144 uint8_t scl3300_mode = 4; // Default inclinometer mode
sameera0824 0:e8ba98a758d0 145 uint8_t SCL3300_CMD, SCL3300_CRC;
sameera0824 0:e8ba98a758d0 146 uint16_t SCL3300_DATA;
sameera0824 0:e8ba98a758d0 147 double Temperature, X_angle, Y_angle, Z_angle;
sameera0824 0:e8ba98a758d0 148 bool setFastRead = false;
sameera0824 0:e8ba98a758d0 149
sameera0824 0:e8ba98a758d0 150 void initSPI();
sameera0824 0:e8ba98a758d0 151 void beginTransmission();
sameera0824 0:e8ba98a758d0 152 void endTransmission();
sameera0824 0:e8ba98a758d0 153 uint8_t CalculateCRC(uint32_t Data);
sameera0824 0:e8ba98a758d0 154 uint8_t CRC8(uint8_t BitValue, uint8_t SCL3300_CRC);
sameera0824 0:e8ba98a758d0 155 unsigned long transfer(unsigned long value);
sameera0824 0:e8ba98a758d0 156
sameera0824 0:e8ba98a758d0 157 union FourByte {
sameera0824 0:e8ba98a758d0 158 unsigned long bit32;
sameera0824 0:e8ba98a758d0 159 unsigned int bit16[2];
sameera0824 0:e8ba98a758d0 160 unsigned char bit8[4];
sameera0824 0:e8ba98a758d0 161 };
sameera0824 0:e8ba98a758d0 162 unsigned long modeCMD[5] = { 0, ChgMode1, ChgMode2, ChgMode3, ChgMode4 };
sameera0824 0:e8ba98a758d0 163 };
sameera0824 0:e8ba98a758d0 164 #endif