Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Помощник по лечению болезни Альцгеймера

Компоненты и расходные материалы

Arduino MKR1000
× 1
Infineon Sensor Hub Nano
× 1
ЖК-дисплей Nokia 5110
× 1
Модуль Bluetooth HC-05
× 1
Макет (общий)
× 1
Перемычки (общие)
× 1
Кнопочный переключатель SparkFun, 12 мм
× 1
Зуммер
× 1
Передатчик FT1235 5 Вт
× 1
Приемник FT1236 5 Вт
× 1

Необходимые инструменты и машины

Паяльник (общий)

Приложения и онлайн-сервисы

IDE Arduino
Блинк
Служба IFTTT Maker

Об этом проекте

Этих фактов, цитируемых прямо с веб-сайта Alzheimer’s Association (взятого в сентябре 2017 года), достаточно, чтобы дать кому-либо представление о проблемах, с которыми придется столкнуться человеку, если он или его близкие болеют болезнью Альцгеймера.

Как производитель, я подумал об этом и решил, что создам носимое устройство, систему, которая может помочь как пациентам, так и тем, кто за ними ухаживает.

Эта система должна выполнять как минимум следующие задачи:

  • Напоминание пациенту о выполнении повседневных задач (например, прием лекарств, физических упражнений и т. д.).
  • Следите за тем, где находится пациент в доме.
  • Предупредить опекунов в случае возникновения чрезвычайной ситуации.
  • Отображать время (в конце концов, это часы!)
  • Он должен быть портативным и простым в использовании даже для пожилого пациента.
  • Стоимость должна быть минимальной.

Когда я увидел Sensor Hub Nano от Infineon, он показался мне хорошим кандидатом в таком проекте из-за своего очень маленького размера и возможностей BLE. Благодаря точному измерению давления его можно использовать для определения того, упал ли пациент, а также для определения того, где именно пациент находится в доме.

Я буду использовать следующие части для простого проекта для работы:

  • Sensor Hub Nano от Infineon
  • Arduino MKR1000
  • Модуль Bluetooth HC-05
  • Дисплей Nokia 5110

Вы поймете, что я имею в виду под «простым проектом», когда прочтете раздел «Персонализация помощника по борьбе с болезнью Альцгеймера».

Как это работает

В этом разделе я кратко опишу, как работают часы, и опишу шаги, которые мы должны пройти, чтобы заставить их работать.

Оценочная плата Infineon Sensor Hub Nano оснащена датчиком барометрического давления DPS310, который отправляет свои данные через оценочную плату через Bluetooth. Значения давления, высоты и температуры можно просмотреть в приложении для Android от Infineon (скачать здесь), а также в оценочной программе SES2G. Пользователи также могут создавать приложения для Android с помощью библиотеки, предоставляемой Infineon, в соответствии с их собственными требованиями.

Дополнительную информацию о Sensor Hub Nano можно найти здесь.

Но я хочу, чтобы Ассистент Альцгеймера работал без телефона Android. Это должно быть носимое устройство, которое может работать само по себе, а также иметь возможность подключаться к смартфону для просмотра данных датчика. Итак, я решил, что буду использовать плату Arduino MKR1000 из-за ее небольшого форм-фактора и возможности Wi-Fi, и подключу ее каким-либо способом к Sensor Hub Nano.

Это распиновка для Arduino MKR1000, которая вам пригодится:

У меня был модуль Bluetooth HC-05, поэтому мне пришлось использовать его для соединения между Arduino MKR1000 и Sensor Hub Nano. Но сначала нам нужно правильно подключить HC-05 к аппаратным выводам Tx и Rx Arduino с учетом логических уровней. Мой модуль bluetooth работает от 3,3 В, что такое же, как у MKR1000, поэтому не было необходимости в переключателе уровня напряжения. Но если ваш модуль Bluetooth работает на уровне 5 В, вам может потребоваться переключатель уровня, подобный показанному.

После согласования уровней напряжения нам нужно соединить HC-05 с Sensor Hub Nano, чтобы начать обмен данными между ними, и найти простой способ заставить их автоматически связываться каждый раз, когда Sensor Hub Nano попадает в зону действия Bluetooth HC. -05.

