On this page

Sensors

The complete chain from physical quantities to I2C register values


Sensor Interface Selection

InterfaceDistanceSpeedPower ConsumptionMulti-deviceTypical Sensors
I2CPCB100k~1MLow✅ (Address)Most digital sensors
SPIPCBMHzMediumNeeds CSHigh-speed ADC, IMU
UARTLong115k~1MMedium❌ One-to-oneGPS, LiDAR
AnalogPCB-Very LowNTC, LDR, Microphone
1-WireLongSlowVery Low✅ (ROM ID)DS18B20
Pulse/PWMPCB-LowHall effect, Tachometer

Temperature Sensors

NTC Thermistor (Cheapest)

Circuit: Voltage Divider
  Vcc
   │
   R_fixed (10k, 1%)
   │
   ├── ADC Input
   │
   NTC
   │
  GND

Temperature Calculation:
  R_ntc = R_fixed × (Vcc - V_adc) / V_adc
  T = 1 / (1/T25 + ln(R_ntc/R25)/B) - 273.15
  T25 = 298.15K, R25 = Nominal resistance @25°C, B = B constant

Accuracy: ±0.5°C (with accurate B value + 1% resistor), sufficient for most scenarios
Pros: Cheap (a few cents), fast response, small size
Cons: Non-linear, requires MCU ADC, requires lookup table or B-parameter formula

DS18B20 (Digital 1-Wire)

Protocol: 1-Wire (one data line, parasitic power optional)
Accuracy: ±0.5°C (-10~85°C)
Resolution: 9~12 bit
Each unit has a unique 64-bit ROM ID → Multiple devices on one bus

Pros: No ADC needed, factory calibrated, supports long distance, supports multi-point
Cons: Expensive (~¥3), slow (750ms @12bit), complex protocol

Thermocouple (High Temperature)

Principle: Thermoelectric potential generated at the junction of two different metals (Seebeck effect)
Types: Type K (most common, -200~1250°C), J/T/E/N types
Requires: Cold junction compensation (measure cold junction temperature + lookup table)

Chips: MAX6675 (Type K, SPI), MAX31855/MAX31856
Applications: 3D printer hotends, ovens, industrial furnaces

Quick Selection Guide

Scenario                      Recommendation
────────────────────────────────────
Room temp, ±2°C is enough     NTC (Cheapest)
Factory calibrated, no ADC    DS18B20
High temp (>150°C)            Thermocouple (Type K)
High precision (±0.1°C)       PT100/PT1000 (Platinum RTD)
Human body temp               Medical-grade IR
PCB board temp                Built-in sensor or NTC

IMU (Inertial Measurement Unit)

Typical Chips

ChipAccelerometerGyroscopeMagnetometerInterfaceFeatures
MPU60503-axis3-axisI2CClassic entry-level
MPU92503-axis3-axis3-axisI2C/SPI9-axis integrated
ICM-209483-axis3-axis3-axisI2C/SPILow-power 9-axis
BMI1603-axis3-axisI2C/SPIUltra-low power
LSM6DS33-axis3-axisI2C/SPIST mainstream
BNO0553-axis3-axis3-axisI2C/UARTBuilt-in attitude solution!

IMU Outputs

Accelerometer: Acceleration (m/s² or g)
  Static: Z-axis = 1g (gravity)
  Can calculate pitch and roll (using gravity direction)

Gyroscope: Angular velocity (°/s or rad/s)
  Integrate to get angle → but drifts
  Static ideal value = 0 (actual has zero offset)

Magnetometer: Magnetic field strength (μT)
  Can calculate yaw (compass)

9-axis fusion = Accelerometer + Gyro + Magnetometer → Drift-free absolute attitude
  (Gyro is fast but drifts, Accel+Mag are drift-free but slow/noisy)
  → Complementary filter / Kalman filter / Madgwick algorithm

Practical Pitfalls

- MPU6050 needs calibration after power-on (static sampling hundreds of times, take zero offset)
- I2C address conflict (MPU6050 default 0x68, AD0 pulled high becomes 0x69)
- Accelerometer unusable in vibrating environments (requires more complex filtering)
- Magnetometer is extremely susceptible to interference (keep away from motors/currents/ferromagnetic materials!)
- BNO055 saves fusion code but is expensive

Environmental Sensors

Temperature & Humidity

DHT11/DHT22: 1-Wire, cheap but slow (once every 2s), average accuracy
SHT30/31: I2C, ±2%RH, fast, reliable
BME280: I2C/SPI, Temp+Humidity+Pressure, one chip three uses ★Recommended
AHT20: I2C, cheap alternative to SHT30

Pitfalls: DHT11 is severely inaccurate at >80%RH or <10%RH
    SHT/BME series are much better

Barometric Pressure

BMP280/BME280: I2C/SPI, accuracy ±1hPa (±8.5m altitude)
LPS22HB: I2C/SPI, ±0.5hPa
MS5611: I2C/SPI, ±0.15hPa (High precision)

Applications: Altimeter, weather station, drone altitude hold

Light

BH1750: I2C, directly outputs lux value (no calibration needed!)
VEML7700: I2C, wide range, low power
OPT3001: I2C, spectral response matched to human eye

LDR (Light Dependent Resistor): Analog, cheap but non-linear + requires calibration

Air Quality / Gas

CCS811: I2C, eCO2 + TVOC (requires 48h aging, high power consumption)
SGP30: I2C, eCO2 + TVOC (better than CCS811)
PMS5003: UART, Laser PM2.5/PM10 (physical measurement, accurate!)
MH-Z19: UART, NDIR CO2 (physical measurement)
MQ series (MQ-2/MQ-135...): Analog, requires warm-up, inaccurate

Sensor Debugging Routine

1. Power on → Read WHO_AM_I / Device ID register
   Cannot read → Check power supply/soldering/I2C address/pull-up resistors
   Read successfully → Sensor is alive, continue

2. Read raw data → Check if reasonable
   All 0s or 0xFF → Configuration issue (not enabled/conversion not started)
   Data fluctuates wildly → Power noise / Timing issues

3. Compare with reference values
   NTC calculated temp vs room temp → Difference >5°C check B parameter or R_fixed
   IMU static accel ≈ 1g → If not, check range configuration

4. Add filtering
   Simple moving average → Eliminate high-frequency noise
   Median filter → Eliminate sporadic spikes

5. Calibration (if needed)
   Temperature: Ice water 0°C + Boiling water 100°C two-point calibration
   IMU: Six-face calibration (static sampling on each face)

Keywords: NTC, DS18B20, Thermocouple, MPU6050, IMU, BME280, SHT30, I2C Sensor, Calibration