不是湿度传感器
LPS22HB 只测气压和芯片内部温度。软件界面出现“湿度”通常是通用界面或传感器型号不匹配。
LPS22HB 只测气压和芯片内部温度。软件界面出现“湿度”通常是通用界面或传感器型号不匹配。
常见地址是 0x5C 或 0x5D。扫不到时先查供电、共地、SDA/SCL 和 CS 是否拉高。
芯片本体供电为 1.7~3.6V。模块是否能接 5V,要看板载稳压/电平转换和丝印。
Wiring
使用 I2C 时,CS 需要为高电平;SDO/SA0 用来选择地址,接 GND 常见为 0x5C,接 VDD 常见为 0x5D。
| LPS22HB 模块 | Arduino UNO/Nano | ESP32 |
|---|---|---|
| VCC / VIN | 5V 或 3.3V,以模块丝印为准 | 优先 3.3V |
| GND | GND | GND |
| SDA | A4 | GPIO21,或程序自定义 |
| SCL | A5 | GPIO22,或程序自定义 |
| CS | 高电平 / VCC | 高电平 / VCC |
| SDO / SA0 | 地址选择:0x5C / 0x5D | 地址选择:0x5C / 0x5D |
| INT / DRDY | 可不接 | 可不接 |
Data
模块读的是当前位置的绝对气压,不一定和天气 App 的海平面修正气压完全一致。
1 hPa = 1 mbar = 100 Pa。海平面附近常见约 1013 hPa,海拔越高绝对气压越低。
如果软件显示 7640,可能是 764.0 mmHg 或放大 10 倍显示。764.0 mmHg 约等于 1018.6 hPa,属于正常大气压范围。
有些软件为了避免小数,会把温度放大 10 倍显示。LPS22HB 温度主要用于芯片内部补偿,不等同于专业环境温度探头。
| 项目 | 换算/判断 |
|---|---|
| 压力原始值 | pressure_hPa = PRESS_OUT_raw / 4096.0 |
| 温度原始值 | temperature_C = TEMP_OUT_raw / 100.0 |
| 压力寄存器 | 0x28 / 0x29 / 0x2A,低字节在前 |
| 温度寄存器 | 0x2B / 0x2C,低字节在前 |
Arduino Code
先用 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
先检查 VCC/GND、SDA/SCL 是否接反;Arduino UNO 为 A4/A5,ESP32 常用 GPIO21/GPIO22;再确认 CS 是否为高电平,并分别试 0x5C 和 0x5D。
可能是地址选错、读到其它 I2C 设备、CS 状态错误、供电不稳定或程序读寄存器方式错误。
LPS22HB 不支持湿度测量。湿度栏多半是通用上位机界面,不能当作 LPS22HB 的正常输出。
模块读当前位置绝对气压,天气 App 常显示海平面修正气压;海拔、室内外和天气变化都会造成差异。
Customer Reply
References