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.

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.

Meer info: Sensor Hub Nano.

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.

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.

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.


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.


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:
- Sensor Hub Nano met smartphone koppelen.
- Infineon Sensor Hub Nano Evaluatie-app downloaden (Android), Sensor Hub Nano aanzetten. App toont "IFX_NANOHUB" met MAC-adres eronder.
- 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.

- Upload "AT Commands" sketch naar MKR1000 (zie code sectie).
- Alleen Bluetooth-module aan Arduino aansluiten per schema.


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".

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

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
- Blynk-app downloaden (iOS/Android), QR-code scannen via Blynk-app → basis-widgets automatisch aangemaakt.

- Vergelijkbaar scherm verschijnt:

- 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.


Code uploaden en testen
- Bibliotheken geïnstalleerd → bijgevoegde code downloaden, aanpassen: Blynk auth-token (per e-mail bij nieuw project), WiFi SSID/wachtwoord.
- Code uploaden naar MKR1000.
- Schakeling opbouwen per schema:

- 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.


- 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

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.

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.

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.

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).

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.


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).

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)

Met Blynk Eventor-widget (details).
- Eventor-widget toevoegen (al aanwezig na QR-code scan).
- Volg screenshots voor setup.



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:

Hetzelfde voor oefening:

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:

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.

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:

IFTTT webhook-kanaal:

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





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:

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).

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.






Eindresultaat:

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

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.

Fritzing-diagram voor bare-bones project.

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