Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Assistente de Alzheimer

Componentes e suprimentos

Arduino MKR1000
× 1
Infineon Sensor Hub Nano
× 1
Nokia 5110 LCD
× 1
Módulo Bluetooth HC-05
× 1
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
× 1
SparkFun Botão de pressão 12 mm
× 1
Buzzer
× 1
FT1235 5W transmissor
× 1
Receptor FT1236 5W
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)

Aplicativos e serviços online

Arduino IDE
Blynk
Serviço IFTTT Maker

Sobre este projeto


Esses fatos citados diretamente do site da Associação de Alzheimer (em setembro de 2017) são suficientes para dar a qualquer pessoa uma ideia dos problemas que uma pessoa tem que enfrentar se ela ou seus entes queridos têm a doença de Alzheimer.

Sendo um criador, pensei sobre isso e decidi que vou construir um dispositivo vestível, um sistema que pode ajudar os pacientes e seus cuidadores.

Este sistema deve ser capaz de realizar pelo menos as seguintes tarefas:
  • Lembrar o paciente de realizar tarefas, ele / ela tem que fazer diariamente (como medicamentos, exercícios, etc)
  • Monitore onde o paciente está na casa
  • Alerte os cuidadores em caso de emergência de qualquer tipo
  • Mostre a hora (afinal, é um relógio!)
  • Deve ser portátil e fácil de usar, mesmo para um paciente idoso
  • O custo deve ser mínimo

Quando eu vi o Sensor Hub Nano da Infineon, ele pareceu ser um bom candidato em tal projeto, devido ao seu tamanho muito pequeno e capacidades BLE. Com o sensor de pressão preciso, ele poderia ser usado para detectar se o paciente caiu e também dizer onde exatamente o paciente está na casa.

Usarei as seguintes partes para o projeto básico funcionar:
  • Sensor Hub Nano da Infineon
  • Arduino MKR1000
  • Módulo Bluetooth HC-05
  • Tela Nokia 5110

Você saberá o que quero dizer com "projeto básico" quando ler a seção 'Personalização do Assistente de Alzheimer'.





Como funciona


Nesta seção, descreverei brevemente como o relógio funciona e delinearei as etapas que temos que seguir para fazê-lo funcionar.

A placa de avaliação Sensor Hub Nano da Infineon possui um sensor de pressão barométrica DPS310, que envia seus dados através da placa de avaliação via bluetooth. Os valores de pressão, altitude e temperatura podem ser visualizados no aplicativo Android da Infineon (baixe aqui), bem como no software de avaliação SES2G. Os usuários também podem construir aplicativos para Android com a biblioteca que a Infineon oferece, com base em seus próprios requisitos.

Você pode encontrar mais informações sobre o Sensor Hub Nano aqui.

Mas quero que o Alzheimer's Assistant funcione sem um smartphone Android no meio. Deve ser um wearable que funcione sozinho, bem como a capacidade de se conectar a um smartphone para visualizar os dados do sensor. Então, eu decidi que vou usar uma placa Arduino MKR1000 devido ao seu formato pequeno e capacidade WiFi, e conectá-la por algum método ao Sensor Hub Nano.

Esta é a pinagem do Arduino MKR1000 que você achará útil:

Eu tinha um módulo bluetooth HC-05, então tive que usá-lo para a conexão entre o Arduino MKR1000 e o Sensor Hub Nano. Mas primeiro, precisamos conectar o HC-05 corretamente aos pinos Tx e Rx do hardware do Arduino, levando em consideração os níveis lógicos. Meu módulo bluetooth funciona em 3.3v, que é o mesmo que o MKR1000, então não houve necessidade de nenhum shifter de nível de tensão. Mas se o seu módulo bluetooth funciona no nível 5v, pode ser necessário usar um deslocador de nível semelhante ao mostrado.

Depois de combinar os níveis de tensão, precisamos emparelhar o HC-05 com o Sensor Hub Nano para iniciar a comunicação de dados entre eles e encontrar uma maneira fácil de fazê-los emparelhar automaticamente toda vez que o Sensor Hub Nano entrar no alcance do bluetooth do HC -05.

Para isso, pensei em configurar o HC-05 para funcionar como um dispositivo bluetooth 'master', e emparelhá-lo apenas com um endereço MAC específico; o do Sensor Hub Nano. Assim, após configurá-lo assim, uma vez ligado o HC-05, ele procura um dispositivo com um endereço MAC específico (o do Sensor Hub Nano), e emparelha automaticamente com ele, deixando para o usuário enviar e receber dados.

Isso é feito usando os comandos do modo AT para o HC-05 e é abordado na seção "Configurando o Módulo Bluetooth".

Observação:anexei um documento que encontrei on-line, que lista todos os comandos AT compatíveis com o HC-05, portanto, use-os conforme necessário.

Depois de emparelhado e conectado corretamente, o envio de comandos para o Sensor Hub Nano é como um terminal bluetooth. Você pode usar os comandos que eu especifiquei acima simplesmente imprimindo-os como uma String, através da porta serial do hardware ao qual o HC-05 está conectado. Por exemplo, este é o comando que você enviará para iniciar o fluxo de dados do sensor:
  $ start_sensor id =1 // Para iniciar o fluxo de dados do sensor  

Aqui está uma lista dos comandos que conheço:
  $ hello id =// Olá 
$ info id =// Informação
$ sinfo id =1 // Informação do sensor
$ set_mode sid =1; md =modo; val =bg // Baixa energia
$ set_mode sid =1; md =prs_osr; val =16 // Modo padrão
$ set_mode sid =1; md =prs_mr; val =32 // Alta precisão
$ start_sensor id =1 // Iniciar
$ stop id =// Parar

