Frühwarnsystem für Inkontinenz

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche
Frühwarnsystem für Inkontinenz
Frühwarnsystem für Inkontinenz


Entwickler

Felix Adler, Dennis Kitzmann

Projektdateien

GitHub

Verwendete Programmiersprachen

C/C++ (Arduino), Java

Helper-Klasse und Vektorgrafiken

BluetoothHelper Java-Klasse, sign-check-icon, sign-warning-icon

Eingesetzte Software

Arduino IDE v1.8.8, Android Studio v3.2.1 (181.5056338), fritzing v0.9.3b, Inkscape v0.92.4

Eingesetzte Hardware

Laser-Cutter Epilog Zing 6030, Handelsübliche Nähmaschine und Lötkolben

Datenblätter

Arduino Nano, HC Serial Bluetooth Products

Pflege und Schutz der Haut sind bei bettlägerigen und inkontinenten Menschen enorm wichtig. Bestimmte Inhaltsstoffe im Urin können die Haut angreifen und so Schäden verursachen. Deshalb muss ein längerer Kontakt mit Urin bzw. der nassen Bettwäsche vermieden werden. Der für die bettlägerige Person verantwortliche Pfleger muss dafür in regelmäßigen Abständen Kontrollen durchführen, was in der Praxis nur schwer möglich ist, da meist mehrere Personen gleichzeitig betreut werden müssen.

Bei diesem Problem setzt das Projekt an. Die inkontinente Person soll auf einer intelligenten Bettunterlage liegen, die sensiblel auf Feuchtigkeit reagiert. Die Bettunterlage besteht aus einer handelsüblichen Inkontinenzunterlage die keinerlei Flüssigkeit durchsickern lässt. Dadurch bleibt die Bettwäsche trocken. Ein selbstgebauter Sensor auf der Unterlage dient dazu, Feuchtigkeit mittels eines angeschlossenen Mikrocontroller-Systems zu überwachen. Das Mikrocontroller-System benachrichtigt im Falle eines zu hohen Feuchtigkeitswerts einen Pfleger über ein drahtlos verbundenes Android-Smartphone. Zusätzlich ist der Status der Bettunterlage direkt über LEDs am Mirkrocontroller-System-Gehäuse ablesbar. Damit ist eine schnellstmögliche Hilfe für die inkontinente Person gewährleistet.

Dieser Wiki-Eintrag dient dazu, jedem die technischen Hintergründe des Projekts verständlich darzulegen und zum Nachbau zu befähigen. Alle für das Projekt erstellten Dateien wurden auf GitHub unter der GNU General Public License v3.0 veröffentlicht.

Material-Liste[Bearbeiten]

Hier sind alle Materialen aufgelistet, die für dieses Projekt verwendet wurden.
Einige davon wurden uns kostenlos zur Verfügung gestellt - Es werden aber trotzdem die ungefähren Preise für jedes Teil mit aufgelistet. (Stand: 01.2019)

Bauteil Preis
Arduino Nano v3.0 3,50 €
HC-05 Bluetooth-Modul 6 €
Inkontinenzunterlage (75 cm2) 20 €
50 m Silberdraht mit Kupferkern (0,5 mm Durchmesser) 7 €
Etwas Nähgarn ~1 €
2x Clipanschluss einer 9V-Blockbatterie ~1 €
Lochrasterplatine (7x5 cm) ~2 €
3x LED-Diode (Grün, Blau, Rot) ~0,20 €
3x 330 Ω Widerstand ~1 €
10 kΩ Widerstand ~0,20 €
3 mm Multiplex-Platte (Gehäuse) ~1 €
Summe: 42,90 €

Intelligente Bettunterlage[Bearbeiten]

Wir haben uns dazu entschieden keine fertigen Feuchtigkeitsmodule zu verwenden, da die Inkontinenzunterlage sonst nicht gewaschen werden könnte. Außerdem bräuchte man eine gewisse Anzahl an Modulen, um die ganze Fläche der Unterlage von 75 cm2 abzudecken. Um diese Probleme zu lösen haben wir uns einen DIY-Feuchtigkeitssensor aus sehr gut leitfähigen Silberdraht gebaut. Der "Sensor" kann so eine beliebige Fläche problemlos abdecken und die Unterlage kann auch gewaschen werden.

Abbildung 1. Die schematische Darstellung der Unterlage.

Auf die Inkontinenzunterlage wird der Silberdraht 2x spiralförmig und parallel mit einem Abstand von 3 cm zueinander mit dem Nähgarn aufgenäht. Man erhält somit 2 getrennte Leiterbahnen, an diese ein 9V-Blockbatterie-Clipanschluss angelötet wird. Der Clipanschluss dient dazu, die Unterlage an das Mikrocontroller-System anzuschließen bzw. davon zu trennen, wenn die Inkontinenzunterlage gewaschen werden muss.

