Inclusive & Assistive Products
ISDN2001/2002: Second Year Design Project
The individual study of
Jeremy
User Interface Integration
How to let elderly control the blanket effectively?


Hardware UI example
The weighted blanket features four adjustable areas: Chest, Stomach, Leg, and Overall. Use the power button to turn the blanket on/off. When powered on, all areas reset to default weight settings; when off, they return to 0%. To adjust a specific area, press the “Choose Area” button (which emits a beep when pressed) to cycle through the four zones in a fixed sequence (Chest → Stomach → Leg → Overall). Only the selected area can be modified using the “heavier” or “lighter” buttons, which also emit a beep when pressed. Each press of these buttons adjusts the weight by ±1% (e.g., pressing “lighter” five times reduces weight by 5%), and holding the button does not accelerate adjustments.
Software UI example
The software interface for the weighted blanket includes four labelled gauges (Chest, Stomach, Leg, Overall) that display weight levels on a 0–255 scale, directly corresponding to 0–100% (e.g., 255 = 100%). A power indicator light shows whether the blanket is on (lit) or off (unlit). When powered on, all areas reset to a predefined default value; when off, gauges drop to 0%. Each area has dedicated “heavier” and “lighter” buttons below its gauge, with one press adjusting the weight by ±1% (≈2.55 units on the 0–255 scale). Press-and-hold functionality is disabled to prevent rapid adjustments, and gauges update in real time to reflect changes. The interface prevents values from exceeding 0% or 100%, and text size/colour contrast adapt to the user’s system-wide accessibility settings.


