Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Asistente de Alzheimer

Componentes y suministros

Arduino MKR1000
× 1
Infineon Sensor Hub Nano
× 1
Nokia 5110 LCD
× 1
Módulo Bluetooth HC-05
× 1
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 1
Interruptor de botón SparkFun de 12 mm
× 1
Buzzer
× 1
Transmisor FT1235 5W
× 1
Receptor FT1236 de 5 W
× 1

Herramientas y máquinas necesarias

Soldador (genérico)

Aplicaciones y servicios en línea

Arduino IDE
Blynk
Servicio IFTTT Maker

Acerca de este proyecto

Estos datos, citados directamente del sitio web de la Asociación de Alzheimer (tomado en septiembre de 2017), son suficientes para dar una idea de los problemas que una persona debe atravesar si ella o sus seres queridos padecen la enfermedad de Alzheimer.

Como fabricante, pensé en esto y decidí que construiría un dispositivo portátil, un sistema que puede ayudar tanto a los pacientes como a sus cuidadores.

Este sistema debería poder realizar al menos las siguientes tareas:

  • Recordar al paciente las tareas que debe realizar a diario (como medicamentos, ejercicio, etc.)
  • Controle dónde está el paciente en la casa
  • Alerta a los cuidadores en caso de una emergencia de cualquier tipo
  • Muestre la hora (después de todo, es un reloj)
  • Debe ser portátil y fácil de usar, incluso para un paciente mayor
  • El costo debe mantenerse al mínimo

Cuando vi el Sensor Hub Nano de Infineon, parecía ser un buen candidato para un proyecto de este tipo, debido a su tamaño muy pequeño y sus capacidades BLE. Con la detección de presión precisa, podría usarse para detectar si el paciente se ha caído y también para indicar dónde está exactamente el paciente en la casa.

Usaré las siguientes partes para el proyecto básico para funcionar:

  • Sensor Hub Nano de Infineon
  • Arduino MKR1000
  • Módulo Bluetooth HC-05
  • Pantalla Nokia 5110

Sabrá lo que quiero decir con "proyecto básico" cuando lea la sección "Personalización del asistente de Alzheimer".

Cómo funciona

En esta sección, describiré brevemente cómo funciona el reloj y describiré los pasos que debemos seguir para que funcione.

La placa de evaluación Sensor Hub Nano de Infineon tiene un sensor de presión barométrica DPS310, que envía sus datos a través de la placa de evaluación a través de bluetooth. Los valores de presión, altitud y temperatura se pueden ver en la aplicación de Android de Infineon (descargar aquí), así como en el software de evaluación SES2G. Los usuarios también pueden crear aplicaciones para Android con la biblioteca que proporciona Infineon, según sus propios requisitos.

Puede encontrar más información sobre Sensor Hub Nano aquí.

Pero quiero que Alzheimer's Assistant funcione sin un teléfono Android en el medio. Debe ser un dispositivo portátil que pueda funcionar por sí solo, además de tener la capacidad de conectarse a un teléfono inteligente para ver los datos del sensor. Entonces, decidí que usaré una placa Arduino MKR1000 debido a su factor de forma pequeño y capacidad WiFi, y la conectaré mediante algún método al Sensor Hub Nano.

Este es el pinout para el Arduino MKR1000 que encontrará útil:

Tenía un módulo bluetooth HC-05, así que tuve que usarlo para la conexión entre el Arduino MKR1000 y el Sensor Hub Nano. Pero primero, necesitamos conectar correctamente el HC-05 a los pines Tx y Rx del hardware de Arduino, teniendo en cuenta los niveles lógicos. Mi módulo bluetooth funciona a 3.3v, que es lo mismo que el MKR1000, por lo que no hubo necesidad de ningún cambiador de nivel de voltaje. Pero si su módulo bluetooth funciona en el nivel de 5v, es posible que deba usar un cambiador de nivel similar al que se muestra.

Después de hacer coincidir los niveles de voltaje, necesitamos emparejar el HC-05 con el Sensor Hub Nano para iniciar la comunicación de datos entre ellos, y encontrar una manera fácil de hacer que se emparejen automáticamente cada vez que el Sensor Hub Nano entre en el rango de bluetooth del HC. -05.