Для этого я подумал о настройке HC-05 так, чтобы он работал как «главное» устройство Bluetooth, и связал его только с определенным MAC-адресом; что из Sensor Hub Nano. Итак, после такой настройки, как только вы включаете HC-05, он ищет устройство с определенным MAC-адресом (MAC-адресом Sensor Hub Nano) и автоматически соединяется с ним, оставляя пользователю возможность отправлять и получать данные.

Это делается с помощью команд режима AT для HC-05 и рассматривается в разделе «Настройка модуля Bluetooth».

Примечание. Я приложил найденный в Интернете документ, в котором перечислены все AT-команды, поддерживаемые HC-05, поэтому используйте их по мере необходимости.

После того, как он спарен и правильно подключен, отправка команд на Sensor Hub Nano похожа на терминал Bluetooth. Вы можете использовать указанные выше команды, просто распечатав их в виде строки через аппаратный последовательный порт, к которому подключен HC-05. Например, это команда, которую вы отправите, чтобы запустить поток данных датчика:

  $ start_sensor id =1 // Чтобы начать поток данных датчика  

Вот список известных мне команд:

  $ hello id =// Привет 
$ info id =// Информация
$ sinfo id =1 // Информация о датчике
$ set_mode sid =1; md =mode; val =bg // Низкое энергопотребление
$ set_mode sid =1; md =prs_osr; val =16 // Стандартный режим
$ set_mode sid =1; md =prs_mr; val =32 // Высокая точность
$ start_sensor id =1 // Запуск
$ stop id =// Стоп

Данные датчика, поступающие от Sensor Hub Nano, имеют следующий формат:

  $ 1, t, 36.9299,1154206 // Температура 
$ 1, p, 997.6813,1154206 // Давление
$ 1, a, 130.4305,1154206 // Высота

Примечание. Я хотел бы сослаться на Питера Смита сообщение в блоге что помогло мне установить связь с Sensor Hub Nano через Bluetooth.

Как только мы сможем запустить поток данных из модуля, нам понадобится способ их синтаксического анализа. Я должен признать, что это была самая сложная часть проекта; как только вы отправляете команду для запуска потока данных, Sensor Hub Nano просто отправляет поток данных, оставляя его на усмотрение устройства, получающего данные, для анализа чего-либо разумного из них. Итак, после опробования многих методов разной сложности (которые я здесь не буду описывать), это был самый простой и наиболее эффективный метод, который я придумал, для синтаксического анализа данных из Sensor Hub Nano.

  void getSensorValues ​​() {
// Извлекает значения датчиков из Sensor Hub Nano через порт Serial1
String junkVal;
если (Serial1.available ()) {
junkVal =Serial1.readStringUntil ('\ n');
junkVal =Serial1.readStringUntil ('т');
t =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('p');
p =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('a');
a =Serial1.parseFloat ();
junkVal =Serial1.readStringUntil ('\ n');
}
}

К Arduino также будет подключен дисплей для взаимодействия с пользователем и отображения любых сообщений, а также для отображения времени или данных с датчика (подробнее об этом по мере чтения).

После того, как вы получите данные в Arduino MKR1000, благодаря его возможности беспроводного подключения, вы можете отправить данные на ряд различных платформ IoT, таких как Cayenne или Blynk.

Я решил использовать для этого Cayenne, так как был впечатлен его красивым интерфейсом и простой настройкой. Но, к сожалению, у него были некоторые ошибки с WiFi-соединением MKR1000, которые не позволяли нам выбирать контакты. Я должен упомянуть, что ребята из Cayenne мне очень помогли, но проблема все еще не решена. Поэтому в конце я решил использовать Blynk, но они очень похожи по использованию, поэтому, просто изменив несколько строк кода Arduino, вы можете переключиться с Blynk на Cayenne, если хотите протестировать его, или если проблема возникла. решено. Оба имеют одинаковые функции, более или менее, так что это только ваше личное предпочтение. Но единственным преимуществом Cayenne является то, что вы можете получить к нему доступ и на ПК, в то время как Blynk работает только на смартфонах.

Теперь мы получили данные от Sensor Hub Nano, поместили их в Arduino и передали на платформу IoT (с этого момента я буду называть Blynk), и теперь вам просто нужно будет персонализировать Ассистента Альцгеймера в соответствии с в соответствии с вашими потребностями, и это рассматривается в другом разделе (там обсуждаются вопросы обнаружения падения и местоположения).

