Connected Coasters
Made by Lynn Sandberg, Stephen Nomura, Aaron Kurth and Joseph Johnson
Made by Lynn Sandberg, Stephen Nomura, Aaron Kurth and Joseph Johnson
Using particle devices, we developed a prototype which allows separated drinking buddies to know when the other is using their coaster.
Created: February 9th, 2016
With Connected Coasters, each friend has a linked coaster, when one friend is having a drink and they set a glass on their coaster, both coasters will light up with one color, when the second friend joins in and puts their drink on a coaster, both coasters will light up with two colors, signaling that the two friends are drinking simultaneously.
This solution includes identical coasters which will allow both friends to be notified when their friend is having a drink and when they are drinking at the same time, giving a sense of connection and bonding to both parties.
1. Conceptualized different product concepts and scenarios
2. Created criteria for picking an concept and picked the most feasible, usable, and original concpet.
3. Brainstormed how the product would work with sensors and actuators
4. Created code for mechanisms
5. Prototyped circuitboard connections
6. Created housing for the product
7. Documented the project
Components for One Coaster:
1 - Circuit board
1 - Photon
8 - RGB LEDs
1 - Button
4 - 1000 Ω resistors
32 - Jumper wires
1 - Coaster housing
//Records the photon's unique device ID
String myID = System.deviceID();
//Controls green and blue colors in first cluster of three LEDs
int greenPins1 = D0;
int bluePins1 = D1;
//Controls green and blue colors in second cluster of three LEDs
int greenPins2 = D2;
int bluePins2 = D3;
//Controls
int buttonPin = D4;
//Stores binary variable indicating status (dring / no drink) of sibling coaster
int friendStatus = 0;
//Stores binary variable indicating status (drink / no drink) of local coaster
int myStatus = 0;
void setup ()
{
//Set the button as input
pinMode (buttonPin, INPUT_PULLUP);
//Sets the LED clusters as output
pinMode (greenPins1, OUTPUT);
pinMode (bluePins1, OUTPUT);
pinMode (greenPins2, OUTPUT);
pinMode (bluePins2, OUTPUT);
//These events ultimately control the friendStatus variable (on both ends)
Particle.subscribe("public-event/gstodtmeister11", eventHandler);
Particle.subscribe("public-event/gstodtmeister22", eventHandler2);
//Ensures the LEDs are initially deactivated
nobodyDrinking();
}
void loop ()
{
monitorButton();
}
void monitorButton()
{
//Reads the state of the button on the coaster
int buttonState = digitalRead(buttonPin);
//If the button is depressed...
if (buttonState == LOW)
{
//Publish event indicating the button is depressed
Particle.publish("public-event/gstodtmeister11", myID);
//Set status of local coaster as activated
myStatus = 1;
//If friend is also drinking...
if (friendStatus == 1)
{
drinkingTogether();
}
else
{
drinkingAlone();
}
}
//If the button is not depressed...
else
{
//...and you just lifted a glass from the coaster
if (myStatus == 1)
{
//Set status of coaster
myStatus = 0;
delay(1000);
//Publish event indicating the button is not depressed
Particle.publish("public-event/gstodtmeister22", myID);
}
//If friend is also drinking...
if (friendStatus == 1)
{
friendDrinking();
}
else
{
nobodyDrinking();
}
}
}
/*If someone sets a glass on the sibling coaster, the code publishes an event
that calls this method. If the corresponding device published the event (not
your device), this method sets the friendStatus variable to 1. */
void eventHandler(const char *event, const char *data)
{
if (myID != data)
{
friendStatus = 1;
}
}
/*If someone lifts a glass off the sibling coaster, the code publishes an event
that calls this method. If the corresponding device published the event (not
your device), this method sets the friendStatus variable to 0.*/
void eventHandler2(const char *event, const char *data)
{
if (myID != data)
{
friendStatus = 0;
}
}
//Activates only the green LEDs in both clusters
//Indicates you're drinking alone
void drinkingAlone()
{
digitalWrite(greenPins1, 0);
digitalWrite(bluePins1, 255);
digitalWrite(greenPins2, 0);
digitalWrite(bluePins2, 255);
}
//Activates one LED cluster green and the other LED cluster blue
//Indicates both individuals have a cup on their coaster
void drinkingTogether()
{
digitalWrite(greenPins1, 0);
digitalWrite(bluePins1, 255);
digitalWrite(greenPins2, 255);
digitalWrite(bluePins2, 0);
}
//Activates only the blue LEDs in both clusters
//Indicates your friend is drinking alone
void friendDrinking ()
{
digitalWrite(greenPins1, 255);
digitalWrite(bluePins1, 0);
digitalWrite(greenPins2, 255);
digitalWrite(bluePins2, 0);
}
//Deactivates all LEDs in both clusters
//Indicates nobody is drinking
void nobodyDrinking ()
{
digitalWrite(greenPins1, 255);
digitalWrite(bluePins1, 255);
digitalWrite(greenPins2, 255);
digitalWrite(bluePins2, 255);
}
Click to Expand
The Connected Coasters will light up independent of which friend is using their coaster, simultaneously notifying the users that a) the coaster is working for the user with a drink and b) that the user without a drink can join in the drinking anytime.
Scenario: Ted and Mike are friends who met in college. Ted lives in Austin while Mike lives in Boston. Ted likes to have a drink around 7pm usually, one night he sets his drink down on his Connected Coaster, within minutes his coaster is lighting up with different colors - he knows Mike is there having a drink with him.
There are interesting considerations when developing a connected device. One consideration is that both users need to be on a similar page in terms of how often and in what context they would like to interact with each other. For instance, in the scenario of Ted and Mike, this product wouldn't necessarily work for a person who didn't want to be reminded of when their friend was having a drink. Any connected device needs to be reciprocal in terms of usefulness. Moreover, it was a challenge to uncover how to solve simple interactions in the physical context. For instance, accounting for affirmation that Ted's coaster is working, affirmation that Ted knows Mike's coaster is working, and vice versa. There are many edge cases that we discovered and were curious about, for instance, what if a third friend wants to join in, and what if both users are holding their drink at the same time - does that cause interaction problems?
This course charts the emergence of the now "connected world" to explore the possibilities for future products and connected spaces.
Using particle devices, we developed a prototype which allows separated drinking buddies to know when the other is using their coaster.