Wenn die Unterlage mit dem Mikrocontroller-System verbunden ist, liegt auf einer Leiterbahn der Unterlage eine 5 V (Mess-)Spannung an. Die andere Leiterbahn ist mit der Masse (GND) verbunden. Auf der Messspannungs-Leitung liegt der 10 kΩ Widerstand. Die Unterlage bzw. der Zwischenraum zwischen den 2 Leiterbahnen, stellt einen weiteren Widerstand dar, der im trockenen Zustand gegen Unendlich geht (unterbricht Stromkreis). Nun wird der Spannungsabfall über den 10 kΩ Widerstand mittels Analogen-Pin gemessen. Wie Freunde der Elektrotechnik vielleicht schon erkannt haben - Das ist nichts anderes als ein unbelasteter Spannungsteiler. Man muss hier unbedingt einen hochohmigen Widerstand verwenden! So erhält man später bei der analogen Messung brauchbare Werte, da der Widerstand der Unterlage auch im feuchten Zustand ziemlich hoch ist. In Abbildung 1 bzw. 2 ist der Aufbau schematisch dargestellt.

Wird die Unterlage bzw. der Zwischenraum zwischen den 2 Leiterbahnen feucht, verringert sich dessen Widerstand und der Stromkreis wird geschlossen. Je mehr Nässe vorhanden ist, desto geringer ist der Widerstand der Unterlage und desto mehr Spannung fällt darüber ab. Da der Spannungsabfall am 10 kΩ Widerstand gemessen wird, fällt dort immer weniger Spannung ab je feuchter die Unterlage ist. Somit hat man sich die Möglichkeit geschaffen genau festzulegen, ab wann die Unterlage als nass gilt.

Der DIY-Sensor reagiert durch den geringen Abstand der Leiterbahnen und den gewählten Widerstand in der Praxis äußerst sensiblel auf Feuchtigkeit, was auch für den Einsatzzweck erforderlich ist. Die inkontinenten Personen haben in der Regel Schutzhosen an, weshalb Feuchtigkeit nur langsam und in kleinen Mengen austritt.

Mikrocontroller-System[Bearbeiten]

Abbildung 2. Der Schaltplan des Mikrocontroller-Systems.
Abbildung 3. Fertig erstellte Platine.
Abbildung 4. Das Gehäuse für die Platine.

Wir haben uns als Mikrocontroller-Board für den Arduino Nano v3.0 entschieden, da er trotz seiner geringen Größe mehr als genügend Anschlussmöglichkeiten und Austattung besitzt. Das Herzstück des Nanos ist ATmega328P-Mikrocontroller mit 16 MHz, 2 KB SRAM und 1 KB EEPROM. Der Energieverbrauch des Ardunio Nanos beträgt gerade einmal 19 mA. Der Mikrocontroller wird über USB permanent mit Strom versorgt.

Da das System mit einem Android-Smartphone gekoppelt werden soll, haben wir uns für das HC-05-Bluetooth-Modul entschieden. Es kann im Master und im Slave-Modus betrieben werden. Für dieses Projekt wird nur der Slave-Modus benötigt, da das Smartphone bzw. Tablet die Verbindung herstellen soll. Es wäre also auch möglich gewesen das HC-06-Bluetooth Modul zu verwenden, welches nur den Slave-Modus beherrscht. Preislich liegen beide Module aber sehr nah beieinander.

Die Komponenten wurden auf der Lochrasterplatine verlötet und in ein per Lasercutter hergestelltes Holz-Gehäuse aus der Multiplex-Platte installiert. Abbildung 2 zeigt den Schaltplan des Mikrocontroller-Systems. Die Abbildungen 3 und 4 zeigen die verlötete Platine sowie das Gehäuse.

Das Programm (Sketch) das auf dem Mikrocontroller läuft wurde in C/C++ erstellt. Der Mikrocontroller führt in regelmäßigen Intervallen eine Feuchtigkeits-Messung der Unterlage durch. Dabei ist anzumerken, dass der Messtromkreis nur während eines Messvorgangs (ca. 130 µs) unter 5 V Spannung steht. Das hält den Energieverbrauch gering und verlängert die Lebensdauer der 2 Silberdraht-Leiterbahnen auf der Unterlage erheblich, da es dort zur Elektrolyse kommt und sich die Leiterbahnen schnell auflösen würden.