Para hacer eso, pensé en configurar el HC-05 para que actúe como un dispositivo 'maestro' de bluetooth y emparejarlo solo con una dirección MAC específica; la del Sensor Hub Nano. Entonces, después de configurarlo así, una vez que enciende el HC-05, busca un dispositivo con una dirección MAC específica (la del Sensor Hub Nano) y se empareja automáticamente con él, dejando que el usuario envíe y recibir datos.

Esto se hace usando los comandos del modo AT para el HC-05 y se trata en la sección "Configuración del módulo Bluetooth".

Nota:He adjuntado un documento que encontré en línea, que enumera todos los comandos AT que admite el HC-05, así que úselos según sea necesario.

Una vez que está emparejado y conectado correctamente, enviar comandos al Sensor Hub Nano es como un terminal bluetooth. Puede usar los comandos que especifiqué anteriormente simplemente imprimiéndolos como una Cadena, a través del puerto serie de hardware al que está conectado el HC-05. Por ejemplo, este es el comando que enviará para iniciar el flujo de datos del sensor:

  $ start_sensor id =1 // Para iniciar el flujo de datos del sensor  

Aquí hay una lista de los comandos que conozco:

  $ hello id =// Hola 
$ info id =// Info
$ sinfo id =1 // Información del sensor
$ set_mode sid =1; md =mode; val =bg // Baja energía
$ set_mode sid =1; md =prs_osr; val =16 // Modo estándar
$ set_mode sid =1; md =prs_mr; val =32 // Alta precisión
$ start_sensor id =1 // Start
$ stop id =// Stop

Los datos del sensor que provienen del Sensor Hub Nano están en este formato:

  $ 1, t, 36.9299,1154206 // Temperatura 
$ 1, p, 997.6813,1154206 // Presión
$ 1, a, 130.4305,1154206 // Altitud

Nota:me gustaría hacer una referencia a Peter Smith entrada de blog lo que me ayudó a iniciar la comunicación con Sensor Hub Nano mediante bluetooth.

Una vez que podamos iniciar el flujo de datos desde el módulo, necesitamos una forma de analizar los datos de este. Esta fue, debo admitir, la parte más difícil del proyecto; Una vez que envía el comando para iniciar el flujo de datos, el Sensor Hub Nano simplemente envía un flujo de datos, dejándolo en manos del dispositivo que recibe los datos para analizar cualquier cosa sensible de él. Entonces, después de probar muchos métodos de complejidad variable (que no analizaré aquí), este fue el método más simple y más eficiente que se me ocurrió para analizar datos del Sensor Hub Nano.

  void getSensorValues ​​() {
// Recupera los valores del sensor del Sensor Hub Nano a través del puerto 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');
}
}

También se conectará una pantalla al Arduino para interactuar con el usuario y mostrar cualquier mensaje, o para mostrar la hora o los datos del sensor (más sobre esto a medida que sigue leyendo).

Una vez que obtenga los datos en el Arduino MKR1000, debido a su conectividad inalámbrica, puede enviar los datos a varias plataformas de IoT diferentes, como Cayenne o Blynk.

Decidí usar Cayenne para esto, ya que estaba impresionado por su hermosa interfaz y fácil configuración. Pero, lamentablemente, tuvo algunos errores con la conexión WiFi MKR1000 que nos impidieron seleccionar los pines. Debo mencionar que los chicos de Cayenne fueron muy útiles, pero aún así el problema no se resolvió. Por lo tanto, decidí usar Blynk al final, pero son muy similares en su uso, por lo que con solo cambiar algunas líneas de código Arduino, puede cambiar de Blynk a Cayenne si desea probarlo o una vez que el problema sea resuelto. Ambos tienen las mismas características, más o menos, por lo que es solo su preferencia. Pero la única ventaja de Cayenne es que también puede acceder a él en una PC, mientras que Blynk solo funciona en teléfonos inteligentes.

Ahora, hemos recibido datos del Sensor Hub Nano, los hemos introducido en Arduino y los hemos transferido a una plataforma de IoT (a partir de ahora diré Blynk), por lo que ahora solo necesitará personalizar el Asistente de Alzheimer de acuerdo con según sus propias necesidades, y eso se trata en otra sección (la detección de caída y ubicación se discute allí).

Nota:He intentado documentar todos y cada uno de los pasos en detalle, pero si no sabe algo (como cargar código en su Arduino), sería una mejor idea ir al Arduino página de inicio , familiarícese con él por un tiempo y luego regrese para esto, una vez que sepa al menos los conceptos básicos.

Configurando el módulo bluetooth