Примечание. Я попытался подробно описать каждый шаг, но если вы чего-то не знаете (например, загружаете код в свой Arduino), было бы лучше перейти на Arduino . домашняя страница ознакомьтесь с ним какое-то время, а затем вернитесь для этого, как только вы узнаете хотя бы основы.

Настройка модуля bluetooth

Первое, что вам нужно сделать, это получить MAC-адрес вашего Sensor Hub Nano Evaluation Kit. Будет много разных способов сделать это, но я расскажу, как я это сделал.

Выполните сопряжение Sensor Hub Nano со своим смартфоном:

Загрузите приложение Infineon Sensor Hub Nano Evaluation (для Android) отсюда и включите Sensor Hub Nano. Откройте приложение, и оно отобразит Sensor Hub Nano как «IFX_NANOHUB» с MAC-адресом под ним.

Запишите это, так как оно вам понадобится позже.

Примечание:вам лучше отключить Sensor Hub Nano от вашего смартфона, если вы не используете его сейчас, потому что, если ваш телефон находится поблизости с включенным Bluetooth и сопряженным Sensor Hub Nano, телефон автоматически подключается к нему. . А когда вы настраиваете HC-05 и пытаетесь подключить его к Nano Hub, он просто не подключается.

Перевод HC-05 в режим AT:

Режим AT позволяет настраивать параметры bluetooth-модуля HC-05; установить скорость передачи данных или указать, следует ли подключаться в качестве ведомого или ведущего устройства и т. д. Нам нужно будет изменить некоторые настройки модуля, чтобы он мог успешно извлекать данные из Infineon Sensor Hub Nano.

Сначала загрузите скетч «AT-команды» в Arduino MKR1000. Это позволит нам отдавать команды модулю Bluetooth в режиме AT через Arduino MKR1000.

  // Оригинальный набросок из блога Мартина Карри здесь:
// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/
//
// Скетч модифицированный мной для работы с Arduino MKR1000!
//
// Базовый скетч Bluetooth
// Подключаем модуль HC-05 и общаемся с помощью последовательного монитора
//
// Настройки HC-05 по умолчанию в режим соединения при первом включении.
// Необходимо перевести в режим AT
// После сброса настроек по умолчанию скорость передачи данных для режима связи составляет 38400
char c ='';
void setup () {
// запускаем последовательную связь с главным компьютером
Serial.begin (9600);
Serial.println («Arduino с HC-05 готова»);
// начинаем связь с HC-05, используя 38400
Serial1.begin (38400);
Serial.println («Serial1 начался с 38400»);
}
void loop () {
// Продолжаем чтение из HC-05 и отправляем в Arduino Serial Monitor
if (Serial1.available ())
{
c =Serial1.read ();
Serial.write (c);
}
// Продолжаем чтение из последовательного монитора Arduino и отправляем на HC-05
if (Serial.available ())
{
c =Serial.read ( );
// зеркалируем команды обратно на монитор последовательного порта
// упрощаем выполнение команд
Serial.write (c);
Serial1.write (c);
}
}

Затем подключите к Arduino MKR1000 только модуль Bluetooth, следуя схеме.

Примечание. Было бы неплохо сначала подключить все это на макетной плате, а затем приступить к правильной разводке, как только вы ее правильно настроите.

Если вы попытаетесь включить Sensor Hub Nano и HC-05, вы увидите, что они не подключаются автоматически в это время. Вот что вы увидите:

Чтобы изменить настройки HC-05, вам необходимо перевести модуль Bluetooth в режим AT. Метод для этого зависит от того, какая у вас коммутационная плата, поэтому вам, возможно, придется сделать это по-другому. Если у вас есть модуль, отличный от того, который есть у меня, зайдите в блог Мартина Карри здесь, где вы можете найти подробную информацию о том, как перевести модули Bluetooth HC-05 в режим AT. Если вы застряли, погуглите свою проблему или прокомментируйте, и я постараюсь помочь.

В моем модуле Bluetooth есть кнопочный переключатель, поэтому мне нужно сделать следующие шаги, чтобы перевести его в режим AT-команд (не забудьте загрузить код AT-команды в Arduino):

  • Отключите питание модуля. (Линии TX и RX все еще подключены!)
  • Нажмите и удерживайте кнопочный переключатель на закрытом модуле.
  • Подайте питание, удерживая нажатой кнопку переключателя.
  • Когда загорится светодиод, отпустите переключатель.

