Skip to content

Repositório para o trabalho final da disciplina de Projetos de Sistemas Ubíquos da UFSC, campus de Araranguá.

License

Notifications You must be signed in to change notification settings

theHprogrammer-UFSCWORKS/UBIQUOS_STRESS_DETECTOR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UBÍQUOS_STRESS_DETECTOR

Repositório para o trabalho final da disciplina de Projetos de Sistemas Ubíquos da UFSC, campus de Araranguá. O presente trabalho consiste no desenvolvimento de um protótipo de um detector de estresse destinado a profissionais da área da saúde, integrando sensores de Resposta Galvânica da Pele (do inglês Galvanic Skin Response - GSR), Frequência Cardiaca (conhecido no ingês como Pulse Sensor e de temperatura (DS18B20)), a um sistema web com backend em django por meio de comunicação com o protocolo de Transporte de Telemetria ded Enfileiramento de Menagens (do inglês Message Queuing Telemetry Transport - MQTT).


Tecnologias e Ferramentas

  • Sensores: GSR, Frequência Cardíaca (Pulse Sensor), DS18B20 (Temperatura).
  • Backend: Django.
  • Banco de Dados: MySQL.
  • Comunicação: MQTT.
  • Placa de Desenvolvimento: ESP32.

Bibliotecas

Biblioteca Versão Descrição
Arduino.h - Biblioteca padrão do Arduino
WiFi.h 1.2.7 Para comunicação WiFi
PubSubClient.h 2.8.0 Comunicação MQTT
OneWire.h 2.3.7 Biblioteca do serial do sensor de temperatura
DallasTemperature.h 3.9.0 Biblioteca do sensor de temperatura
PulseSensorPlayground.h 1.9.1 Biblioteca do sensor de frequência cardíaca

Fundamentos para Detecção de Estresse

O estresse é uma resposta física e psicológica do corpo a desafios ou demandas. É caracterizado por mudanças fisiológicas e comportamentais, como aumento da frequência cardíaca, tensão muscular, alterações na respiração e na transpiração. A detecção de estresse tornou-se um campo de interesse vital, particularmente em ambientes profissionais de alta pressão, como o setor de saúde.

Detecção de Estresse com Sensores

Sensor GSR (Galvanic Skin Response):

  • O que é: O sensor GSR mede a condutividade elétrica da pele, que varia com a sua umidade.
  • Detecção de Estresse: Durante o estresse, as glândulas sudoríparas são mais ativas, aumentando a umidade da pele e, consequentemente, sua condutividade. O sensor GSR detecta essas mudanças, fornecendo uma indicação quantitativa do nível de estresse.
  • Parâmetros para medição:
    • Baixo Estresse: Condutividade abaixo de 10 kΩ, indicando um estado de calma ou relaxamento.
    • Estresse Moderado: Condutividade entre 10 kΩ e 50 kΩ, representando um estado de alerta ou ansiedade leve.
    • Alto Estresse: Condutividade acima de 50 kΩ, sugerindo um estado elevado de estresse ou ansiedade.

Sensor de Frequência Cardíaca (Pulse Sensor)

  • O que é: Este sensor monitora a frequência cardíaca ao detectar as pulsações do sangue através da pele.
  • Detecção de Estresse: O estresse pode acelerar a frequência cardíaca. A monitoração da frequência cardíaca permite detectar essas alterações, sendo um indicador importante de estresse agudo.
  • Parâmetros para medição:
    • Normal: Frequência cardíaca de 50 a 90 batimentos por minuto (bpm) em repouso.
    • Estresse Leve a Moderado: Frequência cardíaca entre 90 e 120 bpm, pode indicar nervosismo ou ansiedade.
    • Alto Estresse: Frequência cardíaca acima de 120 bpm, especialmente em repouso, sugere um estado elevado de estresse ou ansiedade.