Lo primero que deberá hacer es obtener la dirección MAC de su Sensor Hub Nano Evaluation Kit. Habrá muchas formas diferentes de hacerlo, pero contaré cómo lo hice.

Empareje el Sensor Hub Nano con su teléfono inteligente:

Descargue la aplicación Sensor Hub Nano Evaluation de Infineon (para Android) desde aquí y encienda su Sensor Hub Nano. Abra la aplicación y mostrará el Sensor Hub Nano como "IFX_NANOHUB", con la dirección MAC debajo.

Anote esto, ya que lo necesitará más adelante.

Nota:sería mejor que desemparejara el Sensor Hub Nano de su teléfono inteligente si no lo está usando ahora porque si su teléfono está cerca con el bluetooth encendido y el Sensor Hub Nano emparejado, el teléfono se conecta automáticamente con él . Y cuando configura el HC-05 e intenta emparejarlo con el Nano Hub, simplemente no se conecta.

Poner el HC-05 en modo AT:

El modo AT nos permite configurar los ajustes del módulo bluetooth HC-05; establezca la velocidad en baudios o establezca si desea conectarse como dispositivo esclavo o maestro y más. Tendremos que cambiar algunas configuraciones del módulo para permitirle recuperar datos exitosamente del Sensor Hub Nano de Infineon.

Primero, cargue el boceto "AT Commands" al Arduino MKR1000. Esto nos permitirá dar comandos al módulo Bluetooth en modo AT, a través del Arduino MKR1000.

  // Boceto original del blog de Martyn Currey aquí:
// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/
//
// ¡Boceto modificado por mí para trabajar con Arduino MKR1000!
//
// Esquema básico de Bluetooth
// Conecte el módulo HC-05 y comuníquese usando el monitor serial
//
// Los valores predeterminados del HC-05 al modo de trituración cuando se enciende por primera vez.
// Debe colocarse en modo AT
// Después de un restablecimiento de fábrica, la velocidad en baudios predeterminada para el modo de comunicación es 38400
char c ='';
void setup () {
// inicia la comunicación serial con la computadora host
Serial.begin (9600);
Serial.println ("Arduino con HC-05 está listo");
// iniciar la comunicación con el HC-05 usando 38400
Serial1.begin (38400);
Serial.println ("Serial1 comenzó en 38400");
}
void loop () {
// Siga leyendo de HC-05 y envíe a Arduino Serial Monitor
if (Serial1.available ())
{
c =Serial1.read ();
Serial.write (c);
}
// Siga leyendo desde Arduino Serial Monitor y envíe a HC-05
if (Serial.available ())
{
c =Serial.read ( );
// duplica los comandos en el monitor serial
// facilita el seguimiento de los comandos
Serial.write (c);
Serial1.write (c);
}
}

Luego, conecte solo el módulo bluetooth al Arduino MKR1000 siguiendo el diagrama.

Nota:sería una buena idea conectarlo todo primero en una placa de pruebas y proceder al cableado adecuado una vez que lo haya configurado correctamente.

Si intenta encender el Sensor Hub Nano y el HC-05, verá que no se conectan automáticamente en este momento. Esto es lo que vería:

Para cambiar la configuración del HC-05, necesitará poner su módulo bluetooth en modo AT. El método para hacer esto depende de la placa de ruptura que tenga y, por lo tanto, es posible que deba hacerlo de manera diferente. Si tiene un módulo que es diferente al que tengo, diríjase al blog de Martyn Currey aquí, donde puede encontrar información detallada sobre cómo obtener los módulos bluetooth HC-05 en modo AT. Si está atascado, busque en Google su problema o comentario e intentaré ayudarlo.

Mi módulo bluetooth tiene el interruptor de botón, así que tengo que seguir los siguientes pasos para ponerlo en modo de comando AT (no olvides cargar el código de comando AT en el Arduino):

  • Desconecte la alimentación del módulo. (¡Las líneas TX y RX todavía están conectadas!)
  • Mantenga presionado el interruptor de botón en el módulo cerrado
  • Aplique energía mientras mantiene presionado el botón interruptor
  • Cuando se encienda el LED, suelte el interruptor

Un video que muestra cómo poner el HC-05 en modo AT:

Una vez en el modo AT, notará una diferencia considerable en el patrón de parpadeos del LED en el HC-05. En el modo de comunicación, el LED parpadea rápidamente, aproximadamente 5 veces por segundo, mientras que en el modo AT el LED parpadea una vez cada dos segundos.

