Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Slimme Alzheimer's-begeleider: Arduino-gebaseerd waarschuwingssysteem

Onderdelen en benodigdheden

  • Arduino MKR1000 – 1 stuk
  • Infineon Sensor Hub Nano – 1 stuk
  • Nokia 5110 LCD – 1 stuk
  • HC-05 Bluetooth-module – 1 stuk
  • Breadboard (generiek) – 1 stuk
  • Jumper wires (generiek) – 1 set
  • SparkFun Drukknop 12mm – 1 stuk
  • Buzzer – 1 stuk
  • FT1235 5W zender – 1 stuk
  • FT1236 5W ontvanger – 1 stuk

Benodigde tools en machines

  • Solderbout (generiek)

Apps en online diensten

  • Arduino IDE
  • Blynk
  • IFTTT Maker service

Over dit project

Deze feiten, rechtstreeks van de Alzheimer's Association website (september 2017), geven een beeld van de problemen die mensen doorstaan bij Alzheimer, of bij hun naasten.

Als maker dacht ik: ik bouw een draagbaar apparaat, een systeem dat zowel patiënten als mantelzorgers helpt.

Het systeem moet minimaal het volgende kunnen:

  • Patiënt herinneren aan dagelijkse taken (medicijnen, oefeningen, etc.)
  • Monitoren waar de patiënt in huis is
  • Mantelzorgers alarmeren bij noodgevallen
  • Tijd weergeven (het is een horloge!)
  • Draagbaar en simpel te bedienen, ook voor ouderen
  • Kosten minimaal houden

De Infineon Sensor Hub Nano leek ideaal: zeer klein, BLE-mogelijkheden, en met nauwkeurige drukmeting valdetectie en lokaalbepaling in huis mogelijk.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

De "bare-bones" versie gebruikt: Sensor Hub Nano, Arduino MKR1000, HC-05 Bluetooth, Nokia 5110 Display.

Hoe het werkt

De Sensor Hub Nano evaluatieboard heeft een DPS310 barometrische druksensor die data via Bluetooth stuurt. Druk, hoogte en temperatuur zijn zichtbaar in de Android-app van Infineon en SES2G-evaluatiesoftware. Gebruikers kunnen eigen Android-apps bouwen met de Infineon-bibliotheek.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Meer info: Sensor Hub Nano.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Maar ik wil dat Alzheimer's Assistant werkt zonder Android-telefoon ertussen. Een draagbaar apparaat dat zelfstandig werkt, maar wel kan connecten met smartphone voor sensordata. Daarom Arduino MKR1000 (klein, WiFi) en verbinden met Sensor Hub Nano.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Ik had een HC-05 Bluetooth-module, dus die gebruikte ik voor de verbinding Arduino ↔ Sensor Hub Nano, rekening houdend met logische niveaus. Mijn HC-05 werkt op 3.3V, gelijk aan MKR1000, dus geen level shifter nodig. Als jouw module 5V is, heb je een level shifter nodig.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Na spanningsniveaus matchen: HC-05 koppelen met Sensor Hub Nano voor datacommunicatie, en automatisch koppelen wanneer in bereik.

HC-05 configureren als Bluetooth master, en alleen koppelen met specifiek MAC-adres van de Sensor Hub Nano. Bij inschakelen zoekt HC-05 naar dat MAC-adres en koppelt automatisch. Gebruiker hoeft alleen data te sturen/ontvangen.

Dit doe je met AT-commando's voor HC-05 (zie sectie "Bluetooth-module configureren").

Let op: Ik heb een document met alle AT-commando's van de HC-05 bijgevoegd.

Eenmaal gekoppeld: commando's sturen naar Sensor Hub Nano is als een Bluetooth-terminal. Commando's printen als String via hardware seriële poort. Voorbeeld om sensordata te starten:

$start_sensor id=1

Bekende commando's:

$hello id=
$info id=
$sinfo id=1
$set_mode sid=1;md=mode;val=bg      // Laag energie
$set_mode sid=1;md=prs_osr;val=16  // Standaard modus
$set_mode sid=1;md=prs_mr;val=32   // Hogeprecisie
$start_sensor id=1                 // Start
$stop id=                          // Stop

Sensordata formaat:

$1,t,36.9299,1154206 // Temperatuur
$1,p,997.6813,1154206 // Druk
$1,a,130.4305,1154206 // Hoogte

Referentie: Peter Smith's blogpost hielp bij Bluetooth-communicatie met Sensor Hub Nano.