Sensor de Temperatura (DS18B20)

  • O que é: O DS18B20 é um sensor de temperatura que pode ser usado para medir a temperatura do corpo ou do ambiente.
  • Detecção de Estresse: Embora as variações de temperatura do corpo devido ao estresse sejam mais sutis em comparação com outros indicadores, a temperatura da pele pode diminuir em situações de estresse, devido à vasoconstrição periférica.
  • Parâmetros para medição:
    • Normal: Temperatura corporal entre 36,1°C e 37,2°C.
    • Possível Estresse: Variações na temperatura corporal, como uma queda para abaixo de 36,1°C, podem indicar estresse, particularmente se acompanhadas por outros indicadores.
    • Atenção: Variações extremas de temperatura corporal, para mais ou menos, devem ser avaliadas com cuidado, pois podem indicar condições médicas além do estresse.

Arquitetura do Sistema

A arquitetura do sistema do detector de estresse é projetada para haver a integração entre os componentes de hardware e software, garantindo a coleta eficiente e o processamento de dados fisiológicos. Os módulos de sensor são responsáveis pela aquisição direta de dados biológicos, como frequência cardíaca e resistência da pele, que são posteriormente encaminhados ao controlador. O controlador atua como o núcleo de processamento, onde os dados são inicialmente tratados e interpretados.

Uma vez processados, os dados são enviados através de um protocolo de comunicação MQTT, um método leve e eficiente para a transferência de mensagens entre dispositivos com recursos limitados. O sistema web desempenha um papel duplo, agindo tanto como uma interface de usuário para a apresentação das informações processadas quanto como um sistema de back-end para o armazenamento seguro dos dados coletados em um banco de dados. Esta dualidade assegura que os dados possam ser acessados para análise futura e também em tempo real para monitoramento.

Abaixo está o diagrama de blocos representando a arquitetura do sistema:

Diagrama de Blocos da Arquitetura do Sistema

1. Especificações do Sensor Grove - GSR

Parâmetro Descrição
Nome do Produto Grove - GSR Sensor
Versão V1.2 (31/07/2014)
Funcionalidade Medição da resistência da pele (GSR)
Tensão de Operação 3.3V/5V
Sensibilidade Ajustável via potenciômetro
Sinal de Entrada Resistência (não Condutividade)
Sinal de Saída Tensão, leitura analógica
Material de Contato Níquel

2. Especificações do Sensor de Frequência Cardíca - Pulse Sensor

Parâmetro Descrição
Nome do Produto Pulse Sensor
Descrição Geral Sensor óptico de baixo custo para medição da frequência cardíaca (PPG) para Arduino e outras microcontroladoras
Fabricante World Famous Electronics
Características Inclui acessórios do kit, Plug and Play, Pequeno, Compatível com MCU com ADC, Funciona com 3V ou 5V, Biblioteca Arduino
Faixa de Temperatura Operacional -40°C a +85°C
Faixa de Tensão de Entrada 3 a 5.5 V
Faixa de Tensão de Saída 0.3 a Vdd V
Corrente de Alimentação 3 a 4 mA

3. Especificações do Sensor de Temperatura - DS18B20

Parâmetro Descrição
Nome do Produto DS18B20
Descrição Geral Termômetro digital que fornece medições de temperatura em Celsius de 9 a 12 bits
Características Especiais Interface 1-Wire, Mede -55°C a +125°C, Precisão de ±0.5°C, Resolução de 9 a 12 bits, Não requer componentes externos
Taxa de Tensão 3 a 5.5 V
Aplicações Controles termostáticos, Sistemas industriais, Produtos de consumo, Termômetros, Sistemas sensíveis à temperatura

4. Principais Especificações do ESP32

