Sistema de perguntas com botões de sim e não

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.");
}

1a. recomendação
remova 1 Serial.begin()?

" Serial.begin(9600);
Serial.begin(115200);"

PS: 1
No setup() voce mandou imprimir:
" Serial.println(F("Pressione o botão para iniciar a triagem")); "

Que botão deverá ser pressionado?

Sugiro que vc poste um esquemático do seu projeto.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.