ESP32 + ADS1015 + 0.96" OLED 压力监测固件
本项目用于通过 ESP32 读取 ADS1015 外接的模拟压力传感器(量程 00.2 MPa,输出 0.54.5V),并在 0.96 英寸 SSD1306 OLED 上实时显示压力值。工程基于 PlatformIO 与 Arduino 框架。
硬件准备
- 主控: ESP32-DevKitC 或兼容开发板(3.3V 逻辑)
- ADC: ADS1015(I2C,建议与 ESP32 I2C 速率 400kHz)
- 显示: 0.96" SSD1306 OLED I2C(常用地址 0x3C)
- 压力传感器: 供电 5V,输出 0.5
4.5V(量程 00.2MPa) - 若 ADS1015 供电为 3.3V,请务必加入分压或限压,避免 4.5V 直接进入 ADC!
接线说明
默认 I2C 引脚为 SDA=21
, SCL=22
(可在 src/main.cpp
里通过 I2C_SDA_PIN/I2C_SCL_PIN
修改)。
- I2C 连接(共用总线)
-
ESP32
3V3
→ SSD1306VCC
-
ESP32
GND
→ SSD1306GND
-
ESP32
GPIO21 (SDA)
→ SSD1306SDA
-
ESP32
GPIO22 (SCL)
→ SSD1306SCL
-
ESP32
3V3
或5V
→ ADS1015VDD
(推荐 3.3V 上拉逻辑更安全) -
ESP32
GND
→ ADS1015GND
-
ESP32
GPIO21 (SDA)
→ ADS1015SDA
-
ESP32
GPIO22 (SCL)
→ ADS1015SCL
-
ADS1015
ADDR
→GND
(地址 0x48,若接到 VDD/或其它,地址会不同)
- 传感器-ADC 接线(单端 A0)
- 传感器
V+ (5V)
→ 5V 电源 - 传感器
GND
→ 系统 GND - 传感器
OUT (0.5~4.5V)
→ 分压网络 → ADS1015A0
分压建议
- 如果 ADS1015 以 3.3V 供电,
A0
最大输入不应超过参考范围(按增益配置)。建议做分压,例如R1=10kΩ
与R2=10kΩ
(1:1 分压),将 4.5V 降到约 2.25V。 - 分压连接:传感器输出 →
R1
→ 节点(接A0
) →R2
→ GND。 - 在代码顶部可设置电阻值用于反推传感器端电压:
R1_OHMS
、R2_OHMS
。
软件与依赖
- PlatformIO(VSCode/Cursor)
- 依赖库(
platformio.ini
已配置):Adafruit ADS1X15
Adafruit SSD1306
Adafruit GFX Library
构建与烧录
- 打开本工程目录。
- 连接 ESP32 到电脑。
- 选择合适的串口,执行编译与上传(PlatformIO: Upload)。
- 打开串口监视器,波特率
115200
。
屏幕显示与功能
- 顶部状态条显示功能名与状态(OK/ERR)。
- 中央大号字体显示实时压力值(单位 MPa)。
- 底部显示传感器端电压 Vs,并提供相对满量程的进度条。
参数与校准
在 src/main.cpp
顶部可配置:
SENSOR_MIN_V
/SENSOR_MAX_V
:传感器 0MPa 与满量程的电压(默认 0.5V~4.5V)。PRESSURE_FULL_SCALE_MPA
:满量程压力(默认 0.2MPa)。ZERO_TRIM_V
:零点微调(V)。SPAN_SCALE
:跨度微调(倍率)。R1_OHMS
/R2_OHMS
:分压电阻值(未分压则设为 0)。ADS_GAIN
:ADS1015 增益(默认GAIN_ONE
±4.096V;若 ADC 端电压可能更高可改为GAIN_TWOTHIRDS
)。
校准步骤建议:
- 在无压力状态,观察 Vs 是否接近
SENSOR_MIN_V
,必要时调整ZERO_TRIM_V
至读数接近 0MPa。 - 在已知压力点(如 0.1MPa),调节
SPAN_SCALE
使显示读数接近真实值。 - 校准完成后记录参数,固定使用。
故障与排查
- 屏幕显示
ADS1015 MISSING
:I2C 地址、接线或供电问题。 - 屏幕显示
SENSOR INVALID
:采样电压无效或超出范围,检查分压与增益设置。 - 串口输出含有
[WARN] ADC read invalid
:原始电压异常(可能为过压、浮空、断线)。
许可证
MIT
HTTP 上报与本地测试
- 固件每 5 秒会向
http://<SERVER_HOST>:<SERVER_PORT><SERVER_PATH>
发送 JSON:
curl -X POST http://localhost:5000/data \
-H "Content-Type: application/json" \
-d '{"device_id":"test","timestamp":"2023-01-01T12:00:00Z","pressure":0.1,"voltage":2.5}'
- 在
src/main.cpp
中通过以下宏配置:SERVER_HOST
(建议用电脑的局域网 IP,不要用 localhost)、SERVER_PORT
(默认 5000)、SERVER_PATH
(默认 /data)、DEVICE_ID
。 - 同时设置
WIFI_SSID
、WIFI_PASSWORD
。
Flask 简易示例(本地调试)
from flask import Flask, request
app = Flask(__name__)
@app.route('/data', methods=['POST'])
def data():
print(request.json)
return {'ok': True}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
启动说明(重要):
- 请将
SERVER_HOST
改为你电脑的局域网 IP(例如 192.168.1.100),不要用localhost
。ESP32 通过路由器访问电脑服务。 - 若需要我等待你启动服务:请告知我,我将等待 30 秒再继续。
Description
Languages
C++
71.3%
Makefile
26.7%
Python
1.1%
Vue
0.4%
C
0.3%
Other
0.1%