Видео, показывающее, как перевести HC-05 в режим AT:

В режиме AT вы заметите значительную разницу в схеме мигания светодиодов на HC-05. В режиме связи светодиод мигает быстро, примерно 5 раз в секунду, в то время как в режиме AT светодиод мигает каждые пару секунд.

Настройка модуля HC-05:

Откройте монитор последовательного порта, установите скорость передачи 9600 и выберите «Оба NL и CR».

Примечание. Вам нужно будет установить для него перевод строки и возврат каретки, иначе AT-команды не работают.

Введите «AT» на серийном мониторе, и вы должны получить «ОК». Если да, то можете продолжить и отдавать команды, как я.

По сути, нам нужно изменить эти настройки в режиме AT:

  • Удалить все сопряженные в настоящий момент устройства.
  • Заставить его подключаться только к указанному MAC-адресу Bluetooth
  • Установите режим подключения Bluetooth на «Главный».
  • Укажите MAC-адрес, который нам нужен для подключения
  • Установите скорость передачи данных 115200, стоповый бит - 2 бита и четность.

Вышеуказанные инструкции были даны для того, чтобы вы могли использовать их, даже если у вас есть другой модуль Bluetooth, обращаясь к командам и тому, что они делают. Но теперь я перечислю команды, которые я дал HC-05 для сопряжения с Sensor Hub Nano.

  • AT + RMAAD
  • AT + CMODE =0
  • AT + ROLE =1
  • AT + BIND =1234,56, abcdef (заменить на MAC-адрес Sensor Hub Nano)
  • AT + UART =115200,0,0

Вот журнал моих AT-команд для вашей справки:

Теперь вы должны отсоединить Arduino, чтобы выключить модуль Bluetooth. Это вернет его в режим связи.

Примечание. Если вы что-то напутали в настройках HC-05, неплохо было бы сбросить модуль до настроек по умолчанию и начать с нуля с помощью команды:AT + ORGL

Проверка подключения:

Теперь вам нужно будет проверить, был ли последний шаг успешным; вы можете сделать это, включив Sensor Hub Nano. Синий светодиод будет мигать очень медленно, раз в пару секунд. Затем подключите Arduino к компьютеру и обратите внимание на изменение мигания светодиода как на HC-05, так и на Sesnor Hub Nano.

Посмотрите на мигание сейчас и сравните его с миганием раньше:

Есть заметная разница, и вы должны знать, что оба модуля подключены. Теперь вы можете перейти к следующей части - подключению проекта и его тестированию.

Примечание. Если вы ранее сопрягали свой смартфон с Sensor Hub Nano, возможно, вам придется отменить сопряжение, иначе это может вызвать проблемы с подключением. Он может подключаться только к одному устройству за раз.

Тестирование простого проекта

После того, как вы подтвердили правильное соединение между HC-05 и Sensor Hub Nano по образцу мигания светодиода, переходите к настройке приложения Blynk на смартфоне.

Настройка приложения Blynk:

Загрузите приложение Blynk (если вы еще этого не сделали) для своего устройства iOS или Android отсюда и отсканируйте QR-код через приложение Blynk. Он автоматически скопирует основные виджеты, необходимые на данный момент.

Вы увидите похожий экран:

На данном этапе не вносите никаких изменений, а просто продолжайте читать.

Установка необходимых библиотек:

Вам потребуется установить две разные библиотеки для Arduino IDE, чтобы код компилировался без ошибок. Это:

  • Блинк , чтобы подключить его к смартфону.
  • u8g2lib , для отображения

Есть два способа установить необходимые библиотеки. Первый - через «Диспетчер библиотек», который доступен в новых версиях Arduino IDE, а второй - ручная установка. Оба метода подробно описаны здесь, поэтому проверьте ссылку, я не буду повторять ее.

Загрузка кода и тестирование:

После того, как вы установили библиотеки, загрузите прикрепленный код и внесите в него некоторые изменения. Вам нужно будет добавить свой код аутентификации из Blynk (он будет отправлен вам по электронной почте при создании нового проекта в Blynk), а также ваш SSID и пароль WiFi. Как только это будет сделано, загрузите код в MKR1000.

