Note

Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Approfondissez vos connaissances sur Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez les problèmes après‑vente et les 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.

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

  • Promotions et cadeaux festifs : Participez à des concours et promotions spéciales pendant les 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 d’un ADC0834 ou d’un MCP3008 et suivez la section correspondante.

Introduction

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

Avertissement

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

Composants requis

Dans ce projet, nous avons besoin des composants suivants.

../_images/list2_Battery_Indicator.png

Il est bien sûr pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément via les liens ci‑dessous.

INTRODUCTION DU COMPOSANT

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

Graphique à barres LED

-

MCP3008

-

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 : Construisez le circuit.

../_images/july24_3.1.5_battery_indicator_mcp3008.png

Étape 2 : Accédez au dossier du code.

cd ~/raphael-kit/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 l’exécution du programme, connectez séparément le 3e broche du MCP3008 et la masse (GND) aux deux pôles d’une batterie. Vous pouvez voir que la LED correspondante de la barre à LED s’allume pour afficher le niveau de puissance (plage de mesure : 0 – 5 V).

Note

Si cela ne fonctionne pas après l’exécution ou si un message d’erreur apparaît : « 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  // 1 MHz
#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 unique
    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 la configuration 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("ADC Value : %d\tVoltage : %.2f V\tLevel : %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 unique, CH0~CH7
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

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

Cette fonction lit les valeurs analogiques du circuit intégré MCP3008 via SPI. Le paramètre channel sélectionne l’une des 8 entrées analogiques (CH0 – CH7). Le MCP3008 retourne une valeur numérique 10 bits comprise entre 0 et 1023 représentant la tension analogique.

void LedBarGraph(int value) {
    for (int i = 0; i < 10; i++) {
        if (i < value)
            digitalWrite(pins[i], HIGH);  // Allumer LED (hypothèse : câblage actif HIGH)
        else
            digitalWrite(pins[i], LOW);   // Éteindre LED
    }
}

Cette fonction contrôle un afficheur à 10 LEDs. Chaque LED représente 1/10 de la plage de tension. Les LED s’allument dans l’ordre jusqu’au niveau spécifié.

Remarque : Cette version suppose que les anodes des LED sont connectées aux GPIO et les cathodes à la masse (actif HIGH).

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 la configuration SPI !\n");
        return 1;
    }

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

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

        float voltage = analogVal * VREF / 1023.0;
        int level = analogVal * 10 / 1024;  // Mise à l’échelle 0 – 10 niveaux
        if (level > 10) level = 10;

        LedBarGraph(level);  // Affichage du niveau sur les LED

        printf("ADC Value : %d\tVoltage : %.2f V\tLevel : %d\n", analogVal, voltage, level);

        delay(200);  // Taux de mise à jour : 5 Hz
    }

    return 0;
}

Logique principale du programme :

  • Initialise wiringPi et la communication SPI.

  • Définit les broches GPIO comme sorties pour contrôler la barre à 10 LEDs.

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

  • Convertit la lecture en tension avec VREF = 3,3 V.

  • Met à l’échelle la tension sur une barre 0 – 10 et allume les LED correspondantes.

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

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