Os dados do sensor provenientes do Sensor Hub Nano estão neste formato:
  $ 1, t, 36.9299,1154206 // Temperatura 
$ 1, p, 997.6813,1154206 // Pressão
$ 1, a, 130.4305,1154206 // Altitude

Observação:eu gostaria de dar uma referência à de Peter Smith postagem no blog, o que me ajudou a iniciar a comunicação com o Sensor Hub Nano usando bluetooth.

Assim que pudermos iniciar o fluxo de dados do módulo, precisamos encontrar uma maneira de analisar os dados dele. Essa foi, devo admitir, a parte mais difícil do projeto; uma vez que você envia o comando para iniciar o fluxo de dados, o Sensor Hub Nano apenas envia um fluxo de dados, deixando para o dispositivo que está recebendo os dados analisar qualquer coisa sensata a partir deles. Então, depois de experimentar muitos métodos de complexidade variada (que não irei abordar aqui), este foi o método mais simples e eficiente que eu criei, para analisar dados do Sensor Hub Nano.
  void getSensorValues ​​() {
// Recupera os valores do sensor do Sensor Hub Nano através da porta Serial1
String junkVal;
if (Serial1.available ()) {
junkVal =Serial1.readStringUntil ('\ n');
junkVal =Serial1.readStringUntil ('t');
t =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('p');
p =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('a');
a =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('\ n');
}
}

Um display também será conectado ao Arduino para interagir com o usuário e mostrar quaisquer mensagens ou para exibir a hora ou os dados do sensor (mais sobre isso conforme você lê).

Depois de obter os dados no Arduino MKR1000, devido à sua conectividade sem fio, você pode enviar os dados para várias plataformas IoT diferentes, como Cayenne ou Blynk.

Decidi usar o Cayenne para isso, pois fiquei impressionado com sua bela interface e fácil configuração. Mas, infelizmente, havia alguns bugs na conexão WiFi MKR1000 que nos impediam de selecionar os pinos. Devo dizer que os caras do Cayenne foram muito prestativos, mas mesmo assim o problema não foi resolvido. Portanto, decidi usar o Blynk no final, mas eles são muito semelhantes no uso, então apenas alterando algumas linhas do código do Arduino, você pode alternar de Blynk para Cayenne se quiser testá-lo ou quando o problema for resolvido. Ambos têm as mesmas características, mais ou menos, então é apenas sua preferência. Mas a única vantagem do Cayenne é que você também pode acessá-lo em um PC, enquanto o Blynk só funciona em smartphones.

Agora, recebemos dados do Sensor Hub Nano, colocamos no Arduino e os transferimos para uma plataforma IoT (direi Blynk de agora em diante) e, portanto, agora você só precisa personalizar o Assistente de Alzheimer de acordo com para suas próprias necessidades, e isso é tratado em outra seção (detecção de queda e localização são discutidas lá).

Observação:tentei documentar cada etapa em detalhes, mas se você não sabe de algo (como fazer upload do código para o seu Arduino), seria uma ideia melhor ir para o Arduino página inicial , familiarize-se com ele por um tempo e depois volte, assim que souber pelo menos o básico.





Configurando o módulo bluetooth


A primeira coisa que você precisa fazer é obter o endereço MAC do seu kit de avaliação do Sensor Hub Nano. Haverá muitas maneiras diferentes de fazer isso, mas contarei como o fiz.

Emparelhe o Sensor Hub Nano com seu smartphone:

Baixe o aplicativo de avaliação do Sensor Hub Nano da Infineon (para Android) aqui e ligue o Sensor Hub Nano. Abra o aplicativo e ele exibirá o Sensor Hub Nano como "IFX_NANOHUB", com o endereço MAC abaixo dele.

Anote isso, pois você precisará disso mais tarde.

Observação:seria melhor você desparelhar o Sensor Hub Nano de seu smartphone se não o estiver usando agora, porque se seu telefone estiver próximo com bluetooth ligado e o Sensor Hub Nano pareado, o telefone se conecta automaticamente a ele . E quando você configura o HC-05 e tenta emparelhá-lo com o Nano Hub, ele simplesmente não se conecta.

Colocando o HC-05 no modo AT:

O modo AT nos permite definir as configurações do módulo bluetooth HC-05; definir a taxa de transmissão ou definir se deseja conectar como um dispositivo mestre ou escravo e muito mais. Precisaremos alterar algumas configurações do módulo para permitir que ele recupere dados com sucesso do Sensor Hub Nano da Infineon.

Primeiro, carregue o esboço "Comandos AT" para o Arduino MKR1000. Isso nos permitirá dar comandos ao módulo Bluetooth em modo AT, através do Arduino MKR1000.
  // Esboço original do blog de Martyn Currey aqui:
// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/
//
// Sketch modificado por mim para funcionar com o Arduino MKR1000!
//
// Esboço Bluetooth básico
// Conecte o módulo HC-05 e comunique-se usando o monitor serial
//
// Os padrões do HC-05 para o modo de cominação quando ligado pela primeira vez.
// Precisa ser colocado no modo AT
// Após um reset de fábrica, a taxa de transmissão padrão para o modo de comunicação é 38400
char c ='';
void setup () {
// inicia a comunicação serial com o computador host
Serial.begin (9600);
Serial.println ("Arduino com HC-05 está pronto");
// iniciar a comunicação com o HC-05 usando 38400
Serial1.begin (38400);
Serial.println ("Serial1 iniciado em 38400");
}
void loop () {
// Continue lendo HC-05 e envie para o Monitor Serial Arduino
if (Serial1.available ())
{
c =Serial1.read ();
Serial.write (c);
}
// Continue lendo do Arduino Serial Monitor e envie para HC-05
if (Serial.available ())
{
c =Serial.read ( );
// espelha os comandos de volta para o monitor serial
// torna mais fácil seguir os comandos
Serial.write (c);
Serial1.write (c);
}
}

