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