1---2name: sensor-integration3description: Integrate hardware sensors — I2C/SPI drivers, calibration, signal filtering, and sensor fusion algorithms4---56## When to activate78- Writing drivers for I2C/SPI sensors9- Implementing sensor calibration routines10- Designing signal filtering pipelines (Kalman, moving average, complementary)11- Building sensor fusion algorithms (IMU + magnetometer)12- Debugging noisy or unreliable sensor readings1314## When NOT to use1516- For camera/vision sensors (different pipeline)17- For analog-only sensor circuits18- For sensor hardware selection/procurement1920## Instructions21221. **Interface selection.** I2C (simple, shared bus, slow), SPI (fast, full-duplex, more pins), UART (simple, point-to-point).232. **Driver implementation.** Init sequence (from datasheet), read register, write register, data conversion (raw → engineering units).243. **Calibration.** Factory calibration (read from sensor), user calibration (zero-offset, scale factor), temperature compensation.254. **Filtering.** Moving average (simple), Low-pass IIR (efficient), Kalman filter (optimal for noisy + model), Complementary filter (IMU fusion).265. **Sensor fusion.** Combine accelerometer + gyroscope (complementary/Kalman). Add magnetometer for absolute heading. Quaternion representation.276. **Sampling strategy.** Oversampling + decimation for noise reduction. Match sample rate to signal bandwidth (Nyquist).287. **Error handling.** I2C NACK detection, timeout, CRC validation, range checking, stuck-at detection.2930## Example3132```c33// BME280 temperature reading with calibration34float read_temperature(BME280 *dev) {35 uint8_t raw[3];36 i2c_read(dev->addr, 0xFA, raw, 3); // temp registers37 38 int32_t adc_T = (raw[0] << 12) | (raw[1] << 4) | (raw[2] >> 4);39 40 // Compensation formula from datasheet41 int32_t var1 = ((((adc_T >> 3) - (dev->cal.dig_T1 << 1))) * dev->cal.dig_T2) >> 11;42 int32_t var2 = (((((adc_T >> 4) - dev->cal.dig_T1) * ((adc_T >> 4) - dev->cal.dig_T1)) >> 12) * dev->cal.dig_T3) >> 14;43 44 return ((var1 + var2) * 5 + 128) / 25600.0f; // Temperature in °C45}4647// Complementary filter for IMU orientation48float angle = 0.98f * (angle + gyro_rate * dt) + 0.02f * accel_angle;49```