Comparison:
Software UI (Gauges + On-Screen Buttons)
Pros:
-
Visual Clarity: Gauges (0–255 scale) and labels clearly display weight percentages in real time.
-
Direct Access: Dedicated buttons for each area (Chest, Stomach, Leg, Overall) eliminate cycling through zones.
-
Accessibility: Adjustable text size/colour contrast accommodates users with vision impairments.
Cons:
-
Tech Familiarity: Requires comfort with digital interfaces, which may challenge some elderly users.
-
No Tactile Feedback: Touchscreen buttons lack physical feedback (unless paired with haptic/audio cues).
-
Screen Dependency: Glare, low brightness, or screen damage could hinder usability.
-
Power Reliance: Requires a charged device or stable power source.
Hardware UI
Pros:
-
Tactile Interaction: Physical buttons provide clear, tactile feedback (e.g., pressing a button or hearing a beep), reducing reliance on vision.
-
Simplicity: No screens or menus to navigate; fixed sequence (Chest → Stomach → Leg → Overall) minimizes confusion.
-
Durability: No risk of screen damage or software glitches.
-
Low Learning Curve: Intuitive for users unfamiliar with technology.
Cons:
-
Physical Effort: Repeated button presses (e.g., adjusting from 10% to 50% requires 40 presses) may strain users with arthritis.
-
Limited Feedback: No visual confirmation of weight percentage (only a light bulb indicates the selected area).
-
Visibility Issues: Light bulbs may be hard to see under the blanket or in dim lighting.
-
No Customization: Must cycle through all areas to reach the desired one.
The choice to adopt the software UI for elderly users is justified by its superior accessibility and adaptability. Unlike the hardware interface, the software allows users to adjust text size and colour contrast, addressing common age-related vision challenges such as macular degeneration or light sensitivity. The real-time 0–255 gauge display provides clear, precise feedback on weight percentages, eliminating the ambiguity of the hardware’s simple light bulbs. Dedicated buttons for each area (Chest, Stomach, Leg, Overall) remove the need to cycle through zones, reducing physical effort and cognitive load. While the software requires basic familiarity with digital interfaces, its design avoids complex menus or gestures, prioritizing simplicity akin to the hardware’s tactile buttons. Additionally, safeguards like 0–100% limits prevent over-adjustment, and the system’s alignment with device-wide accessibility settings ensures a more inclusive experience. Though lacking tactile feedback, the software’s visual clarity and adaptability ultimately make it more suitable for elderly users with vision impairments, particularly in controlled AB testing environments where usability can be refined.
Conclusion:
Implementation
Object Orientated Programming
Using OOP in your program is beneficial because it organizes code into modular classes, making it easier to manage and update. This decision likely stems from the need to handle complex interactions between components like motors and valves efficiently.
Class Valve
Attributes:
-
Private:
-
uint8_t pin: Pin number associated with the valve.
-
bool isOpen: Indicates if the valve is open (true) or closed (false).
-
Methods:
-
Valve(): Default constructor.
-
Valve(uint8_t valvePin): Constructor that initializes the valve with a pin.
-
void open(): Opens the valve.
-
void close(): Closes the valve.
-
bool isValveOpen() const: Returns the state of the valve (open or closed).
-
uint8_t getPin() const: Returns the pin number associated with the valve.
Class Zone
Attributes:
-
Private:
-
Valve inputValve: Input valve for the zone.
-
Valve outputValve: Output valve for the zone.
-
uint8_t volume: Current volume of water in the zone.
-
uint8_t vp: Virtual pin value for Blynk communication.
-
Methods:
-
Zone(): Default constructor.
-
Zone(uint8_t inputPin, uint8_t outputPin, uint8_t vpValue): Constructor to initialize the zone with input/output pins and a virtual pin value.
-
uint8_t getVolume() const: Returns the current volume of water in the zone.
-
void setVolume(uint8_t vol): Sets the volume of water in the zone and updates the virtual pin.
-
void infillWater(): Opens the input valve and closes the output valve to fill the zone with water.
-
void storeWater(): Closes both input and output valves to store water in the zone.
-
void outflowWater(): Opens the output valve and closes the input valve to release water from the zone.
-
void updateVol(): Updates the virtual pin with the current volume.
Class Motor
Attributes:
-
Private:
-
uint8_t positivePin: The pin number for the motor's positive terminal.
-
uint8_t PositivePWMChannel: PWM channel for the positive pin.
-
uint8_t speed: Current speed of the motor.
-
Methods:
-
Motor(): Default constructor.
-
Motor(uint8_t posPin, uint8_t channel1): Constructor to initialize the motor with a positive pin and a PWM channel.
-
void pumpWater(): Activates the motor to pump water.
-
void stop(): Stops the motor.
-
void setSpeed(int newSpeed): Sets the speed of the motor.
Class Blanket
Attributes:
-
Private:
-
Motor inflowMotor: Motor for inflow of water.
-
Motor outflowMotor: Motor for outflow of water.
-
Zone zones[4]: Array of four Zone objects.
-
bool mainStable: Indicates if the main system is stable.
-
bool powerState: Indicates if the blanket is powered on.
-
uint8_t bag[4]: Array for storing water levels for different zones.
-
int8_t offset[4]: Array for storing offset values for each zone.
-
Methods:
-
Blanket(): Default constructor.
-
void init(...): Initializes the blanket with motors and zones.
-
void setZonePercent(uint8_t no): Sets the water infill percentage for a specific zone.
-
bool isMainStable() const: Returns the state of the main stability.
-
bool isPowerOn() const: Returns the power state.
-
void closeAllValve(): Closes all valves in the blanket.
-
void stopAllMotor(): Stops all motors in the blanket.
-
void setMainStable(bool state): Sets the main stability state.
-
void setPowerState(bool state): Sets the power state of the blanket.
-
uint8_t getBagValue(uint8_t index) const: Returns the bag value for a specific index.
-
int8_t getOffsetValue(uint8_t index) const: Returns the offset value for a specific zone.
-
void setBagValue(uint8_t index, uint8_t value): Sets the bag value for a specific zone.
-
void setOffsetValue(int8_t index, int8_t value): Sets the offset value for a specific zone.
-
void updateOffset(int index, int change): Updates the offset value for a specific zone.
-
void update(): Updates the volume for all zones.
-
void closeAllValve(): Closes all valves in the blanket.
-
void stopAllMotor(): Stops all motors in the blanket.
-
void setMainStable(bool state): Sets the main stability state.
-
void setPowerState(bool state): Sets the power state of the blanket.
Explanations