Pubbly Love is a device that enables romantic interests to wirelessly indicate when they need to communicate about a next step in their relationship by using the amount of water as an indicator.


Problem Statement

One of the primary concerns was that dating rarely follows a linear path towards a committed relationship. Often, the two parties are loath to share their thoughts and feelings with one another during this nonlinear process, thus compounding upon the complexity. We realized the opportunity to provide an abstracted wayfinding product for people finding their ways through the nascent stages of relationships, towards greater intimacy and pants-off-things.

Pubbly 2
Jamie Curran -

StoryBoard: How it Works




As a team, we wanted to work on romantic relationships. From there we chose to focus on the ambiguity in modern day dating. The team began by mapping out their current relationships and their phases. We spoke about these phases and chose to break them up into 'stages', 'actions', and 'emotions' to better understand the nuances of relationships.

From there, possible inputs and outputs were brainstormed to understand what we could sense and output. These were they discussed in tandem with the phases. As a team, it was decided that the final design should focus on moving forward or backward in a relationship - as opposed to the phases one may be moving away from or towards.


Design Iterations

It was decided to use water as a metric of where you are in the relationship as water is easy to manipulate and carries a weight that can a user can feel and understand - enabling something abstract ("moving forward") to become tangible.

Initially, we wanted to use a cup which users would continually fill to indicate their (hopefully) increasing interest in the relationship. It was decided that when both users filled the cup to its maximum capacity, the cups would pour over to create a waterfall effect to indicate both users are ready to speak to one another.

After discussing this idea further, the team chose to move to vibration instead of pour over effect.  A speaker and solenoid were explored for this effect but they were not compelling to the team. Finally, the team chose to add bubbles to the system instead.

The bubbles were the used to indicate users were at the same stage of the relationship (mapped to equal levels of water), with a light indicating that both users are ready to talk.


Final Hardware Design

was hard. Circuit did not want to work for a while. 


Final Vase Design

The Vase is made up of three parts:

Water Chamber: The upper chamber of the vase holds the water poured in by the pair. At the top will be the ultrasonic sensor attached and facing into the vase. The six walls of the vase were made from laser cut co-polyester and glued to shape using a glue gun. After the glue gus had set on the outer walls the silicone sealant was added to the inner walls. 

[NOTE: When adding the silicone it was hard to get it on the walls after it is put together so we needed smaller hands]

[NOTE: Silicone Adhesives should never be used indoors without proper ventilation; Lest you want to lose your brain cells]


Bubble Valve: The one way valve can be found in soap dispensers. You can unscrew to them and and look at the pump. The lower section is made up of a one-way valve and a spring. After cutting it off you can pull the spring out and hold onto the valve. We used a pipette to create a funnel for continued airflow but prevent the ball bearing from getting too far from the valve. The valve was then glued into the bottom face of the water chamber and sealed with the silicone sealant. Then seal the bottom face to the water chamber. These valves were very unreliable, as the ball kept getting lodged.

Pump and Electronic Housing: The bottom part of the design is made up of six sheets of laser cut co-polyester. Since it didn’t require the ability to hold water we didn’t add any waterproofing silicone.  


Bill of Material






TIP120 Transistor


1K Resistor


Ultrasonic Sensor


AIRPO D2028B Pneumatic Pump




AA Battery Pack (x4)


AA Batteries


16 LED Neopixel





Loctite Silicone Sealant: Aquarium Grade


Soap dispenser 1-way valve


#include "neopixel.h"
#include <math.h>
#define PIXEL_PIN D0
#define PIXEL_COUNT 16
#define PIXEL_TYPE WS2812

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

int valp1 = 0;
int valp2 = 0;
int ledPin = D7;
int othercm;
int bubblesPin = D3;
const int trigPin = D5;
const int echoPin = D6;

void setup() {
  //listening for other device's events
  Particle.subscribe("amountlove-Raha" , loveHandler);//change event name for other device
  strip.begin();; // Initialize all pixels to 'off'
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(bubblesPin, OUTPUT);

void loop() {
  long duration1;
   int inches, cm;
  digitalWrite(trigPin, LOW);
  digitalWrite(trigPin, HIGH);
  digitalWrite(trigPin, LOW);
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.

  duration1 = pulseIn(echoPin, HIGH);
  //Serial.print("ms,  ");
  // convert the time into a distance
  inches = microsecondsToInches(duration1);
  cm = microsecondsToCentimeters(duration1);
  Serial.print("in, ");
  Serial.print("cm, ");

  String myVal = String(cm);
  Serial.print("cm  ");
  // read the value from the button pin
  Particle.publish( "amountlove-Jamie", myVal );//change event name for other device


//letstalk turns on lights
//vibin turns on pump
  int difference = (cm-othercm);
  int absDifference = abs(difference);
  //Serial.print("diff  ");
  if( absDifference <= 2) {
       if (cm < 4) {
         if (othercm < 4){
         else {
      }else {
        uint32_t i;
        for(i=0; i< strip.numPixels(); i++){
        strip.setPixelColor(i, 0, 0, 0 );}//lights off;

  }else {
      //Serial.print("systemoff ");

void loveHandler(const char *event,const char *data)
{ //this is the handler for receiving the subscribed event
  String otherValString = data;
  othercm = otherValString.toInt();
  Serial.print("  ");


long microsecondsToInches(long microseconds)
  return microseconds / 74 / 2;

long microsecondsToCentimeters(long microseconds)
  return microseconds / 29 / 2;

void letstalk() {
  //float val = (exp(sin(millis()/2000.0*M_PI)) - 0.36787944)*108.0;
  uint16_t i;
    //uint32_t c = strip.Color(0,  255,  255);
    //c is deciding color
    //i is position of led
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, 0,  255,  255);
      //sets every pixel to the same color

void vibin() {
  digitalWrite(bubblesPin, HIGH);


void systemoff(){
  uint32_t i;
  for(i=0; i< strip.numPixels(); i++){
  strip.setPixelColor(i, 0, 0, 0 );}//lights off;
  digitalWrite(bubblesPin, LOW);

Click to Expand
Share this Project


49-713 Designing for the Internet of Things

· 26 members

A hands-on introductory course exploring the Internet of Things and connected product experiences.

Focused on

Pubbly Love is a device that enables romantic interests to wirelessly indicate when they need to communicate about a next step in their relationship by using the amount of water as an indicator.


February 12th, 2017