Data parsen was de lastigste stap. De Sensor Hub Nano stuurt een continue stroom data; de ontvanger moet er zin uit halen. Na veel pogingen was dit de simpelste en efficiëntste methode:

void getSensorValues() {
  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');
  }
}

Een display (Nokia 5110) is aangesloten voor interactie, berichten, tijd, sensordata.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Data in MKR1000 → via WiFi naar IoT-platforms (Cayenne, Blynk). Ik koos eerst Cayenne (mooie interface, makkelijke setup), maar bugs met MKR1000 WiFi (pins niet selecteerbaar). Cayenne-team was behulpzaam, maar onopgelost. Dus Blynk gekozen. Ze zijn vergelijkbaar; paar regels code wijzigen om te switchen. Voordeel Cayenne: PC-toegang; Blynk: alleen smartphone.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Nu: data van Sensor Hub Nano → Arduino → Blynk. Vervolgens personaliseren per patiënt (valdetectie, lokaalbepaling in volgende sectie).

Let op: Ik heb elke stap gedocumenteerd, maar als je basis Arduino niet kent: ga eerst naar Arduino homepage, oefen even, dan terug hier.

Bluetooth-module configureren

Eerst MAC-adres van Sensor Hub Nano Evaluation Kit verkrijgen. Mijn methode:

  1. Sensor Hub Nano met smartphone koppelen.
  2. Infineon Sensor Hub Nano Evaluatie-app downloaden (Android), Sensor Hub Nano aanzetten. App toont "IFX_NANOHUB" met MAC-adres eronder.
  3. MAC-adres noteren.

Let op: Ontkoppel Sensor Hub Nano van smartphone als je het niet gebruikt; anders verbindt telefoon automatisch en HC-05 kan niet koppelen.

HC-05 in AT-modus brengen

AT-modus stelt instellingen in: baudrate, master/slave, etc. We moeten instellingen wijzigen voor succesvolle data-ophaling van Sensor Hub Nano.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

  1. Upload "AT Commands" sketch naar MKR1000 (zie code sectie).
  2. Alleen Bluetooth-module aan Arduino aansluiten per schema.
  3. Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  4. Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Sensor Hub Nano en HC-05 aan → ze koppelen nog niet automatisch.

HC-05 in AT-modus: afhankelijk van breakout board. Mijn module heeft knopje:

  • Voeding loskoppelen (TX/RX blijven verbonden!)
  • Knop ingedrukt houden
  • Voeding aansluiten, knop vast
  • LED gaat branden → knop loslaten

Video: HC-05 in AT-modus.

In AT-modus knippert LED langzaam (1x per paar seconden) vs snel in communicatiemodus (5x/sec).

HC-05 instellen

Serial Monitor openen: 9600 baud, "Both NL & CR".

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Let op: Newline + carriage return verplicht voor AT-commando's.

Type "AT" → moet "OK" geven. Dan verder:

  • Alle gekoppelde apparaten verwijderen
  • Alleen verbinden met gespecificeerd MAC-adres
  • Bluetooth-modus: Master
  • MAC-adres opgeven
  • Baudrate: 115200, stopbit: 2, even parity

Mijn AT-commando's:

  • AT+RMAAD
  • AT+CMODE=0
  • AT+ROLE=1
  • AT+BIND=1234,56,abcdef (vervang met MAC-adres Sensor Hub Nano)
  • AT+UART=115200,0,0

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Arduino ontkoppelen → HC-05 terug in communicatiemodus.

Let op: Als je fouten maakt: reset met AT+ORGL naar fabrieksinstellingen.

Verbinding testen

Sensor Hub Nano aanzetten → blauwe LED knippert langzaam. Arduino aan PC → LED-patronen veranderen op beide modules. Verschil zichtbaar = verbonden.

Let op: Als smartphone eerder gekoppeld was: ontkoppelen, anders verbindingsproblemen. Alleen 1 verbinding tegelijk.

Bare-bones project testen

Na bevestigde verbinding (LED-patronen): Blynk-app instellen op smartphone.

Blynk-app instellen

  1. Blynk-app downloaden (iOS/Android), QR-code scannen via Blynk-app → basis-widgets automatisch aangemaakt.
  2. Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  3. Vergelijkbaar scherm verschijnt: Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  4. Nog geen wijzigingen aanbrengen, lees verder.

Benodigde bibliotheken installeren

  • Blynk – voor smartphone-verbinding
  • u8g2lib – voor display

