.. 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 [|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 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. .. warning:: 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. .. image:: ../img/list2_Battery_Indicator.png :align: center 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 :** Montez le circuit. .. image:: ../img/july24_3.1.5_battery_indicator_mcp3008.png **Étape 2 :** Accédez au dossier contenant le code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/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 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 à :ref:`install_wiringpi`. Code ---- .. code-block:: c #include #include #include #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 ------------------- .. 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 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. .. code-block:: c 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). .. 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 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.