Configuración del módulo HC-05:

Abra el monitor en serie, establezca la velocidad en baudios en 9600 y seleccione "Ambos NL y CR".

Nota:Deberá configurarlo en salto de línea y retorno de carro, o los comandos AT no funcionarán.

Escriba "AT" en el monitor de serie y debería recibir un "OK". Si lo hace, puede continuar y dar los comandos como lo hice yo.

Básicamente, necesitamos cambiar estas configuraciones en el modo AT:

  • Eliminar todos los dispositivos vinculados actualmente
  • Consígalo para que se conecte solo a una dirección MAC de Bluetooth especificada
  • Establezca el modo de conexión bluetooth en "Maestro"
  • Especifique la dirección MAC a la que necesitamos conectarnos
  • Establezca la velocidad en baudios en 115200, el bit de parada en 2 bits e incluso paridad

Las instrucciones anteriores se dieron para que pueda usarlas incluso si tiene otro módulo Bluetooth, consultando los comandos y lo que hacen. Pero ahora enumeraré los comandos que di para que el HC-05 se empareje con el Sensor Hub Nano.

  • AT + RMAAD
  • AT + CMODE =0
  • AT + ROLE =1
  • AT + BIND =1234,56, abcdef (Reemplazar con la dirección MAC del Sensor Hub Nano)
  • AT + UART =115200,0,0

Aquí hay un registro de mis comandos AT para su referencia:

Ahora debe desconectar el Arduino para apagar el módulo Bluetooth. Esto lo devolverá al modo de comunicación.

Nota:si estropea algo en la configuración del HC-05, sería una buena idea restablecer el módulo a la configuración predeterminada y comenzar desde cero con el comando:AT + ORGL

Probando la conexión:

Ahora, deberá probar si el último paso fue exitoso; puede hacerlo encendiendo el Sensor Hub Nano. El LED azul parpadeará muy lentamente, una vez cada dos segundos. Luego, conecte su Arduino a su PC y observe el cambio en el LED parpadea tanto en el HC-05 como en el Sesnor Hub Nano.

Mire el parpadeo ahora y compárelo con el parpadeo anterior:

Hay una diferencia notable y debe saber que ambos módulos están conectados. Ahora puede pasar a la siguiente parte, conectar el proyecto y probarlo.

Nota:si ya vinculó su teléfono inteligente con el Sensor Hub Nano, es posible que deba desvincularlo, de lo contrario, se producirían problemas de conexión. Solo se puede conectar a un dispositivo a la vez.

Probando el proyecto básico

Una vez que haya confirmado una conexión adecuada entre el HC-05 y el Sensor Hub Nano mediante los patrones de parpadeo del LED, proceda a configurar la aplicación Blynk en el teléfono inteligente.

Configuración de la aplicación Blynk:

Descargue la aplicación Blynk (si aún no lo ha hecho) para su dispositivo iOS o Android desde aquí y escanee el código QR a través de la aplicación Blynk. Replicará automáticamente los widgets básicos necesarios en este momento.

Verá una pantalla similar:

No realice ningún cambio aquí en este momento y siga leyendo.

Instalación de las bibliotecas necesarias:

Necesitará tener dos bibliotecas diferentes para el IDE de Arduino instalado para que el código se compile sin errores. Ellos son:

  • Blynk , para conectarlo a su teléfono inteligente
  • u8g2lib , para la pantalla

Hay dos formas de instalar las bibliotecas necesarias. El primero es a través del "Administrador de bibliotecas" que está disponible en las versiones más nuevas del IDE de Arduino, y el segundo es la instalación manual. Ambos métodos se describen en detalle aquí, así que consulte el enlace, ya que no voy a pasar por eso.

Subiendo el código y probando:

Una vez que haya instalado las bibliotecas, descargue el código adjunto y realice algunos cambios. Deberá agregar su código de autenticación de Blynk (que se le envía por correo electrónico cuando se realiza un nuevo proyecto en Blynk), así como su SSID WiFi y contraseña. Una vez hecho esto, cargue el código en el MKR1000.

Después de cargar el código, conecte el circuito de acuerdo con el esquema.