После загрузки кода подключите схему согласно схеме.

Затем откройте приложение Blynk на своем смартфоне, откройте проект Alzheimer’s Assistant и нажмите кнопку воспроизведения. Подключите MKR1000 (с подключенными HC-05 и дисплеем), и вы должны увидеть логотип «Помощник по болезни Альцгеймера» на дисплее. Он останется на мгновение, а затем вы увидите сообщение « Waiting for Sensor Hub Nano ». Включите небольшой переключатель на Sensor Hub Nano, убедившись, что вы находитесь в зоне действия Bluetooth модуля HC-05. В нем должно быть написано " Connected to Infineon’s Sensor Hub Nano ". ", и через несколько секунд вы должны увидеть на своем смартфоне значения давления, температуры и высоты.

А через несколько секунд вы также увидите время в 24-часовом формате, а также дату, которая синхронизируется с Интернетом.

Это видео тестирования:

Если это так, поздравляю, вы выполнили сложную часть настройки и теперь приступаем к индивидуальной настройке для отдельных пациентов в соответствии с их предпочтениями.

Персонализация помощника по болезни Альцгеймера

До сих пор то, что мы настроили, извлекает данные датчиков от Infineon DPS310 в аккуратной и элегантной настройке, но чтобы извлечь из этого что-то полезное, мы должны настроить настройку в соответствии с индивидуальными требованиями и предпочтениями. Поэтому в этом разделе я расскажу о коде и о том, как изменить «Помощник по болезни Альцгеймера», чтобы он работал в соответствии с предпочтениями каждого пользователя. Я дам фрагмент кода для каждой «функции», и вы можете просто добавить его в основной код с небольшими изменениями.

Примечание. Когда вы посмотрите на код, который я прикрепил для «простого проекта», вы увидите, что он использует функции, заключенные в BlynkTimer. Было бы неплохо использовать их, если вы хотите выполнить какую-либо настройку, поскольку он может выполнять задачи с заданным интервалом, а также предотвращать ошибку Blynk flood, которая возникает, когда ваше оборудование отправляет много запросов в Blynk. Кроме того, код является «скудным» в том смысле, что все функции присутствуют, но не включены в основной код; пользователь должен отредактировать основной код в соответствии с требованиями и, возможно, придется настроить интервал времени, с которым запускается каждая функция.

DPS310:-

Infineon DPS310 - это недорогой цифровой датчик атмосферного давления, который обеспечивает очень высокую точность и имеет очень малый форм-фактор. По этой причине его идеально использовать в таком проекте, а значения можно использовать для определения падений у пожилого пациента или для определения того, в какой именно комнате находится пациент.

Примечание. Я еще не делал корпус для умных часов, поэтому использую Sensor Hub Nano на руке, подключенный к Arduino через Bluetooth, как на этом изображении:

Обнаружение падения: Чтобы обнаружить падение, нам нужно будет указать значение падения (разница в давлении воздуха между двумя показаниями за заданное время) и установить зазор. Например, если изменение высоты между двумя последовательными значениями (в течение некоторого времени, скажем, секунды) находится между значением падения ± значением клиренса, падение будет обнаружено.

Я провел несколько тестов и обнаружил, что значение падения должно составлять 0,7, а значение зазора должно быть ± 0,2, но они могут работать не во всех ситуациях. Это происходит по простой и понятной причине:падение человека может происходить по-разному. Следовательно, для повышения точности системы обнаружения падений потребуется использование вторичного датчика (возможно, акселерометра), и это будет добавлено в будущую работу. Но всегда возможно, что существуют другие, более точные алгоритмы обнаружения падений, и я готов их услышать; не стесняйтесь комментировать, если у вас есть какие-либо идеи по этому поводу.

Видео, демонстрирующее обнаружение падения:

Определение местонахождения пациента: Это работает аналогично алгоритму обнаружения падения. Например, если вам нужно знать, на каком этаже находится пациент, вы можете получить текущее значение высоты и вычесть его из предыдущего. А затем сравните разницу с заранее заданным значением. Это укажет, на каком этаже находится пациент.

Было бы просто использовать простую логику if и else, чтобы определить, на каком этаже находится пациент (значения высоты уже присутствуют в основном коде). Это можно указать с помощью светодиодных виджетов в Blynk.

