/*
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h> // Necesario para la función log10()
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Audio para ESP32 ---
#define audioInL 36 // Canal Izquierdo (ADC1_CH0)
#define audioInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Vúmetro ---
#define SAMPLES_PEAK 256 // Número de muestras para encontrar el pico en cada ciclo
#define ADC_CENTER 2048 // Valor central del ADC de 12 bits (4095 / 2)
#define ADC_REF_0DB 1024 // Nivel de ADC que consideraremos 0dB. AJUSTA ESTE VALOR según la sensibilidad de tu entrada.
#define BAR_WIDTH 24 // Ancho de cada barra del vúmetro
#define SEGMENT_HEIGHT 3 // Altura de cada segmento de la barra
#define SEGMENT_SPACING 1 // Espacio entre segmentos
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0 // Valor en dB para la parte inferior de la barra
#define DB_MAX 12.0 // Valor en dB para la parte superior de la barra
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Función para dibujar una barra de vúmetro segmentada
void drawVUMeterBar(int x, double dbValue) {
// Mapea el valor de dB a un número de segmentos a dibujar
// El +1 es para asegurar que incluso valores bajos dibujen al menos un segmento si están en rango
int totalSegments = (SCREEN_HEIGHT - 2) / (SEGMENT_HEIGHT + SEGMENT_SPACING);
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
for (int i = 0; i < segmentsToDraw; i++) {
// Mapeamos el segmento actual a su valor en dB para determinar el "color"
double segmentDb = map(i, 0, totalSegments, DB_MIN, DB_MAX);
int yPos = SCREEN_HEIGHT - 1 - (i * (SEGMENT_HEIGHT + SEGMENT_SPACING)) - SEGMENT_HEIGHT;
// NOTA: Como la pantalla es monocromática, dibujamos todo en BLANCO.
// La POSICIÓN del segmento indica el nivel de "color".
// Zona "Verde": dB < 0
// Zona "Amarilla": 0 <= dB < 6
// Zona "Naranja": 6 <= dB < 9
// Zona "Roja": dB >= 9
// Si tuvieras una pantalla a color, aquí cambiarías el color antes de dibujar.
// Por ejemplo: if (segmentDb < 0) { setColor(GREEN); } else if ...
display.fillRect(x, yPos, BAR_WIDTH, SEGMENT_HEIGHT, WHITE);
}
}
void setup() {
Serial.begin(115200); // Iniciar serial para depuración
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo para encontrar el valor pico de la señal ---
unsigned int peakL = 0;
unsigned int peakR = 0;
for (int i = 0; i < SAMPLES_PEAK; i++) {
// Leemos el valor y lo centramos en cero
int sampleL = analogRead(audioInL) - ADC_CENTER;
int sampleR = analogRead(audioInR) - ADC_CENTER;
// Tomamos el valor absoluto para obtener la amplitud
sampleL = abs(sampleL);
sampleR = abs(sampleR);
// Actualizamos el pico si la muestra actual es mayor
if (sampleL > peakL) {
peakL = sampleL;
}
if (sampleR > peakR) {
peakR = sampleR;
}
// Una pequeña demora puede ayudar a estabilizar lecturas si hay mucho ruido
// delayMicroseconds(20);
}
// --- 2. Convertir el valor pico a Decibelios (dB) ---
// Evitar log10(0) que resulta en -infinito
double dbL = (peakL == 0) ? DB_MIN : 20 * log10((double)peakL / ADC_REF_0DB);
double dbR = (peakR == 0) ? DB_MIN : 20 * log10((double)peakR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED ---
display.clearDisplay();
// Dibujar las barras para cada canal
int x_pos_L = 25;
int x_pos_R = SCREEN_WIDTH - x_pos_L - BAR_WIDTH;
drawVUMeterBar(x_pos_L, dbL);
drawVUMeterBar(x_pos_R, dbR);
// Opcional: Mostrar los valores de dB en texto
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(x_pos_L, 0);
display.print(dbL, 1); // Imprimir con 1 decimal
display.print("dB");
display.setCursor(x_pos_R, 0);
display.print(dbR, 1);
display.print("dB");
display.display();
}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h> // Necesario para la función log10()
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Voltaje DC para ESP32 --- // <-- MODIFICADO (Comentario)
#define voltageInL 36 // Canal Izquierdo (ADC1_CH0)
#define voltageInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Medidor ---
#define SAMPLES_AVG 64 // <-- NUEVO: Número de muestras para promediar y estabilizar la lectura DC.
#define ADC_MAX_VALUE 4095 // <-- NUEVO: Valor máximo del ADC de 12 bits del ESP32.
#define ADC_REF_0DB ADC_MAX_VALUE // <-- MODIFICADO: El nivel 0dB corresponde a la entrada máxima (3.3V -> 4095).
#define BAR_WIDTH 24 // Ancho de cada barra del vúmetro
#define SEGMENT_HEIGHT 3 // Altura de cada segmento de la barra
#define SEGMENT_SPACING 1 // Espacio entre segmentos
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0 // Valor en dB para la parte inferior de la barra
#define DB_MAX 12 // <-- MODIFICADO: Valor en dB para la parte superior de la barra
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Función para dibujar una barra de vúmetro segmentada (SIN CAMBIOS)
void drawVUMeterBar(int x, double dbValue) {
int totalSegments = (SCREEN_HEIGHT - 2) / (SEGMENT_HEIGHT + SEGMENT_SPACING);
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
for (int i = 0; i < segmentsToDraw; i++) {
double segmentDb = map(i, 0, totalSegments, DB_MIN, DB_MAX);
int yPos = SCREEN_HEIGHT - 1 - (i * (SEGMENT_HEIGHT + SEGMENT_SPACING)) - SEGMENT_HEIGHT;
// NOTA: Como la pantalla es monocromática, dibujamos todo en BLANCO.
// La POSICIÓN del segmento indica el nivel.
// En un vúmetro real, la posición se correlaciona con colores (verde, amarillo, rojo).
display.fillRect(x, yPos, BAR_WIDTH, SEGMENT_HEIGHT, WHITE);
}
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo y promedio del valor DC ---
// Se ha reemplazado la búsqueda de picos por un promedio para estabilizar la lectura de DC.
unsigned long totalL = 0;
unsigned long totalR = 0;
for (int i = 0; i < SAMPLES_AVG; i++) {
totalL += analogRead(voltageInL);
totalR += analogRead(voltageInR);
}
// Calculamos el valor promedio de la lectura del ADC
unsigned int avgL = totalL / SAMPLES_AVG;
unsigned int avgR = totalR / SAMPLES_AVG;
// --- 2. Convertir el valor promedio a Decibelios (dB) ---
// La fórmula es 20 * log10(valor_medido / valor_referencia).
// Nuestra referencia (ADC_REF_0DB) es 4095, que corresponde a 3.3V.
// Evitar log10(0) que resulta en -infinito.
double dbL = (avgL == 0) ? DB_MIN : 20 * log10((double)avgL / ADC_REF_0DB);
double dbR = (avgR == 0) ? DB_MIN : 20 * log10((double)avgR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED ---
display.clearDisplay();
// Dibujar las barras para cada canal
int x_pos_L = 25;
int x_pos_R = SCREEN_WIDTH - x_pos_L - BAR_WIDTH;
drawVUMeterBar(x_pos_L, dbL);
drawVUMeterBar(x_pos_R, dbR);
// Opcional: Mostrar los valores de dB en texto
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(x_pos_L, 0);
display.print(dbL, 1); // Imprimir con 1 decimal
display.print("dB");
display.setCursor(x_pos_R, 0);
display.print(dbR, 1);
display.print("dB");
display.display();
delay(50); // Pequeña pausa para no saturar el display y hacer la lectura más estable.
}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h> // Necesario para la función log10()
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Voltaje DC para ESP32 ---
#define voltageInL 36 // Canal Izquierdo (ADC1_CH0)
#define voltageInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Medidor ---
#define SAMPLES_AVG 64
#define ADC_MAX_VALUE 4095
#define ADC_REF_0DB ADC_MAX_VALUE
#define BAR_WIDTH 24
#define SEGMENT_HEIGHT 3
#define SEGMENT_SPACING 1
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0 // Valor en dB para la parte inferior de la barra
#define DB_MAX 12.0 // <-- MODIFICADO: El valor máximo ahora es +12dB.
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// La función para dibujar la barra no necesita cambios, ya que utiliza DB_MAX
void drawVUMeterBar(int x, double dbValue) {
int totalSegments = (SCREEN_HEIGHT - 2) / (SEGMENT_HEIGHT + SEGMENT_SPACING);
// La función map ahora usará el nuevo rango de -30 a 12
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
for (int i = 0; i < segmentsToDraw; i++) {
double segmentDb = map(i, 0, totalSegments, DB_MIN, DB_MAX);
int yPos = SCREEN_HEIGHT - 1 - (i * (SEGMENT_HEIGHT + SEGMENT_SPACING)) - SEGMENT_HEIGHT;
display.fillRect(x, yPos, BAR_WIDTH, SEGMENT_HEIGHT, WHITE);
}
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo y promedio del valor DC ---
unsigned long totalL = 0;
unsigned long totalR = 0;
for (int i = 0; i < SAMPLES_AVG; i++) {
totalL += analogRead(voltageInL);
totalR += analogRead(voltageInR);
}
unsigned int avgL = totalL / SAMPLES_AVG;
unsigned int avgR = totalR / SAMPLES_AVG;
// --- 2. Convertir el valor promedio a Decibelios (dB) ---
// La lógica no cambia, solo el rango de visualización.
// Nota: Los valores de dB seguirán siendo 0dB para 3.3V y negativos para voltajes menores.
// El rango de +12dB en la gráfica es solo para visualización, no se alcanzará con una entrada de 0-3.3V.
double dbL = (avgL == 0) ? DB_MIN : 20 * log10((double)avgL / ADC_REF_0DB);
double dbR = (avgR == 0) ? DB_MIN : 20 * log10((double)avgR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED ---
display.clearDisplay();
int x_pos_L = 25;
int x_pos_R = SCREEN_WIDTH - x_pos_L - BAR_WIDTH;
drawVUMeterBar(x_pos_L, dbL);
drawVUMeterBar(x_pos_R, dbR);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(x_pos_L, 0);
display.print(dbL, 1);
display.print("dB");
display.setCursor(x_pos_R, 0);
display.print(dbR, 1);
display.print("dB");
display.display();
delay(50);
}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h> // Necesario para la función log10()
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Voltaje DC para ESP32 ---
#define voltageInL 36 // Canal Izquierdo (ADC1_CH0)
#define voltageInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Medidor ---
#define SAMPLES_AVG 64
#define ADC_MAX_VALUE 4095
#define ADC_REF_0DB ADC_MAX_VALUE
// <-- MODIFICADO: Parámetros para barras HORIZONTALES -->
#define BAR_LENGTH 100 // Longitud total de la barra en píxeles
#define BAR_HEIGHT 20 // Altura de la barra en píxeles
#define SEGMENT_WIDTH 3 // Ancho de cada segmento de la barra
#define SEGMENT_SPACING 1 // Espacio entre segmentos
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0
#define DB_MAX 12.0
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// <-- MODIFICADO: Función para dibujar una barra horizontal -->
void drawVUMeterBar(int x_start, int y_start, double dbValue) {
// Calcula el número total de segmentos que caben en la longitud de la barra
int totalSegments = BAR_LENGTH / (SEGMENT_WIDTH + SEGMENT_SPACING);
// Mapea el valor de dB al número de segmentos a dibujar
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
// Dibuja un rectángulo de fondo para la barra (opcional, pero mejora la apariencia)
display.drawRect(x_start - 1, y_start - 1, BAR_LENGTH + 2, BAR_HEIGHT + 2, WHITE);
for (int i = 0; i < segmentsToDraw; i++) {
// Calculamos la posición X de cada segmento, la Y es constante
int xPos = x_start + (i * (SEGMENT_WIDTH + SEGMENT_SPACING));
// Dibujamos el segmento horizontal
display.fillRect(xPos, y_start, SEGMENT_WIDTH, BAR_HEIGHT, WHITE);
}
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo y promedio del valor DC (SIN CAMBIOS) ---
unsigned long totalL = 0;
unsigned long totalR = 0;
for (int i = 0; i < SAMPLES_AVG; i++) {
totalL += analogRead(voltageInL);
totalR += analogRead(voltageInR);
}
unsigned int avgL = totalL / SAMPLES_AVG;
unsigned int avgR = totalR / SAMPLES_AVG;
// --- 2. Convertir el valor promedio a Decibelios (dB) (SIN CAMBIOS) ---
double dbL = (avgL == 0) ? DB_MIN : 20 * log10((double)avgL / ADC_REF_0DB);
double dbR = (avgR == 0) ? DB_MIN : 20 * log10((double)avgR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED (MODIFICADO) ---
display.clearDisplay();
// Definir posiciones para las barras y el texto
int bar_x_start = 14; // Posición X inicial para ambas barras
int bar_y_L = 12; // Posición Y para la barra superior (Canal L)
int bar_y_R = 40; // Posición Y para la barra inferior (Canal R)
// Dibujar las barras para cada canal
drawVUMeterBar(bar_x_start, bar_y_L, dbL);
drawVUMeterBar(bar_x_start, bar_y_R, dbR);
// Mostrar los valores de dB y etiquetas para cada canal
display.setTextSize(1);
display.setTextColor(WHITE);
// Texto para el canal Izquierdo (L), encima de su barra
display.setCursor(bar_x_start, 0);
display.print("L ");
display.print(dbL, 1);
display.print("dB");
// Texto para el canal Derecho (R), encima de su barra
display.setCursor(bar_x_start, bar_y_R - 10);
display.print("R ");
display.print(dbR, 1);
display.print("dB");
display.display();
delay(50);
}
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Voltaje DC para ESP32 ---
#define voltageInL 36 // Canal Izquierdo (ADC1_CH0)
#define voltageInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Medidor ---
#define SAMPLES_AVG 64
#define ADC_MAX_VALUE 4095
// <-- Referencia para 0dB -->
// Se calcula para que 4095 (entrada de 3.3V) corresponda a +11.37dB
// El cálculo es: 4095 / (10^(11.37 / 20)) ≈ 1106
#define ADC_REF_0DB 1106.0
// <-- Parámetros para barras HORIZONTALES -->
#define BAR_LENGTH 100 // Longitud total de la barra en píxeles
#define BAR_HEIGHT 20 // Altura de la barra en píxeles
#define SEGMENT_WIDTH 3 // Ancho de cada segmento de la barra
#define SEGMENT_SPACING 1 // Espacio entre segmentos
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0
// <-- El valor máximo de dB ahora es Aproximadamente 11.37 -->
#define DB_MAX 11.4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Función para dibujar una barra horizontal
void drawVUMeterBar(int x_start, int y_start, double dbValue) {
// Calcula el número total de segmentos que caben en la longitud de la barra
int totalSegments = BAR_LENGTH / (SEGMENT_WIDTH + SEGMENT_SPACING);
// Mapea el valor de dB al número de segmentos a dibujar
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
// Dibuja un rectángulo de fondo para la barra (opcional, pero mejora la apariencia)
display.drawRect(x_start - 1, y_start - 1, BAR_LENGTH + 2, BAR_HEIGHT + 2, WHITE);
for (int i = 0; i < segmentsToDraw; i++) {
// Calculamos la posición X de cada segmento, la Y es constante
int xPos = x_start + (i * (SEGMENT_WIDTH + SEGMENT_SPACING));
// Dibujamos el segmento horizontal
display.fillRect(xPos, y_start, SEGMENT_WIDTH, BAR_HEIGHT, WHITE);
}
}
void setup() {
//Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo y promedio del valor DC ---
unsigned long totalL = 0;
unsigned long totalR = 0;
for (int i = 0; i < SAMPLES_AVG; i++) {
totalL += analogRead(voltageInL);
totalR += analogRead(voltageInR);
}
unsigned int avgL = totalL / SAMPLES_AVG;
unsigned int avgR = totalR / SAMPLES_AVG;
// --- 2. Convertir el valor promedio a Decibelios (dB) ---
double dbL = (avgL == 0) ? DB_MIN : 20 * log10((double)avgL / ADC_REF_0DB);
double dbR = (avgR == 0) ? DB_MIN : 20 * log10((double)avgR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED (SIN CAMBIOS EN LA LÓGICA) ---
display.clearDisplay();
// Definir posiciones para las barras y el texto
int bar_x_start = 14; // Posición X inicial para ambas barras
int bar_y_L = 12; // Posición Y para la barra superior (Canal L)
int bar_y_R = 40; // Posición Y para la barra inferior (Canal R)
// Dibujar las barras para cada canal
drawVUMeterBar(bar_x_start, bar_y_L, dbL);
drawVUMeterBar(bar_x_start, bar_y_R, dbR);
// Mostrar los valores de dB y etiquetas para cada canal
display.setTextSize(1);
display.setTextColor(WHITE);
// Texto para el canal Izquierdo (L), encima de su barra
display.setCursor(bar_x_start, 0);
display.print("L ");
display.print(dbL, 1);
display.print("dB");
// Texto para el canal Derecho (R), encima de su barra
// Ajuste de la posición Y del texto para que no se solape con la barra de arriba
display.setCursor(bar_x_start, bar_y_R - 12);
display.print("R ");
display.print(dbR, 1);
display.print("dB");
display.display();
delay(50);
}
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
// --- Configuraciones de Hardware ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
// --- Pines de entrada de Voltaje DC para ESP32 ---
#define voltageInL 36 // Canal Izquierdo (ADC1_CH0)
#define voltageInR 39 // Canal Derecho (ADC1_CH3)
// --- Parámetros del Medidor ---
#define SAMPLES_AVG 64
#define ADC_MAX_VALUE 4095
// Referencia para 0dB
#define ADC_REF_0DB 1106.0
// Parámetros para barras HORIZONTALES
#define BAR_LENGTH 100 // Longitud total de la barra en píxeles
#define BAR_HEIGHT 20 // Altura de la barra en píxeles
#define SEGMENT_WIDTH 3
#define SEGMENT_SPACING 1
// Rango de dB que se mostrará en la pantalla
#define DB_MIN -30.0
#define DB_MAX 11.4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Función para dibujar una barra horizontal (SIN CAMBIOS)
void drawVUMeterBar(int x_start, int y_start, double dbValue) {
int totalSegments = BAR_LENGTH / (SEGMENT_WIDTH + SEGMENT_SPACING);
int segmentsToDraw = map(dbValue, DB_MIN, DB_MAX, 0, totalSegments);
segmentsToDraw = constrain(segmentsToDraw, 0, totalSegments);
display.drawRect(x_start - 1, y_start - 1, BAR_LENGTH + 2, BAR_HEIGHT + 2, WHITE);
for (int i = 0; i < segmentsToDraw; i++) {
int xPos = x_start + (i * (SEGMENT_WIDTH + SEGMENT_SPACING));
display.fillRect(xPos, y_start, SEGMENT_WIDTH, BAR_HEIGHT, WHITE);
}
}
void setup() {
//Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
}
void loop() {
// --- 1. Muestreo y promedio del valor DC (SIN CAMBIOS) ---
unsigned long totalL = 0;
unsigned long totalR = 0;
for (int i = 0; i < SAMPLES_AVG; i++) {
totalL += analogRead(voltageInL);
totalR += analogRead(voltageInR);
}
unsigned int avgL = totalL / SAMPLES_AVG;
unsigned int avgR = totalR / SAMPLES_AVG;
// --- 2. Convertir el valor promedio a Decibelios (dB) (SIN CAMBIOS) ---
double dbL = (avgL == 0) ? DB_MIN : 20 * log10((double)avgL / ADC_REF_0DB);
double dbR = (avgR == 0) ? DB_MIN : 20 * log10((double)avgR / ADC_REF_0DB);
// --- 3. Visualización en la Pantalla OLED (MODIFICADO) ---
display.clearDisplay();
int label_x = 3; // Posición X para las etiquetas L y R
int bar_x_start = 20; // Posición X inicial para ambas barras
int bar_y_L = 3; // Posición Y para la barra superior (Canal L)
int bar_y_R = 42; // Posición Y para la barra inferior (Canal R)
// Configurar texto
display.setTextSize(1);
display.setTextColor(WHITE);
// Dibujar las barras para cada canal (esta parte no cambia)
drawVUMeterBar(bar_x_start, bar_y_L, dbL);
drawVUMeterBar(bar_x_start, bar_y_R, dbR);
// Texto para el canal Izquierdo (L), encima de su barra
display.setCursor(20, 27); // La posición del cursor sigue siendo la misma
display.print(dbL, 1);
display.print("dB");
// Texto para el canal Derecho (R), encima de su barra
display.setCursor(80,32);
display.print(dbR, 1);
display.print("dB");
display.setTextSize(2);
display.setCursor(label_x, 7);
display.print("L");
display.setCursor(label_x, 46);
display.print("R");
display.display();
delay(50);
}