Note

Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Plongez plus profondément dans l’univers du Raspberry Pi, d’Arduino et de l’ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez vos problèmes après-vente et vos défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus exclusifs.

  • Réductions spéciales : Profitez de remises exclusives sur nos derniers produits.

  • Promotions festives et cadeaux : Participez à des tirages au sort et des promotions de fêtes.

👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !

3.1.5 Indicateur de batterie (MCP3008)

Note

../_images/mcp3008_and_adc0834.jpg

Selon la version de votre kit, identifiez si vous disposez de ADC0834 ou MCP3008 et suivez la section correspondante.

Introduction

Dans ce projet, nous allons réaliser un indicateur de batterie qui pourra afficher visuellement le niveau de la batterie sur la barre de LED.

Avertissement

N’utilisez pas de composants de batterie dépassant 3,3 V afin d’éviter toute surcharge, ce qui pourrait endommager la puce ou le Raspberry Pi.

Composants nécessaires

Pour ce projet, nous avons besoin des composants suivants.

../_images/list2_Battery_Indicator.png

Schéma de câblage

Nom T-Board

physique

wiringPi

BCM

SPICE0

Pin 24

10

8

SPIMOSI

Pin 19

12

10

SPIMISO

Pin 21

13

9

SPISCLK

Pin 23

14

11

GPIO25

Pin 22

6

25

GPIO12

Pin 32

26

12

GPIO16

Pin 36

27

16

GPIO20

Pin 38

28

20

GPIO21

Pin 40

29

21

GPIO5

Pin 29

21

5

GPIO6

Pin 31

22

6

GPIO13

Pin 33

23

13

GPIO19

Pin 35

24

19

GPIO26

Pin 37

25

26

../_images/schematic_battery_indicator_mcp3008.png

Procédures expérimentales

Étape 1 : Montez le circuit.

../_images/july24_3.1.5_battery_indicator_mcp3008.png

Étape 2 : Accédez au dossier contenant le code.

cd ~/davinci-kit-for-raspberry-pi/c/3.1.5-2/

Étape 3 : Compilez le code.

gcc 3.1.5_BatteryIndicator.c -lwiringPi

Étape 4 : Exécutez le fichier exécutable.

sudo ./a.out

Après avoir lancé le programme, reliez séparément la 3ᵉ broche du MCP3008 et la masse (GND) aux deux pôles d’une batterie. Vous pourrez alors voir la LED correspondante sur la barre de LED s’allumer pour indiquer le niveau de charge (plage de mesure : 0–5 V).

Note

Si cela ne fonctionne pas après l’exécution, ou s’il y a un message d’erreur : « wiringPi.h: No such file or directory », veuillez vous référer à Installer et vérifier WiringPi.

Code

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000  // 1MHz
#define VREF        3.3

int pins[10] = {6, 26, 27, 28, 29, 21, 22, 23, 24, 25};

int read_ADC(int channel)
{
    if (channel < 0 || channel > 7) return -1;

    unsigned char buffer[3];
    buffer[0] = 1;  // Bit de démarrage
    buffer[1] = (8 + channel) << 4;  // Mode entrée simple
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];
    return value;
}

void LedBarGraph(int value) {
    for (int i = 0; i < 10; i++) {
        if (i < value)
            digitalWrite(pins[i], HIGH);
        else
            digitalWrite(pins[i],LOW);
    }
}

int main(void)
{
    if (wiringPiSetup() == -1) {
        printf("Échec de l’initialisation de wiringPi !\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Échec de l’initialisation SPI !\n");
        return 1;
    }

    for (int i = 0; i < 10; i++) {
        pinMode(pins[i], OUTPUT);
        digitalWrite(pins[i], HIGH);
    }

    while (1) {
        int analogVal = read_ADC(0);  // MCP3008 CH0
        if (analogVal < 0) continue;

        float voltage = analogVal * VREF / 1023.0;
        int level = analogVal * 10 / 1024;
        if (level > 10) level = 10;

        LedBarGraph(level);

        printf("Valeur ADC : %d\tTension : %.2f V\tNiveau : %d\n", analogVal, voltage, level);

        delay(200);
    }

    return 0;
}

Explication du code

int read_ADC(int channel)
{
    if (channel < 0 || channel > 7) return -1;

    unsigned char buffer[3];
    buffer[0] = 1;  // Bit de démarrage
    buffer[1] = (8 + channel) << 4;  // Mode entrée simple, CH0~CH7
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];  // Combine le résultat sur 10 bits
    return value;
}

Cette fonction lit les valeurs analogiques depuis le MCP3008 via SPI. Le paramètre channel sélectionne l’une des 8 entrées analogiques (CH0–CH7). Le MCP3008 renvoie une valeur numérique sur 10 bits (0 à 1023) représentant la tension analogique.

void LedBarGraph(int value) {
    for (int i = 0; i < 10; i++) {
        if (i < value)
            digitalWrite(pins[i], HIGH);  // Allume la LED (suppose un câblage actif à l’état haut)
        else
            digitalWrite(pins[i], LOW);   // Éteint la LED
    }
}

Cette fonction contrôle un afficheur à 10 LEDs (bargraph). Chaque LED représente 1/10 de la plage de tension. Les LEDs sont allumées en ordre jusqu’au niveau spécifié.

Remarque : cette version suppose que les anodes des LEDs sont reliées aux GPIO et les cathodes à la masse (actif à l’état haut).

int main(void)
{
    if (wiringPiSetup() == -1) {
        printf("Échec de l’initialisation de wiringPi !\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Échec de l’initialisation SPI !\n");
        return 1;
    }

    for (int i = 0; i < 10; i++) {
        pinMode(pins[i], OUTPUT);
        digitalWrite(pins[i], HIGH);  // Initialise toutes les LEDs sur ON
    }

    while (1) {
        int analogVal = read_ADC(0);  // Lecture de la tension sur CH0
        if (analogVal < 0) continue;

        float voltage = analogVal * VREF / 1023.0;
        int level = analogVal * 10 / 1024;  // Convertit en niveaux 0–10
        if (level > 10) level = 10;

        LedBarGraph(level);  // Affiche le niveau sur les LEDs

        printf("Valeur ADC : %d\tTension : %.2f V\tNiveau : %d\n", analogVal, voltage, level);

        delay(200);  // Fréquence de mise à jour : 5 Hz
    }

    return 0;
}

Logique du programme :

  • Initialise wiringPi et la communication SPI.

  • Configure les broches GPIO en sortie pour piloter les 10 LEDs.

  • Lit en continu la tension analogique via le MCP3008 (CH0).

  • Convertit la lecture en tension à l’aide de VREF = 3,3 V.

  • Convertit la tension en un niveau 0–10 et allume les LEDs correspondantes.

  • Affiche dans la console série la valeur brute ADC, la tension (en volts) et le niveau LED.

Cela agit comme un indicateur visuel du niveau de batterie ou un voltmètre analogique.