adc_oneshot.c
L'ADC du H2 passe par le nouveau pilote esp_adc : on configure unité, canal, atténuation et largeur, puis adc_oneshot_read renvoie le brut. La conversion en millivolts par table de calibration remplace la règle de trois approximative.
Matériel requis
Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. 1 potentiomètre 10 kΩ (ou capteur analogique type MPX5700, sortie < 3,3 V).
Branchement
Curseur du potentiomètre sur ADC3 (GPIO4), les deux autres pattes sur 3,3 V et GND. Jamais plus de 3,3 V sur une broche ADC.
Fonctionnement
adc_oneshot_new_unit ouvre l'unité, config_channel fixe 12 bits + atténuation 12 dB (pleine échelle ≈ 3,3 V), read renvoie l'échantillon. La double lecture élimine la traîne du multiplexeur. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.
Pour aller plus loin
Moyennez 16 échantillons pour stabiliser, ou déclenchez la lecture par le contrôleur LP timer entre deux sommeils.
adc_oneshot.c
// adc_oneshot.c — lecture 12 bits + conversion en millivolts.
#include "driver/adc.h"
#include "esp_adc/adc_oneshot.h"
#include "esp_log.h"
static const char *TAG = "adc";
void app_main(void)
{
const adc_oneshot_unit_init_cfg_t ucfg = { .unit_id = ADC_UNIT_1 };
adc_oneshot_unit_handle_t adc;
ESP_ERROR_CHECK(adc_oneshot_new_unit(&ucfg, &adc));
adc_oneshot_chan_cfg_t chan = {
.bitwidth = ADC_BITWIDTH_12, .atten = ADC_ATTEN_DB_12,
};
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc, ADC_CHANNEL_3, &chan));
int mv = 0, raw = 0;
while (1) {
ESP_ERROR_CHECK(adc_oneshot_read(adc, ADC_CHANNEL_3, &raw));
adc_oneshot_read(adc, ADC_CHANNEL_3, &raw); // 2e lecture : plus stable
// Conversion brute -> mV par la table de calibration du SDK :
mv = raw * 3300 / 4095;
ESP_LOGI(TAG, "raw=%d soit ~%d mV (potentiometre ?)", raw, mv);
vTaskDelay(pdMS_TO_TICKS(500));
}
}