#include <Wire.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#define SSID "Wokwi-GUEST"
#define PASS ""
#define CH_ID 2575218
#define API_KEY "T6SGVM6TFH1ETWQL"
char ssid[] = SSID;
char pass[] = PASS;
int KeyIndex = 0;
WiFiClient client;
unsigned long ChannelNumber = CH_ID;
const char *myAPIKey = API_KEY;
#define pinTEMP 32 // Pino do sensor de Temperatura
#define pinBPM 35
#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(115200);
pinMode(INTERRUPT_PIN, INPUT);
pinMode(pinTEMP, OUTPUT);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), HeartRateInterrupt, RISING); // Configura a interrupção no pino
while (!Serial){
;
}
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
if (WiFi.status() != WL_CONNECTED){
Serial.print("Tentando se conectar com o SSID ");
Serial.println(SSID);
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("Conetado ao WiFi");
}
// Ajuste na fórmula para mapear a faixa de 0 Hz a 220 Hz para a frequência cardíaca em BPM
int count = analogRead(pinBPM);
float heartRate = map(count, 0, 4095, 0, 220); // Mapeia a contagem para a faixa desejada
// Fórmula para cálculo da temperatura corporal em celsius
int valorTemp = analogRead(pinTEMP);
float tempCorp = 1 / (log(1 / (4095. / 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("----");
ThingSpeak.setField(1, tempCorp);
ThingSpeak.setField(2, heartRate);
int x = ThingSpeak.writeFields(ChannelNumber, myAPIKey);
if (x == 200) {
Serial.println("Canal atualizado");
} else {
Serial.print("Problema ao atualizar o canal. Código de erro: ");
Serial.println(x);
if (x == -101) {
Serial.println("WiFi network disconectado. Tentando reconectar...");
} else if (x == -301) {
Serial.println("Não foi possível conectar ao servidor do ThingSpeak");
} else if (x == -303) {
Serial.println("Tempo esgotado ao aguardar resposta do servidor ThingSpeak");
} else {
Serial.println("Erro desconhecido");
}
}
delay(10000);
}