Em seguida, conecte apenas o módulo bluetooth ao Arduino MKR1000 seguindo o diagrama.

Observação:seria uma boa ideia conectar tudo primeiro em uma placa de ensaio e proceder com a fiação adequada depois de configurá-la adequadamente.

Se você tentar ligar o Sensor Hub Nano e o HC-05, verá que eles não se conectam automaticamente neste momento. Isso é o que você veria:

Para alterar as configurações do HC-05, você precisará colocar seu módulo bluetooth no modo AT. O método para fazer isso depende de qual quadro de apoio você possui e, portanto, pode ser necessário fazê-lo de forma diferente. Se você tiver um módulo diferente do que eu tenho, vá para o blog de Martyn Currey aqui, onde você pode encontrar informações detalhadas sobre como obter os módulos bluetooth HC-05 no modo AT. Se você estiver travado, pesquise no Google seu problema ou comentário e tentarei ajudar.

Meu módulo bluetooth tem a chave de botão, então tenho que seguir os seguintes passos para obtê-lo no modo de comando AT (não se esqueça de fazer o upload do código de comando AT para o Arduino):
  • Desconecte a alimentação do módulo. (As linhas TX e RX ainda estão conectadas!)
  • Pressione e segure o botão switch no módulo fechado
  • Ligue a alimentação enquanto mantém pressionada a chave do botão
  • Quando o LED acender, solte o botão

Um vídeo mostrando como colocar o HC-05 no modo AT:

Uma vez no modo AT, você notará uma diferença considerável no padrão de piscadas do LED no HC-05. No modo de comunicação, o LED pisca rapidamente, cerca de 5 vezes por segundo, enquanto no modo AT o LED pisca uma vez a cada dois segundos.

Configurando o módulo HC-05:

Abra o monitor serial, defina a taxa de transmissão para 9600 e selecione “Ambos NL e CR”.

Observação:você precisará defini-lo para nova linha e retorno de carro, ou os comandos AT não funcionam.

Digite “AT” no monitor serial e deverá receber um “OK”. Se você fizer isso, poderá prosseguir e dar os comandos como eu fiz.

Basicamente, precisamos alterar essas configurações no modo AT:
  • Exclua todos os dispositivos atualmente emparelhados
  • Obtenha-o para se conectar apenas a um endereço Bluetooth MAC especificado
  • Defina o modo de conexão bluetooth para ‘Mestre’
  • Especifique o endereço MAC ao qual precisamos para nos conectar
  • Defina a taxa de transmissão para 115200, o bit de parada deve ser de 2 bits e paridade uniforme

As instruções acima foram fornecidas para que você possa usá-las mesmo se tiver outro módulo Bluetooth, referindo-se aos comandos e o que eles fazem. Mas agora vou listar os comandos que dei para o HC-05 emparelhar com o Sensor Hub Nano.
  • AT + RMAAD
  • AT + CMODE =0
  • AT + ROLE =1
  • AT + BIND =1234,56, abcdef (Substitua pelo endereço MAC do Hub do Sensor Nano)
  • AT + UART =115200,0,0

Aqui está um registro dos meus comandos AT para sua referência:

Agora você deve desconectar o Arduino para desligar o módulo Bluetooth. Isso o colocará de volta no modo de comunicação.

Nota:Se você bagunçar alguma coisa nas configurações do HC-05, seria uma boa ideia redefinir o módulo para as configurações padrão e começar do zero com o comando:AT + ORGL

Testando a conexão:

Agora, você precisará testar se a última etapa foi bem-sucedida; você pode fazer isso ligando o Sensor Hub Nano. O LED azul piscará muito lentamente, uma vez a cada dois segundos. Em seguida, conecte o Arduino ao PC e observe a mudança no LED piscando no HC-05 e no Sesnor Hub Nano.

Olhe para o piscar agora e compare-o com o que piscava antes:

Há uma diferença notável, e você deve saber se os dois módulos estão conectados. Agora você pode passar para a próxima parte, de conectar o projeto e testá-lo.

Observação:Se você já emparelhou seu smartphone com o Sensor Hub Nano antes, pode ser necessário desemparelhá-lo, caso contrário, isso causaria problemas de conexão. Ele só pode se conectar a um dispositivo por vez.





Testando o projeto básico


Depois de ter confirmado uma conexão adequada entre o HC-05 e o Sensor Hub Nano pelos padrões de intermitência do LED, prossiga com a configuração do aplicativo Blynk no smartphone.

Configurando o aplicativo Blynk:

Baixe o aplicativo Blynk (se ainda não o fez) para o seu dispositivo iOS ou Android a partir daqui e escaneie o código QR através do aplicativo Blynk. Ele irá replicar automaticamente os widgets básicos necessários neste momento.

Você verá uma tela semelhante:

Não faça nenhuma alteração aqui neste momento e apenas continue a ler.

Instalação das bibliotecas necessárias:

Você precisará ter duas bibliotecas diferentes para o Arduino IDE instalado para obter o código para compilar sem erros. Eles são:
  • Blynk , para conectá-lo ao seu smartphone
  • u8g2lib , para a tela

Existem duas maneiras de instalar as bibliotecas necessárias. A primeira é por meio do ‘Library Manager’, que está disponível nas versões mais recentes do IDE Arduino, e a segunda é a instalação manual. Ambos os métodos são descritos em detalhes aqui, então verifique o link, pois não irei examiná-lo.

Upload do código e teste:

