adc-12bits.ino
El ADC del ESP32-S3 llega a 12 bits pero es caprichoso: no lineal abajo, ruidoso, dependiente de la atenuación. Este sketch fija los ajustes recomendados (11 dB, reloj APB), promedia 32 lecturas y aplica una calibración propia de dos puntos.
Hardware
Un Arduino Nano ESP32 (ESP32-S3 de doble núcleo, Wi-Fi 2,4 GHz + Bluetooth Low Energy, formato físico compatible con el Nano, USB nativo, pines de 3,3 V únicamente). Nano ESP32, fuente analógica 0-3,3 V en A0; multímetro para calibrar.
Cableado
Señal en A0 y GND común; la escala llena real es ~3,1-3,3 V según atenuación, nunca pases de 3,3 V.
Funcionamiento
analogSetPinAttenuation(ADC_11db) cubre 0-3,3 V; el reloj APB evita la deriva del ADC_80M. La media digital divide el ruido, la calibración de dos puntos corrige ganancia/offset.
Ejecución
Instala el paquete Arduino ESP32 Boards (o sigue la guía oficial del Nano ESP32), selecciona Arduino Nano ESP32 y carga. Los pines son de 3,3 V: nunca envíes 5 V a una entrada. El monitor serie usa el USB nativo.
Variantes
Para precisión, pasa a un ADS1115 externo por I2C, o usa esp_adc_cal (API bajo nivel) con el eFuse de calibración de fábrica.
adc-12bits.ino
// ADC de l'ESP32-S3 : 12 bits natifs, mais non lineaire en bas
// d'echelle. attenuation 11 dB = pleine echelle ~3,3 V.
const int CANAL = A0;
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 0..4095
analogSetPinAttenuation(CANAL, ADC_11db);
analogSetPixelClockSource(ADC_PIXEL_CLOCK_APB); // horloge stable
}
void loop() {
// moyenne sur 32 lectures : l'ADC ESP32 est bruité
uint32_t somme = 0;
for (int i = 0; i < 32; i++) somme += analogRead(CANAL);
float brut = somme / 32.0;
// calibration lineaire par deux points (bricolage maison)
const float A = 3.3 / 4095.0 * 1.02f;
const float B = -0.02;
float tension = brut * A + B;
Serial.print("brut=");
Serial.print(brut, 0);
Serial.print(" -> ");
Serial.print(tension, 3);
Serial.println(" V");
delay(500);
}