Parâmetro Descrição
Nome do Produto ESP32
Descrição Geral Chip combo Wi-Fi e Bluetooth de 2,4 GHz projetado com tecnologia TSMC de baixo consumo de 40 nm
Características Principais Wi-Fi 802.11b/g/n, Wi-Fi 802.11n (2.4 GHz, até 150 Mbps), Bluetooth v4.2 BR/EDR e LE, 2 ou 1 x Xtensa® 32-bit LX6 Microprocessors
Capacidades Modos de infraestrutura, SoftAP e promíscuo simultâneos, Aceleração de hardware criptográfico, ADC, DAC, I2C, I2S, SDIO, UART, ETH, PWM, sensor de toque
Memória Flash ou PSRAM integrados, SRAM
Alimentação 3.3V (tensão típica)

Pinagem do ESP32

Pinagem do ESP32

Modelagem do Hardware

Na modelagem do hardware deste sistema, diversos componentes foram cuidadosamente selecionados e configurados para medir dados fisiológicos. O ADC0 foi utilizado para a leitura do sensor de pulso, que é crucial para a detecção de frequência cardíaca. A GPIO4 foi designada para o sensor de temperatura DS18B20, utilizando o protocolo OneWire para comunicação. Já a GPIO34 foi dedicada ao sensor GSR, responsável pela medição da condutância da pele, que pode indicar alterações no estado emocional do usuário. Além disso, foi implementado um resistor de pull-up de 4,7kΩ para garantir leituras precisas e estáveis do sensor de temperatura.

Esquemático do circuito:

Esquemático do Circuito

Modelagem do Banco de Dados

O sistema de detecção de estresse utiliza um banco de dados MySQL para armazenar e gerenciar os dados coletados. A modelagem do banco de dados foi implementada dentro do Django, um framework de desenvolvimento web de alto nível que encoraja o desenvolvimento rápido e limpo, com um design pragmático. O banco de dados é composto por três tabelas principais:

  1. Usuário: Armazena informações de identificação dos usuários, incluindo nome, e-mail e senha.
  2. Análise: Contém registros de cada análise realizada, vinculada ao usuário correspondente e marcada com um carimbo de data/hora.
  3. Dados: Captura os dados fisiológicos coletados, como temperatura, frequência cardíaca e condutância da pele (GSR), associados a uma análise específica.

Este design permite o armazenamento eficiente de dados de forma estruturada, facilitando o acesso e a análise dos mesmos. A relação entre as tabelas é estabelecida através de chaves estrangeiras, que associam cada análise a um usuário específico e cada conjunto de dados fisiológicos a uma análise correspondente.

Abaixo está o diagrama entidade-relacionamento (ER) que ilustra a estrutura do banco de dados:

Diagrama Entidade-Relacionamento do Banco de Dados

Modelagem do Sistema Web

O sistema web do detector de estresse foi desenvolvido a partir de um template adaptado para Django, com o uso de Bootstrap do Creative Tim, e codificado por AppSeed. O template foi localizado para o português brasileiro (pt-br), e a página principal foi personalizada para permitir que o usuário insira o endereço MAC do dispositivo e solicite a coleta de dados.

Para possibilitar a atualização dos dados em tempo real, foi implementado um código AJAX na página. O script AJAX é responsável por iniciar a análise de dados ao receber um endereço MAC válido, fazendo uma requisição POST para o servidor. Em seguida, a função atualizarDadosSensores é chamada a cada cinco segundos para atualizar os valores de GSR, frequência cardíaca e temperatura apresentados na interface do usuário.

A lógica AJAX garante que, uma vez iniciada a análise, os dados são atualizados regularmente sem a necessidade de recarregar a página, proporcionando uma experiência de usuário fluida e responsiva.

Abaixo está a representação da interface principal do sistema web:

Interface Principal do Sistema Web


Implementação do Código JavaScript

O código JavaScript abaixo é responsável pela interação do usuário com o sistema web através de requisições AJAX, que permitem atualizações em tempo real sem recarregar a página.

