#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <esp_adc_cal.h>

#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
#define OLED_RESET -1    // OLED复位引脚,如果没有则设为-1

#define ADC_PIN 36       // ESP32 ADC引脚,这里使用GPIO36
#define SAMPLES 10       // 取样次数

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
esp_adc_cal_characteristics_t adc_chars;

// 初始化ADC
void initADC() {
  esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 0, &adc_chars);
  pinMode(ADC_PIN, INPUT);
}

// 读取ADC值并计算平均电压
float readADC() {
  uint32_t adc_sum = 0;
  for (int i = 0; i < SAMPLES; i++) {
    adc_sum += esp_adc_cal_raw_to_voltage(analogRead(ADC_PIN), &adc_chars);
    delay(10); // 稍微延时以稳定读数
  }
  return (float)adc_sum / SAMPLES;
}

void setup() {
  Serial.begin(115200);

  // 初始化OLED显示屏
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.display();

  initADC();
}

void loop() {
  float voltage = readADC();
  // 假设经过分压电路,进行电压范围扩展,这里假设分压比为 5
  float actual_voltage = voltage * 5; 

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Input Voltage:");

  if (actual_voltage >= 1000) {
    display.setCursor(0, 10);
    display.print(actual_voltage / 1000);
    //display.setCursor(0, 20);
    display.print("V");
  } else {
    display.setCursor(0, 10);
    display.print(actual_voltage);
    //display.setCursor(0, 20);
    display.print("mV");
  }

  display.setCursor(0, 30);
  display.print("Pin Voltage:");

  if (voltage >= 1000) {
    display.setCursor(0, 40);
    display.print(voltage / 1000);
    //display.setCursor(0, 50);
    display.print("V");
  } else {
    display.setCursor(0, 40);
    display.print(voltage);
    //display.setCursor(0, 50);
    display.print("mV");
  }

  display.display();

  Serial.print("Input Voltage: ");
  if (actual_voltage >= 1000) {
    Serial.print(actual_voltage / 1000);
    Serial.println(" V");
  } else {
    Serial.print(actual_voltage);
    Serial.println(" mV");
  }

  Serial.print("Pin Voltage: ");
  if (voltage >= 1000) {
    Serial.print(voltage / 1000);
    Serial.println(" V");
  } else {
    Serial.print(voltage);
    Serial.println(" mV");
  }

  delay(1000);
}