Depois de instalar as bibliotecas, baixe o código em anexo e faça algumas alterações. Terá de adicionar o seu código de autenticação do Blynk (que lhe é enviado por e-mail quando é feito um novo projecto em Blynk), bem como o seu SSID WiFi e a palavra-passe. Feito isso, carregue o código no MKR1000.

Depois de enviar o código, conecte o circuito de acordo com o esquema.

Em seguida, abra o aplicativo Blynk em seu smartphone, abra o projeto do Alzheimer’s Assistant e pressione o botão play. Conecte o MKR1000 (com o HC-05 e a tela conectada) e você verá o logotipo, o Assistente de Alzheimer na tela. Ele permanecerá por um momento e então você poderá ver a mensagem “ Esperando pelo Sensor Hub Nano ”. Ligue o pequeno interruptor no Sensor Hub Nano, garantindo que você esteja dentro do alcance do bluetooth do módulo HC-05. Deve dizer " Conectado ao Sensor Hub Nano da Infineon ", e após alguns segundos, você deverá ver os valores de pressão, temperatura e altitude no seu smartphone.

E depois de alguns segundos você também verá a hora no formato 24 horas, assim como a data, e que sincroniza com a internet.

Este é um vídeo de teste:

Se sim, parabéns, você concluiu a parte difícil de configurá-lo e agora vem personalizando-o para cada paciente, de acordo com suas preferências.





Personalização do assistente de Alzheimer


Até agora, o que configuramos recupera os dados do sensor do DPS310 da Infineon em uma configuração simples e elegante, mas para fazer algo útil com isso, temos que configurar a configuração de acordo com os requisitos e preferências individuais. Portanto, nesta seção, falarei sobre o código e como modificar o Assistente de Alzheimer para funcionar de acordo com a preferência de cada usuário. Vou dar o trecho de código para cada ‘recurso’ e você pode simplesmente adicioná-lo no código principal com algumas mudanças.

Observação:quando você olhar o código que anexei para o 'projeto básico', verá que ele usa funções agrupadas no BlynkTimer. Eu seria uma boa ideia usá-los se você quiser fazer alguma personalização, pois ele pode realizar tarefas em um intervalo especificado, e também, evitar o erro de inundação de Blynk que acontece quando seu hardware envia muitas solicitações para Blynk. Além disso, o código é 'básico', no sentido de que todas as funções estão presentes, mas não incluídas no código principal; o usuário deve editar o código principal de acordo com o requisito e pode ter que ajustar o intervalo de tempo em que cada função é executada.

O DPS310:-

O DPS310 da Infineon é um sensor de pressão barométrica digital de baixo custo que fornece uma precisão muito alta em um formato muito pequeno. Por isso, é perfeito para uso em tal projeto, e os valores podem ser usados ​​para detectar quedas em um paciente idoso, ou em qual quarto o paciente está exatamente.

Observação:eu não fiz o invólucro do smartwatch ainda, então estou usando o Sensor Hub Nano na minha mão, conectado ao Arduino via Bluetooth, como nesta imagem:

Detecção de queda: Para detectar quedas, precisaremos fornecer um valor de queda (a diferença na pressão do ar, entre duas leituras em um tempo especificado) e configurar uma folga. Por exemplo, se a mudança na altitude entre dois valores sucessivos (ao longo de um tempo, digamos, um segundo) estiver entre o valor de queda ± o valor de liberação, uma queda será detectada.

Eu fiz alguns testes e descobri que o valor de queda deve ser 0,7 e o valor de folga deve ser ± 0,2, mas eles podem não funcionar em todas as situações. Isso se deve a um motivo simples e compreensível de que a queda de uma pessoa pode ocorrer de várias maneiras. Portanto, o uso de um sensor secundário (provavelmente um acelerômetro) será necessário para ganhar mais precisão no sistema de detecção de quedas, e que será adicionado aos trabalhos futuros. Mas sempre será possível que existam outros algoritmos mais precisos para detectar quedas, e estou aberto para ouvi-los; sinta-se à vontade para comentar se você tiver alguma idéia sobre isso.

Um vídeo demonstrando a detecção de queda:

Detectar onde o paciente está: Isso funciona de forma semelhante ao algoritmo de detecção de queda. Por exemplo, se você precisa saber em que andar o paciente está, você pode pegar o valor da altitude atual e subtraí-lo do anterior. E então compare a diferença com um valor predefinido. Isso indicará em que andar o paciente está.

Seria apenas uma questão de usar a lógica if e else simples para determinar em que andar o paciente está (os valores de altitude já estão presentes no código principal). Isso pode ser indicado usando os widgets de LED em Blynk.

Observação:não incluí a detecção de local no código principal, mas os usuários podem adicioná-la conforme necessário, apenas não se esqueça de usá-la como uma função de temporizador Blynk.

A mesma técnica também pode ser usada para detectar em que sala uma pessoa está. Nesse caso, um sensor secundário, como um sensor de movimento, seria necessário, caso contrário, poderia haver muitos gatilhos falsos.

Temperatura: O DPS310 também mostra o valor da temperatura que podemos usar para nos alertar sobre qualquer acidente que possa acontecer ao paciente, por exemplo, um incêndio. Se a temperatura aumentar para um valor específico, digamos 45 ℃, isso alerta o zelador.

Mas como o sensor DPS310 não está conectado diretamente à pele (pelo menos neste caso de uso), o que obtemos não é a temperatura corporal, mas seria mais preciso dizer que é a temperatura do Sensor Hub Nano.

O código para isso é muito simples (use-o em qualquer lugar do loop principal) e pode ser algo assim:
  if (t> maxTemp) {
// Faça o que quiser se a temperatura estiver acima do máximo
}
else {
// Faça o que quiser se a temperatura for inferior ao máximo
}