Luego, abra la aplicación Blynk en su teléfono inteligente, abra el proyecto Asistente de Alzheimer y presione el botón de reproducción. Conecte el MKR1000 (con el HC-05 y la pantalla conectados), y debería ver el logotipo, Asistente de Alzheimer en la pantalla. Se quedará por un momento y luego podrá ver el mensaje " Esperando Sensor Hub Nano ”. Encienda el pequeño interruptor en el Sensor Hub Nano, asegurándose de que está dentro del alcance de bluetooth del módulo HC-05. Debería decir " Conectado al sensor Hub Nano de Infineon ", y después de unos segundos, debería ver los valores de presión, temperatura y altitud en su teléfono inteligente.

Y después de unos segundos también verá la hora en formato de 24 horas, así como la fecha, y eso se sincroniza con Internet.

Este es un video de cómo probarlo:

Si es así, enhorabuena, ha completado la parte difícil de configurarlo y ahora viene personalizándolo para pacientes individuales, de acuerdo con sus preferencias.

Personalización del asistente de Alzheimer

Hasta ahora, lo que hemos configurado recupera los datos del sensor del DPS310 de Infineon en una configuración ordenada y elegante, pero para hacer algo útil a partir de eso, tenemos que configurar la configuración de acuerdo con los requisitos y preferencias individuales. Por lo tanto, en esta sección, hablaré sobre el código y cómo modificar el Asistente de Alzheimer para que funcione según las preferencias de cada usuario. Daré el fragmento de código para cada "función" y simplemente puede agregarlo en el código principal con algunos cambios.

Nota:cuando mires el código que adjunto para el 'proyecto básico', verás que usa funciones envueltas en BlynkTimer. Sería una buena idea usarlos si desea hacer alguna personalización, ya que puede realizar tareas en un intervalo específico y también evitar el error de inundación de Blynk que ocurre cuando su hardware envía muchas solicitudes a Blynk. Además, el código es "básico" en el sentido de que todas las funciones están presentes pero no incluidas en el código principal; el usuario tiene que editar el código principal de acuerdo con los requisitos y es posible que deba ajustar el intervalo de tiempo en el que se ejecuta cada función.

El DPS310:-

El DPS310 de Infineon es un sensor de presión barométrica digital de bajo costo que proporciona una precisión muy alta, en un factor de forma muy pequeño. Por eso, es perfecto para usar en un proyecto de este tipo, y los valores se pueden usar para detectar caídas en un paciente anciano, o en qué habitación se encuentra exactamente el paciente.

Nota:Todavía no hice la caja del reloj inteligente, así que estoy usando el Sensor Hub Nano en mi mano, conectado con el Arduino a través de Bluetooth, como en esta imagen:

Detección de caídas: Para detectar caídas, necesitaremos dar un valor de caída (la diferencia en la presión del aire, entre dos lecturas durante un tiempo específico) y establecer un espacio libre. Por ejemplo, si el cambio de altitud entre dos valores sucesivos (durante un tiempo de digamos un segundo) se encuentra entre el valor de caída ± el valor de espacio libre, se detectará una caída.

Hice un par de pruebas y descubrí que el valor de caída debería ser 0,7 y el valor de holgura debería ser ± 0,2, pero es posible que no funcionen en todas las situaciones. Esto se debe a una razón simple y comprensible de que cuando una persona se cae puede ocurrir de muchas formas diferentes. Por lo tanto, será necesario el uso de un sensor secundario (probablemente un acelerómetro) para ganar más precisión en el sistema de detección de caídas, y eso se agregará al trabajo futuro. Pero siempre es posible que existan otros algoritmos más precisos para detectar caídas, y estoy abierto a escucharlos; siéntase libre de comentar si tiene alguna idea al respecto.

Un video que demuestra la detección de caídas:

Detectar dónde está el paciente: Esto funciona de manera similar al algoritmo de detección de caídas. Por ejemplo, si necesita saber en qué piso se encuentra el paciente, puede obtener el valor de altitud actual y restarlo del anterior. Y luego compare la diferencia con un valor predefinido. Esto indicará en qué piso se encuentra el paciente.

Solo sería cuestión de utilizar una lógica simple if y else para determinar en qué piso se encuentra el paciente (los valores de altitud ya están presentes en el código principal). Eso podría indicarse usando los widgets LED en Blynk.

Nota:No he incluido la detección de ubicación en el código principal, pero los usuarios pueden agregarla según sea necesario, pero no olvide usarla como una función de temporizador Blynk.