{% block javascripts %}
<!-- Carregamento do jQuery, uma biblioteca JavaScript rápida, pequena e rica em recursos. -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<script>
    // Função para obter o valor do cookie CSRF do Django para segurança nas requisições AJAX.
	function getCookie(name) {
		let cookieValue = null;
		if (document.cookie && document.cookie !== "") {
			const cookies = document.cookie.split(";");
			for (let i = 0; i < cookies.length; i++) {
				const cookie = cookies[i].trim();
				if (cookie.substring(0, name.length + 1) === (name + "=")) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return cookieValue;
	}

	// Obtenção do token CSRF usando a função acima.
	const csrftoken = getCookie("csrftoken");

    // Função para iniciar a análise dos dados coletados pelo dispositivo de hardware.
    function startAnalysis() {
        // Obtém o endereço MAC fornecido pelo usuário no campo de input.
        var macAddress = $("#macInput").val();
        if (macAddress) {
            // Requisição AJAX para iniciar a análise de dados.
            $.ajax({
                url: "iniciar-analise/",
                type: "POST",
                headers: {"X-CSRFToken": csrftoken},
                data: {mac_address: macAddress},
                success: function (response) {
                    console.log("Análise iniciada", response);
                    // Inicia a função de atualização dos dados dos sensores.
                    atualizarDadosSensores();
                    // Define um intervalo para atualizar os dados a cada 5 segundos.
                    intervaloAtualizacao = setInterval(atualizarDadosSensores, 5000);
                },
                error: function (error) {
                    console.error("Erro ao iniciar análise:", error);
                },
            });
        } else {
            alert("Por favor, insira o endereço MAC.");
        }
    }

    // Função para atualizar os dados dos sensores na interface do usuário.
    function atualizarDadosSensores() {
        $.ajax({
            url: "obter-dados-sensores/",
            type: "GET",
            success: function (response) {
                // Atualiza os valores dos sensores na página.
                $("#gsrValue").text(response.gsr);
                $("#heartRateValue").text(response.freq_cardiaca);
                $("#temperatureValue").text(response.temperatura);
                // Se a coleta de dados foi finalizada, limpa o intervalo.
                if (response.coleta_ativa == 'False') {
                    clearInterval(intervaloAtualizacao);
                    console.log("Coleta de dados finalizada.");
                }
            },
            error: function (error) {
                console.error("Erro ao obter dados dos sensores:", error);
            },
        });
    }
</script>
{% endblock javascripts %}

Implementação das Views no Django

As views são uma parte crucial do framework Django, lidando com a lógica da aplicação e respondendo às requisições HTTP. Abaixo está a implementação de duas views que lidam com o início da análise de dados e a obtenção de dados dos sensores, respectivamente.

from django.http import JsonResponse
from django.views.decorators.http import require_POST
from paho.mqtt import publish
from .models import Analise, DadoSensor

@require_POST
def iniciar_analise(request):
    # Recebe o endereço MAC via POST e inicia a análise.
    mac_address = request.POST.get('mac_address')
    print(f"Iniciando análise para o MAC Address: {mac_address}")  # Log para verificação
    
    try:
        # Envia um comando MQTT para o tópico apropriado.
        publish.single('esp32/sensores/comandos', mac_address, port=1883, hostname='localhost')
        message = 'Análise iniciada para o MAC: ' + mac_address
        status = 'success'
        print("Publicação MQTT bem-sucedida.")
    except Exception as e:
        # Em caso de falha, loga o erro.
        message = str(e)
        status = 'error'
        print("Erro na publicação MQTT:", e)

    # Cria um novo registro de análise no banco de dados associado ao usuário atual.
    nova_analise = Analise(usuario=request.user)
    nova_analise.save()
    
    # Retorna uma resposta JSON indicando o sucesso ou falha da operação.
    return JsonResponse({'status': status, 'message': message})

def obter_dados_sensores(request):
    # Recupera a análise mais recente.
    ultima_analise = Analise.objects.latest('data_criacao')

    # Tenta obter os dados mais recentes associados a essa análise.
    try:
        dados = DadoSensor.objects.filter(analise=ultima_analise).latest('timestamp')
        response_data = {
            'gsr': dados.gsr_media,
            'freq_cardiaca': dados.freq_cardiaca_media,
            'temperatura': dados.temperatura_final,
            'coleta_ativa': dados.coleta_ativa,
        }
    except DadoSensor.DoesNotExist:
        # Se não houver dados disponíveis, define valores padrão.
        response_data = {'gsr': 0, 'freq_cardiaca': 0, 'temperatura': 0}

    # Retorna os dados como uma resposta JSON.
    return JsonResponse(response_data)

Requisitos Atendidos

A seguir, apresentamos uma checklist dos requisitos do projeto e seu status atual:

Requisitos Funcionais

  • RF01: O sistema deve enviar notificações para o usuário se os níveis de estresse excederem um determinado limite. (Pendente)
  • RF02: O sistema deve proporcionar um dashboard, mostrando o nível atual de estresse. (Pendente)
  • RF03: O sistema deve guardar um histórico de dados coletados. (Atendido)
  • RF04: O sistema deve realizar coleta de dados de forma contínua. (Atendido)

Requisitos Não Funcionais

  • RNF01: O sistema deve garantir a privacidade e segurança dos dados do usuário. (Atendido)
  • RNF02: O aplicativo deve ser compatível com a web. (Atendido)
  • RNF03: O aplicativo deve ter um design responsivo, adaptando-se a diferentes tamanhos de tela. (Atendido)
  • RNF04: O aplicativo deve ser intuitivo, com uma curva de aprendizado de no máximo 10 minutos para novos usuários. (Atendido)

Regras de Negócio

  • RN01: Os níveis de estresse são categorizados em "Baixo", "Moderado" e "Alto" com base nos dados coletados pelo hardware. (Atendido)
  • RN02: O feedback ao usuário deve ser baseado nas melhores práticas médicas e pesquisas atualizadas. (Atendido)
  • RN03: Cada usuário deve ter uma identificação única no sistema. (Atendido)

Requisitos de Hardware

  • RH01: O dispositivo de hardware deve ser capaz de se conectar de forma confiável à internet, preferencialmente usando Wi-Fi (ESP32). (Atendido)
  • RH02: O dispositivo deve incluir um sensor GSR, frequência cardíaca e temperatura para calcular o estresse do usuário. (Atendido)
  • RH03: O hardware deve possuir uma fonte de alimentação confiável, seja através de uma bateria recarregável ou conexão direta a energia elétrica. (Não Atendido)
  • RH04: O hardware deve transmitir dados ao servidor em intervalos regulares. (Atendido)
  • RH05: O dispositivo deve ter uma vida útil duradoura e ser resistente a desgastes comuns do dia-a-dia. (Não Atendido)

Trabalhos Futuros

O caminho adiante para o projeto de detecção de estresse contempla melhorias e inovações, incluindo:

  • Finalizar Requisitos Pendentes: Completar as funcionalidades que ainda estão em aberto, como as notificações de estresse e aprimoramentos do dashboard.
  • Desenvolvimento de Hardware Vestível: Criar um dispositivo integrado e miniaturizado, melhorando a usabilidade e o conforto para o monitoramento contínuo.
  • Sistema Web com PWA: Expandir o sistema web atual para um Progressive Web App, permitindo uma melhor experiência de usuário com funcionalidades offline.
  • Aplicativo Móvel: Desenvolver um aplicativo móvel dedicado para fornecer uma interação mais rica e personalizada com o usuário.
  • Migração para a Nuvem: Transferir o sistema para um ambiente de produção em nuvem, visando escalabilidade e melhor distribuição.

Estas direções futuras visam não só completar o projeto atual, mas também abrir novas possibilidades para o uso da tecnologia no monitoramento do bem-estar.


Como Rodar Localmente

Para configurar e rodar o projeto de detecção de estresse localmente, siga os passos abaixo:

Configurando o Arduino

  1. Instale o Arduino IDE em seu computador.
  2. Abra o Arduino IDE e instale as bibliotecas necessárias mencionadas anteriormente através do "Gerenciador de Bibliotecas" no IDE.

Preparando o Ambiente Django

  1. Certifique-se de ter o Python instalado em seu sistema.
  2. Instale o framework Django usando o pip, o gerenciador de pacotes do Python.
  3. Navegue até o diretório do projeto Django e instale as dependências listadas no arquivo requirements.txt com o comando:
    pip install -r requirements.txt

Configurando o Mosquitto MQTT Broker

  1. Instale o broker MQTT Mosquitto.
  2. Edite o arquivo mosquitto.conf e inclua as seguintes linhas para configurar o broker:
    listener 1883
    allow_anonymous true
    
  3. Inicie o Mosquitto com o comando:
    mosquitto -v -c /etc/mosquitto/mosquitto.conf

Rodando o Servidor Django

  1. No terminal, navegue até o diretório do projeto Django.
  2. Execute o serviço MQTT do Django com o comando:
    python manage.py startmqtt --traceback
  3. Em um terminal separado, inicie o servidor Django com o comando:
    python manage.py runserver

Configurando o Banco de Dados no Django

  1. No arquivo settings.py do Django, localize a seção DATABASES e atualize com as configurações do seu banco de dados MySQL:
    DATABASES = { 
        'default': {
            'ENGINE'  : 'django.db.backends.mysql', 
            'NAME'    : os.getenv('DB_NAME'     , 'stress_detector'),
            'USER'    : os.getenv('DB_USERNAME' , 'root'),
            'PASSWORD': os.getenv('DB_PASS'     , 'SenhaAqui'),
            'HOST'    : os.getenv('DB_HOST'     , 'localhost'),
            'PORT'    : os.getenv('DB_PORT'     , '3306'),
        }, 
    }
  2. Certifique-se de que o banco de dados MySQL esteja em execução e as credenciais fornecidas estejam corretas.
  3. Aplique as migrações do banco de dados com o comando:
    python manage.py migrate

Seguindo esses passos, você terá um ambiente de desenvolvimento local configurado e pronto para executar o projeto.

Observação: Esse procedimento é válido para sistemas Linux. Em Windows pode ser totalmente diferente.


Código e Documentação


Licença

Este projeto está licenciado sob a Licença GNU General Public License v3 (GPLv3), que se aplica exclusivamente ao código desenvolvido para as partes de hardware e qualquer outra funcionalidade original incluída neste repositório. Esta licença permite que outros remixem, adaptem e construam sobre este trabalho para qualquer propósito, desde que a licença original e os direitos autorais sejam mantidos com o projeto.

Importante: O template "Black Dashboard Django" utilizado neste projeto é propriedade da Creative Tim e está sujeito aos termos de sua própria licença de usuário final (EULA). Qualquer uso do template "Black Dashboard Django" deve estar em conformidade com os termos da EULA da Creative Tim, que podem ser encontrados em Creative Tim License. A licença aplicada a este projeto não cobre o uso do template "Black Dashboard Django", e qualquer redistribuição ou uso do template deve respeitar estritamente as restrições impostas pela EULA da Creative Tim.


Cloning this Repository

  1. On GitHub.com, navigate to the repository's main page.
  2. Above the list of files, click code.
  3. To clone the repository using HTTPS, under "Clone with HTTPS", click 📋. To clone the repository using an SSH key, including a certificate issued by your organization's SSH certificate authority, click Use SSH, then click 📋. To clone a repository using GitHub CLI, click Use GitHub CLI, then click 📋.
  4. Open Git Bash.
  5. Type git clone (clone git) and paste the URL you copied earlier.
$ git clone git@github.com:theHprogrammer-UFSCWORKS/UBIQUOS_STRESS_DETECTOR.git
  1. Press Enter to create your local clone.


👨‍💻 Colaboradores

Helder's Image
Helder Henrique
Luiza's Image
Luiza Castilho
Jim Lau's Image
Jim Lau

About

Repositório para o trabalho final da disciplina de Projetos de Sistemas Ubíquos da UFSC, campus de Araranguá.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published