Skip to content

Accelerometer

I2C address is 0x19

The demo starts with a WhoAmI check that should return 0x33.

Then, initializes the sensor with the following configuration:

StepRegisterValue
10x23 CTRL_REG40x80 Block data update
20x20 CTRL_REG10x2f 10 Hz, LPM, XYZ
or0x1f 1Hz, LPM, XYZ
30x1f TEMP_CFG_REG0x00 Temperature sensor disabled

The main loop follows with the following sequence:

StepRegisterValue
Read0x27 STATUS_REG0x0f means new XYZ data is available
Read0xa8 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