#include "SevSeg.h"
const int potPin = 34; // Pin del potenciómetro
const int buttonPin = 18; // Pin del pulsador
const int numLEDs = 10; // Número de LEDs en la barra
const int ledPins[] = {35, 26, 37, 14, 12, 13, 15, 2, 4, 16}; // Pines de los LEDs
const int dipSwitchPins[] = {5, 19, 21, 20, 11, 17, 33, 36}; // Pines del DIP switch
const int buzzerPin = 3; // Pin del buzzer para alarma sonora
SevSeg sevseg; // Objeto para controlar el display de 7 segmentos
int mode = 0; // Variable para guardar el modo actual (0: BPM, 1: mmHg, 2: SpO2)
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;
int lastButtonState = HIGH;
int buttonState = HIGH;
void setup() {
// Configura los pines de los LEDs como salidas
for (int i = 0; i < numLEDs; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(buttonPin, INPUT_PULLUP); // Configura el pulsador con resistencia pull-up
pinMode(buzzerPin, OUTPUT); // Configura el buzzer como salida
// Configura los pines del DIP switch como entradas
for (int i = 0; i < 8; i++) {
pinMode(dipSwitchPins[i], INPUT_PULLUP);
}
Serial.begin(115200); // Para depuración
// Configuración del display de 7 segmentos
byte numDigits = 4;
byte digitPins[] = {0, 12, 9, 27}; // Pines de los dígitos
byte segmentPins[] = {0, 1, 6, 7, 8, 9, 10, }; // Pines de los segmentos
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = false;
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90); // Brillo del display
}
void loop() {
int potValue = analogRead(potPin); // Lee el valor del potenciómetro
int displayValue = 0; // Valor que se mostrará en el display
bool alarmActive = false; // Estado de la alarma
// Leer el estado del botón y gestionar el debounce
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == LOW && buttonState == HIGH) {
// Cambia el modo al presionar el botón
mode = (mode + 1) % 3; // Alterna entre 0, 1 y 2
}
buttonState = reading;
}
lastButtonState = reading;
// Selección de parámetros según el modo
switch (mode) {
case 0: // Frecuencia cardíaca (BPM)
displayValue = map(potValue, 0, 4095, 60, 180); // Simulación BPM 60-180
Serial.println("Modo: Frecuencia cardíaca (BPM)");
// Alarmas para frecuencia cardíaca
if (displayValue < 70 || displayValue > 120) {
alarmActive = checkAlarm(0); // Verifica si la alarma está activada con el DIP switch
}
break;
case 1: // Presión arterial (mmHg)
displayValue = map(potValue, 0, 4095, 90, 120); // Simulación mmHg 90-120
Serial.println("Modo: Presión arterial (mmHg)");
// Alarmas para presión arterial
if (displayValue < 100 || displayValue > 110) {
alarmActive = checkAlarm(1);
}
break;
case 2: // Saturación de oxígeno (SpO2)
displayValue = map(potValue, 0, 4095, 90, 100); // Simulación SpO2 90-100%
Serial.println("Modo: Saturación de oxígeno (SpO2)");
// Alarmas para saturación de oxígeno
if (displayValue < 95 || displayValue > 98) {
alarmActive = checkAlarm(2);
}
break;
}
// Mostrar el valor en el display de 7 segmentos
sevseg.setNumber(displayValue);
sevseg.refreshDisplay(); // Actualiza el display
// Enciende/apaga los LEDs según el valor del potenciómetro
int numLEDsOn = map(potValue, 0, 4095, 0, numLEDs);
for (int i = 0; i < numLEDs; i++) {
if (i < numLEDsOn) {
digitalWrite(ledPins[i], HIGH); // Enciende el LED
} else {
digitalWrite(ledPins[i], LOW); // Apaga el LED
}
}
// Si la alarma está activada, enciende el buzzer y parpadean los LEDs
if (alarmActive) {
tone(buzzerPin, 1000); // Sonido del buzzer a 1000Hz
for (int i = 0; i < numLEDs; i++) {
digitalWrite(ledPins[i], HIGH);
delay(100);
digitalWrite(ledPins[i], LOW);
delay(100);
}
} else {
noTone(buzzerPin); // Apaga el buzzer si no hay alarma
}
delay(100); // Pausa para evitar lecturas excesivas
}
// Función para verificar si la alarma está activada con el DIP switch
bool checkAlarm(int parameter) {
// Parámetro 0 para BPM, 1 para mmHg, 2 para SpO2
// Asume que las posiciones del DIP switch están relacionadas con cada parámetro
return !digitalRead(dipSwitchPins[parameter]); // La alarma está activada si el switch está en LOW
}