.. note::
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
**Warum beitreten?**
- **Expertenunterstützung**: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
- **Lernen & Teilen**: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.
- **Exklusive Vorschauen**: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.
- **Sonderrabatte**: Genieße exklusive Rabatte auf unsere neuesten Produkte.
- **Festliche Aktionen und Verlosungen**: Nimm an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [|link_sf_facebook|] und tritt noch heute bei!
.. _3.1.5_c_pi5_mcp3008:
3.1.5 Batterieanzeige (MCP3008)
===============================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Je nach deiner Kit-Version überprüfe bitte, ob du **ADC0834** oder **MCP3008** hast, und fahre mit dem entsprechenden Abschnitt fort.
Einführung
----------
In diesem Projekt werden wir ein Batterieanzeigegerät bauen, das den Ladezustand visuell auf einer LED-Balkenanzeige darstellen kann.
.. warning::
Verwende keine Batterien, die mehr als 3,3 V liefern, um Überlastung zu vermeiden, die den Chip oder den Raspberry Pi beschädigen könnte.
Benötigte Komponenten
---------------------
In diesem Projekt benötigen wir die folgenden Komponenten.
.. image:: ../img/list2_Battery_Indicator.png
:align: center
Schaltplan
----------
============ ======== ======== ===
T-Board-Name Physical 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
Experimentelle Schritte
-----------------------
**Schritt 1:** Baue die Schaltung auf.
.. image:: ../img/july24_3.1.5_battery_indicator_mcp3008.png
**Schritt 2:** Gehe in den Code-Ordner.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.5-2/
**Schritt 3:** Kompiliere den Code.
.. raw:: html
.. code-block::
gcc 3.1.5_BatteryIndicator.c -lwiringPi
**Schritt 4:** Führe die erstellte Datei aus.
.. raw:: html
.. code-block::
sudo ./a.out
Nachdem das Programm läuft, verbinde den 3. Pin des MCP3008 und GND separat mit Drähten und führe diese dann zu den beiden Polen einer Batterie.
Du kannst sehen, wie die entsprechenden LEDs der LED-Balkenanzeige leuchten, um den Ladezustand anzuzeigen (Messbereich: 0–5 V).
.. note::
Falls es nach dem Ausführen nicht funktioniert oder die Fehlermeldung „wiringPi.h: No such file or directory“ erscheint, siehe :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; // Startbit
buffer[1] = (8 + channel) << 4; // Single-Ended-Modus
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("setup wiringPi failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\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;
}
Code-Erklärung
--------------
.. code-block:: c
int read_ADC(int channel)
{
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Startbit
buffer[1] = (8 + channel) << 4; // Single-Ended-Modus, CH0~CH7
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2]; // 10-Bit-Ergebnis kombinieren
return value;
}
Diese Funktion liest analoge Werte vom MCP3008-ADC-Chip über SPI.
Der Parameter `channel` wählt einen der 8 analogen Eingänge (CH0–CH7).
Der MCP3008 gibt einen 10-Bit-Digitalwert zwischen 0 und 1023 zurück, der die analoge Spannung repräsentiert.
.. code-block:: c
void LedBarGraph(int value) {
for (int i = 0; i < 10; i++) {
if (i < value)
digitalWrite(pins[i], HIGH); // LED einschalten (aktive HIGH-Schaltung)
else
digitalWrite(pins[i], LOW); // LED ausschalten
}
}
Diese Funktion steuert eine 10-LED-Balkenanzeige.
Jede LED repräsentiert 1/10 des Spannungsbereichs.
Die LEDs werden der Reihe nach bis zum angegebenen Wert eingeschaltet.
Hinweis: Diese Version geht davon aus, dass die LED-Anoden mit den GPIOs verbunden sind und die Kathoden mit GND (aktive HIGH-Schaltung).
.. code-block:: c
int main(void)
{
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
for (int i = 0; i < 10; i++) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], HIGH); // Alle LEDs initial einschalten
}
while (1) {
int analogVal = read_ADC(0); // Spannung an CH0 lesen
if (analogVal < 0) continue;
float voltage = analogVal * VREF / 1023.0;
int level = analogVal * 10 / 1024; // Auf 0–10 Stufen skalieren
if (level > 10) level = 10;
LedBarGraph(level); // Level auf LEDs anzeigen
printf("ADC Value: %d\tVoltage: %.2f V\tLevel: %d\n", analogVal, voltage, level);
delay(200); // Aktualisierungsrate: 5 Hz
}
return 0;
}
Hauptprogramm-Logik:
- Initialisiert wiringPi und SPI-Kommunikation.
- Setzt die GPIO-Pins als Ausgänge zur Steuerung der 10-LED-Balkenanzeige.
- Liest kontinuierlich die analoge Spannung über den MCP3008 (CH0).
- Wandelt den Messwert in eine Spannung um (unter Verwendung von ``VREF = 3,3 V``).
- Skaliert die Spannung auf 0–10 Level und schaltet die entsprechenden LEDs ein.
- Gibt den rohen ADC-Wert, die Spannung (in Volt) und das LED-Level über die serielle Konsole aus.
Dies fungiert als visuelle Batterieanzeige oder als analoges Voltmeter.