1 while (1) { 2 adc_value = 0; 3 for (i = 0; i < NB_READ; i++) { 4 adc_value += adc_read(POTENTIOMETER_ADC); 5 } 6 #define DIFF_MIN 20 7 if (((current_value - adc_value) < -DIFF_MIN) || ((current_value - adc_value) > DIFF_MIN)) { current_value = adc_value; } 8 send_value(&digits, &segments, digit2value, current_value / NB_READ, load); 9 }Afin que le chiffre des unités reste lisible l'affichage ne change que si la différence des mesures est "notable" (lignes 6 et 7). Il est donc normal dans certains cas de ne pas pouvoir afficher les valeurs limites (0..19 et 4075..4095).
Le code complet: https://gitlab.com/dsx/blue-pill/-/tree/master/stm32f103c8t6/05_4x7_segments_74hc595_adc
On peut faire un peu plus "élégant" en utilisant le DMA. L'astuce consiste à utiliser le même "channel" plusieurs fois fois (ici 10):... #define SENSORS_CHANNELS 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ... uint16_t adc_values[] = { SENSORS_CHANNELS }; // channel number as fake value ... while (1) { adc_value = 0; for (i = 0; sensors_channels[i] != -1; i++) { adc_value += adc_values[i]; } #define DIFF_MIN 30 if (((current_value - adc_value) < -DIFF_MIN) || ((current_value - adc_value) > DIFF_MIN)) { current_value = adc_value; } send_value(&digits, &segments, digit2value, current_value / i, load); }Le code complet: https://gitlab.com/dsx/blue-pill/-/tree/master/stm32f103c8t6/05_4x7_segments_74hc595_adc_dma