Twee methoden: Library Manager (nieuwere Arduino IDE) of handmatig. Zie installatiehandleiding.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Code uploaden en testen

  1. Bibliotheken geïnstalleerd → bijgevoegde code downloaden, aanpassen: Blynk auth-token (per e-mail bij nieuw project), WiFi SSID/wachtwoord.
  2. Code uploaden naar MKR1000.
  3. Schakeling opbouwen per schema: Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  4. Blynk-app openen, Alzheimer's Assistant project, Play-knop. MKR1000 aan (met HC-05 en display). Logo "Alzheimer's Assistant" op display, dan "Waiting for Sensor Hub Nano". Sensor Hub Nano aan (in Bluetooth-bereik van HC-05). "Connected to Infineon's Sensor Hub Nano", na seconden: druk, temperatuur, hoogte op smartphone.
  5. Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  6. Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem
  7. Na seconden: tijd (24u-formaat) en datum, gesynchroniseerd met internet.

Video van test: Testvideo.

Gelukt? De moeilijke kant klaar. Nu personaliseren per patiënt.

Alzheimer's Assistant personaliseren

Nu sensordata netjes ophalen, maar om nuttig te zijn: configureren per individu. Ik geef code-snippets per feature, toe te voegen aan hoofdcodem met kleine aanpassingen.

Let op: In de "bare-bones" code worden functies in BlynkTimer gewrapped. Gebruik dit voor aanpassingen: taken op intervallen, voorkomt Blynk flood error (te veel verzoeken). Code is "bare-bones": alle functies aanwezig maar niet in main code; gebruiker past main code aan, past intervallen aan.

De DPS310 sensor

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Infineon's DPS310: goedkope digitale barometrische druksensor, hoge nauwkeurigheid, klein formaat. Perfect voor valdetectie bij ouderen of kamerbepaling in huis.

Let op: Nog geen behuizing, dus Sensor Hub Nano op hand, via Bluetooth met Arduino verbonden.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Valdetectie

Valdetectie: valwaarde (luchtdrukverschil tussen twee metingen over tijd) en clearance instellen. Bijvoorbeeld: hoogteverschil tussen twee opeenvolgende waarden (over 1 sec) tussen valwaarde ± clearance = val gedetecteerd.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Mijn tests: valwaarde 0.7, clearance ±0.2. Werkt niet in alle situaties (vallen kan op veel manieren). Secundaire sensor (versnellingsmeter) nodig voor betere nauwkeurigheid → toekomstig werk. Open voor betere algoritmen – reageer in comments!

Video valdetectie: Demo.

Waar is de patiënt?

Vergelijkbaar algoritme. Bijv. verdieping bepalen: huidige hoogte minus vorige, verschil vergelijken met voorgedefinieerde waarde. Simpele if/else logica met hoogtewaarden (al in main code). Kan aangegeven worden met LED-widgets in Blynk.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Let op: Locatiedetectie niet in main code, zelf toevoegen als BlynkTimer-functie.

Zelfde techniek voor kamerbepaling → dan bewegingsensor nodig voor minder false triggers.

Temperatuur

DPS310 meet ook temperatuur. Bij stijging naar bv. 45°C → alarm mantelzorger (brandgevaar).

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Let op: sensor niet op huid → geen lichaamstemperatuur, maar temperatuur van Sensor Hub Nano.

Code (in main loop):

if (t > maxTemp) {
  // Actie bij te hoge temperatuur
} else {
  // Actie bij normale temperatuur
}

Let op: Grafieken gemaakt met SESG2 Evaluatiesoftware van Infineon.

Buzzer en knop

Buzzer en knop horen thuis in het systeem. Buzzer: patiënt attentie trekken (medicijntijd). Knop: veiligheidsapparaat.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Via Blynk: knop indrukken → notificatie op telefoon mantelzorger, of bellen/SMS (via IFTTT, later meer). Code-snippet:

void emailOnButtonPress() {
  // WAARSCHUWING: Max 1 e-mail per 15 seconden!
  int isButtonPressed = !digitalRead(2); // Inverteren, knop is "Active LOW"
  if (isButtonPressed) {
    Serial.println("Button is pressed.");
    Blynk.email("jouw_email@mail.com", "Subject: Button Logger", "You just pushed the button...");
    // Of e-mail uit app instellingen: Blynk.email("Subject: Button Logger", "You just pushed the button...");
  }
}

