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