Observação:todos os gráficos acima são criados usando o software de avaliação SESG2 fornecido pela Infineon.

Uma campainha e um interruptor:-

Eu não mencionei isso antes, mas uma campainha e um interruptor também devem estar presentes no sistema e serão muito úteis. Por exemplo, uma campainha poderia ser usada para atrair a atenção do paciente, quando seria a hora de tomar um remédio, por exemplo, e o interruptor poderia ser usado como um dispositivo de segurança.

E como usaremos o Blynk, a chave do botão pode ser configurada de forma que, quando pressionada, uma notificação apareça no telefone do zelador ou ele faça uma chamada ou envie um SMS (isso pode ser feito usando IFTTT e é fornecido mais tarde ) Este poderia ser o snippet de código para fazer isso:
  void emailOnButtonPress () 
{
// *** AVISO:Você está limitado a enviar APENAS UM E-MAIL POR 15 SEGUNDOS! ***
// Vamos enviar um e-mail quando você pressionar o botão
// conectado ao pino digital 2 em seu Arduino
int isButtonPressed =! digitalRead (2); // Inverte o estado, já que o botão está "Ativo BAIXO"
if (isButtonPressed) // Você pode escrever qualquer condição para acionar o envio de e-mail
{
Serial.println ("O botão está pressionado . "); // Isso pode ser visto no Monitor Serial
Blynk.email ("[email protected]", "Assunto:Registrador de Botão", "Você acabou de apertar o botão ...");
// Ou, se você deseja usar o e-mail especificado no aplicativo (como para exportação de aplicativo):
//Blynk.email("Subject:Button Logger "," Você acabou de apertar o botão. .. ");
}
}

É retirado do código de amostra Blynk e usa uma interrupção para verificar o botão. Isso poderia ser usado pelo paciente para alertar o zelador em qualquer emergência, como uma queda que não foi detectada pelo algoritmo de detecção de queda. Você pode obter o código de amostra completo aqui, que envia um e-mail assim que um botão é pressionado.

A campainha pode ser usada para produzir tons (usando o comando tone () do Arduino - mais informações aqui), para lembrar o paciente de uma tarefa como medicação ou exercício.

O visor:-

Uma parte importante do projeto, para a qual o usuário realmente olha, é a tela. Os monitores Nokia 5110 estão normalmente disponíveis, são fáceis de configurar e baratos, mas não são tão chamativos, especialmente quando usados ​​em tal sistema. Monitores OLED com uma resolução mais alta serão uma alternativa muito boa, e você pode facilmente modificar o código para funcionar com um porque usei a biblioteca u8g2 (github aqui). Escolha qualquer um dos modelos de tela aqui e adicione-o ao início do esboço (removendo a linha Nokia 5110, é claro!). Você precisará conectar de acordo com o que está no código e você está pronto para começar. Você também pode usar imagens de bitmap com uma tela de resolução mais alta. You can also change the font for the text on the display, select fonts from the huge list here and edit the name of the font in the code.

Note:You may have to change the pixel positions for the text in the code if you use a display with a higher resolution.

That was just a brief description of the library used to get the display working. But, now I will tell you how to edit the code to get Alzheimer's Assistant to show the time or the Sensor Hub Nano data (temperature, Altitude and pressure).

Displaying time: To display the time, you could simply use an RTC (or time keeping module) but as we're connected to the Internet, it would be much more easier to use the Internet to sync the time. And as we're using Blynk that would make it even more simpler. You just need the RTC widget in your project. Now with a few lines of code, you can automatically retrieve the time from the Blynk server (Make sure to set your timezone from the Blynk widget). The main code is set to display the time by default (not the sensor values, discussed next)

Note:The time displayed on the screen could go up or down a minute, as it is synced from the internet, but despite that, I have tested it for a long time and have found it to be very accurate (just a difference of a few seconds).

Displaying the Sensor Hub Nano data: We could just as well display data from the Sensor Hub Nano in the display. Not that it would benefit the patient, but its good for debugging purposes, should you need it. That can be done with the following code snippet:
void showSensorValues() { 
//Shows the sensor values on the display
char bufT[10];
char bufP[10];
char bufA[10];
String(t).toCharArray(bufT, 10);
String(p).toCharArray(bufP, 10);
String(a).toCharArray(bufA, 10);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tf );
//Display the temperature
u8g2.drawStr(0, 10, "T:");
u8g2.drawStr(12, 10, bufT);
u8g2.drawStr(73, 10, "C");
u8g2.drawCircle(70, 4, 1, U8G2_DRAW_ALL);
u8g2.drawHLine(0, 12, 85);
//Display the pressure
u8g2.drawStr(0, 26, "P:");
u8g2.drawStr(12, 26, bufP);
u8g2.drawStr(60, 26, "mBar");
u8g2.drawHLine(0, 28, 85);
//Display the altitude
u8g2.drawStr(0, 42, "A:");
u8g2.drawStr(12, 42, bufA);
u8g2.drawStr(72, 42, "m");
u8g2.drawHLine(0, 44, 85);
//Send the values to the display
u8g2.sendBuffer();
}

Don't forget to run this command to get the sensor data below:
getSensorValues(); 

But that's not all for the display. As I said in the start, Alzheimer's Assistant should be able to remind the patient of the tasks which need to be done daily, such as when to take medications or to remind the patient to exercise.

Using Eventor widget to remind:-

For that, we will be using the Eventor widget (check here for details) in Blynk.

