adc-12bits.ino
L'ADC de l'ESP32-S3 monte à 12 bits mais est capricieux : non-linéaire en bas d'échelle, bruité, dépendant de l'atténuation. Ce croquis fixe les réglages conseillés (11 dB, horloge APB), moyenne 32 lectures et applique une calibration deux points maison.
Matériel requis
Un Arduino Nano ESP32 (ESP32-S3 double cœur, Wi-Fi 2,4 GHz + Bluetooth Low Energy, brochage physique compatible Nano, USB natif, broches 3,3 V uniquement). Nano ESP32, source analogique 0-3,3 V sur A0 ; multimètre pour calibrer.
Câblage
Signale sur A0 et GND commun ; la pleine échelle réelle est ~3,1-3,3 V selon l'atténuation, ne jamais dépasser 3,3 V.
Fonctionnement
analogSetPinAttenuation(ADC_11db) couvre 0-3,3 V ; l'horloge APB évite la dérive du ADC_80M. La moyenne numérique divise le bruit, la calibration deux points corrige le gain/offset.
Exécution
Installez le package Arduino ESP32 Boards (ou le guide Nano ESP32 officiel), sélectionnez Arduino Nano ESP32, téléversez. Les broches sont en 3,3 V : n'envoyez jamais 5 V sur une entrée. Le moniteur série utilise l'USB natif.
Variantes
Pour du précis, passez par un ADS1115 externe sur I2C, ou utilisez esp_adc_cal (API bas niveau) avec le eFuse de calibration usine.
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);
}