Примечание. Я не включил определение местоположения в основной код, но пользователи могут добавить его по мере необходимости, просто не забудьте использовать его как функцию таймера Blynk.

Тот же метод можно использовать для определения того, в какой комнате находится человек. В этом случае потребуется дополнительный датчик, например датчик движения, иначе может возникнуть много ложных срабатываний.

Температура: DPS310 также показывает значение температуры, которое мы можем использовать, чтобы предупредить нас о любых несчастных случаях, которые могут случиться с пациентом, например о пожаре. Если температура повышается до определенного значения, скажем 45 ℃, это предупреждает смотрителя.

Но поскольку датчик DPS310 не прикреплен непосредственно к коже (по крайней мере, в этом случае), мы получаем не температуру тела, а точнее было бы сказать, что это температура Sensor Hub Nano.

Код для этого очень простой (используйте его в любом месте основного цикла) и может быть примерно таким:

  if (t> maxTemp) {
// Делайте, что хотите, если температура выше максимальной
}
else {
// Делайте, что хотите если температура ниже максимальной
}

Примечание. Все приведенные выше графики созданы с использованием оценочного программного обеспечения SESG2, предоставленного Infineon.

Зуммер и выключатель:-

Я не упоминал об этом раньше, но в системе также должны присутствовать зуммер и переключатель, и они тоже будут очень полезны. Например, зуммер можно использовать для привлечения внимания пациента, когда, например, пора принимать лекарство, а выключатель можно использовать в качестве предохранительного устройства.

И поскольку мы будем использовать Blynk, кнопочный переключатель можно настроить таким образом, чтобы при нажатии на телефон смотрителя появлялось уведомление, либо он звонил или отправлял SMS (это можно было сделать с помощью IFTTT и дается позже. ). Это может быть фрагмент кода для этого:

  void emailOnButtonPress () 
{
// *** ВНИМАНИЕ:вы можете отправлять ТОЛЬКО ОДИН ЭЛЕКТРОННЫЙ ПИСЬМО ЗА 15 СЕКУНД! ***
// Давайте отправим электронное письмо, когда вы нажмете кнопку
// подключенную к цифровому выводу 2 на вашем Arduino
int isButtonPressed =! digitalRead (2); // Инвертировать состояние, так как кнопка находится в "Активном НИЗКОМ"
if (isButtonPressed) // Вы можете написать любое условие для запуска отправки электронной почты
{
Serial.println ("Кнопка нажата . "); // Это можно увидеть в Serial Monitor
Blynk.email ("[email protected]", "Subject:Button Logger", "Вы только что нажали кнопку ...");
// Или, если вы хотите использовать адрес электронной почты, указанный в приложении (например, для экспорта приложения):
//Blynk.email("Subject:Button Logger "," Вы просто нажали кнопку. .. ");
}
}

Он взят из примера кода Blynk и использует прерывание для проверки кнопки. Это может быть использовано пациентом для предупреждения опекуна в любой чрезвычайной ситуации, например, о падении, которое не было обнаружено алгоритмом обнаружения падений. Здесь вы можете получить полный пример кода, который отправляет электронное письмо при нажатии кнопки.

Зуммер можно использовать для воспроизведения сигналов (с помощью команды Arduino tone () - подробнее здесь), чтобы напоминать пациенту о такой задаче, как прием лекарств или упражнение.

Дисплей:-

Основная часть проекта, на которую фактически смотрит пользователь, - это дисплей. The Nokia 5110 displays are commonly available, easy to set up and cheap, but they aren’t that flashy, especially when used in such a system. OLED displays with a higher resolution will be a very good alternative to it, and you can easily modify the code to work with one because I used the u8g2 library (github here). 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.

Код

  • 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(); задержка (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();}

Изготовленные на заказ детали и корпуса

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

Схема

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

Производственный процесс

  1. Детектор языка TinyML на основе Edge Impulse и Arduino
  2. Игра с гироскопом Arduino с MPU-6050
  3. Цифровые игральные кости Arduino
  4. Рулетка DIY 37 LED
  5. Мини-аркада ATtiny85:Змейка
  6. Переносимый детектор дальности
  7. Реактивный настольный светильник для звука Arduino
  8. Умный автомобиль-робот с отслеживанием лиц
  9. Персональный помощник по медицинскому обслуживанию PHA
  10. Гальваника медью