LPS22HB · MEMS Pressure Sensor

LPS22HB 气压压力传感器模块资料

LPS22HB 是 ST 的 MEMS 数字绝对压力传感器,可读气压和芯片内部温度。它不是湿度传感器,不能测空气湿度。

Quick Facts

  • SKU:01624 / R1409-2 / 0694
  • 接口:I2C / SPI
  • I2C 地址:0x5C 或 0x5D
  • 压力范围:260 ~ 1260 hPa
  • WHO_AM_I:0xB1

不是湿度传感器

LPS22HB 只测气压和芯片内部温度。软件界面出现“湿度”通常是通用界面或传感器型号不匹配。

先扫 I2C 地址

常见地址是 0x5C 或 0x5D。扫不到时先查供电、共地、SDA/SCL 和 CS 是否拉高。

注意 5V 风险

芯片本体供电为 1.7~3.6V。模块是否能接 5V,要看板载稳压/电平转换和丝印。

Wiring

Arduino / ESP32 I2C 接线

使用 I2C 时,CS 需要为高电平;SDO/SA0 用来选择地址,接 GND 常见为 0x5C,接 VDD 常见为 0x5D。

LPS22HB Arduino ESP32 I2C 接线图
LPS22HB 模块Arduino UNO/NanoESP32
VCC / VIN5V 或 3.3V,以模块丝印为准优先 3.3V
GNDGNDGND
SDAA4GPIO21,或程序自定义
SCLA5GPIO22,或程序自定义
CS高电平 / VCC高电平 / VCC
SDO / SA0地址选择:0x5C / 0x5D地址选择:0x5C / 0x5D
INT / DRDY可不接可不接

Data

正常数据怎么看

模块读的是当前位置的绝对气压,不一定和天气 App 的海平面修正气压完全一致。

气压单位

1 hPa = 1 mbar = 100 Pa。海平面附近常见约 1013 hPa,海拔越高绝对气压越低。

7640 不一定是 7640 hPa

如果软件显示 7640,可能是 764.0 mmHg 或放大 10 倍显示。764.0 mmHg 约等于 1018.6 hPa,属于正常大气压范围。

279 可能是 27.9℃

有些软件为了避免小数,会把温度放大 10 倍显示。LPS22HB 温度主要用于芯片内部补偿,不等同于专业环境温度探头。

项目换算/判断
压力原始值pressure_hPa = PRESS_OUT_raw / 4096.0
温度原始值temperature_C = TEMP_OUT_raw / 100.0
压力寄存器0x28 / 0x29 / 0x2A,低字节在前
温度寄存器0x2B / 0x2C,低字节在前

Arduino Code

Wire 原始寄存器读取例程

先用 I2C Scanner 扫到 0x5C 或 0x5D,再用下面例程读 WHO_AM_I、气压和温度。

#include <Wire.h>

#define LPS22HB_ADDR 0x5C  // 如果扫描到 0x5D,就改成 0x5D

uint8_t readReg(uint8_t reg) {
  Wire.beginTransmission(LPS22HB_ADDR);
  Wire.write(reg);
  Wire.endTransmission(false);
  Wire.requestFrom(LPS22HB_ADDR, (uint8_t)1);
  return Wire.available() ? Wire.read() : 0xFF;
}

void writeReg(uint8_t reg, uint8_t value) {
  Wire.beginTransmission(LPS22HB_ADDR);
  Wire.write(reg);
  Wire.write(value);
  Wire.endTransmission();
}

int32_t readPressureRaw() {
  uint8_t xl = readReg(0x28);
  uint8_t l = readReg(0x29);
  uint8_t h = readReg(0x2A);
  int32_t raw = ((int32_t)h << 16) | ((int32_t)l << 8) | xl;
  if (raw & 0x00800000) raw |= 0xFF000000;
  return raw;
}

int16_t readTemperatureRaw() {
  uint8_t l = readReg(0x2B);
  uint8_t h = readReg(0x2C);
  return (int16_t)((h << 8) | l);
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  // ESP32 可用:Wire.begin(21, 22);
  delay(200);

  uint8_t id = readReg(0x0F);
  Serial.print("WHO_AM_I = 0x");
  Serial.println(id, HEX);

  writeReg(0x10, 0x10); // CTRL_REG1, ODR=1Hz 连续测量
}

void loop() {
  float pressure_hPa = readPressureRaw() / 4096.0;
  float temp_C = readTemperatureRaw() / 100.0;

  Serial.print("Pressure: ");
  Serial.print(pressure_hPa, 2);
  Serial.println(" hPa");

  Serial.print("Temperature: ");
  Serial.print(temp_C, 2);
  Serial.println(" C");
  Serial.println();
  delay(1000);
}

Troubleshooting

常见问题排查

I2C 扫描不到怎么办?

先检查 VCC/GND、SDA/SCL 是否接反;Arduino UNO 为 A4/A5,ESP32 常用 GPIO21/GPIO22;再确认 CS 是否为高电平,并分别试 0x5C 和 0x5D。

WHO_AM_I 不是 0xB1

可能是地址选错、读到其它 I2C 设备、CS 状态错误、供电不稳定或程序读寄存器方式错误。

软件有湿度栏怎么办?

LPS22HB 不支持湿度测量。湿度栏多半是通用上位机界面,不能当作 LPS22HB 的正常输出。

和天气 App 气压不一致

模块读当前位置绝对气压,天气 App 常显示海平面修正气压;海拔、室内外和天气变化都会造成差异。

Customer Reply

淘宝客户简短话术

您好,LPS22HB 是气压传感器,正常气压一般是几百到一千多 hPa。如果软件显示 7640,一般不是 7640 hPa,可能是放大 10 倍或按 764.0 mmHg 显示,换算大约是 1018 hPa,属于正常大气压范围。

您好,LPS22HB 本身只能测气压和芯片内部温度,不是湿度传感器,不能测湿度。软件里如果有湿度栏,可能是通用界面或软件型号选择不匹配,请先用 LPS22HB 对应的 I2C 扫描和读取例程测试。

您好,LPS22HB 常见 I2C 地址是 0x5C 或 0x5D。请先检查 VCC/GND、SDA/SCL 是否接反,Arduino UNO 是 A4/A5,ESP32 常用 21/22;使用 I2C 时 CS 脚需要为高电平。

References

官方与公开资料