Olá, estou terminando de realizar o meu projeto de tcc no arduino mega, porem tive alguns problemas. Seria um sistema de triagem, possui alguns sensores de bpm, SO2, temperatura corporal, sensor biométrico e teclado matricial. Consegui arrumar os sensores para funcionarem juntos exibindo os parâmetros, está confuso, mas só falta realizar algumas perguntas, que são respondidas pelos botões de sim e não, serão pontuadas as respostas para exibir a classificação de urgência. Eu fiz a parte e funcionou perfeitamente, mas quando inseri no código central exibe apenas a primeira pergunta, como se o void de próximas perguntas não funcionasse, ou como se os botões não fossem lidos corretamente, alguém pode me ajudar?
Linhas a serem revistas para possível funcionamento e que tem relação com os botões: Linhas 10 a 30 - declarações de variáveis/pinos e lista de perguntas. Linha 73 e 74 declaram os botões. Linha 173 a 189 - diz oque os botões de sim e não devem fazer quando acionados. Linha 299 a 339 - void para próximas perguntas, exibição e reiniciar
#include <Adafruit_Fingerprint.h>
#include <Password.h> // Biblioteca utilizada para controle de senha
#include <Keypad.h> // Biblioteca para controle do teclado de matrizes
SoftwareSerial mySerial(52, 53);
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <Adafruit_MLX90614.h>
#define REPORTING_PERIOD_MS 1000
// Pinos dos botões de sim enão para perguntas
const int botaoSimPin = 2;
const int botaoNaoPin = 3;
// Variáveis para armazenar as respostas
boolean respostaSim = false;
boolean respostaNao = false;
int classifica = 0;
// Array de perguntas
String perguntas[] = {
"Possui alguma doença preexistente?",
"Se sim, seria alguma dessas? Hipertensão, problema crônico, diabetes, doença do coração, avc, cancêr, asma, algum reumatismo ou depressão ",
"Utiliza medicamentos de uso contínuo?",
"Sente fortes dores de cabeça?",
"Sente nâusea, vômito ou mau estar?",
"Sente falta de ar?",
"Sente dores no peito ou abdominal?",
"Sente dores no corpo?",
"Esta com tosse ou nariz escorrendo?"
};
int numPerguntas = sizeof(perguntas) / sizeof(perguntas[0]); //numero de perguntas, armazena as perguntas
int perguntaAtual = 0; //pergunta 1
// Acima estão as bibliotecas e definições
//declarações de bpm e saturação
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected() {
Serial.println("Iniciando!");
}
//sensor impressão digital
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
byte ind = 0;
//teclado matricial
const byte LINHAS = 4; // Linhas do teclado
const byte COLUNAS = 4; // Colunas do teclado
String leitura;
Password senha = Password("1"); // Senha utilizada para liberacao
const int pinoSensor = 11; //PINO DIGITAL UTILIZADO PELO SENSOR
const int pinoLed = 12; //PINO DIGITAL UTILIZADO PELO LED
const char TECLAS_MATRIZ[LINHAS][COLUNAS] = { // Matriz de caracteres (mapeamento do teclado)
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
const byte PINOS_LINHAS[LINHAS] = { 9, 8, 7, 6 }; // Pinos de conexao com as linhas do teclado
const byte PINOS_COLUNAS[COLUNAS] = { 5, 4, 13, 10 }; // Pinos de conexao com as colunas do teclado
Keypad teclado_personalizado = Keypad(makeKeymap(TECLAS_MATRIZ), PINOS_LINHAS, PINOS_COLUNAS, LINHAS, COLUNAS); // Inicia teclado
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup() {
// Inicialização dos pinos dos botões
pinMode(botaoSimPin, INPUT_PULLUP); // botão sim perguntas
pinMode(botaoNaoPin, INPUT_PULLUP); // botão não perguntas
pinMode(pinoSensor, INPUT); //DEFINE O PINO COMO ENTRADA
pinMode(pinoLed, OUTPUT); //DEFINE O PINO COMO SAÍDA
Serial.begin(9600);
Serial.begin(115200);
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println(F("Triagem Igualitária de Saúde Automatizada..."));
delay(500);
Serial.println(F("Pressione o botão para iniciar a triagem"));
delay(500);
} else {
Serial.println(F("Não encontrou o sensor de impressão digital :("));
while (1) { delay(1); }
}
if (!pox.begin()) {
Serial.println("FAILED");
for (;;)
;
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop() {
if (digitalRead(pinoSensor) == HIGH) { //SE A LEITURA DO PINO FOR IGUAL A HIGH - SENSOR TOQUE -
digitalWrite(pinoLed, LOW); //APAGA O LED //ACENDE O LED
Serial.println(F("Olá! Seja bem vindo(a)."));
delay(1000);
Serial.println(F("Iniciando..."));
delay(1000);
Serial.println(F("Você deseja se identificar por biometria ou CPF?"));
delay(500);
Serial.println(F("A - CPF"));
Serial.println(F("B - BIOMETRIA"));
} else { //SENÃO, FAZ
digitalWrite(pinoLed, LOW); //APAGA O LED
}
char leitura_teclas = teclado_personalizado.getKey();
// Atribui a variavel a leitura do teclado
if (leitura_teclas) { // Se alguma tecla foi pressionada //TECLADO MATRICIAL
switch (ind) {
case 0:
if (leitura_teclas == 'A') {
ind = 1;
Serial.println(F("Informe o CPF e confirme clicando na letra C: "));
} else if (leitura_teclas == 'B') {
if (finger.verifyPassword()) {
Serial.println(F("..."));
delay(500);
} else {
Serial.println(F("Não encontrou o sensor de impressão digital :("));
while (1) { delay(1); }
}
Serial.println(F("Pressione o dedo no sensor biométrico"));
}
break;
case 1:
if (leitura_teclas == 'C') { // Se a tecla 'C' foi pressionada
if (senha.evaluate()) { // Verifica se a senha digitada esta correta
Serial.println(F("\nCPF Encontrado")); // Exibe a mensagem que a senha esta correta
delay(500);
Serial.println(F("Medidor de temperatura"));
delay(500);
Serial.println(F("Aproxime a testa do leitor de temperatura: "));
delay(3000);
mlx.begin();
Serial.print("Temperatura corporal: ");
Serial.print(mlx.readObjectTempC());
Serial.println();
delay(1000);
Serial.println(F("Aguarde:"));
delay(1000);
Serial.println(F("Medidor de bpm e saturação"));
delay(1000);
pox.update();
delay(3000);
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Batimento Cardiaco:");
Serial.print(pox.getHeartRate());
Serial.print("Saturação:");
Serial.print(pox.getSpO2());
tsLastReport = millis();
}
delay(1000);
Serial.println("\nIniciando perguntas básicas para determinarmos a claissificação de urgência...");
delay(500);
Serial.println("Responda as perguntas usando os botões de sim(verde) e não(vermelho)\n");
delay(1000);
if (digitalRead(botaoSimPin) == LOW) {
respostaSim = true;
respostaNao = false;
classifica = classifica + 5;
proximaPergunta();
delay(500); // Pequena pausa para evitar leituras múltiplas
}
// Verificar se o botão "Não" foi pressionado
if (digitalRead(botaoNaoPin) == LOW) {
respostaSim = false;
respostaNao = true;
classifica = classifica + 0;
proximaPergunta();
delay(500); // Pequena pausa para evitar leituras múltiplas
}
exibirPergunta(perguntaAtual);
} else { // Caso a senha esteja incorreta
Serial.println(F("\nCPF Inválido"));
ind = 2; // Exibe a mensagem que a senha esta errada
}
senha.reset(); // Limpa a variavel senha
} else { // Caso outra tecla tenha sido pressionada
Serial.print(leitura_teclas); // Exibe a tecla pressionada
senha.append(leitura_teclas); // Salva o valor da tecla pressionada na variavel senha
}
break;
default:
Serial.println(F("Ação indisponivel"));
break;
}
do {
getFingerprintIDez();
delay(50);
} while (leitura_teclas == 'B');
}
}
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
return -1;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
return -2;
}
p = finger.fingerSearch();
if (p == FINGERPRINT_NOTFOUND) {
Serial.println(F("Digital não cadastrada"));
delay(3000);
Serial.println(F("Coloque seu dedo...."));
return -3;
} else {
if (p != FINGERPRINT_OK) {
return -4;
}
}
Serial.print(F("Encontrado ID: "));
Serial.print(finger.fingerID);
Serial.print(F(" Com confiança de "));
Serial.println(finger.confidence);
delay(3000);
Serial.println(F("Medidor de temperatura"));
delay(500);
Serial.println(F("Aproxime a testa do leitor de temperatura: "));
delay(3000);
mlx.begin();
Serial.print(F("Temperatura corporal: "));
Serial.print(mlx.readObjectTempC());
Serial.println();
delay(1000);
Serial.println(F("Aguarde:"));
delay(1000);
Serial.println(F("Medidor de bpm e saturação"));
delay(1000);
pox.update();
delay(3000);
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Batimento Cardiaco:");
Serial.print(pox.getHeartRate());
Serial.println("Saturação:");
Serial.print(pox.getSpO2());
tsLastReport = millis();
}
delay(1000);
Serial.println("\nIniciando perguntas básicas para determinarmos a claissificação de urgência...");
delay(500);
Serial.println("Responda as perguntas usando os botões de sim(verde) e não(vermelho)\n");
delay(1000);
if (digitalRead(botaoSimPin) == LOW) {
respostaSim = true;
respostaNao = false;
classifica = classifica + 5;
proximaPergunta();
delay(500); // Pequena pausa para evitar leituras múltiplas
}
// Verificar se o botão "Não" foi pressionado
if (digitalRead(botaoNaoPin) == LOW) {
respostaSim = false;
respostaNao = true;
classifica = classifica + 0;
proximaPergunta();
delay(500); // Pequena pausa para evitar leituras múltiplas
}
exibirPergunta(perguntaAtual);
delay(1000);
return finger.fingerID;
}
//FIM DO LOOP E INICIO DE DECLARAÇÕES DE CLASSES
void exibirPergunta(int indice) {
Serial.println(perguntas[indice]);
}
void proximaPergunta() {
perguntaAtual++;
if (perguntaAtual < numPerguntas) {
exibirPergunta(perguntaAtual);
} else {
if (classifica == 0 or classifica == 5) {
Serial.println("Classificação de Urgência: Azul - espera de até 240 minutos");
}
if (classifica >= 10 and classifica <= 19) {
Serial.println("Classificação de Urgência: Verde - espera de até 120 minutos");
}
if (classifica == 20) {
Serial.println("Classificação de Urgência: Amarelo - espera de até 50 minutos");
}
if (classifica == 25) {
Serial.println("Classificação de Urgência: Laranja - espera de até 10 minutos");
}
if (classifica >= 30) {
Serial.println("Classificação de Urgência: Vermelho - Atendimento imediato");
}
// Todas as perguntas foram respondidas
// Faça o que for necessário com as respostas armazenadas
// Reinicie o sistema ou execute outra ação
//reiniciarSistema();
}
}
void reiniciarSistema() {
perguntaAtual = 0;
respostaSim = false;
respostaNao = false;
// Reinicialize quaisquer outras variáveis ou estados necessários
Serial.println("Sistema reiniciado.");
}