49713 Designing for the Internet of Things
· 16 members
A hands-on introductory course exploring the Internet of Things and connected product experiences.
Found in DIoT - Augmented Objects
Connected Bedrooms offers an experience for distant couples which enables them to feel a sense of togetherness even when they are miles away from their loved one.
Our story begins with a team of three students. We went searching to find the answer to the question, what object do people cherish the most in their home? We found two insights - people love their bed and people miss their family when they are alone. How could we enhance the peace that being in bed evokes? How could we bring our families into our lonely homes?
Our designer had a clear vision to elicit these feelings using subtle touches. She didn't want to overpower the person. That's when the right idea clicked - breathing. When we lie next to our spouse, we can feel their breathing. It's the subtle movements of their chest that tell us they're next to us. It's the warmth of their body.
Our object would communicate the presence of another by simulating breathing. We would use heat, vibration, and soft light. We named our idea, "Rest Assured".
Faizan is a 30-year-old MBA student studying in Pittsburgh, but his girlfriend is based in Chicago. We interviewed Faizan to discover the pain points he may have given his situation. In the interview process, Faizan was able to offer us a detailed context of his living space. His living space in Pittsburgh is somewhat gloomy and he misses the comfort of coming home to his loved one. Although he communicates with his girlfriend quite often, the absence of her presence makes Faizan feels isolated. He truly hopes his living space can be "augmented" in some way so that he feels connected to his girlfriend even when they are miles away from each other. Given Faizan's personal condition, we have designed an augmented blanket for his bedroom, where he spends most of his time, to establish a sense of connection between him and his girlfriend. As such, the device is aimed to create positive and comforting environment for Faizan at his home.
The initial prototype was a cardboard model of two rooms separate by a wall. The two rooms were Dallas and Pittsburgh. When you 'rested' you hand on one bed's pillow, the other bed would 'breathe' by breathing a LED strip and a servo motor in unison.
All in all, we would complete 5 component tests and 5 hardware iterations of our idea. Not bad for a team of two.
The final prototype had a few new features built in, based on feedback from the first demo day.
See below for a visual journey map of the challenges and tests we completed on our way to a final prototype.
716.455 KB · Download / View
//This code is duplicated across two particles
// This #include statement was automatically added by the Particle IDE.
#include <neopixel.h>
// This #include statement was automatically added by the Particle IDE.
#include <neopixel.h>
int fsrPin = A0;
int fsrReading = 0;
int toggle = 0;
#define PIXEL_PIN D2
#define PIXEL_COUNT 7
#define PIXEL_TYPE WS2812
#define PIXEL_PIN2 D4
#define PIXEL_COUNT2 7
#define PIXEL_TYPE2 WS2812
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
Adafruit_NeoPixel strip2(PIXEL_COUNT2, PIXEL_PIN2, PIXEL_TYPE2);
//flag to keep track of fade direction up or down
bool breathe_up = true;
//has the blanked been warmed up yet?
bool blanketWarmed = false;
//is my spouse in their bed?
bool spouseInBed = false;
int i = 0;
int publish_time = millis();
int start_time = 0;
void publish_event();
int buttonPin = D7;
int heatingPin = D5;
void turn_heat_on();
void turn_heat_off();
void setSpouseInBed(const char *event, const char *data);
void unloadingSequence();
bool programON = true;
void setup()
{
Particle.subscribe( "inbed3000",setSpouseInBed ); // From all devices!
pinMode( heatingPin, OUTPUT);
pinMode(fsrPin, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
//pinMode(PIXEL_PIN, OUTPUT);
Particle.variable("fsr", fsrReading);
Particle.variable("spouseInBed",spouseInBed);
Particle.variable("blanketWarmed",blanketWarmed);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
strip2.begin();
strip2.show();
//loadingSequence();
//delay(1000);
strip2.clear();
strip2.show();
strip.clear();
strip.show();
}
void loop() {
fsrReading = analogRead(fsrPin);
//if you step on the rug, warm the blanket
if (fsrReading>2000 and blanketWarmed == false)
{
loadingSequence();
start_time = millis();
blanketWarmed = true;
turn_heat_on();
programON = true;
}
//if you step on the rug after you've been in bed x hours, cool down the bed
//turn off procedure if program has ran startup sequence and 10 seconds have passed
else if (fsrReading >2000 and blanketWarmed and millis() - start_time > 10000)
{
blanketWarmed = false;
unloadingSequence();
programON = false;
}
//if I'm in bed, tell my spouse's bed
if (digitalRead(buttonPin) == LOW and blanketWarmed == true and programON)
{
publish_event();
}
else if (programON)
{
//if its been 5 seconds since the last published event
if(millis() - publish_time > 15000)
{
spouseInBed = false;
}
}
if (blanketWarmed == true and spouseInBed == false and programON )
{
//blue is the "ready" state
for(int j=1; j<strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(0,0,255));
strip.show();
strip2.setPixelColor(j, strip.Color(0,0,255));
strip2.show();
}
//reset the breathing sequence back to starting state
//starting state should be at 255-blue and fading down
i=255;
breathe_up=false;
}
else if (blanketWarmed == true and spouseInBed == true and programON)
{
//breathe to indicate your spouse is in their bed
breathAll();
}
delay(10);
}
//turn the heating pad on
void turn_heat_on()
{
digitalWrite( heatingPin, HIGH );
}
void turn_heat_off()
{
digitalWrite( heatingPin, LOW );
}
//have spam limits on the events
void publish_event()
{
if(millis() - publish_time > 15000)
{
Particle.publish("inbed3000");
Particle.publish("inbed1000");
publish_time = millis();
}
}
//set the spouseinbed flag
void setSpouseInBed(const char *event, const char *data)
{
spouseInBed = true;
}
//simulate the warming up sequence
void loadingSequence()
{
strip2.clear();
strip2.show();
strip.clear();
strip.show();
for(int j=1; j<strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(255,0,0));
strip.show();
strip2.setPixelColor(j, strip.Color(255,0,0));
strip2.show();
delay(500);
}
}
//simulate the warming down sequence
void unloadingSequence()
{
for(int j=1; j<strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(0,0,0));
strip.show();
strip2.setPixelColor(j, strip.Color(0,0,0));
strip2.show();
delay(500);
}
}
//breathe the LEDs
void breathAll() {
if (breathe_up)
{
i = i + 1;
for(int j=1; j<strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(0,0,i));
strip2.setPixelColor(j, strip.Color(0,0,i));
}
strip.show();
strip2.show();
if(i>=255)
{
breathe_up = false;
}
}
else
{
i = i - 1;
for(int j=1; j<strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(0,0,i));
strip2.setPixelColor(j, strip.Color(0,0,i));
}
strip2.show();
strip.show();
if(i<=0)
{
breathe_up = true;
}
}
}
Click to Expand
To take this project further there could be some subtle elements that we could add which enhance the experience of connectedness such as:
- active and passive interactions
- comforting immersive ambience
- sensory stimulants
- exploratory methods of connectivity between bedrooms across cities
A hands-on introductory course exploring the Internet of Things and connected product experiences.
Connected Bedrooms offers an experience for distant couples which enables them to feel a sense of togetherness even when they are miles away from their loved one.
November 21st, 2019