#include <Wire.h>
#include <WiFi.h>
#include<
#define LED1 27
#define LED2 26
#define LED3 25
#define pinTEMP 15 // Pino do sensor de Temperatura
#define PULSE_PER_BEAT 1 // Número de pulsos por batimento cardíaco
#define INTERRUPT_PIN 5 // Pino de interrupção
#define SAMPLING_INTERVAL 1000 // Intervalo de amostragem em milissegundos
volatile uint16_t pulse; // Variável que será incrementada na interrupção
uint16_t count; // Variável para armazenar o valor atual de pulse
float heartRate; // Frequência cardíaca calculada a partir de count
const float BETA = 3950; // Variável do coeficiente BETA do termistor
unsigned long cont = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; // Mutex para garantir acesso seguro a pulse
void IRAM_ATTR HeartRateInterrupt() {
portENTER_CRITICAL_ISR(&mux); // Entra em uma seção crítica de interrupção
pulse++; // Incrementa a variável pulse de maneira segura
portEXIT_CRITICAL_ISR(&mux); // Sai da seção crítica de interrupção
}
void setup() {
Serial.begin(9600);
analogReadResolution(10); // Define o tamanho (em bits) dos valores lido em 10 bits (valores de 0 a 1023)
Serial.print("Conectando-se ao Wi-Fi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Conectado!");
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT);
pinMode(pinTEMP, OUTPUT);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), HeartRateInterrupt, RISING); // Configura a interrupção no pino
}
void loop() {
HeartRateandTemperature(); // Chama a função principal
}
void HeartRateandTemperature() {
static unsigned long startTime;
if (millis() - startTime < SAMPLING_INTERVAL) return; // Intervalo de amostragem
startTime = millis();
portENTER_CRITICAL(&mux); // Entra em uma seção crítica
count = pulse; // Salva o valor atual de pulse e zera pulse
pulse = 0;
portEXIT_CRITICAL(&mux); // Sai da seção crítica
// Ajuste na fórmula para mapear a faixa de 0 Hz a 220 Hz para a frequência cardíaca em BPM
heartRate = map(count, 0, 220, 0, 220); // Mapeia a contagem para a faixa desejada
SinaisdoLed();
// Fórmula para cálculo da temperatura corporal em celsius
int valorTemp = analogRead(pinTEMP);
float tempCorp = 1 / (log(1 / (1023. / valorTemp - 1)) / BETA + 1.0 / 298.15) - 273.15;
cont++; // A cada impressão, incrementa um valor (para número de análise)
Serial.println("Análise " + String(cont) + ":");
Serial.println("Temperatura Corporal: " + String(tempCorp) + " ℃");
Serial.println("Frequência Cardíaca: " + String(heartRate, 2) + " BPM");
Serial.println("----");
}
void SinaisdoLed() {
if ((heartRate > 120) || (heartRate < 60)) {
digitalWrite(LED3, HIGH);
digitalWrite(LED2, LOW); // Apaga LED2
digitalWrite(LED1, LOW); // Apaga LED1
} else if ((heartRate >= 95) && (heartRate <= 120)) {
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW); // Apaga LED3
digitalWrite(LED1, LOW); // Apaga LED1
} else {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW); // Apaga LED2
digitalWrite(LED3, LOW); // Apaga LED3
}
}