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