Afkomstig uit Blynk-voorbeeldcode, gebruikt interrupt voor knopcontrole. Patiënt kan mantelzorger alarmeren bij noodgeval (val niet gedetecteerd). Volledige voorbeeldcode: Blynk button email.

Buzzer: tonen produceren met Arduino tone() (meer info hier), voor herinneringen (medicijnen, oefeningen).

Display

Belangrijkste deel wat gebruiker ziet. Nokia 5110: algemeen, makkelijk, goedkoop, maar niet "flashy". OLED met hogere resolutie is betere optie. Code aanpassen is makkelijk want ik gebruik u8g2 library (GitHub). Elk displaymodel kiezen, aan sketch begin toevoegen (Nokia 5110 regel verwijderen). Bedrading volgens code. Bitmap-afbeeldingen mogelijk met hogere resolutie. Lettertypes kiezen uit lijst en naam in code aanpassen.

Let op: Pixel-posities voor tekst mogelijk aanpassen bij hogere resolutie display.

Tijd weergeven

RTC-module mogelijk, maar via internet simpeler. Blynk maakt het nog makkelijker: RTC-widget in project. Paar regels code halen tijd van Blynk-server (tijdzone instellen in widget!). Main code toont standaard tijd (niet sensordata).

Let op: Tijd op scherm kan ±1 minuut afwijken (internet-sync), maar na lang testen heel nauwkeurig (verschil seconden).

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Sensor Hub Nano data weergeven

Ook sensordata op display (debugging). Code:

void showSensorValues() {
  char bufT[10], bufP[10], 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);
  // Temperatuur
  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);
  // Druk
  u8g2.drawStr(0, 26, "P:");
  u8g2.drawStr(12, 26, bufP);
  u8g2.drawStr(60, 26, "mBar");
  u8g2.drawHLine(0, 28, 85);
  // Hoogte
  u8g2.drawStr(0, 42, "A:");
  u8g2.drawStr(12, 42, bufA);
  u8g2.drawStr(72, 42, "m");
  u8g2.drawHLine(0, 44, 85);
  u8g2.sendBuffer();
}

Vergeet niet getSensorValues(); aan te roepen.

Dagelijkse herinneringen (medicijnen, oefening)

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Met Blynk Eventor-widget (details).

  1. Eventor-widget toevoegen (al aanwezig na QR-code scan).
  2. Volg screenshots voor setup.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Voorbeeld: Eventor voor valdetectie-notificatie.

Herinneringen via Eventor:

BLYNK_WRITE(vEVENTOR_PIN) {
  int currentValue = param.asInt(); // 0 to 1
  if (currentValue == 1) {
    showPillReminder();
    playBuzzerReminder(); // Nog niet in main code, maar toe te voegen!
  } else {
    // Niets doen
  }
}

Resultaat op display bij medicijntijd:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Hetzelfde voor oefening:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Code: showExerciseReminder(); ipv showPillReminder();.

Eventor kan ook: temperatuurstijging → e-mail sturen, zonder codewijziging!

Verschillende modi Sensor Hub Nano

Test modi met commando's:

sendCommand(LOW_ENERGY);
sendCommand(STANDARD_MODE);
sendCommand(HIGH_PRECISION);

Via Blynk schakelen efficiënter. Blynk-app setup:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Niet in main code toegevoegd (geen gebruik voor mij), maar commando's aanwezig, logica toevoegen in sketch.

Blynk en IFTTT

Blynk laat Arduino-projecten IFTTT-kracht benutten.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Blynk stuurt webhook-request naar IFTTT Webhooks-kanaal (voorheen Maker-kanaal). IFTTT-applet wacht op webhook-trigger (van Blynk/Arduino) en triggert actie.

Eenvoudig voorbeeld: Blynk + IFTTT webhooks

Blynk webhook-widget voor request:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

IFTTT webhook-kanaal:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

IFTTT kan ook getriggerd worden door Blynk e-mails en tweets.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Applet gemaakt. Testen: IFTTT Services → Webhooks → Settings → URL kopiëren, openen in nieuw tab, {event} vervangen door event-naam (bij mij "button_pressed"), "Test it" → resultaat na seconden:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Webhook werkt → URL in Blynk webhook-instellingen zetten, GET/POST request via Blynk webhook-widget.

In plaats van SMS: bellen, Twitter, Facebook – allemaal even simpel. Dat is de kracht van IFTTT.

Zelfde als mijn slimme huiskamer controller project hier, daar uitgebreid besproken, maar te mooi om over te slaan.

