INTELLITEX

Wearable pressure ulcer prevention sensor patches

Project GitHub repo

CHALLENGE

Pressure ulcer(PU) is a skin ulcer caused by ischemia and necrosis. It is estimated that about 1-2% of the population in developed countries experience PU in their lifetime. In the United States alone, more than 2.5 million patients develop PU each year, and about 60,000 people die from PU complications.

PU negatively affects patients' lives and global finance. PU can cause severe pain, depression, decreased mobility, etc. Meanwhile, the annual economic burden associated with PU is $25 billion in the United States, $13 billion in Europe, $9 billion in Asia, and $3.5 billion in Australia.

PU has three main causes: prolonged high pressure, high skin temperature or humidity. However, PU prevention products nowadays can only respond to pressure, ignoring other PU triggers.

DESIGN DETAILS

We wrote this grasshopper script (rhino 7) to generate serpentine-shaped wires from any chosen base curve. Users can try to adjust different parameters to get different serpentine results (e.g. change the width, amplitute, period, etc.). With this script, users can not only use straight segments of pre-cut serpentine-shaped silver fabric as mentioned in the workflow page, but also tailor any "pre-curved" silver fabric traces according to their designs. In this application, because the silver fabric traces need to cover a long distance, the segment methods can be less productive, so we just used this script to generate tailored traces and cut it out using the laser-cutter.

We also wrote this grasshopper script (rhino 7) to generate voronoi patterns in any given curve boundaries (users need to first identify a large "bounding" rectangle, then select/draw a curve that falls absolutely within that rectangle). Users can try to adjust different parameters to get different voronoi patterns.

Because the laser cutter we used is not large enough to cut the entire patch at one time, we separated the patch into four different areas: shoulder, left elbow, right elbow, and hip.

The entire patch design (including silver fabric layer, base fabric layer, and double-coated fabric layer), can be downloaded here. To reduce the number of IO ports used, two humidity&temperature sensing sub-areas are connected in series for every sensing area.

For each sensing area, it constitutes of two sensing "sub-areas": pressure sensing and humidity&temperature sensing. Pressure sensing area is made of double-coated 0.6mm nylon spandex fabric and large silver fabric electrodes underneath. Humidity&temperature sensing area is made of double-coated 0.3mm nylon spandex fabric and small silver fabric electrodes that goes with sewing connection to provide better stability over washing cycles and thus more robust connection.

For this application, we used an older version of PCB for the MCU, which had magnet connection. This PCB is the same with our current version except for the distance between soldering pads. If you want to use our current PCB design, you might need to manually change the soldering pads distance and relative positions in the dxf file we provided.

TECH DETAILS

Visit our GitHub repository of this application to view all source code.

Crosstalk

The first question that comes with the patch design is that it can lead to crosstalks. Specifically, the pressure sensor will also respond to humidity and temperature; and when exposed to both high humidity and high temperature, the humidity&temperature sensing sub-area can only report that high humidity is detected (this is because the resistance decrease caused by rising temperature is neglectable compared to the resistance increase caused by rising humidity degrees).

In this specific application scenario, however, this crosstalk is not a problem. Our design wants to provide altert to caregivers when the wearer has high PU risks. And we want the alert to happen: immediately when high humidity or temperature is detected (high-priority variables); or, if high pressure in certain area lasts for prolonged time (e.g. 2 hrs, low-priority variables). Therefore, if high humidity or high temperature is detected by the humidity&temperature sensing sub-area, alert will immediately be given, neglecting the crosstalk of pressure sensor reading. If both high humidity and temperature occurs, high humidity alert will immediately be given to the caregiver, and when the caregiver offers tailored care to the wearer (e.g. change his/her body position, clean body, etc.), the high temperature problem can also be addressed.

We created a table to illustrate all possible scenarios of crosstalks and according actions.

ESP32C3 - Arduino

