151 lines
4.5 KiB
YAML
151 lines
4.5 KiB
YAML
# ===================================================================
|
|
# ESPHome 配置: 基于 ESP32 + ADS1015 + SSD1306 的压力监测器 (最终完整版)
|
|
#
|
|
# 修正了 ota 组件的配置格式。
|
|
# ===================================================================
|
|
|
|
esphome:
|
|
name: pressure-monitor
|
|
|
|
# -- 平台和板型配置 --
|
|
esp32:
|
|
board: esp32dev
|
|
framework:
|
|
type: arduino
|
|
|
|
# -- 标准网络连接配置 --
|
|
wifi:
|
|
ssid: "hhhhhhhh"
|
|
password: "nihaoahhh"
|
|
|
|
# -- Home Assistant API, OTA 更新, 日志等 --
|
|
api:
|
|
|
|
ota:
|
|
platform: esphome # <-- 已修正:为 ota 添加 platform
|
|
|
|
logger:
|
|
|
|
# ===================================================================
|
|
# I2C 总线配置
|
|
# ===================================================================
|
|
i2c:
|
|
sda: 21
|
|
scl: 22
|
|
scan: true
|
|
frequency: 400kHz
|
|
|
|
# ===================================================================
|
|
# ADC 硬件组件配置
|
|
# ===================================================================
|
|
ads1115:
|
|
id: ads1015_hub
|
|
address: 0x48
|
|
|
|
# ===================================================================
|
|
# 传感器实体配置
|
|
# ===================================================================
|
|
sensor:
|
|
# -----------------------------------------------------------------
|
|
# 步骤 1: 定义一个 ADS1115 传感器,读取电压 (Vs)
|
|
# -----------------------------------------------------------------
|
|
- platform: ads1115
|
|
ads1115_id: ads1015_hub
|
|
id: sensor_voltage
|
|
name: "Sensor Voltage"
|
|
multiplexer: 'A0_GND'
|
|
gain: 4.096
|
|
update_interval: 50ms
|
|
unit_of_measurement: "V"
|
|
icon: "mdi:flash-circle"
|
|
accuracy_decimals: 3
|
|
filters:
|
|
- sliding_window_moving_average:
|
|
window_size: 16
|
|
send_every: 4
|
|
|
|
# -----------------------------------------------------------------
|
|
# 步骤 2: 创建一个模板传感器来计算压力 (MPa)
|
|
# -----------------------------------------------------------------
|
|
- platform: template
|
|
id: pressure_sensor
|
|
name: "Pressure"
|
|
unit_of_measurement: "MPa"
|
|
icon: "mdi:gauge"
|
|
accuracy_decimals: 3
|
|
lambda: |-
|
|
const float sensor_volts = id(sensor_voltage).state;
|
|
if (isnan(sensor_volts)) {
|
|
return NAN;
|
|
}
|
|
|
|
const float SENSOR_MIN_V = 0.5f;
|
|
const float SENSOR_MAX_V = 4.5f;
|
|
const float PRESSURE_FULL_SCALE_MPA = 0.2f;
|
|
const float span_v = SENSOR_MAX_V - SENSOR_MIN_V;
|
|
|
|
if (span_v <= 0.0f) {
|
|
return 0.0f;
|
|
}
|
|
|
|
float ratio = (sensor_volts - SENSOR_MIN_V) / span_v;
|
|
|
|
if (ratio < 0.0f) ratio = 0.0f;
|
|
if (ratio > 1.0f) ratio = 1.0f;
|
|
|
|
return ratio * PRESSURE_FULL_SCALE_MPA;
|
|
|
|
# ===================================================================
|
|
# 显示屏配置 (SSD1306 OLED)
|
|
# ===================================================================
|
|
font:
|
|
- file: "gfonts://Roboto"
|
|
id: roboto_font
|
|
size: 12
|
|
- file: "gfonts://Roboto"
|
|
id: roboto_font_large
|
|
size: 24
|
|
|
|
display:
|
|
- platform: ssd1306_i2c
|
|
id: oled_display
|
|
model: "SSD1306 128x64"
|
|
address: 0x3C
|
|
update_interval: 200ms
|
|
lambda: |-
|
|
const float pressure = id(pressure_sensor).state;
|
|
const float voltage = id(sensor_voltage).state;
|
|
const bool sensor_ok = !isnan(pressure) && !isnan(voltage) && voltage > 0.1;
|
|
|
|
// 绘制标题栏
|
|
it.filled_rectangle(0, 0, 128, 16, COLOR_ON);
|
|
it.print(4, 4, id(roboto_font), COLOR_OFF, "PRESSURE");
|
|
|
|
if (sensor_ok) {
|
|
it.print(128 - 22, 4, id(roboto_font), COLOR_OFF, "OK");
|
|
} else {
|
|
it.print(128 - 26, 4, id(roboto_font), COLOR_OFF, "ERR");
|
|
}
|
|
|
|
if (!sensor_ok) {
|
|
it.printf(it.get_width() / 2, 40, id(roboto_font), TextAlign::CENTER, "SENSOR ERR");
|
|
return;
|
|
}
|
|
|
|
// 绘制主读数
|
|
it.printf(it.get_width() / 2, 34, id(roboto_font_large), TextAlign::CENTER, "%.3f", pressure);
|
|
it.print(it.get_width() - 2, 44, id(roboto_font), TextAlign::TOP_RIGHT, "MPa");
|
|
|
|
// 绘制电压
|
|
it.printf(4, 52, id(roboto_font), TextAlign::TOP_LEFT, "Vs: %.3f V", voltage);
|
|
|
|
// 绘制进度条
|
|
const int bar_x = 4, bar_y = 64 - 8, bar_w = 128 - 8, bar_h = 6;
|
|
it.rectangle(bar_x, bar_y, bar_w, bar_h, COLOR_ON);
|
|
float ratio = pressure / 0.2f;
|
|
if (ratio < 0.0f) ratio = 0.0f;
|
|
if (ratio > 1.0f) ratio = 1.0f;
|
|
int filled_w = (int)(ratio * (bar_w - 2));
|
|
if (filled_w > 0) {
|
|
it.filled_rectangle(bar_x + 1, bar_y + 1, filled_w, bar_h - 2, COLOR_ON);
|
|
} |