Afwerking

Electronica bijna klaar, nog een paar dingen.

Batterij en laden

MKR1000 heeft LiPo-batterijpoort. Ik heb er geen, dus niet dieper in. Check Arduino MKR1000 website voor info.

Laden: twee opties: direct via MKR1000 USB, of draadloos laden (als beschikbaar). Ik gebruik draadloos laden (Futara Elettronica ontvanger/zender).

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Ontvanger/zender: opgegeven spanning aan zender = "dok" waar Alzheimer's Assistant op laadt. Ontvanger: reserve USB micro-B kabel (naar MKR1000 USB) knippen, VCC en ground aansluiten per pinout.

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Eindresultaat:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Behuizing

Elk project heeft behuizing nodig. Zo bedoel ik Alzheimer's Assistant:

Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Let op: Geen toegang tot lasersnijder/3D-printer, dus STL-bestand is alleen voor uiterlijk, niet op schaal.

Dit sluit de documentatie af. Toch toekomstwerk:

  • Goede behuizing maken (nu breadboard; bij lasersnijder/3D-printer: documentatie updaten)
  • Bluetooth 4.0-module ipv HC-05
  • Nog beter: alleen DPS310-sensor ipv Sensor Hub Nano. Lagere kosten (geen Sensor Hub Nano + Bluetooth-module nodig). Code aanpassen voor DPS310 direct, rest klaar.
  • Secundaire sensor voor valdetectie en lokaalbepaling (minder false positives/negatives). Versnellingsmeter en bewegingsdetector waarschijnlijk nodig.
  • Hartslagsensor toevoegen (had ik niet, geweldige toevoeging)
  • Hogere resolutie display, liefst OLED. Grafieken mogelijk, mooier.
  • Batterijduur verbeteren: deep sleep modus MKR1000 (nog niet in code gebruikt)

Bedankt voor lezen, hopelijk leuk project! Opinies en ideeën welkom in comments.

Code

AT Commands (Arduino)

Configureer HC-05 in AT-modus. Details in projectbeschrijving.

// Originele sketch: Martyn Currey's blog
// https://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/
// Aangepast voor Arduino MKR1000!
// Basic Bluetooth sketch
// HC-05 module verbinden en communiceren via Serial Monitor
// HC-05 start in communicatiemodus. Moet in AT-modus.
// Na factory reset: standaard baudrate communicatiemodus = 38400
char c = ' ';
void setup() {
  Serial.begin(9600);
  Serial.println("Arduino with HC-05 is ready");
  Serial1.begin(38400);
  Serial.println("Serial1 started at 38400");
}
void loop() {
  if (Serial1.available()) {
    c = Serial1.read();
    Serial.write(c);
  }
  if (Serial.available()) {
    c = Serial.read();
    Serial.write(c); // Mirror voor volgen
    Serial1.write(c);
  }
}

Alzheimer's Assistant (Arduino)

Hoofdcode, na configuratie HC-05 met Sensor Hub Nano.

#include <BlynkSimpleMKR1000.h>
#include <WidgetRTC.h>
#include <WiFi101.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

char auth[] = ""; // Blynk auth token
char ssid[] = ""; // WiFi SSID
char pass[] = ""; // WiFi wachtwoord

#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="

#define FALL 0.7
#define CLEARANCE 0.2

#define vTEMPERATURE_PIN V0
#define vPRESSURE_PIN V1
#define vALTITUDE_PIN V2
#define vEVENTOR_PIN V3
#define vFALL_PIN V4

float t, p, a, previousA;
boolean fallState;
unsigned long previousMillis = 0;
const long interval = 1000;
boolean BTconnected = false;
int btStatePin = 9;
int backlightPin = 2;

BlynkTimer timer;
WidgetRTC rtc;

U8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, 7, 8, 3, 5, 4);

void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);
  timer.setInterval(1000L, sendSensorValues);
  timer.setInterval(3000L, showTimeAndDate);
  pinMode(btStatePin, INPUT);
  pinMode(backlightPin, OUTPUT);
  digitalWrite(backlightPin, LOW);
  u8g2.begin();
  showStartMessage();
  delay(2000);
  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) {
  Serial1.println(sensorCommand);
}

