ESP32 + ADS1015 + 0.96" OLED 压力监测固件
=========================================

本项目用于通过 ESP32 读取 ADS1015 外接的模拟压力传感器（量程 0~0.2 MPa，输出 0.5~4.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（量程 0~0.2MPa）
- 若 ADS1015 供电为 3.3V，请务必加入分压或限压，避免 4.5V 直接进入 ADC！

接线说明
--------

默认 I2C 引脚为 `SDA=21`, `SCL=22`（可在 `src/main.cpp` 里通过 `I2C_SDA_PIN/I2C_SCL_PIN` 修改）。

1) I2C 连接（共用总线）

- ESP32 `3V3` → SSD1306 `VCC`
- ESP32 `GND` → SSD1306 `GND`
- ESP32 `GPIO21 (SDA)` → SSD1306 `SDA`
- ESP32 `GPIO22 (SCL)` → SSD1306 `SCL`

- ESP32 `3V3` 或 `5V` → ADS1015 `VDD`（推荐 3.3V 上拉逻辑更安全）
- ESP32 `GND` → ADS1015 `GND`
- ESP32 `GPIO21 (SDA)` → ADS1015 `SDA`
- ESP32 `GPIO22 (SCL)` → ADS1015 `SCL`
- ADS1015 `ADDR` → `GND`（地址 0x48，若接到 VDD/或其它，地址会不同）

2) 传感器-ADC 接线（单端 A0）

- 传感器 `V+ (5V)` → 5V 电源
- 传感器 `GND` → 系统 GND
- 传感器 `OUT (0.5~4.5V)` → 分压网络 → ADS1015 `A0`

分压建议
--------

- 如果 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`

构建与烧录
--------

1. 打开本工程目录。
2. 连接 ESP32 到电脑。
3. 选择合适的串口，执行编译与上传（PlatformIO: Upload）。
4. 打开串口监视器，波特率 `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`）。

校准步骤建议：

1. 在无压力状态，观察 Vs 是否接近 `SENSOR_MIN_V`，必要时调整 `ZERO_TRIM_V` 至读数接近 0MPa。
2. 在已知压力点（如 0.1MPa），调节 `SPAN_SCALE` 使显示读数接近真实值。
3. 校准完成后记录参数，固定使用。

故障与排查
--------

- 屏幕显示 `ADS1015 MISSING`：I2C 地址、接线或供电问题。
- 屏幕显示 `SENSOR INVALID`：采样电压无效或超出范围，检查分压与增益设置。
- 串口输出含有 `[WARN] ADC read invalid`：原始电压异常（可能为过压、浮空、断线）。

许可证
----

MIT

HTTP 上报与本地测试
----------------

- 固件每 5 秒会向 `http://<SERVER_HOST>:<SERVER_PORT><SERVER_PATH>` 发送 JSON：

```bash
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 简易示例（本地调试）
---------------------

```python
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 秒再继续。


