Configuración del Beetle ESP32 - C3 y el MAX30102
Microcontrolador Beetle ESP32-C3 con Sensor MAX30102
En este blog enseñaremos a configurar el MAX30102 con un microcontrolador Beetle ESP32-C3
El microcontrolador mostrado en la imagen es el Beetle ESP32-C3, es un microcontrolador compacto y versátil diseñado para aplicaciones IoT. A continuación se detalla una explicación de sus componentes y conexiones de la imagen anterior:
Componentes y Conexiones
Beetle ESP32-C3: Es el microcontrolador principal de la configuración. Incluye un módulo ESP32-C3, que es una opción popular para aplicaciones de Internet de las Cosas (IoT) debido a su conectividad Wi-Fi y Bluetooth integradas.
Sensor MAX30102: Es un sensor óptico que mide la frecuencia cardíaca y los niveles de oxígeno en la sangre (SpO2). En la imagen, este sensor está conectado al Beetle ESP32-C3.
Batería de Litio 3.7V: Proporciona la energía necesaria para el funcionamiento del sistema. Está conectada al Beetle ESP32-C3 para alimentar tanto el microcontrolador como el sensor.
Conexiones
Conexiones del Sensor MAX30102:
- VCC (Rojo): Conectado al pin de alimentación del Beetle ESP32-C3.
- GND (Negro): Conectado al pin de tierra del Beetle ESP32-C3.
- SDA (Amarillo): Conectado al pin GPIO correspondiente del Beetle ESP32-C3 para la comunicación I2C.
- SCL (Azul): Conectado al pin GPIO correspondiente del Beetle ESP32-C3 para la comunicación I2C.
- INT (Blanco): Conectado al pin GPIO correspondiente del Beetle ESP32-C3 para interrupciones (opcional).
Conexiones de la Batería:
- Positivo (Rojo): Conectado al pin de entrada de alimentación del Beetle ESP32-C3.
- Negativo (Negro): Conectado al pin de tierra del Beetle ESP32-C3.
Código para el Microcontrolador Beetle ESP32-C3 y el Sensor MAX30102
Para la programacion de este microcontrolador podemos usar la misma metodologia de programacion del microcontrolador ESP32 DEV KIT V1, sin embargo en este caso seleccionamos del gestor de tarjetas la opcion "ESP32C3 Dev Module"
Una vez configurada la tarjeta, procedemos a ejecutar el codigo que aparece a continuación
// Incluimos las librerías necesarias
#include <Arduino.h>
#include <MAX30105.h>
#define SDA 21
#define SCL 22
#define LED 10
#define Tm 0.004
MAX30105 Max30102;
// VARIABLES MAX30102
int CuentasSensorM[2];
float VoltajeSensorM[2] = {0.0000, 0.0000};
char envio[10];
// MUESTREO SENSORES
hw_timer_t* MuestreoSensores = NULL;
_Bool TMuestreoSensores;
void IRAM_ATTR Int_MuestreoSensores() {
TMuestreoSensores = 1;
}
void InicializacionMuestreoSensores() {
MuestreoSensores = timerBegin(0, 80, true);
timerAttachInterrupt(MuestreoSensores, &Int_MuestreoSensores, true); // Habilita interrupción del timer
timerAlarmWrite(MuestreoSensores, 4000, true);
timerAlarmEnable(MuestreoSensores);
}
// TIEMPO ENVÍO
hw_timer_t* MuestreoEnvio = NULL;
_Bool TMuestreoEnvio;
void IRAM_ATTR Int_MuestreoEnvio() {
TMuestreoEnvio = 1;
}
void InicializacionMuestreoEnvio() {
MuestreoEnvio = timerBegin(1, 80, true);
timerAttachInterrupt(MuestreoEnvio, &Int_MuestreoEnvio, true);
timerAlarmWrite(MuestreoEnvio, 16000, true);
timerAlarmEnable(MuestreoEnvio);
}
// MAX30102
void initMAX() {
if (!Max30102.begin(Wire, I2C_SPEED_FAST))
{
Serial.println("MAX30105 was not found. Please check wiring/power.");
while (1);
}
}
// MAX30102
void initMAX() {
if (!Max30102.begin(Wire, I2C_SPEED_FAST))
{
Serial.println("MAX30105 was not found. Please check wiring/power.");
while (1);
}
}
void setupMAX() {
byte ledBrightness = 0x1F; //Opciones: 0=Off a 255=50mA - Configuración de amplitud del pulso LED
byte sampleAverage = 4; //Opciones: 1, 2, 4, 8, 16, 32 - El chip promediará múltiples muestras del mismo tipo juntas si lo desea
byte ledMode = 2; //Opciones: 1 = Solo rojo, 2 = Rojo + IR, 3 = Rojo + IR + Verde
int sampleRate = 400; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200
int pulseWidth = 411; //Opciones: 69, 118, 215, 411
int adcRange = 4096; //Opciones: 2048, 4096, 8192, 16384
Max30102.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
}
void obtencionDatosMAX() {
CuentasSensorM[0] = Max30102.getRed();
VoltajeSensorM[0] = (CuentasSensorM[0] * (3.3000 / 262143));
CuentasSensorM[1] = Max30102.getIR();
VoltajeSensorM[1] = (CuentasSensorM[1] * (3.3000 / 262143));
}
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(115200);
initMAX();
setupMAX();
InicializacionMuestreoSensores();
InicializacionMuestreoEnvio();
}
void loop() {
if (TMuestreoSensores == 1) {
obtencionDatosMAX();
TMuestreoSensores = 0;
}
if (TMuestreoEnvio == 1) {
sprintf(envio, "%f;%f", VoltajeSensorM[0], VoltajeSensorM[1]);
Serial.println(envio);
digitalWrite(LED, !digitalRead(LED));
TMuestreoEnvio = 0;
}
}
Contáctanos si tienes dudas sobre el proyecto 👍️💫