Afficheurs 7 segments - 4 x 7 segmenst et 74HC595

Table des matières

TL;DR

Afficher une valeur sur un afficheur 4 x 7 segments.

Le matériel

Un potentiomètre 10K est connecté sur la broche PB1 de la blue pill, en plus des 2 74HC595 et de l'afficheur 4x7 segments.

Le code

Une fois configurés l'ADC et les broches des 2 74HC595 je lis 10 fois la valeur de l'ADC et j'affiche la moyenne des lectures:
     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

A suivre

Le bilan matériel pour afficher 4 chiffres n'est pas fameux car il faut en plus de l'afficheur: La solution peut passer par un TM1637: seulement 2 broches pour 4 chiffres !