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