Nota

¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

3.1.5 Indicador de Batería (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y procede con la sección correspondiente.

Introducción

En este proyecto, realizaremos un dispositivo indicador de batería que puede mostrar visualmente el nivel de la batería en la barra de LED (LED Bargraph).

Advertencia

No utilices componentes de batería que excedan los 3.3V para evitar sobrecargas que puedan dañar el chip o la Raspberry Pi.

Componentes requeridos

En este proyecto necesitamos los siguientes componentes.

../_images/list2_Battery_Indicator.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los siguientes enlaces.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Gráfico de Barras LED

-

MCP3008

-

Diagrama esquemático

Nombre T-Board

Física

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

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/july24_3.1.5_battery_indicator_mcp3008.png

Paso 2: Ve a la carpeta del código.

cd ~/raphael-kit/c/3.1.5-2/

Paso 3: Compila el código.

gcc 3.1.5_BatteryIndicator.c -lwiringPi

Paso 4: Ejecuta el archivo compilado.

sudo ./a.out

Después de que el programa se ejecute, conecta un cable desde el pin 3 del MCP3008 y otro desde el GND a los dos polos de una batería. Verás que los LED correspondientes en la barra LED se encienden para mostrar el nivel de energía (rango de medición: 0-5V).

Nota

Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", por favor consulta Instalar y verificar WiringPi.

Código

#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 inicio
    buffer[1] = (8 + channel) << 4;  // Modo de un solo extremo
    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("¡Error al configurar wiringPi!\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("¡Error al configurar 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("Valor ADC: %d\tVoltaje: %.2f V\tNivel: %d\n", analogVal, voltage, level);

        delay(200);
    }

    return 0;
}

Explicación del código

int read_ADC(int channel) { ... }

Esta función lee valores analógicos del chip ADC MCP3008 usando SPI. El parámetro channel selecciona una de las 8 entradas analógicas (CH0–CH7). El MCP3008 devuelve un valor digital de 10 bits entre 0 y 1023 que representa el voltaje analógico.

void LedBarGraph(int value) { ... }

Esta función controla una barra de LED de 10 segmentos. Cada LED representa 1/10 del rango de voltaje. Los LED se encienden en orden hasta el nivel especificado.

Nota: Esta versión asume que los ánodos de los LED están conectados a los GPIOs y los cátodos a GND (es decir, activos en HIGH).

int main(void) { ... }

Lógica principal del programa:

  • Inicializa wiringPi y la comunicación SPI.

  • Configura los pines GPIO como salidas para controlar la barra LED de 10 segmentos.

  • Lee continuamente el voltaje analógico a través del MCP3008 (CH0).

  • Convierte la lectura en voltaje usando VREF = 3.3V.

  • Escala el voltaje a un nivel de 0–10 y enciende los LED correspondientes.

  • Muestra en consola el valor crudo del ADC, el voltaje (en voltios) y el nivel del LED.

Esto actúa como un indicador visual de nivel de batería o voltímetro analógico.