Der Feuchtigkeitswert liegt aufgrund der 10-Bit-Auflösung des Analog-Digital-Wandlers zwischen 0 und 1023. Der Wert 1023 bedeutet, dass die Inkontinenzunterlage komplett trocken ist. Die gesamte Spannung fällt in diesem Fall an den 10 kΩ Widerstand ab. Je niedriger der Wert, desto feuchter die Unterlage. Mithilfe eines Schwellenwertes im Bereich 0 - 1023 lässt sich der Punkt festlegen, ab welchen Nässegrad der Pfleger benachrichtigt werden soll. Der festgelegte Schwellenwert wird permanent mithilfe von Arduino's EEPROM-Bibliothek im EEPROM des Mikrocontrollers gespeichert, sodass auch nach einem Stromausfall der Schwellenwert nicht neu eingestellt werden muss. Den Schwellenwert kann der Benutzer über die Android-App individuell einstellen. Dazu prüft das Mikrocontroller-System vor jeden Messzyklus, ob ein neuer Schwellenwert per Bluetooth angekommen ist und schreibt diesen nach einer erfolgreichen Überprüfung in seinen EEPROM.

Die Kommunikation zwischen Mikrocontroller und Bluetooth-Modul findet seriell statt. Der Arduino Nano unterstützt die serielle Kommunikation über den eingebauten Serial Port (UART) an den Pins 0 und 1. Jedoch würde das den Datenfluss am USB-Port behindern, da dieser am selben UART hängt. Über den USB-Port werden seriell Debugging-Informationen übertragen und können mit einem seriellen Monitor ausgelesen werden. Glücklicherweise kann man dieses Problem mit Arduino's SoftwareSerial-Bibliothek lösen, da nicht viele Daten zwischen Mikrocontroller und Bluetooth-Modul fließen und auch nicht gleichzeitig gesendet und empfangen werden muss. Mithilfe der SoftwareSerial-Bibliothek lassen sich andere Digitale Pins für die serielle Kommunikation nutzen, da die Funktionalität emuliert wird.

Der Schwellenwert im Programm wird in einer 16-Bit Integer-Variable gespeichert. Jedoch ist der EEPROM in Adressen mit je 8-Bit aufgeteilt. Um eine Integer-Variable zu speichern muss diese auf 2 Adressen aufgeteilt, bzw. beim auslesen wieder daraus zusammengebaut werden. Der folgende Auszug aus dem Quellcode des Programms veranschaulicht, wie das mithilfe von Bitmanipulation umgesetzt wurde. Die "Serial.println"-Ausgaben dienen nur dem Debugging.

// Schreibt den Schwellenwert in Adresse 0 und 1 des EEPROM
// Da der Schwellenwert ein 2 Byte Integer ist, muss es auf 2 Adressen aufgeteilt werden
void writeThreshold(int threshold)
{
    // Neuen Schwellenwert nur setzten, falls gültig und notwendig
    if (threshold < 0 || threshold > 1023 || threshold == WETNESS_THRESHOLD)
    {
        return;
    }
    
    WETNESS_THRESHOLD = threshold;
    Serial.println("Neuen Schwellenwert erkannt und im System gesetzt");
    
    // Den Int-Schwellenwert (16 Bit) auf 2 Adressen (je 8 Bit) aufteilen
    byte low_byte = WETNESS_THRESHOLD & 0xFF;
    byte high_byte = ((WETNESS_THRESHOLD >> 8) & 0xFF);
    
    EEPROM.write(0, low_byte);
    EEPROM.write(1, high_byte);
    
    // Prüfen, ob der Schwellenwert in den EEPROM geschrieben wurde
    if (WETNESS_THRESHOLD == readThreshold())
    {
        Serial.println("Neuen Schwellenwert erfolgreich in den EEPROM geschrieben");
    }
    else
    {
        Serial.println("FEHLER: Der neue Schwellenwert konnte nicht in den EEPROM geschrieben werden!");
    }
}

// Liest den gespeicherten Schwellenwert von Adresse 0 und 1 des EEPROM wieder aus
int readThreshold()
{
    Serial.println("Schwellenwert vom EEPROM lesen");
    
    byte low_byte = EEPROM.read(0);
    byte high_byte = EEPROM.read(1);
    
    // Gespeicherte Bytes zusammenfügen und auf 16 Bit auffüllen,
    // damit es in den "int" Datentyp passt
    return low_byte + ((high_byte << 8) & 0xFF00);
}

Nach jedem Messvorgang wird der aktuelle Feuchtigkeitswert mit dem Schwellenwert verglichen. Wird dieser erreicht bzw. unterschritten, muss der Benutzer per App alarmiert werden. Der gemessene Feuchtigkeitswert wird zusammen mit dem Schwellenwert und der vergangenen Zeit in Sekunden, seit der Schwellenwertunterschreitung, per Bluetooth als Zeichenkette versendet. Die Zeichenkette hat das folgende Format:

