.. 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 [|link_sf_facebook|] et rejoignez‑nous dès aujourd’hui !
.. _3.1.5_c_pi5_mcp3008:
3.1.5 Indicateur de batterie (MCP3008)
======================================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
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.
.. warning::
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.
.. image:: ../img/list2_Battery_Indicator.png
:align: center
Il est bien sûr pratique d’acheter un kit complet, voici le lien :
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nom
- ÉLÉMENTS DANS CE KIT
- LIEN
* - Kit Raphael
- 337
- |link_Raphael_kit|
Vous pouvez également les acheter séparément via les liens ci‑dessous.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCTION DU COMPOSANT
- LIEN D’ACHAT
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_bar_graph`
- \-
* - :ref:`cpn_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
============ ======== ======== ===
.. image:: ../img/schematic_battery_indicator_mcp3008.png
:align: center
Procédures expérimentales
-------------------------
**Étape 1 :** Construisez le circuit.
.. image:: ../img/july24_3.1.5_battery_indicator_mcp3008.png
**Étape 2 :** Accédez au dossier du code.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.5-2/
**Étape 3 :** Compilez le code.
.. raw:: html
.. code-block::
gcc 3.1.5_BatteryIndicator.c -lwiringPi
**Étape 4 :** Exécutez le fichier exécutable.
.. raw:: html
.. code-block::
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 à :ref:`install_wiringpi_pi5`.
Code
----
.. code-block:: c
#include
#include
#include
#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
-------------------
.. code-block:: c
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.
.. code-block:: c
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).
.. code-block:: c
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.