Accelerometer¶
I2C address is 0x19
The demo starts with a WhoAmI check that should return 0x33.
Then, initializes the sensor with the following configuration:
Step | Register | Value |
---|---|---|
1 | 0x23 CTRL_REG4 | 0x80 Block data update |
2 | 0x20 CTRL_REG1 | 0x2f 10 Hz, LPM, XYZ |
or | 0x1f 1Hz, LPM, XYZ | |
3 | 0x1f TEMP_CFG_REG | 0x00 Temperature sensor disabled |
The main loop follows with the following sequence:
Step | Register | Value |
---|---|---|
Read | 0x27 STATUS_REG | 0x0f means new XYZ data is available |
Read | 0xa8 XYZ OUT_REG (MSB bit set) | XYZ data |
The rest of the code is for reorienting the EPD screen based on the accelerometer XYZ values.
// Accelerometer
#define ACC_I2C 0x19
uint8_t bufferWrite[8] = { 0 };
uint8_t bufferRead[8] = { 0 };
typedef union
{
int16_t i16[3];
uint8_t ui8[6];
} xyz_i16_ui8_t;
xyz_i16_ui8_t myXYZ;
void setup()
{
bufferWrite[0] = 0x0f; // WhoAmI, should be 0x33
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 1, bufferRead, 1);
mySerial.println("I2C read...");
mySerial.printf("WhoAmI = 0x%02x", bufferRead[0]);
mySerial.println();
bufferWrite[0] = 0x23;
bufferWrite[1] = 0x80; // Block data update
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 2, bufferRead, 0);
bufferWrite[0] = 0x20;
// bufferWrite[1] = 0x2f; // 10 Hz, LPM, XYZ
bufferWrite[1] = 0x1f; // 1 Hz, LPM, XYZ
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 2, bufferRead, 0);
bufferWrite[0] = 0x1f;
bufferWrite[1] = 0x00; // No temperature
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 2, bufferRead, 0);
bufferRead[0] = 0x00;
while ((bufferRead[0] & 0x0f) != 0x0f)
{
bufferWrite[0] = 0x27; // Status
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 1, bufferRead, 1);
mySerial.print(".");
delay(8);
}
mySerial.println();
}
void loop()
{
bufferWrite[0] = 0x27; // Status
bufferRead[0] = 0x00;
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 1, bufferRead, 1);
if ((bufferRead[0] & 0x0f) == 0x0f)
{
bufferWrite[0] = 0xa8; // xyz, MSB
bufferRead[0] = 0x00;
hV_HAL_Wire_transfer(ACC_I2C, bufferWrite, 1, myXYZ.ui8, 6);
aX = myXYZ.i16[0] / 16;
aY = myXYZ.i16[1] / 16;
aZ = myXYZ.i16[2] / 16;
}
else
{
mySerial.print(".");
delay(8);
}
delay(1000);
}
The full demo can be found here: https://github.com/PervasiveDisplays/PDLS_EXT4_Basic_Matter/tree/main/examples/EXT4