Files
pressureSensor/sensor.yaml
2025-09-09 09:27:33 +08:00

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);
}