Add the Eventor widget into your project (It's already there if you scanned the QR code above), and just follow the screenshots to see how to set it up:

In the above example, the Eventor widget is used to set up a fall detection notification.

Using the Eventor widget to remind is done by this code:
BLYNK_WRITE(vEVENTOR_PIN) { 
//Use the Eventor widget to check if it's time to do a task (take medication in this case)
int currentValue =param.asInt(); // 0 to 1
if (currentValue ==1) {
//Do here what you want to when its time for medication
showPillReminder();
playBuzzerReminder();
//This is just a tone, I haven't made it in the main code, but you can if you want!
}
else {
//If it's not the time for medication, do nothing
}
}

And the result on the display when it's the time for medication:

The same for exercise:

This is done by typing:
showExerciseReminder(); 

Instead of:
showPillReminder(); 

The eventor widget could, as said above, be used for a number of things. For example, you could set that an increase in temperature could result in sending an e-mail, and with no code modification!

Using different modes of the Sensor Hub Nano:-

You can test out the use of different modes for the Sensor Hub Nano. Using the following commands:
sendCommand(LOW_ENERGY);
sendCommand(STANDARD_MODE);
sendCommand(HIGH_PRECISION);

Using Blynk to switch modes could be more efficient. For that, set up your Blynk app like this:

As this had no use for me, I did not add it it in the main code, but you could always do so as needed (The commands are present, you just need to add them with a bit of logic in the main sketch).

Using Blynk and IFTTT:-

Blynk can allow any Arduino project to easily harness the power of IFTTT.

This is because you can use Blynk to send a webhook request to the IFTTT Webhooks channel (previously called Maker channel), and you could create an IFTTT applet which waits for the webhook to be triggered (from the Blynk and Arduino side) and you could get it to trigger anything else in response to that.

A simple example on how to use IFTTT and Blynk with webhooks :

The Blynk webhook widget could be used to send a webhook request like this:

This is the IFTTT webhook channel:

And using webhooks to trigger IFTTT is not the only method. IFTTT can also be triggered by using Blynk to send emails and tweets.

You have now made an applet. Time to test it.

Open "Services" in IFTTT and then select "Webhooks". Go to "Settings" and there you will see a URL. Copy that and open it in a new tab. There, instead of {event}, type the event name (which you set earlier). That was "button_pressed" for me, and so when I click on "Test it", this is the result after a few seconds:

Now that you have confirmed the Webhook works, you can just write the URL in the Blynk webhook settings and get a GET or POST request (through the Blynk webhook widget)

And, instead of SMS, you could just as well use phone calls, or even Twitter and Facebook, if you want, and it's just as simple That is the power of IFTTT.

It's the same thing as my smart home controller project here, and I also discussed it in detail there, but it is a great thing which I couldn't go by without mentioning.





Final Touches


By now, almost all of the electronics part of the project is complete, but a few things still remain. Read on for them, and in the end, I will list the future work which should be done to improve this project.

Battery and charging:

The MKR1000 has a port for a LiPo battery, which means you could attach one. But I don't have one at the moment so I will not be going into that but you should check out the website for the Arduino MKR1000 if you need information on that.

For charging, you have two options, using the MKR1000 USB port directly, and the other one is to use wireless charging, if you have it. I will be using the wireless charging for it. This is because I already have a wireless charging receiver and transmitter made by Futara Elettronica.

To use the receiver and transmitter, it's just a simple matter of providing the specified voltage to the transmitter. That will be the 'dock', where you can place Alzheimer's Assistant to charge. At the receiver side, you will just have to cut and attach a spare USB micro B cable (which goes to the MKR1000 USB port) and connect the other side to VCC and ground by looking at the pinout.

Just look at the images below to see how to wire it up:

And the end result:

The Enclosure:

As with every project, an enclosure is required for this too, and this how I intend Alzheimer's Assistant to look like:

Note:I do not yet have the privilege of a laser cutter or 3D printer, so the STL file is just intended for showing how the final project looks like and it's not to scale.

This concludes the documentation for Alzheimer's Assistant, but I would still like to include the future work section to describe the things which I very much wanted to do for the project, but couldn't, due to some reason or the other.

Future work:

As I said before, these are the things which I wanted to include in the project, which I will add in future, should I get the time:
  • Making a proper enclosure for it. Now I am just testing it on a breadboard but if I get access to a laser cutter or 3D printer I will update the documentation with that.
  • Using a Bluetooth 4.0 module instead of this one.
  • Or even better, using just the DPS310 Sensor instead of the Sensor Hub Nano. This would decrease the cost for the project overall, as it will eliminate the use of the Sensor Hub Nano and the bluetooth module; the DPS310 itself is a available for cheap. It's a matter of editing the main code to get temperature, pressure and altitude values from the DPS310 only, the rest of the part is done.
  • Using a secondary sensor to work along with the DPS310 for fall detection and the location detection. This would decrease the occurrence of both, false positive and false negative alerts. Most probably an accelerometer and a motion detector will be needed for both.
  • Adding a pulse sensor. I did not have one, so I couldn't add that. It should be a great addition to the project.
  • Using a higher resolution display, preferably an OLED. With that, graphics can also be included and that would be pretty neat.
  • Working on improving the battery life for the project. This can be done by using a deep sleep mode in the MKR1000, but I haven't used it in the code yet.

Thanks for reading, and hope you liked my project. Feel free to give me your opinions and ideas about the project.

Código

  • AT Commands
  • Alzheimer's Assistant
AT CommandsArduino
This code is used to configure the HC-05 in AT mode. Details on how to get in AT mode are given in the project description
// Original sketch from Martyn Currey's blog here:// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode///// Sketch modified by me to work with Arduino MKR1000!//// Basic Bluetooth sketch// Connect the HC-05 module and communicate using the serial monitor//// The HC-05 defaults to commincation mode when first powered on.// Needs to be placed in to AT mode// After a factory reset the default baud rate for communication mode is 38400char c =' ';void setup() { // start the serial communication with the host computer Serial.begin(9600); Serial.println("Arduino with HC-05 is ready"); // start communication with the HC-05 using 38400 Serial1.begin(38400); Serial.println("Serial1 started at 38400");}void loop() { // Keep reading from HC-05 and send to Arduino Serial Monitor if (Serial1.available()) { c =Serial1.read(); Serial.write(c); } // Keep reading from Arduino Serial Monitor and send to HC-05 if (Serial.available()) { c =Serial.read(); // mirror the commands back to the serial monitor // makes it easy to follow the commands Serial.write(c); Serial1.write(c); }} 
Alzheimer's AssistantArduino
The main code for the project, used once you've configured and got the HC-05 to work with Sensor Hub Nano
//Including required libraries#include #include #include #include #include #include // You should get Auth Token in the Blynk App.// Go to the Project Settings (nut icon).char auth[] =""; //Enter your Blynk auth token here// Your WiFi credentials.// Set password to "" for open networks.char ssid[] ="";char pass[] ="";//Defining Sensor Hub Nano board commands#define HELLO "$hello id="#define INFO "$info id="#define SENSOR_INFO "$sinfo id=1"#define LOW_ENERGY "$set_mode sid=1;md=mode;val=bg"#define STANDARD_MODE "$set_mode sid=1;md=prs_osr;val=16"#define HIGH_PRECISION "$set_mode sid=1;md=prs_mr;val=32"#define START "$start_sensor id=1"#define STOP "$stop id="//Defining fall and clearance thresholds//You may need to change them, but I found these values to be good#define FALL 0.7#define CLEARANCE 0.2//Defining Blynk virtual pins#define vTEMPERATURE_PIN V0#define vPRESSURE_PIN V1#define vALTITUDE_PIN V2#define vEVENTOR_PIN V3#define vFALL_PIN V4//Declaring required variablesfloat t, p, a, previousA;//Boolean which tells tells if a fall is detected or notboolean fallState;//Variables needed for the fall detection algorithmunsigned long previousMillis =0;const long interv al =1000;//BTconnected is false when not connected and true when connectedboolean BTconnected =false;//Defining BT state and LCD backlight pinsint btStatePin =9;int backlightPin =2;BlynkTimer timer;WidgetRTC rtc;//Nokia 5110 Display wiringU8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 7, /* data=*/ 8, /* cs=*/ 3, /* dc=*/ 5, /* reset=*/ 4);void setup() { //Initialize both serial ports:Serial.begin(115200); Serial1.begin(115200); //Setup the timed fuctions timer.setInterval(1000L, sendSensorValues); timer.setInterval(3000L, showTimeAndDate); //Setting up required inputs and outputs pinMode(btStatePin, INPUT); pinMode(backlightPin, OUTPUT); digitalWrite(backlightPin, LOW); u8g2.begin(); showStartMessage(); atraso (2000); // wait until the bluetooth module has made a connection while (!BTconnected) { if (digitalRead(btStatePin) ==HIGH) { BTconnected =true; } else { showWaitingFor(); } } initSensorHub(); Blynk.begin(auth, ssid, pass); rtc.begin (); setBlynkWidgets(); showTimeAndDate(); sendCommand(START);}void loop() { Blynk.run(); timer.run (); getSensorValues(); checkIfFalling();}void sendCommand (String sensorCommand) { //This function sends commands through the bluetooth module on the hardware serial port to the the Sensor Hub Nano //For example:"sendCommand(START);", starts the flow of data from the sensor //The full list of commands I know are defined at the top of the sketch Serial1.println(sensorCommand);}void initSensorHub() { //Initialise the Sensor Hub Nano, and give an error if there is any problem String junkVal; sendCommand(INFO); while (Serial1.find("IFX_NanoHub") ==false) { sendCommand(INFO); Serial.println("ERROR"); showErrorMessage(); } junkVal =Serial1.readStringUntil('\n'); junkVal =""; showConnectedMessage(); delay(1500);}void getSensorValues() { //Retrieves the sensor values from the Sensor Hub Nano through the Serial1 port String junkVal; if (Serial1.available()) { junkVal =Serial1.readStringUntil('\n'); junkVal =Serial1.readStringUntil('t'); t =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('p'); p =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('a'); a =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('\n'); }}void sendSensorValues() { //Sending the sensor values to the Blynk server Blynk.virtualWrite(vTEMPERATURE_PIN, t); Blynk.virtualWrite(vPRESSURE_PIN, p); Blynk.virtualWrite(vALTITUDE_PIN, a);}void checkIfFalling() { //Algorithm to check if the patient is falling unsigned long currentMillis =millis(); if ((currentMillis - previousMillis)>=interval) { float diff =previousA - a; if ((diff>=(FALL - CLEARANCE)) &&(diff <=(FALL + CLEARANCE))) { fallState =true; //Here insert what you need to do if fall is detected, such as sending a notification or email with Blynk //Or you could also use IFTTT to call or send an sms to alert the caretaker (more info in the project documentation) Serial.println("Falling"); showFallMessage(); //In this example, vFALL_PIN (virtual pin 4) is set to 255 if fall is detected Blynk.virtualWrite(vFALL_PIN, 255); //You can send a notification using only the notification widget too! //Blynk.notify("DPS310 detected a fall!"); } previousA =a; previousMillis =currentMillis; fallState =false; //Set vFALL_PIN to 0 if a fall isn't detected Blynk.virtualWrite(vFALL_PIN, 0); }}void showStartMessage() { //Shows the start-up message u8g2.clearBuffer(); u8g2.drawRFrame(3, 7, 75, 31, 7); u8g2.setFont(u8g2_font_prospero_bold_nbp_tf); u8g2.drawStr(8, 19, "Alzheimer's"); u8g2.drawStr(12, 35, "Assistant"); u8g2.sendBuffer();}void showWaitingFor() { //Shows the waiting for Sensor Hub Nano message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_prospero_bold_nbp_tf); u8g2.drawStr(9, 15, "Waiting for"); u8g2.drawStr(8, 28, "Sensor Hub"); u8g2.drawStr(22, 41, "Nano !!!"); u8g2.sendBuffer();}void showConnectedMessage() { //Shows the connected message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(0, 10, "Connected to"); u8g2.drawStr(8, 22, "Infineon's"); u8g2.drawStr(7, 34, "Sensor Hub"); u8g2.drawStr(29, 46, "Nano"); u8g2.sendBuffer();}void showErrorMessage() { //Shows the error message u8g2.clearBuffer(); // clear the internal memory u8g2.setFont(u8g2_font_fub14_tf); // choose a suitable font u8g2.drawStr(9, 30, "ERROR"); // write something to the internal memory u8g2.sendBuffer(); // transfer internal memory to the display}void showSensorValues() { //Shows the sensor values on the display char bufT[10]; char bufP[10]; char bufA[10]; String(t).toCharArray(bufT, 10); String(p).toCharArray(bufP, 10); String(a).toCharArray(bufA, 10); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_6x10_tf ); //Display the temperature u8g2.drawStr(0, 10, "T:"); u8g2.drawStr(12, 10, bufT); u8g2.drawStr(73, 10, "C"); u8g2.drawCircle(70, 4, 1, U8G2_DRAW_ALL); u8g2.drawHLine(0, 12, 85); //Display the pressure u8g2.drawStr(0, 26, "P:"); u8g2.drawStr(12, 26, bufP); u8g2.drawStr(60, 26, "mBar"); u8g2.drawHLine(0, 28, 85); //Display the altitude u8g2.drawStr(0, 42, "A:"); u8g2.drawStr(12, 42, bufA); u8g2.drawStr(72, 42, "m"); u8g2.drawHLine(0, 44, 85); //Send the values to the display u8g2.sendBuffer();}void showFallMessage() { //Show the fall detected message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(27, 20, "Fall"); u8g2.drawStr(13, 32, "Detected!"); u8g2.sendBuffer(); delay(1000);}void showPillReminder() { //Show the pill reminder message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(0, 20, "Time to take"); u8g2.drawStr(5, 32, "your pills!"); u8g2.sendBuffer();}void showExerciseReminder() { //Show the exercise reminder message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(16, 20, "Time to"); u8g2.drawStr(12, 32, "exercise!"); u8g2.sendBuffer();}void showTimeAndDate() { //Displays the time and date from the RTC widget in Blynk in 24 hours format if (year() ==1970) { //Serial.println("Time not yet synced"); } else if (year() !=1970) { char bufHours[3]; char bufColon[2]; char bufMinutes[3]; char bufDate[11]; String currentHours =String(hour()); String colon =":"; String currentMinutes =String(minute()); String currentDate =String(day()) + "/" + month() + "/" + year(); String(currentHours).toCharArray(bufHours, 3); String(colon).toCharArray(bufColon, 2); String(currentMinutes).toCharArray(bufMinutes, 3); String(currentDate).toCharArray(bufDate, 11); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_inr33_mf); u8g2.drawStr(30, 30, bufColon); u8g2.setFont(u8g2_font_logisoso32_tn); u8g2.drawStr(0, 32, bufHours); u8g2.drawStr(45, 32, bufMinutes); u8g2.setFont(u8g2_font_saikyosansbold8_8n); u8g2.drawHLine(0, 35, 85); u8g2.drawStr(0, 46, bufDate); u8g2.sendBuffer(); }}BLYNK_WRITE(vEVENTOR_PIN) { //Use the Eventor widget to check if it's time to do a task (take medication in this case) int currentValue =param.asInt(); // 0 to 1 if (currentValue ==1) { showPillReminder(); //Serial.println("Time to take your pills"); } else { //Serial.println("Not the time to take pills"); }}void setBlynkWidgets() { //This sets the colour of each widget in the Blynk app //You may remove this from the sketch if you want to set colours manually through the Blynk app //You could also specifiy the hex value of each colour you need //Set temperature widget color to white Blynk.setProperty(vTEMPERATURE_PIN, "color", "#FFFFFF"); //Set pressure widget color to blue Blynk.setProperty(vPRESSURE_PIN, "color", "#00BBFF"); //Set altitude widget color to yellow Blynk.setProperty(vALTITUDE_PIN, "color", "#FFFF00");}BLYNK_CONNECTED() { //Synchronize time on connection, if connection drops rtc.begin();}

Peças personalizadas e gabinetes

This is just to show how I intend the enclosure to look like. It's not at all to scale!

Esquemas

This diagram is used when getting your HC-05 in AT mode and configuring it, using the Arduino MKR1000. Fritzing diagram for the bare-bones project to function Document listing AT commands for the HC-05

Processo de manufatura

  1. Detector de linguagem TinyML baseado em Edge Impulse e Arduino
  2. Jogo Arduino Gyroscope com MPU-6050
  3. Dados digitais Arduino
  4. DIY 37 LED Roulette Game
  5. ATtiny85 Mini Arcade:Snake
  6. Detector de alcance portátil
  7. Arduino Audio Reactive Desk Light
  8. Carro robô rastreador Smart Face
  9. Assistente de Saúde Pessoal PHA
  10. Galvanoplastia com cobre