FEUCHTIGKEITSWERT:SCHWELLENWERT:NASS_SEIT_IN_SEKUNDEN

// Beispiel:
// - Aktueller Feuchtigkeitswert: 800
// - Aktueller Schwellenwert: 900
// - Nass seit 1450 Sekunden
800:900:1450

Die vergangene Zeit in Sekunden wird in einer 32-Bit unsigned long Variable gehalten, also könnten theoretisch bis zu 4.294.967.295 Sekunden gespeichert werden (~136 Jahre).

Am Mikrocontroller-System befinden sich 3 Status-LEDs. Die grüne LED zeigt die Betriebsbereitschaft an. Die rote LED gibt an, ob der Schwellenwert erreicht bzw. unterschritten wurde. Die blaue LED zeigt an, ob ein Smartphone per Bluetooth verbunden ist. Diese LED wird über das HC-05-Modul an dessen Pin 32 (LED2) gesteuert. Laut Datenblatt (S. 12) liefert dieser Pin ein LOW-Signal wenn keine Verbindung besteht und ein HIGH-Signal wenn eine Verbindung hergestellt ist.

Android-App[Bearbeiten]

Die Android-App wurde auf Benutzerfreundlichkeit und Einfachheit getrimmt. Sie wurde gegen das API-Level 15 kompiliert - also läuft sie auf allen Android-Smartphones/Tablets mit Bluetooth v2.0 ab Android v4.0.3 (IceCreamSandwich). Die App unterstützt die Sprachen Deutsch und Englisch. Zunächst muss der Benutzer das Mikrocontroller-System per Bluetooth mit seinem Smartphone koppeln. Danach kann in der App über eine Auswahl-Liste eine Verbindung mit dem gewünschten gekoppelten Gerät hergestellt werden. Ist die Verbindung erfolgreich hergestellt, wird der Benutzer auf die Hauptseite weitergeleitet. Jetzt lauscht die App auf ankommende Daten. Die App akzeptiert und wertet nur Daten aus, die im passenden Format ankommen (FEUCHTIGKEITSWERT:SCHWELLENWERT:NASS_SEIT_IN_SEKUNDEN getrennt durch :). Dabei dient der folgenden reguläre Ausdruck als Filter:

^([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|10[0-1][0-9]|102[0-4]):([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|10[0-1][0-9]|102[0-4]):[0-9]+$

Wenn die Daten nicht im passenden Format ankommen, wird die Verbindung nach überschreiten einer Toleranzgrenze automatisch getrennt.

Auf der Hauptseite wird der aktuelle Status der Unterlage in Echtzeit angezeigt. Liegt der Feuchtigkeitswert über den Schwellenwert gilt der Status Unterlage ist trocken. Wird der Schwellenwert erreicht bzw. unterschritten springt der Status auf Unterlage ist nass. Zudem wird das Datum und die vergangene Zeit seitdem die Unterlage nass ist und eine Benachrichtigung in der Android-Benachrichtigungsleiste mit dem Datum angezeigt.

Der Teil NASS_SEIT_IN_SEKUNDEN aus den empfangenen Daten wird dazu verwendet um das korrekte Datum und die vergangene Zeit zu berechnen. So müssen keinerlei Informationen in einer Datenbank persistent gespeichert werden, wenn die App beendet wird.

Der Benutzer hat über eine Konfigurationsseite die Möglichkeit, den Schwellenwert dauerhaft zu ändern. Auf der Konfigurationsseite wird der aktuell eingestellte Schwellenwert angezeigt. Über ein DropDown-Menü kann der Benutzer den Nässegrad von Trocken bis Nass Stufenweise wählen. Betätigt der Benutzer der Button, wird der gewünschte Schwellenwert per Bluetooth an das Mikrocontroller-System gesendet. War der Sendevorgang erfolgreich übernimmt das Mikrocontroller-System den rest. Jetzt ist der neue Schwellenwert ab sofort in den ankommenden Daten vorhanden. Die folgenden Screenshots veranschaulichen die Oberfläche der App:

Alle Bluetooth-Operationen müssen von dem UI getrennt in seperaten Threads durchgeführt werden, da das UI sonst komplett einfrieren bzw. blockiert werden würde. Dazu nutzt die App die BluetoothHelper-Klasse von G.Capelli, welche ebenfalls die GNU General Public License v3.0 verwendet, als Unterbau für die Bluetooth-Kommunikation. Es wurden 2 Vektorgrafiken sign-check-icon und sign-warning-icon von paomedia verwendet. Die Grafiken stehen unter der Public Domain Lizenz.