void initSensorHub() {
  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() {
  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() {
  Blynk.virtualWrite(vTEMPERATURE_PIN, t);
  Blynk.virtualWrite(vPRESSURE_PIN, p);
  Blynk.virtualWrite(vALTITUDE_PIN, a);
}

void checkIfFalling() {
  unsigned long currentMillis = millis();
  if ((currentMillis - previousMillis) >= interval) {
    float diff = previousA - a;
    if ((diff >= (FALL - CLEARANCE)) && (diff <= (FALL + CLEARANCE))) {
      fallState = true;
      // Hier actie bij val: notificatie/e-mail via Blynk
      // Of IFTTT voor bellen/SMS (zie documentatie)
      Serial.println("Falling");
      showFallMessage();
      Blynk.virtualWrite(vFALL_PIN, 255);
      // Blynk.notify("DPS310 detected a fall!");
    }
    previousA = a;
    previousMillis = currentMillis;
    fallState = false;
    Blynk.virtualWrite(vFALL_PIN, 0);
  }
}

void showStartMessage() {
  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() {
  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() {
  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() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_fub14_tf);
  u8g2.drawStr(9, 30, "ERROR");
  u8g2.sendBuffer();
}

void showSensorValues() {
  char bufT[10], bufP[10], 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);
  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);
  u8g2.drawStr(0, 26, "P:"); u8g2.drawStr(12, 26, bufP); u8g2.drawStr(60, 26, "mBar"); u8g2.drawHLine(0, 28, 85);
  u8g2.drawStr(0, 42, "A:"); u8g2.drawStr(12, 42, bufA); u8g2.drawStr(72, 42, "m"); u8g2.drawHLine(0, 44, 85);
  u8g2.sendBuffer();
}

void showFallMessage() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_7x13B_tf);
  u8g2.drawStr(27, 20, "Fall");
  u8g2.drawStr(13, 32, "Detected!");
  u8g2.sendBuffer();
  delay(1000);
}

void showPillReminder() {
  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() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_7x13B_tf);
  u8g2.drawStr(16, 20, "Time to");
  u8g2.drawStr(12, 32, "exercise!");
  u8g2.sendBuffer();
}

void showTimeAndDate() {
  if (year() == 1970) {
    // Time not yet synced
  } else {
    char bufHours[3], bufColon[2], bufMinutes[3], bufDate[11];
    String currentHours = String(hour());
    String colon = ":";
    String currentMinutes = String(minute());
    String currentDate = String(day()) + "/" + month() + "/" + year();
    currentHours.toCharArray(bufHours, 3);
    colon.toCharArray(bufColon, 2);
    currentMinutes.toCharArray(bufMinutes, 3);
    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) {
  int currentValue = param.asInt();
  if (currentValue == 1) {
    showPillReminder();
  }
}

void setBlynkWidgets() {
  Blynk.setProperty(vTEMPERATURE_PIN, "color", "#FFFFFF");
  Blynk.setProperty(vPRESSURE_PIN, "color", "#00BBFF");
  Blynk.setProperty(vALTITUDE_PIN, "color", "#FFFF00");
}

BLYNK_CONNECTED() {
  rtc.begin();
}

Aangepaste onderdelen en behuizingen

Alleen om te laten zien hoe ik de behuizing wil laten lijken. Helemaal niet op schaal!

Schema's

Diagram voor HC-05 in AT-modus configureren met Arduino MKR1000.
Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Fritzing-diagram voor bare-bones project.
Slimme Alzheimer s-begeleider: Arduino-gebaseerd waarschuwingssysteem

Document met AT-commando's voor HC-05.

Productieproces

  1. TinyML Taaldetector met Edge Impulse op Arduino Nano 33 BLE Sense
  2. Bouw een real-time gyroscoop-spel met Arduino Nano & MPU-6050 sensor
  3. Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
  4. Bouw Je Eigen 37-LED Roulette-spel met Arduino Nano
  5. ATtiny85 Mini Arcade: Snake – Bouw een Handheld OLED Game Console
  6. Draagbare Afstandsdetector – Arduino Nano DIY Kit met HC-SR04, 18650 Accu en 3D-geprinte Behuizing
  7. Een audio-reactieve bureaulamp bouwen met Arduino Nano
  8. Autonome Gezichtsvolgende Robot Auto met Arduino Nano & OpenCV
  9. Personal Healthcare Assistant (PHA) – Slimme IoT-oplossing voor gezondheidszorg
  10. Koper Elektrolyseren Project: Bouw een Slim Systeem met Arduino UNO
  11. NeoPixel Matrix Pong op Arduino Nano: Bouw je eigen neon Pong-spel