The MCU reads the voltage on the fabric sensor every 2s and send the value to the server via WiFi. Due to the lack of Analog ports in the ESP32C3 chip, we used one ESP32C3 for every sensing area (in total 5 used, referring to the dxf file of our design). However, this can be easily improved by using an alternative MCU with more Analog pins. Example code for the left-elbow sensing area are provided below. The code for different sensing areas are very similar and the only thing that needs to be reconfigured is the mapping relation of pin A0, A1, and A2 to humidity&temperature sensing, back pressure sensing, and side pressure sensing.

            
                #include < WiFi.h >
                #include < HTTPClient.h >
                #include < ArduinoJson.h >
                
                const char* ssid     = "name_of_WiFi";
                const char* password = "Password_of_WiFi";
                const char* server = "xxx.xx.xx.x"; // IP address of server
                const int port = 80; // port of server
                
                void setup()
                {
                    pinMode(A0, INPUT);
                    pinMode(A1, INPUT);
                    pinMode(A2, INPUT);
                    Serial.begin(115200);
                
                    // try to connect to WiFi
                    WiFi.begin(ssid, password);
                    while (WiFi.status() != WL_CONNECTED) {
                    delay(1000);
                    Serial.println("Connecting to WiFi...");
                    }
                    Serial.print("Connected to WiFi:");
                    Serial.println(WiFi.localIP());
                }

                void loop()
                {
                    if ((WiFi.status() == WL_CONNECTED))
                    {
                        HTTPClient http;
                        // Here, different mapping relations might applies to different sensing areas
                        int val0 = analogReadMilliVolts(A1); // back pressure sensor reading
                        int val1 = analogReadMilliVolts(A2); // side pressure sensor reading
                        int val2 = analogReadMilliVolts(A3); // humidity&temperature sensor reading     
                
                        // organize data into json format
                        DynamicJsonDocument json(100);
                        json["patch"] = "elbowL"; // id of the json (which part of the body the data represents)
                        json["tempHumi"] = val2; // humidity&temperature data record
                        json["backPressure"] = val0; // back pressure data record
                        json["sidePressure"] = val1; // side pressure data record
                
                        String jsonData;
                        serializeJson(json, jsonData); // json to String
                        String url = "http://" + String(server) + "/sendData?data=" + jsonData; // reformat datan String to a GET request String sending to the server 
                        Serial.println(url);
                    
                        // using the GET request String to send data to the server
                        http.begin(url);
                        int httpCode = http.GET();
                        if (httpCode > 0) // error catch
                        {
                            String payload = http.getString();
                            Serial.println(httpCode);
                            Serial.println(payload);
                        }
                        else
                        {
                            Serial.println("Error on HTTP request");
                        }
                        http.end();
                    }
                    delay(2000); // sample every 2s
                }
                    
            
        

Web - backend and frontend

All front-end, back-end, along with Arduino code can be accessed here.

We used Node.js to implement the server, which constantly compares sensor readings to high PU risk baselines to decide whether to give alert to caregivers and what customized care suggestions to provide. Window filtering was adopted for pressure readings, and Kalman filtering was adopted for humidity&temperature reading.

We used Three.js to render the 3D human body on the browser, and users can click to view data reading from different body areas. D3.js was used to draw linegraph of the resistance change of sensors overtime (this reading can be counterintuitive, e.g. for pressure sensors, lower values represent smaller resistance but higher pressure. Thus, if the linegraph of pressure sensor goes down, it means the pressure rises).

OUTCOME

After the wearable fabric sensor patch is made, we used mesh TPU to heat-iron it onto a shirt. As mentioned before, we also developed an according front-end monitoring system. The fabric sensor is capable of monitoring pressure, humidity, and temperature of PU-prone areas of the care recipient's body: shoulder blade-upper arm area, elbow area, and sacrum-hip area.

Shoulder blade-upper arm area sensor patch ⬇️

Elbow area sensor patch ⬇️

sacrum-hip area sensor patch ⬇️

When factors leading to high PU risk is detected, the caregiver will receive a warning message and corresponding recommendations for care operations on the front-end system.

IMPLEMENTATION

All sensors, hardwares, the server, and the front-end application were implemented (refer to the video below, where the usb-c to usb-c cable only functions as power supply source, but not a data transfer cable: all the data were transfered via WiFi directely to the server).