La misma técnica también podría usarse para detectar en qué habitación se encuentra una persona. En ese caso, sería necesario un sensor secundario, como un sensor de movimiento, de lo contrario podría haber muchos disparadores falsos.

Temperatura: El DPS310 también muestra el valor de temperatura que podemos utilizar para alertarnos sobre cualquier percance que pueda ocurrirle al paciente, por ejemplo, un incendio. Si la temperatura aumenta a un valor específico, digamos 45 ° C, alerta al cuidador.

Pero debido a que el sensor DPS310 no está conectado directamente a la piel (al menos en este caso de uso) lo que obtenemos no es la temperatura corporal, pero sería más exacto decir que es la temperatura del Sensor Hub Nano.

El código para esto es muy simple (utilícelo en cualquier lugar del ciclo principal) y podría ser algo como esto:

  if (t> maxTemp) {
// Haz lo que quieras si la temperatura es más alta que la máxima
}
else {
// Haz lo que quieras si la temperatura es menor que la máxima
}

Nota:Todos los gráficos anteriores se crean utilizando el software de evaluación SESG2 proporcionado por Infineon.

Un timbre y un interruptor:-

No he mencionado esto antes, pero un timbre y un interruptor también deberían estar presentes en el sistema y también serán muy útiles. Por ejemplo, se podría usar un timbre para atraer la atención del paciente, cuando sería el momento de tomar un medicamento, por ejemplo, y el interruptor podría usarse como un dispositivo de seguridad.

Y debido a que usaremos Blynk, el interruptor de botón podría configurarse de manera que cuando se presiona, aparezca una notificación en el teléfono del cuidador o llamará o enviará un SMS (eso se podría hacer usando IFTTT y se da más adelante ). Este podría ser el fragmento de código para hacer eso:

  void emailOnButtonPress () 
{
// *** ADVERTENCIA:¡Está limitado a enviar SOLO UN CORREO ELECTRÓNICO CADA 15 SEGUNDOS! ***
// Vamos a enviar un correo electrónico cuando presione el botón
// conectado al pin digital 2 en su Arduino
int isButtonPressed =! digitalRead (2); // Invertir el estado, ya que el botón es "Activo BAJO"
if (isButtonPressed) // Puede escribir cualquier condición para activar el envío de correo electrónico
{
Serial.println ("El botón está presionado . "); // Esto se puede ver en el Monitor serial
Blynk.email ("[email protected]", "Asunto:Button Logger", "Acabas de presionar el botón ...");
// O, si desea utilizar el correo electrónico especificado en la aplicación (como para la exportación de la aplicación):
//Blynk.email("Subject:Button Logger "," Acaba de presionar el botón. .. ");
}
}

Se toma del código de muestra de Blynk y usa una interrupción para verificar el botón. Esto podría ser utilizado por el paciente para alertar al cuidador en cualquier emergencia, como una caída que no fue detectada por el algoritmo de detección de caídas. Puede obtener el código de muestra completo aquí, que envía un correo electrónico una vez que se presiona un botón.

El zumbador podría usarse para producir tonos (usando el comando Arduino tone (); más información aquí), para recordarle al paciente una tarea como la medicación o el ejercicio.

La pantalla:-

Una parte importante del proyecto, que el usuario realmente mira, es la pantalla. Las pantallas del Nokia 5110 están comúnmente disponibles, son fáciles de configurar y económicas, pero no son tan llamativas, especialmente cuando se usan en un sistema de este tipo. Las pantallas OLED con una resolución más alta serán una muy buena alternativa, y puedes modificar fácilmente el código para que funcione con una porque usé la biblioteca u8g2 (github aquí). Choose any of the display models from here, and add it to the start of the sketch (removing the Nokia 5110 line, of course!). You will need to wire it up according to what it is in the code and you’re ready to go. You can also use bitmap images with a higher resolution display. 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(); retraso (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();}

Piezas y carcasas personalizadas

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

Proceso de manufactura

  1. TinyML-Language Detector basado en Edge Impulse y Arduino
  2. Juego de giroscopio Arduino con MPU-6050
  3. Dados digitales Arduino
  4. Juego de ruleta DIY 37 LED
  5. ATtiny85 Mini Arcade:Serpiente
  6. Detector de alcance portátil
  7. Luz de escritorio reactiva de audio Arduino
  8. Coche robot inteligente de seguimiento facial
  9. Asistente de atención médica personal PHA
  10. Galvanoplastia con cobre
  11. NeoMatrix Arduino Pong