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
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.
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 |
Procédures expérimentales
Étape 1 : Montez le circuit.
É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.